diff --git a/.eslintignore b/.eslintignore index 7b618cca64..d2db8508cf 100644 --- a/.eslintignore +++ b/.eslintignore @@ -10,12 +10,5 @@ apidoc_build/ content_cache/ node_modules/ -# Not linted -website/client-old/ -test/client-old/spec/**/* - -# Temporarilly disabled. These should be removed when the linting errors are fixed TODO -migrations/* -scripts/* -website/common/browserify.js -Gruntfile.js +# Old migrations, disabled +migrations/archive/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index d27fcdee9a..537e118839 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,8 @@ services: cache: directories: - 'node_modules' +addons: + chrome: stable before_install: - npm install -g npm@5 before_script: @@ -25,4 +27,5 @@ env: - TEST="test:sanity" - TEST="test:content" COVERAGE=true - TEST="test:common" COVERAGE=true + - TEST="client:unit" COVERAGE=true - TEST="apidoc" diff --git a/Dockerfile-Production b/Dockerfile-Production index cfc38b6454..6f5edd1e4d 100644 --- a/Dockerfile-Production +++ b/Dockerfile-Production @@ -20,7 +20,7 @@ RUN npm install -g gulp-cli mocha # Clone Habitica repo and install dependencies RUN mkdir -p /usr/src/habitrpg WORKDIR /usr/src/habitrpg -RUN git clone --branch v4.27.0 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg +RUN git clone --branch v4.27.4 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg RUN npm install RUN gulp build:prod --force diff --git a/README.md b/README.md index 85dc8c0edb..22b1589b9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -Habitica [![Build Status](https://travis-ci.org/HabitRPG/habitica.svg?branch=develop)](https://travis-ci.org/HabitRPG/habitica) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.svg)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Coverage Status](https://coveralls.io/repos/github/HabitRPG/habitica/badge.svg?branch=develop)](https://coveralls.io/github/HabitRPG/habitica?branch=develop) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) +Habitica [![Build Status](https://travis-ci.org/HabitRPG/habitica.svg?branch=develop)](https://travis-ci.org/HabitRPG/habitica) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.svg)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Coverage Status](https://coveralls.io/repos/github/HabitRPG/habitica/badge.svg?branch=develop)](https://coveralls.io/github/HabitRPG/habitica?branch=develop) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) [![Open Source Helpers](https://www.codetriage.com/habitrpg/habitica/badges/users.svg)](https://www.codetriage.com/habitrpg/habitica) =============== +[![Greenkeeper badge](https://badges.greenkeeper.io/HabitRPG/habitica.svg)](https://greenkeeper.io/) + [Habitica](https://habitica.com) is an open source habit building program which treats your life like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor. We need more programmers! Your assistance will be greatly appreciated. diff --git a/migrations/.eslintrc b/migrations/.eslintrc new file mode 100644 index 0000000000..6509e9ee6b --- /dev/null +++ b/migrations/.eslintrc @@ -0,0 +1,7 @@ +{ + "root": false, + "rules": { + "no-console": 0, + "no-use-before-define": ["error", { "functions": false }] + } +} diff --git a/migrations/20130128_add_missing_crons.js b/migrations/20130128_add_missing_crons.js deleted file mode 100644 index 1a4c919cc2..0000000000 --- a/migrations/20130128_add_missing_crons.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.update( - { lastCron: { $exists: false} }, - { $set: { lastCron: +new Date } }, - { multi: true } -); \ No newline at end of file diff --git a/migrations/20130128_merge_completed_todo_ids.js b/migrations/20130128_merge_completed_todo_ids.js deleted file mode 100644 index d362a4b771..0000000000 --- a/migrations/20130128_merge_completed_todo_ids.js +++ /dev/null @@ -1,15 +0,0 @@ -db.users.find({ completedIds: { $exists: true } }).forEach(function(user) { - var newTodoIds = user.todoIds; - user.completedIds.forEach(function(value) { - if (newTodoIds.indexOf(value) === -1) { - newTodoIds.push(value) - } - }); - db.users.update( - { _id: user._id }, - { - $set: { todoIds: newTodoIds }, - $unset: { completedIds: 1 } - } - ); -}); \ No newline at end of file diff --git a/migrations/20130129_add_missing_preferences.js b/migrations/20130129_add_missing_preferences.js deleted file mode 100644 index f4e7b55762..0000000000 --- a/migrations/20130129_add_missing_preferences.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.update( - {preferences:{$exists:false}}, - {$set:{preferences:{gender: 'm', armorSet: 'v1'}}}, - {multi:true} -) diff --git a/migrations/20130204_user_public_private_paths.js b/migrations/20130204_user_public_private_paths.js deleted file mode 100644 index 7f43148350..0000000000 --- a/migrations/20130204_user_public_private_paths.js +++ /dev/null @@ -1,102 +0,0 @@ -// %mongo server:27017/dbname underscore.js my_commands.js -// %mongo server:27017/dbname underscore.js --shell - -//db.users.find({'auth.facebook.email': 'tylerrenelle@gmail.com'}).forEach(function(user){ -db.users.find().forEach(function(user){ - - if (!user._id) { - print("User has null _id"); - return; // need to figure out how to delete these buggers if they don't have an id to delete from - } - - if (!!user.idLists) { - print("User " + user._id + " has already been migrated") - return - } - - if (user._id.indexOf("$") === 0) { - print("User id starts with $ (" + user._id + ")") - return; - } - - // even though we're clobbering user later, sometimes these are undefined and crash the script - // this saves us some ternaries - user.stats = user.stats || {}; - user.items = user.items || {}; - user.preferences = user.preferences || {}; - user.notifications = user.notifications || {}; - user.flags = user.flags || {}; - user.habitIds = user.habitIds || []; - user.dailyIds = user.dailyIds || []; - user.todoIds = user.todoIds || []; - user.rewardIds = user.rewardIds|| []; - - _.each(user.tasks, function(task, key){ - if (!task.type) { - delete user.tasks[key]; - // idList will take care of itself on page-load - return - } - if (key == '$spec') { - print("$spec was found: " + user._id); - return - } - if (key.indexOf("$_") === 0) { - var newKey = key.replace("$_", ''), - index = user[task.type + "Ids"].indexOf(key) - user[task.type + "Ids"][index] = newKey; - task.id = newKey - user.tasks[newKey] = task - // TODO make sure this is ok, that we're not deleting the original - // Otherwise use lodash.cloneDeep - delete user.tasks[key] - } - }); - - // New user schema has public and private paths, so we can setup proper access control with racer - // Note 'public' and 'private' are reserved words - var newUser = { - auth: user.auth, // we need this top-level due to derby-auth - apiToken: user.preferences.api_token || null, // set on update, we need derby.uuid() - preferences: { - armorSet: user.preferences.armorSet || 'v1', - gender: user.preferences.gender || 'm' - }, - balance: user.balance || 2, - lastCron: user.lastCron || +new Date, - history: user.history || [], - stats: { - gp: user.stats.money || 0, - hp: user.stats.hp || 50, - exp: user.stats.exp || 0, - lvl: user.stats.lvl || 1 - }, - items: { - armor: user.items.armor || 0, - weapon: user.items.weapon || 0 - }, - tasks: user.tasks || {}, - idLists: { - habit: user.habitIds || [], - daily: user.dailyIds || [], - todo: user.todoIds || [], - reward: user.rewardIds || [] - }, - flags: { - partyEnabled: false, - itemsEnabled: user.items.itemsEnabled || false, - kickstarter: user.notifications.kickstarter || 'show', - ads: user.flags.ads || null // null because it's set on registration - }, - party: { - current: null, - invitation: null - } - }; - - try { - db.users.update({_id:user._id}, newUser); - } catch(e) { - print(e); - } -}) \ No newline at end of file diff --git a/migrations/20130208_idLists_to_typeIds.js b/migrations/20130208_idLists_to_typeIds.js deleted file mode 100644 index f22dc25be7..0000000000 --- a/migrations/20130208_idLists_to_typeIds.js +++ /dev/null @@ -1,19 +0,0 @@ -// move idList back to root-level, is what's causing the sort bug - see https://github.com/codeparty/racer/pull/73 - -// We could just delete user.idLists, since it's re-created on refresh. However, users's first refresh will scare them -// since everything will dissappear - second refresh will bring everything back. -db.users.find().forEach(function(user){ - if (!user.idLists) return; - db.users.update( - {_id:user._id}, - { - $set:{ - 'habitIds':user.idLists.habit, - 'dailyIds':user.idLists.daily, - 'todoIds':user.idLists.todo, - 'rewardIds':user.idLists.reward - } - //$unset:{idLists:true} // run this after the code has been pushed - } - ) -}) \ No newline at end of file diff --git a/migrations/20130208_user_customizations.js b/migrations/20130208_user_customizations.js deleted file mode 100644 index 07b1dfb08f..0000000000 --- a/migrations/20130208_user_customizations.js +++ /dev/null @@ -1,20 +0,0 @@ -db.users.update( - {items:{$exists:0}}, - {$set:{items:{weapon: 0, armor: 0, head: 0, shield: 0 }}}, - {multi:true} -); - -db.users.find().forEach(function(user){ - - var updates = { - // I'm not racist, these were just the defaults before ;) - 'preferences.skin': 'white', - 'preferences.hair': 'blond', - - 'items.head': user.items.armor, - 'items.shield': user.items.armor, - } - - db.users.update({_id:user._id}, {$set:updates}); - -}) \ No newline at end of file diff --git a/migrations/20130307_exp_overflow.js b/migrations/20130307_exp_overflow.js deleted file mode 100644 index 44fb2904b4..0000000000 --- a/migrations/20130307_exp_overflow.js +++ /dev/null @@ -1,39 +0,0 @@ -// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130307_normalize_algo_values.js - -/** - * Make sure people aren't overflowing their exp with the new system - */ -db.users.find().forEach(function(user){ - function oldTnl(level) { - return (Math.pow(level,2)*10)+(level*10)+80 - } - - function newTnl(level) { - var value = 0; - if (level >= 100) { - value = 0 - } else { - value = Math.round(((Math.pow(level,2)*0.25)+(10 * level) + 139.75)/10)*10; // round to nearest 10 - } - return value - } - - var newTnl = newTnl(user.stats.lvl); - if (user.stats.exp > newTnl) { - var percent = user.stats.exp / oldTnl(user.stats.lvl); - percent = (percent>1) ? 1 : percent; - user.stats.exp = newTnl * percent; - - try { - db.users.update( - {_id:user._id}, - {$set: {'stats.exp': user.stats.exp}}, - {multi:true} - ); - } catch(e) { - print(e); - } - - } - -}) \ No newline at end of file diff --git a/migrations/20130307_normalize_algo_values.js b/migrations/20130307_normalize_algo_values.js deleted file mode 100644 index e42faded43..0000000000 --- a/migrations/20130307_normalize_algo_values.js +++ /dev/null @@ -1,47 +0,0 @@ -// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130307_normalize_algo_values.js - -/** - * Users were experiencing a lot of extreme Exp multiplication (https://github.com/lefnire/habitrpg/issues/594). - * This sets things straight, and in preparation for another algorithm overhaul - */ -db.users.find().forEach(function(user){ - if (user.stats.exp >= 3580) { - user.stats.exp = 0; - } - - if (user.stats.lvl > 100) { - user.stats.lvl = 100; - } - - _.each(user.tasks, function(task, key){ - // remove corrupt tasks - if (!task) { - delete user.tasks[key]; - return; - } - - // Fix busted values - if (task.value > 21.27) { - task.value = 21.27; - } - else if (task.value < -47.27) { - task.value = -47.27; - } - }); - - try { - db.users.update( - {_id:user._id}, - {$set: - { - 'stats.lvl': user.stats.lvl, - 'stats.exp': user.stats.exp, - 'tasks' : user.tasks - } - }, - {multi:true} - ); - } catch(e) { - print(e); - } -}) \ No newline at end of file diff --git a/migrations/20130307_remove_duff_histories.js b/migrations/20130307_remove_duff_histories.js deleted file mode 100644 index 6211693a1f..0000000000 --- a/migrations/20130307_remove_duff_histories.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Remove duff histories for dailies - */ -// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130307_remove_duff_histories.js -db.users.find().forEach(function(user){ - - - _.each(user.tasks, function(task, key){ - if (task.type === "daily") { - // remove busted history entries - task.history = _.filter(task.history, function(h){return !!h.value}) - } - }); - - try { - db.users.update( - {_id:user._id}, - {$set: - { - 'tasks' : user.tasks - } - }, - {multi:true} - ); - } catch(e) { - print(e); - } -}) \ No newline at end of file diff --git a/migrations/20130326_migrate_pets.js b/migrations/20130326_migrate_pets.js deleted file mode 100644 index 2e0f0a395b..0000000000 --- a/migrations/20130326_migrate_pets.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Migrate old pets to new system - */ -// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130326_migrate_pets.js - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mapping = { - bearcub: {name:'BearCub', modifier: 'Base'}, - cactus: {name:'Cactus', modifier:'Base'}, - dragon: {name:'Dragon', modifier:'Base'}, - flyingpig: {name:'FlyingPig', modifier:'Base'}, - fox: {name:'Fox', modifier:'Base'}, - lioncub: {name:'LionCub', modifier:'Base'}, - pandacub: {name:'PandaCub', modifier:'Base'}, - tigercub: {name:'TigerCub', modifier:'Base'}, - wolfBorder: {name:'Wolf', modifier:'Base'}, - wolfDesert: {name:'Wolf', modifier:'Desert'}, - wolfGolden: {name:'Wolf', modifier:'Golden'}, - wolfRed: {name:'Wolf', modifier:'Red'}, - wolfShade: {name:'Wolf', modifier:'Shade'}, - wolfSkeleton: {name:'Wolf', modifier:'Skeleton'}, - wolfVeteran: {name:'Wolf', modifier:'Veteran'}, - wolfWhite: {name:'Wolf', modifier:'White'}, - wolfZombie: {name:'Wolf', modifier:'Zombie'} -} - -/** - == Old Style == - pet: Object - icon: "Pet-Wolf-White.png" - index: 14 - name: "wolfWhite" - text: "White Wolf" - value: 3 - pets: Object - bearcub: true - cactus: true - - == New Style == - currentPet: Object - modifier: "Red" - name: "Wolf" - notes: "Find some Hatching Powder to sprinkle on this egg, and one day it will hatch into a loyal pet." - str: "Wolf-Red" - text: "Wolf" - value: 3 - pets: Array - 0: "PandaCub-Base" - 1: "Wolf-Base" - */ - - -db.users.find().forEach(function(user){ - if (!user.items || (!user.items.pets && !user.items.pet)) return; - - // migrate items.pet to items.currentPet - if (!!user.items.pet) { - var mapped = mapping[user.items.pet.name]; - delete user.items.pet; - user.items.currentPet = { - modifier: mapped.modifier, - name: mapped.name, - str: mapped.name + "-" + mapped.modifier, - text: '' // FIXME? - } - } - - // migrate items.pets - if (!!user.items.pets) { - var newPets = []; - _.each(user.items.pets, function(val, key){ - if (_.isNumber(key)) { - newPets.push(val) - //FIXME why is this happening? seems the user gets migrated already... - //throw "Error: User appears already migrated, this shouldn't be happening!" - } else { - newPets.push(mapping[key].name + "-" + mapping[key].modifier); - } - }); - user.items.pets = newPets; - } - - try { - db.users.update( - {_id:user._id}, - {$set: - { 'items' : user.items } - } - ); - } catch(e) { - print(e); - } -}) \ No newline at end of file diff --git a/migrations/20130327_apply_tokens.js b/migrations/20130327_apply_tokens.js deleted file mode 100644 index e277db38fd..0000000000 --- a/migrations/20130327_apply_tokens.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Applies backer tokens & items (this file will be updated periodically - */ - -// mongo habitrpg ./node_modules/underscore/underscore.js migrations/20130327_apply_tokens.js - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mapping = [ - { - tier: 1, - tokens: 0, - users: [] - }, - { - tier: 5, - tokens: 20, - users: [] - }, - { - tier: 10, - tokens: 50, - users: [] - }, - { - tier: 15, - tokens: 100, - users: [] - }, - { - tier: 30, - tokens: 150, - users: [] - }, - { - tier: 45, - tokens: 170, - users: [] - }, - { - tier: 60, - tokens: 200, - users: [] - }, - { - tier: 70, - tokens: 240, - users: [] - }, - { - tier: 80, - tokens: 240, - users: [] - }, - { - tier: 90, - tokens: 280, - users: [] - }, - { - tier: 300, - tokens: 500, - users: [] - }, - { - tier: 800, - tokens: 500, - users: [] - } -]; - -db.users.find().forEach(function(user){ - if (!user._id) return; - - var possibleUserIds = [user._id]; - if (!!user.local) { - if (!!user.local.username) possibleUserIds.push(user.local.username); - if (!!user.local.email) possibleUserIds.push(user.local.email); - } - - _.each(mapping, function(tier){ - var userInTier = !_.isEmpty(_.intersection(tier.users, possibleUserIds)); - if (userInTier) { - var tokenInc = 0, - backer = user.backer || {}; - if (!backer.tokensApplied) { - tokenInc = tier.tokens; - backer.tokensApplied = true; - } - backer.tier = tier.tier; - - try { - db.users.update( - {_id:user._id}, - { - $set: { backer: backer, 'flags.ads': 'hide' }, - $inc: { balance: (tokenInc/4) } - } - ); - } catch(e) { - print(e); - } - } - }) - -}) \ No newline at end of file diff --git a/migrations/20130503_max_gear_achievement.js b/migrations/20130503_max_gear_achievement.js deleted file mode 100644 index d6be25558a..0000000000 --- a/migrations/20130503_max_gear_achievement.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * For users who already have max gear, they earned the achievement - */ -// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130503_max_gear_achievement.js -db.users.find().forEach(function(user){ - var items = user.items; - if (!items) { return; } - if ( parseInt(items.armor) == 5 && - parseInt(items.head) == 5 && - parseInt(items.shield) == 5 && - parseInt(items.weapon) == 6) { - - try { - db.users.update( - {_id:user._id}, - {$set: {'achievements.ultimateGear':true}} - ); - } catch(e) { - print(e); - } - } -}) \ No newline at end of file diff --git a/migrations/20130508_add_backer_pets.js b/migrations/20130508_add_backer_pets.js deleted file mode 100644 index 2a9744af2a..0000000000 --- a/migrations/20130508_add_backer_pets.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({'backer.tier':{$gte:80}}, {$push:{'items.pets':'Wolf-Cerberus'}}, {multi:true}); \ No newline at end of file diff --git a/migrations/20130602_survey_rewards.js b/migrations/20130602_survey_rewards.js deleted file mode 100644 index 98ae8106c2..0000000000 --- a/migrations/20130602_survey_rewards.js +++ /dev/null @@ -1,31 +0,0 @@ -//mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130602_survey_rewards.js - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var members = [] -members = _.uniq(members); - -var query = { - _id: {$exists:1}, - $or:[ - {_id: {$in: members}}, - //{'profile.name': {$in: members}}, - {'auth.facebook.name': {$in: members}}, - {'auth.local.username': {$in: members}}, - {'auth.local.email': {$in: members}} - ] -}; - -print(db.users.count(query)); - -db.users.update(query, - { - $set: { 'achievements.helpedHabit': true }, - $inc: { balance: 2.5 } - }, - {multi:true} -) \ No newline at end of file diff --git a/migrations/20130612_survey_rewards_individual.js b/migrations/20130612_survey_rewards_individual.js deleted file mode 100644 index 1d3fbf3317..0000000000 --- a/migrations/20130612_survey_rewards_individual.js +++ /dev/null @@ -1,9 +0,0 @@ -//mongo habitrpg migrations/20130612_survey_rewards_individual.js - -var query = {_id: ""}; - -db.users.update(query, - { - $set: { 'achievements.helpedHabit': true }, - $inc: { balance: 2.5 } - }) \ No newline at end of file diff --git a/migrations/20130615_add_extra_indexes.js b/migrations/20130615_add_extra_indexes.js deleted file mode 100644 index 2673568184..0000000000 --- a/migrations/20130615_add_extra_indexes.js +++ /dev/null @@ -1,4 +0,0 @@ -db.users.ensureIndex( { _id: 1, apiToken: 1 }, {background: true} ) -db.groups.ensureIndex( { members: 1 }, {background: true} ) -db.groups.ensureIndex( { type: 1 }, {background: true} ) -db.groups.ensureIndex( { type: 1, privacy: 1 }, {background: true} ) \ No newline at end of file diff --git a/migrations/20130908_cleanup_corrupt_tags.js b/migrations/20130908_cleanup_corrupt_tags.js deleted file mode 100644 index 2dce073bbc..0000000000 --- a/migrations/20130908_cleanup_corrupt_tags.js +++ /dev/null @@ -1,16 +0,0 @@ -//mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130908_cleanup_corrupt_tags.js - -// Racer was notorious for adding duplicates, randomly deleting documents, etc. Once we pull the plug on old.habit, -// run this migration to cleanup all the corruption - -db.users.find().forEach(function(user){ - user.tags = _.filter(user.tags, (function(t) { - return !!t ? t.id : false; - })); - - try { - db.users.update({_id:user._id}, {$set:{tags:user.tags}}); - } catch(e) { - print(e); - } -}) diff --git a/migrations/20131022_purchased_and_newStuff.js b/migrations/20131022_purchased_and_newStuff.js deleted file mode 100644 index 862d9e107f..0000000000 --- a/migrations/20131022_purchased_and_newStuff.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.find().forEach(function(user){ - if (!user.purchased) user.purchased = {hair: {}, skin: {}}; - user.purchased.ads = user.flags && !!user.flags.ads; - db.users.update({_id:user._id}, {$set:{'purchased': user.purchased, 'flags.newStuff': true}, $unset: {'flags.ads':1}}); -}); \ No newline at end of file diff --git a/migrations/20131022_restore_ads.js b/migrations/20131022_restore_ads.js deleted file mode 100644 index 6261990664..0000000000 --- a/migrations/20131022_restore_ads.js +++ /dev/null @@ -1,12 +0,0 @@ -// node .migrations/20131022_restore_ads.js -var mongo = require('mongoskin'); -var _ = require('lodash'); -var dbBackup = mongo.db('localhost:27017/habitrpg?auto_reconnect'); -var dbLive = mongo.db('localhost:27017/habitrpg2?auto_reconnect'); -var count = 89474; -dbBackup.collection('users').findEach({$or: [{'flags.ads':'show'}, {'flags.ads': null}]}, {batchSize:10}, function(err, item) { - if (err) return console.error({err:err}); - if (!item || !item._id) return console.error('blank user'); - dbLive.collection('users').update({_id:item._id}, {$set:{'purchased.ads':false}, $unset: {'flags.ads': 1}}); - if (--count <= 0) console.log("DONE!"); -}); \ No newline at end of file diff --git a/migrations/20131102_restore_task_ids.js b/migrations/20131102_restore_task_ids.js deleted file mode 100644 index 260675fbf5..0000000000 --- a/migrations/20131102_restore_task_ids.js +++ /dev/null @@ -1,25 +0,0 @@ -// mongo habitrpg ./node_modules/lodash/lodash.js ./migrations/20131028_task_subdocs_tags_invites.js - -db.challenges.find().forEach(function(chal){ - _.each(chal.habits.concat(chal.dailys).concat(chal.todos).concat(chal.rewards), function(task){ - task.id = task.id || task._id; - }) - try { - db.challenges.update({_id:chal._id}, chal); - db.groups.update({_id:chal.group}, {$addToSet:{challenges:chal._id}}) - } catch(e) { - print(e); - } -}); - -db.users.find().forEach(function(user){ - _.each(user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards), function(task){ - task.id = task.id || task._id; - }) - try { - db.users.update({_id:user._id}, user); - } catch(e) { - print(e); - } -}); - diff --git a/migrations/20131104_remove_invalid_dues.js b/migrations/20131104_remove_invalid_dues.js deleted file mode 100644 index 8ebf89afaf..0000000000 --- a/migrations/20131104_remove_invalid_dues.js +++ /dev/null @@ -1,7 +0,0 @@ -db.users.find({},{todos:1}).forEach(function(user){ - _.each(user.todos, function(task){ - if (moment(task.date).toDate() == 'Invalid Date') - task.date = moment().format('MM/DD/YYYY'); - }) - db.users.update({_id:user._id}, {$set:{todos: user.todos}}); -}); \ No newline at end of file diff --git a/migrations/20131105_remove_history_ids.js b/migrations/20131105_remove_history_ids.js deleted file mode 100644 index 9ddbff620e..0000000000 --- a/migrations/20131105_remove_history_ids.js +++ /dev/null @@ -1,21 +0,0 @@ -function deleteId(h){ - delete h._id; -} - -db.users.find({},{habits:1,dailys:1,history:1}).forEach(function(user){ - if (user.history) { - _.each(['todos','exp'], function(type){ - if (user.history[type]) { - _.each(user.history.exp, deleteId); - } - }) - } else { - user.history = {exp:[],todos:[]}; - } - - _.each(['habits', 'dailys'], function(type){ - _.each(user[type].history, deleteId); - }); - - db.users.update({_id:user._id}, {$set:{history: user.history, habits: user.habits, dailys: user.dailys}}); -}); \ No newline at end of file diff --git a/migrations/20131108_add_gems_for_contribs.js b/migrations/20131108_add_gems_for_contribs.js deleted file mode 100644 index 03ff44e721..0000000000 --- a/migrations/20131108_add_gems_for_contribs.js +++ /dev/null @@ -1,4 +0,0 @@ -// Increase everyone's gems per their contribution level -db.users.find({'contributor.level':{$gt:0}},{contributor:1, balance:1}).forEach(function(user){ - db.users.update({_id:user._id}, {$inc: {balance: (user.contributor.level * .5)} }); -}); \ No newline at end of file diff --git a/migrations/20131111_task_NaN.js b/migrations/20131111_task_NaN.js deleted file mode 100644 index 16e6788003..0000000000 --- a/migrations/20131111_task_NaN.js +++ /dev/null @@ -1,15 +0,0 @@ -// This migration has already been run in the past. It's vital to fix these users presently, but we need to find -// out why task values are ever getting in as NaN. My guess is API PUT /tasks/:tid routes -db.users.find({},{habits:1,dailys:1,todos:1,rewards:1}).forEach(function(user){ - _.each(['habits','dailys','todos','rewards'], function(type){ - _.each(user[type], function(task){ - task.value = +task.value; - if (_.isNaN(task.value)) { - task.value = 0; - print(user._id); - } - }) - }) - - db.users.update({_id:user._id}, {$set:{habits: user.habits, dailys: user.dailys, todos: user.todos, rewards: user.rewards}}); -}); \ No newline at end of file diff --git a/migrations/20131114_migrate_websites_to_blurb.js b/migrations/20131114_migrate_websites_to_blurb.js deleted file mode 100644 index e2bbdd9fcb..0000000000 --- a/migrations/20131114_migrate_websites_to_blurb.js +++ /dev/null @@ -1,14 +0,0 @@ -// Migrate all users websites to the profile blurb field -db.users.find({'profile.websites':{$exists: true}}).forEach(function(user){ - db.users.update({_id: user._id}, { - $set: {"profile.blurb": user.profile.blurb + '\n * ' + user.profile.websites.join('\n * ')}, - $unset: {'profile.websites': 1} - }) -}) - -db.groups.find({'websites.0':{$exists: true}}).forEach(function(group){ - db.groups.update({_id: group._id}, { - $set: {"description": group.description + '\n * ' + group.websites.join('\n * ')}, - $unset: {websites: 1} - }) -}) diff --git a/migrations/20131115_update_gear_preferences.js b/migrations/20131115_update_gear_preferences.js deleted file mode 100644 index 9ec1264b2f..0000000000 --- a/migrations/20131115_update_gear_preferences.js +++ /dev/null @@ -1,10 +0,0 @@ -//Add defaults to show gears in all users -db.users.update( - {}, - {$set:{ - 'preferences.showWeapon': true, - 'preferences.showShield': true, - 'preferences.showArmor': true, - }}, - {multi:true} -) diff --git a/migrations/20131117_fix_task_types.js b/migrations/20131117_fix_task_types.js deleted file mode 100644 index 14d86cb55f..0000000000 --- a/migrations/20131117_fix_task_types.js +++ /dev/null @@ -1,18 +0,0 @@ -// TODO figure out why this is happening in the first place - -db.users.find({},{habits:1, dailys:1, todos:1, rewards:1}).forEach(function(user){ - _.each(user.habits, function(task){ - task.type = 'habit'; - }) - _.each(user.dailys, function(task){ - task.type = 'daily'; - }) - _.each(user.todos, function(task){ - task.type = 'todo'; - }) - _.each(user.rewards, function(task){ - task.type = 'reward'; - }) - - db.users.update({_id:user._id}, {$set:{habits: user.habits, dailys: user.dailys, todos: user.todos, rewards: user.rewards}}); -}); diff --git a/migrations/20131117_remove_undefined_pets.js b/migrations/20131117_remove_undefined_pets.js deleted file mode 100644 index f908621a75..0000000000 --- a/migrations/20131117_remove_undefined_pets.js +++ /dev/null @@ -1,12 +0,0 @@ -// once and for all! - -db.users.find({'items.pets':{$exists:1}},{'items.pets':1}).forEach(function(user){ - _.reduce(user.items.pets, function(m,v,k){ - if (!k.indexOf('undefined')) m.push(k); - return m; - }, []).forEach(function(key){ - delete user.items.pets[key]; - }) - - db.users.update({_id:user._id}, { $set:{'items.pets':user.items.pets} }); -}); diff --git a/migrations/20131122_deleted_tags.js b/migrations/20131122_deleted_tags.js deleted file mode 100644 index e915390041..0000000000 --- a/migrations/20131122_deleted_tags.js +++ /dev/null @@ -1,13 +0,0 @@ -// Cleanup broken tags -// ------------------------- -db.users.find().forEach(function(user){ - var tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards); - - _.each(tasks, function(task){ - _.each(task.tags, function(value, key){ //value is true, key is tag.id - if (!_.find(user.tags,{id:key})) delete task.tags[key]; - }); - }); - - db.users.update({_id:user._id}, user); -}); \ No newline at end of file diff --git a/migrations/20131123_set_default_party_order.js b/migrations/20131123_set_default_party_order.js deleted file mode 100644 index 970e37e05b..0000000000 --- a/migrations/20131123_set_default_party_order.js +++ /dev/null @@ -1,8 +0,0 @@ -//Add default to randomize party members list -db.users.update( - {}, - {$set:{ - 'party.order': 'random', - }}, - {multi:true} -) diff --git a/migrations/20131126_clean_dayStart.js b/migrations/20131126_clean_dayStart.js deleted file mode 100644 index b2001ec7c2..0000000000 --- a/migrations/20131126_clean_dayStart.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.find({'preferences.dayStart':{$exists:1}},{'preferences.dayStart':1}).forEach(function(user){ - var dayStart = +user.preferences.dayStart; - dayStart = (_.isNaN(dayStart) || dayStart < 0 || dayStart > 24) ? 0 : dayStart; - db.users.update({_id:user._id}, {$set:{'preferences.dayStart':dayStart}}); -}); diff --git a/migrations/20131126_turkey_pet.js b/migrations/20131126_turkey_pet.js deleted file mode 100644 index 568e38b237..0000000000 --- a/migrations/20131126_turkey_pet.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({},{$set:{'items.pets.Turkey-Base':5, 'flags.newStuff':true}}, {multi:true}); \ No newline at end of file diff --git a/migrations/20131127_restore_dayStart.js b/migrations/20131127_restore_dayStart.js deleted file mode 100644 index fd9aba3618..0000000000 --- a/migrations/20131127_restore_dayStart.js +++ /dev/null @@ -1,38 +0,0 @@ -// node .migrations/20131127_restore_dayStart.js - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); -var liveUsers = mongo.db('localhost:27017/habitrpg_new?auto_reconnect').collection('users'); - -var query = {'preferences.dayStart':{$exists:1,$ne:0}}; -var select = {'preferences.dayStart': 1}; - -backupUsers.count(query, function(err, count){ - if (err) return console.error(err); - backupUsers.findEach(query, select, {batchSize:20}, function(err, before){ - if (err) return console.error(err); - if (!before) { count--; return console.log('!before'); } - liveUsers.findById(before._id, function(err, after){ - if (err) return console.error(err); - if (!after) { count--; return console.log(before._id + ' deleted?'); } - - var dayStart = +before.preferences.dayStart; - if (after.preferences.dayStart == 0 && dayStart != 0){ - dayStart = (_.isNaN(dayStart) || dayStart < 0 || dayStart > 24) ? 0 : dayStart; - } else { - dayStart = after.preferences.dayStart; - } - - liveUsers.update({_id:after._id}, {$inc:{_v:1}, $set:{'preferences.dayStart':dayStart}}); - if (--count <= 0) console.log("DONE!"); - }) - }); -}); \ No newline at end of file diff --git a/migrations/20131221_restore_NaN_history.js b/migrations/20131221_restore_NaN_history.js deleted file mode 100644 index f0d6d90093..0000000000 --- a/migrations/20131221_restore_NaN_history.js +++ /dev/null @@ -1,51 +0,0 @@ -// node .migrations/20131221_restore_NaN_history.js - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -/** - * After the classes migration, users lost some history entries - */ -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); -var liveUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); - -function filterNaNs(h) { - return h && _.isNumber(+h.value) && !_.isNaN(+h.value); -} - -var fields = {history:1,habits:1,dailys:1,migration:1}; -var count = 0; -liveUsers.findEach({migration: {$ne:'20131221_restore_NaN_history'}}, fields, {batchSize:500}, function(err, after){ - if (!after) err = '!after'; - if (err) {count++;return console.error(err);} - - backupUsers.findById(after._id, fields, function(err, before){ - if (err) {count++;return console.error(err);} - - _.each(['todos','exp'],function(type){ - if (!_.isEmpty(after.history[type])) - after.history[type] = _.filter(after.history[type], filterNaNs); - if (before && !_.isEmpty(before.history[type])) - after.history[type] = before.history[type].concat(after.history[type]); - }) - - _.each(['habits','dailys'], function(type){ - _.each(after[type], function(t){ - t.history = _.filter(t.history, filterNaNs); - var found = before && _.find(before[type],{id:t.id}); - if (found && found.history) t.history = found.history.concat(t.history); - }) - }) - - liveUsers.update({_id:after._id}, {$set:{history:after.history, dailys:after.dailys, habits:after.habits, migration:'20131221_restore_NaN_history'}, $inc:{_v:1}}); - //if (--count <= 0) console.log("DONE! " + after._id); - if (++count%1000 == 0) console.log(count); - if (after._id == '9') console.log('lefnire processed'); - }) -}); \ No newline at end of file diff --git a/migrations/20131225_restore_streaks.js b/migrations/20131225_restore_streaks.js deleted file mode 100644 index c07a3828f3..0000000000 --- a/migrations/20131225_restore_streaks.js +++ /dev/null @@ -1,38 +0,0 @@ -// node .migrations/20131225_restore_streaks.js - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -/** - * After the classes migration, users lost some history entries - */ -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); -var liveUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); - -var fields = {dailys:1,migration:1}; -var count = 0; -liveUsers.findEach({migration: {$ne:'20131225_restore_streaks'}}, fields, {batchSize:250}, function(err, after){ - if (!after) err = '!after'; - if (err) {count++;return console.error(err);} - - backupUsers.findById(after._id, fields, function(err, before){ - if (!before) err = '!before'; - if (err) {count++;return console.error(err);} - - _.each(before.dailys,function(d){ - var found = _.find(after.dailys,{id: d.id}); - if (found && !found.streak) found.streak = d.streak; - }) - - liveUsers.update({_id:after._id}, {$set:{dailys:after.dailys, migration:'20131225_restore_streaks'}, $inc:{_v:1}}); - //if (--count <= 0) console.log("DONE! " + after._id); - if (++count%1000 == 0) console.log(count); - if (after._id == '9') console.log('lefnire processed'); - }) -}); \ No newline at end of file diff --git a/migrations/20140119_task_creation_completion_dates.js b/migrations/20140119_task_creation_completion_dates.js deleted file mode 100644 index 9176b744ac..0000000000 --- a/migrations/20140119_task_creation_completion_dates.js +++ /dev/null @@ -1,8 +0,0 @@ -db.users.find({},{todos:1,dailys:1,rewards:1,habits:1}).forEach(function(user){ - _.each(user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards), function(t){ - t.dateCreated = t.created || new Date; - delete t.created; - if (t.type == 'todo' && t.completed) t.dateCompleted = new Date; - }) - db.users.update({_id:user._id}, {$set:{habits:user.habits,dailys:user.dailys,todos:user.todos,rewards:user.rewards}}); -}); diff --git a/migrations/20140130_birthdayEnd.js b/migrations/20140130_birthdayEnd.js deleted file mode 100644 index a9a8eb93bc..0000000000 --- a/migrations/20140130_birthdayEnd.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({},{$set:{'achievements.habitBirthday':true}},{multi:1}) diff --git a/migrations/20140130_birthdayStart.js b/migrations/20140130_birthdayStart.js deleted file mode 100644 index f022168bcd..0000000000 --- a/migrations/20140130_birthdayStart.js +++ /dev/null @@ -1,12 +0,0 @@ -db.users.update({},{$set:{ - 'items.food.Cake_Skeleton':1, - 'items.food.Cake_Base':1, - 'items.food.Cake_CottonCandyBlue':1, - 'items.food.Cake_CottonCandyPink':1, - 'items.food.Cake_Shade':1, - 'items.food.Cake_White':1, - 'items.food.Cake_Golden':1, - 'items.food.Cake_Zombie':1, - 'items.food.Cake_Desert':1, - 'items.food.Cake_Red':1 -}},{multi:1}) diff --git a/migrations/20140220_challenge_memberCount.js b/migrations/20140220_challenge_memberCount.js deleted file mode 100644 index 1b83408943..0000000000 --- a/migrations/20140220_challenge_memberCount.js +++ /dev/null @@ -1,3 +0,0 @@ -db.challenges.find({},{members:1}).forEach(function(chal){ - db.challenges.update({_id:chal._id}, {$set:{memberCount:chal.members.length}}); -}); diff --git a/migrations/20140301_missing_mysteries.js b/migrations/20140301_missing_mysteries.js deleted file mode 100644 index a244e3f3db..0000000000 --- a/migrations/20140301_missing_mysteries.js +++ /dev/null @@ -1,14 +0,0 @@ -db.users.update( - { - 'purchased.plan.dateCreated':{$gte:new Date('2014-02-22'),$lt:new Date('2014-02-29')}, - 'items.gear.owned.armor_mystery_201402':null, - 'items.gear.owned.head_mystery_201402': null, - 'items.gear.owned.back_mystery_201402': null, - 'purchased.plan.mysteryItems':{$nin:['armor_mystery_201402','head_mystery_201402','back_mystery_201402']} - }, - //{_id:1,'purchased.plan':1,'items.gear.owned':1} - {$push: {'purchased.plan.mysteryItems':{$each:['armor_mystery_201402','head_mystery_201402','back_mystery_201402']}}}, - {multi:true} -)/*.forEach(function(user){ - printjson(user); - });*/ diff --git a/migrations/20140610_missing_backer_mount.js b/migrations/20140610_missing_backer_mount.js deleted file mode 100644 index 5dd28af9da..0000000000 --- a/migrations/20140610_missing_backer_mount.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({'backer.tier':{$gt:69}},{$set:{'items.mounts.LionCub-Ethereal':true}},{multi:1}) \ No newline at end of file diff --git a/migrations/20140712_wiped_quest_membership.js b/migrations/20140712_wiped_quest_membership.js deleted file mode 100644 index f8985e7c77..0000000000 --- a/migrations/20140712_wiped_quest_membership.js +++ /dev/null @@ -1,11 +0,0 @@ -//mongo habitrpg node_modules/lodash/lodash.js ./migrations/20140712_wiped_quest_membership.js -db.groups.find({type:'party','quest.key':{$ne:null},'quest.active':true},{quest:1}).forEach(function(group){ - var activeMembers = _.reduce(group.quest.members, function(m,v,k){ - if (v===true) m.push(k); return m; - },[]); - db.users.update( - {_id:{$in: activeMembers}}, - {$set:{'party.quest.key':group.quest.key,'party.quest.completed':null}}, - {multi:true} - ); -}); diff --git a/migrations/20140803_remove_undefined_notifications.js b/migrations/20140803_remove_undefined_notifications.js deleted file mode 100644 index fe0d143a56..0000000000 --- a/migrations/20140803_remove_undefined_notifications.js +++ /dev/null @@ -1,13 +0,0 @@ -var _ = require('lodash'); - -db.users.find({}).forEach(function(user){ - var newNewMessages = {}; - - _.each(user.newMessages, function(val, key){ - if(key != "undefined"){ - newNewMessages[key] = val; - }; - }); - - db.users.update({_id: user._id}, {$set: {'newMessages': newNewMessages}}); -}); diff --git a/migrations/20140829_change_headAccessory_to_eyewear.js b/migrations/20140829_change_headAccessory_to_eyewear.js deleted file mode 100644 index 9940fb5013..0000000000 --- a/migrations/20140829_change_headAccessory_to_eyewear.js +++ /dev/null @@ -1,81 +0,0 @@ -// node .migrations/20140829_change_headAccessory_to_eyewear.js - -var migrationName = '20140829_change_headAccessory_to_eyewear'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -/** - * https://github.com/HabitRPG/habitrpg/issues/3645 - */ -var mongo = require('mongoskin'); -var _ = require('lodash'); -var liveUsers = mongo.db('localhost:27017/habitrpg2?auto_reconnect').collection('users'); - -var fields = {'migration':1, - 'items.gear.costume.headAccessory':1, - 'items.gear.equipped.headAccessory':1, - 'items.gear.owned.headAccessory_special_wondercon_black':1, - 'items.gear.owned.headAccessory_special_wondercon_red':1, - 'items.gear.owned.headAccessory_special_summerRogue':1, - 'items.gear.owned.headAccessory_special_summerWarrior':1 - }; - -var progressCount = 1000; -var count = 0; -liveUsers.findEach({ $and: [ - { migration: {$ne:migrationName} }, - { $or: [ - {'items.gear.owned.headAccessory_special_summerRogue': {'$exists':true}}, - {'items.gear.owned.headAccessory_special_summerWarrior':{'$exists':true}}, - {'items.gear.owned.headAccessory_special_wondercon_red':{'$exists':true}}, - {'items.gear.owned.headAccessory_special_wondercon_black':{'$exists':true}} - ]} -]}, fields, {batchSize:250}, function(err, user){ - count++; - if (!user) err = '!user'; - if (err) {return console.error(err);} - - var set = {'migration': migrationName}; - var unset = {}; - - var oldToNew = { - 'headAccessory_special_summerRogue': 'eyewear_special_summerRogue', - 'headAccessory_special_summerWarrior': 'eyewear_special_summerWarrior', - 'headAccessory_special_wondercon_red': 'eyewear_special_wondercon_red', - 'headAccessory_special_wondercon_black':'eyewear_special_wondercon_black' - }; - - // items.gear.costume, items.gear.equipped: - _.each(['costume','equipped'],function(type){ - _.each(oldToNew,function(newName,oldName){ - if (user.items.gear[type].headAccessory === oldName) { - unset['items.gear.'+type+'.headAccessory'] = ""; - set['items.gear.'+type+'.eyewear'] = newName; - } - }); - }); - - // items.gear.owned: - _.each(oldToNew,function(newName,oldName){ - if (oldName in user.items.gear.owned) { - unset['items.gear.owned.'+oldName] = ""; - set['items.gear.owned.'+newName] = user.items.gear.owned[oldName]; - } - }); - - //console.log(JSON.stringify(user, null, " ")); - //console.log("set: " + JSON.stringify(set, null, " ")); - //console.log("unset: " + JSON.stringify(unset, null, " ")); - - liveUsers.update({_id:user._id}, {$set:set, $unset:unset, $inc:{_v:1}}); - - if (count%progressCount == 0) console.log(count + ' ' + user._id); - if (user._id == '9') console.log('lefnire processed'); - if (user._id == authorUuid) console.log(authorName + ' processed'); -}); diff --git a/migrations/20140831_increase_gems_for_previous_contributions.js b/migrations/20140831_increase_gems_for_previous_contributions.js deleted file mode 100644 index 164dda444b..0000000000 --- a/migrations/20140831_increase_gems_for_previous_contributions.js +++ /dev/null @@ -1,131 +0,0 @@ -// IMPORTANT: -// -// run like this to capture all output: -// -// node 20140831_increase_gems_for_previous_contributions.js > 20140831_increase_gems_for_previous_contributions_output.txt - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var migrationName = '20140831_increase_gems_for_previous_contributions'; - -/** - * https://github.com/HabitRPG/habitrpg/issues/3933 - * Increase Number of Gems for Contributors - * author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) - * - * Increase everyone's gems per their contribution level. - * Originally they were given 2 gems per tier. - * Now they are given 3 gems per tier for tiers 1,2,3 - * and 4 gems per tier for tiers 4,5,6,7 - * So that means an EXTRA 1 for tier 1, - * 2 for tier 2, - * 3 for tier 3, - * 5 for tier 4, - * 7 for tier 5, - * 9 for tier 6, - * 11 for tier 7, - * 11 for tier 8 (moderators = tier 7 + admin privileges), - * none for tier 9 (staff) - */ - -var mongo = require('mongoskin'); -var _ = require('lodash'); - - -var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); - - -var query = { - 'contributor.level': {$gt: 0, $lt: 9}, - 'migration': {$ne: migrationName} -}; - -var fields = { - 'migration':1, - 'contributor.level':1, - 'balance':1 -}; - -var userResults = {}; // each key is a UUID, each value is a string - // describing what changed for that user - -console.warn('Updating users...'); -var progressCount = 50; -var count = 0; -dbUsers.findEach(query, fields, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All users found. Fetching final balances...'); - return fetchFinalBalances(); - } - count++; - - var set = {'migration': migrationName}; - - var tier = user.contributor.level; - var extraGems = tier; // tiers 1,2,3 - if (tier > 3) { extraGems = 3 + (tier - 3) * 2; } - if (tier == 8) { extraGems = 11; } - var extraBalance = extraGems / 4; - set['balance'] = user.balance + extraBalance; - - // Capture current state of user: - userResults[user._id] = - user._id + ' ' + ':\n' + - ' contrib tier : ' + tier + '\n' + - ' balance before : ' + user.balance + '\n' + - ' balance (gems) added : ' + extraBalance + ' (' + - extraGems + ')' + '\n' + - ' expected balance after: ' + (user.balance + extraBalance) + '\n'; - - // Update user: - dbUsers.update({_id:user._id}, {$set:set, $inc:{_v:1}}); - if (count%progressCount == 0) console.warn(count + ' ' + user._id); -}); - - -function fetchFinalBalances() { - var query = {_id: {$in: Object.keys(userResults)}}; - var fields = { - 'balance':1, - }; - - var count1 = 0; - dbUsers.findEach(query, fields, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All final balances found.'); - return displayData(); - } - count1++; - userResults[user._id] = userResults[user._id] + - user._id + ' ' + ':\n' + - ' actual balance after : ' + user.balance + '\n'; - if (count1%progressCount == 0) console.warn(count1 + ' ' + user._id); - }); -} - - -function displayData() { - _.each(userResults, function(text, uuid) { - console.log(text); // text contains uuid - }); - console.log('\n' + count + - ' users processed (should be roughly 335 according to the Hall)\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20140914_upgrade_admin_contrib_tiers.js b/migrations/20140914_upgrade_admin_contrib_tiers.js deleted file mode 100644 index 7962b7dfde..0000000000 --- a/migrations/20140914_upgrade_admin_contrib_tiers.js +++ /dev/null @@ -1,79 +0,0 @@ -var migrationName = '20140914_upgrade_admin_contrib_tiers'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/** - * https://github.com/HabitRPG/habitrpg/issues/3801 - * Convert Tier 8 contributors to Tier 9 (staff) (all current Tier 8s are admins). - * Convert Tier 7 contributors with admin flag to Tier 8 (moderators). - */ - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); - -var query = - { 'contributor.level':{$gte:7}, 'contributor.admin':true, 'migration': {$ne: migrationName} }; - -var fields = {'migration':1, - 'contributor.admin':1, - 'contributor.level':1, - 'auth.local.username':1, - 'profile.name':1, - }; - -var userResults = {}; // each key is a UUID, each value is a username; - // contains only the users changed - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - var set = {'migration': migrationName}; - var inc = {'contributor.level':1, _v:1}; - - userResults[user._id] = user.profile.name; - - dbUsers.update({_id:user._id}, {$set:set, $inc:inc}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); - if (user._id == '9' ) console.warn('lefnire' + ' processed'); -}); - - -function displayData() { - console.log('users modified:'); - _.each(userResults, function(name, uuid) { - console.log(name); - }); - console.warn('\n' + count + - ' users processed (should be 11 according to the Hall)\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20140922_free_candy.js b/migrations/20140922_free_candy.js deleted file mode 100644 index 77cc221462..0000000000 --- a/migrations/20140922_free_candy.js +++ /dev/null @@ -1,18 +0,0 @@ -db.users.update( - {}, - { - $inc: { - 'items.food.Candy_Base':1, - 'items.food.Candy_CottonCandyBlue':1, - 'items.food.Candy_CottonCandyPink':1, - 'items.food.Candy_Desert':1, - 'items.food.Candy_Golden':1, - 'items.food.Candy_Red':1, - 'items.food.Candy_Shade':1, - 'items.food.Candy_Skeleton':1, - 'items.food.Candy_White':1, - 'items.food.Candy_Zombie':1 - } - }, - {multi:1} -); \ No newline at end of file diff --git a/migrations/20141006_jackolantern_pet.js b/migrations/20141006_jackolantern_pet.js deleted file mode 100644 index f09c38d9f3..0000000000 --- a/migrations/20141006_jackolantern_pet.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({_id:'9'},{$set:{'items.pets.JackOLantern-Base':5, 'flags.newStuff':true}}, {multi:true}); \ No newline at end of file diff --git a/migrations/20141126_turkey_mounts.js b/migrations/20141126_turkey_mounts.js deleted file mode 100644 index 1270390c06..0000000000 --- a/migrations/20141126_turkey_mounts.js +++ /dev/null @@ -1,11 +0,0 @@ -db.users.update( - {'items.pets.Turkey-Base':{$ne:null}}, - {$set:{'items.mounts.Turkey-Base':true}}, - {multi:1} -) - -db.users.update( - {'items.pets.Turkey-Base':null}, - {$set:{'items.pets.Turkey-Base':5}}, - {multi:1} -) \ No newline at end of file diff --git a/migrations/20141211_NaN_consecutives.js b/migrations/20141211_NaN_consecutives.js deleted file mode 100644 index 2822df0267..0000000000 --- a/migrations/20141211_NaN_consecutives.js +++ /dev/null @@ -1,4 +0,0 @@ -db.users.update({'purchased.plan.consecutive.count':NaN}, {$set:{'purchased.plan.consecutive.count':0}}, {multi:1}); -db.users.update({'purchased.plan.consecutive.offset':NaN}, {$set:{'purchased.plan.consecutive.offset':0}}, {multi:1}); -db.users.update({'purchased.plan.consecutive.gemCapExtra':NaN}, {$set:{'purchased.plan.consecutive.gemCapExtra':0}}, {multi:1}); -db.users.update({'purchased.plan.consecutive.trinkets':NaN}, {$set:{'purchased.plan.consecutive.trinkets':0}}, {multi:1}); \ No newline at end of file diff --git a/migrations/20141230_new_years_hats.js b/migrations/20141230_new_years_hats.js deleted file mode 100644 index 595027be0a..0000000000 --- a/migrations/20141230_new_years_hats.js +++ /dev/null @@ -1,11 +0,0 @@ -db.users.update( - {'items.gear.owned.head_special_nye':{$ne:null}}, - {$set:{'items.gear.owned.head_special_nye2014':false}}, - {multi:1} -) - -db.users.update( - {'items.gear.owned.head_special_nye':null}, - {$set:{'items.gear.owned.head_special_nye':false}}, - {multi:1} -) diff --git a/migrations/20150107_plan_dateUpdated_null.js b/migrations/20150107_plan_dateUpdated_null.js deleted file mode 100644 index 6e03b41a55..0000000000 --- a/migrations/20150107_plan_dateUpdated_null.js +++ /dev/null @@ -1,8 +0,0 @@ -db.users.update( - {'purchased.plan.customerId':{$ne:null}, 'purchased.plan.dateUpdated':null}, - { - $set: {'purchased.plan.dateUpdated': new Date('12/01/2014')}, - $unset: {'purchased.plan.datedUpdated':''} - }, - {multi:true} -); diff --git a/migrations/20150124_mountmaster_fix.js b/migrations/20150124_mountmaster_fix.js deleted file mode 100644 index 874faea22c..0000000000 --- a/migrations/20150124_mountmaster_fix.js +++ /dev/null @@ -1,88 +0,0 @@ -var migrationName = '20150124_mountmaster_fix.js'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/** - * https://github.com/HabitRPG/habitrpg/pull/4374#issuecomment-71038795 - * Convert false to null for mounts that used to be owned. - */ - -var dbserver = 'localhost:27017' // CHANGE THIS FOR PRODUCTION DATABASE - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/habitrpg?auto_reconnect').collection('users'); - -var query = { - 'items.mounts':{$exists:true} - }; - -var fields = { - 'items.mounts':1 - }; - -var animals = [ "Wolf-Base", "Wolf-White", "Wolf-Desert", "Wolf-Red", "Wolf-Shade", "Wolf-Skeleton", "Wolf-Zombie", "Wolf-CottonCandyPink", "Wolf-CottonCandyBlue", "Wolf-Golden", "TigerCub-Base", "TigerCub-White", "TigerCub-Desert", "TigerCub-Red", "TigerCub-Shade", "TigerCub-Skeleton", "TigerCub-Zombie", "TigerCub-CottonCandyPink", "TigerCub-CottonCandyBlue", "TigerCub-Golden", "PandaCub-Base", "PandaCub-White", "PandaCub-Desert", "PandaCub-Red", "PandaCub-Shade", "PandaCub-Skeleton", "PandaCub-Zombie", "PandaCub-CottonCandyPink", "PandaCub-CottonCandyBlue", "PandaCub-Golden", "LionCub-Base", "LionCub-White", "LionCub-Desert", "LionCub-Red", "LionCub-Shade", "LionCub-Skeleton", "LionCub-Zombie", "LionCub-CottonCandyPink", "LionCub-CottonCandyBlue", "LionCub-Golden", "Fox-Base", "Fox-White", "Fox-Desert", "Fox-Red", "Fox-Shade", "Fox-Skeleton", "Fox-Zombie", "Fox-CottonCandyPink", "Fox-CottonCandyBlue", "Fox-Golden", "FlyingPig-Base", "FlyingPig-White", "FlyingPig-Desert", "FlyingPig-Red", "FlyingPig-Shade", "FlyingPig-Skeleton", "FlyingPig-Zombie", "FlyingPig-CottonCandyPink", "FlyingPig-CottonCandyBlue", "FlyingPig-Golden", "Dragon-Base", "Dragon-White", "Dragon-Desert", "Dragon-Red", "Dragon-Shade", "Dragon-Skeleton", "Dragon-Zombie", "Dragon-CottonCandyPink", "Dragon-CottonCandyBlue", "Dragon-Golden", "Cactus-Base", "Cactus-White", "Cactus-Desert", "Cactus-Red", "Cactus-Shade", "Cactus-Skeleton", "Cactus-Zombie", "Cactus-CottonCandyPink", "Cactus-CottonCandyBlue", "Cactus-Golden", "BearCub-Base", "BearCub-White", "BearCub-Desert", "BearCub-Red", "BearCub-Shade", "BearCub-Skeleton", "BearCub-Zombie", "BearCub-CottonCandyPink", "BearCub-CottonCandyBlue", "BearCub-Golden" ]; // all Gen1 mounts - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - var mounts = user.items.mounts; - var changed = false; - for(var a in animals) { - if(mounts[animals[a]] == false) { - mounts[animals[a]] = null; - changed = true; - } - } - - if (changed) { - dbUsers.update( - { _id: user._id}, - { - $set: { "migration": migrationName, - "items.mounts" : mounts - } - } - ); - } - - // var set = {'migration': migrationName}; - // var inc = {'xyz':1, _v:1}; - // dbUsers.update({_id:user._id}, {$set:set, $inc:inc}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); - if (user._id == '9' ) console.warn('lefnire' + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20150130_birthday_goodies.js b/migrations/20150130_birthday_goodies.js deleted file mode 100644 index 6c7c2e08c5..0000000000 --- a/migrations/20150130_birthday_goodies.js +++ /dev/null @@ -1,36 +0,0 @@ -db.users.update( - {'items.gear.owned.armor_special_birthday':{$ne:null}}, - {$set:{'items.gear.owned.armor_special_birthday2015':false}}, - {multi:1} -) - -db.users.update( - {'items.gear.owned.armor_special_birthday':null}, - {$set:{'items.gear.owned.armor_special_birthday':false}}, - {multi:1} -) - -db.users.update({},{$inc:{ - 'items.food.Cake_Skeleton':1, - 'items.food.Cake_Base':1, - 'items.food.Cake_CottonCandyBlue':1, - 'items.food.Cake_CottonCandyPink':1, - 'items.food.Cake_Shade':1, - 'items.food.Cake_White':1, - 'items.food.Cake_Golden':1, - 'items.food.Cake_Zombie':1, - 'items.food.Cake_Desert':1, - 'items.food.Cake_Red':1 -}},{multi:1}) - -db.users.update( - {'achievements.habitBirthday':true}, - {$set:{'achievements.habitBirthdays':1}}, - {multi:1} -) - -db.users.update( - {}, - {$inc:{'achievements.habitBirthdays':1}}, - {multi:1} -) \ No newline at end of file diff --git a/migrations/20150131_birthday_goodies_fix_remove_robe.js b/migrations/20150131_birthday_goodies_fix_remove_robe.js deleted file mode 100644 index 54b39030ba..0000000000 --- a/migrations/20150131_birthday_goodies_fix_remove_robe.js +++ /dev/null @@ -1,78 +0,0 @@ -var migrationName = '20150131_birthday_goodies_fix__one_birthday__1'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/* - * remove new birthday robes and second achievement from people who shouldn't have them - */ - -var dbserver = 'localhost:27017' // CHANGE THIS FOR PRODUCTION DATABASE - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/habitrpg?auto_reconnect').collection('users'); - - // 'auth.timestamps.created':{$gt:new Date('2014-02-01')}, -var query = { - 'achievements.habitBirthdays':1, - 'auth.timestamps.loggedin':{$gt:new Date('2014-12-20')} - }; - - // '_id': 'c03e41bd-501f-438c-9553-a7afdf52a08c', - // 'achievements.habitBirthday':{$exists:false}, - // 'items.gear.owned.armor_special_birthday2015':1 - -var fields = { - // 'auth.timestamps.created':1, - // 'achievements.habitBirthday':1, - // 'achievements.habitBirthdays':1, - 'items.gear.owned.armor_special_birthday2015':1, - // 'items.gear.owned.armor_special':1 - }; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - var unset = {'items.gear.owned.armor_special_birthday2015': 1}; - // var set = {'migration':migrationName, 'achievements.habitBirthdays':1 }; - // var inc = {'xyz':1, _v:1}; - dbUsers.update({_id:user._id}, {$unset:unset}); // , $inc:inc}); - // dbUsers.update({_id:user._id}, {$unset:unset, $set:set}); - // console.warn(user.auth.timestamps.created); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); - if (user._id == '9' ) console.warn('lefnire' + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20150201_convert_creation_date_from_string_to_object.js b/migrations/20150201_convert_creation_date_from_string_to_object.js deleted file mode 100644 index 72a31e8020..0000000000 --- a/migrations/20150201_convert_creation_date_from_string_to_object.js +++ /dev/null @@ -1,112 +0,0 @@ -var migrationName = '20150201_convert_creation_date_from_string_to_object__no_date_recent_signup'; -//// var migrationName = '20150201_convert_creation_date_from_string_to_object'; - -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/* - * For users that have no value for auth.timestamps.created, assign them - * a recent value. - * - * NOTE: - * Before this script was used as described above, it was first used to - * find all users that have a auth.timestamps.created field that is a string - * rather than a date object and set it to be a date object. The code used - * for this has been commented out with four slashes: //// - * - * https://github.com/HabitRPG/habitrpg/issues/4601#issuecomment-72339846 - */ - -var dbserver = 'localhost:27017' // CHANGE THIS FOR PRODUCTION DATABASE - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var mongo = require('mongoskin'); -var _ = require('lodash'); -var moment = require('moment'); - -var dbUsers = mongo.db(dbserver + '/habitrpg?auto_reconnect').collection('users'); - -var uuidArrayRecent=[ // recent users with no creation dates -'1a0d4b75-73ed-4937-974d-d504d6398884', -'1c7ebe27-1250-4f95-ba10-965580adbfd7', -'5f972121-4a6d-411c-95e9-7093d3e89b66', -'ae85818a-e336-4ccd-945e-c15cef975102', -'ba273976-d9fc-466c-975f-38559d34a824', -]; - -var query = { - '_id':{$in: uuidArrayRecent} - //// 'auth':{$exists:true}, - //// 'auth.timestamps':{$exists:true}, - //// 'auth.timestamps.created':{$not: {$lt:new Date('2018-01-01')}} - }; - -var fields = { - '_id':1, - 'auth.timestamps.created':1 - }; - // 'achievements.habitBirthdays':1 - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - //// var oldDate = user.auth.timestamps.created; - //// var newDate = moment(oldDate).toDate(); - var oldDate = 'none'; - var newDate = moment('2015-01-11').toDate(); - console.warn(user._id + ' == ' + oldDate + ' == ' + newDate); - - //// var set = { 'migration': migrationName, - //// 'auth.timestamps.created': newDate, - //// 'achievements.habitBirthdays': 2, - //// 'items.gear.owned.head_special_nye':true, - //// 'items.gear.owned.head_special_nye2014':true, - //// 'items.gear.owned.armor_special_birthday':true, - //// 'items.gear.owned.armor_special_birthday2015':true, - //// }; - - var set = { 'migration': migrationName, - 'auth.timestamps.created': newDate, - 'achievements.habitBirthdays': 1, - 'items.gear.owned.armor_special_birthday':true, - }; - - // var unset = {'items.gear.owned.armor_special_birthday2015': 1}; - // var inc = {'xyz':1, _v:1}; - dbUsers.update({_id:user._id}, {$set:set}); - // dbUsers.update({_id:user._id}, {$unset:unset, $set:set, $inc:inc}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); - if (user._id == '9' ) console.warn('lefnire' + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20150201_recapture_emails_phase_update.js b/migrations/20150201_recapture_emails_phase_update.js deleted file mode 100644 index 51fd73a6fa..0000000000 --- a/migrations/20150201_recapture_emails_phase_update.js +++ /dev/null @@ -1,7 +0,0 @@ -db.users.update({ - 'flags.recaptureEmailsPhase': { - $gt: 0 - } -},{$inc:{ - 'flags.recaptureEmailsPhase':1 -}},{multi:1}) \ No newline at end of file diff --git a/migrations/20150218_interactive_tour.js b/migrations/20150218_interactive_tour.js deleted file mode 100644 index 91769742ed..0000000000 --- a/migrations/20150218_interactive_tour.js +++ /dev/null @@ -1,10 +0,0 @@ -db.users.update({},{$set:{ - 'flags.tour.intro':-2, - //'flags.tour.classes':-2, - 'flags.tour.stats':-2, - 'flags.tour.tavern':-2, - 'flags.tour.party':-2, - 'flags.tour.guilds':-2, - 'flags.tour.challenges':-2, - 'flags.tour.market':-2 -}},{multi:1}) \ No newline at end of file diff --git a/migrations/20150224_force_resting_in_inn.js b/migrations/20150224_force_resting_in_inn.js deleted file mode 100644 index 1b704fb411..0000000000 --- a/migrations/20150224_force_resting_in_inn.js +++ /dev/null @@ -1,64 +0,0 @@ -var migrationName = '20150224_force_resting_in_inn'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/* - * force all active players to rest in the inn due to massive server fail - */ - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var dbserver = 'localhost:27017' // CHANGE THIS FOR PRODUCTION DATABASE - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/habitrpg?auto_reconnect').collection('users'); - -var query = { - 'auth.timestamps.loggedin':{$gt:new Date('2015-02-22')} - }; - -var fields = { - 'preferences.sleep':1, - }; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - var set = {'migration':migrationName, 'preferences.sleep':1 }; - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); - if (user._id == '9' ) console.warn('lefnire' + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20150310_survey_achievements.js b/migrations/20150310_survey_achievements.js deleted file mode 100644 index 9678b6c3c4..0000000000 --- a/migrations/20150310_survey_achievements.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.update( - {'achievements.helpedHabit':true}, - {$set:{'achievements.habitSurveys':1}}, - {multi:1} -) \ No newline at end of file diff --git a/migrations/20150604_ultimateGearSets.js b/migrations/20150604_ultimateGearSets.js deleted file mode 100644 index 64ff0142d3..0000000000 --- a/migrations/20150604_ultimateGearSets.js +++ /dev/null @@ -1,138 +0,0 @@ -// var migrationName = '20150604_ultimateGearSets'; -// var authorName = 'Sabe'; // in case script author needs to know when their ... -// var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -var migrationName = '20150620_ultimateGearSets'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/* - * grant the new ultimateGearSets achievement for existing users' collected equipment - * - * - * Changed by Alys on 20150620 to assign false values to - * 'achievements.ultimateGearSets' when true values are not appropriate, - * because of https://github.com/HabitRPG/habitrpg/issues/5427 - * - * Minimal changes were made so the code isn't as efficient or clean - * as it could be, but it's (hopefully) one-use-only and minimal changes - * means minimal new testing. - */ - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var dbserver = 'localhost:27017' // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379' // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -var fields = { - 'achievements.ultimateGearSets':1, - 'items.gear.owned':1 -}; - - -// Changes 20150620: All users have to be processed now (non-achievers need -// false values). -var query = { -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - var achievements = {}; - var changeUser = false; - // Changes 20150620: 'changeUser' now indicates that the user must have the - // Enchanted Armoire unlocked. - if ( (typeof user.items.gear.owned.weapon_wizard_6 !== 'undefined') - && (typeof user.items.gear.owned.armor_wizard_5 !== 'undefined') - && (typeof user.items.gear.owned.head_wizard_5 !== 'undefined') - ) { - achievements['wizard'] = true; - changeUser = true; - } - else { - // Changes 20150620: false added for all classes (here and below) - achievements['wizard'] = false; - } - - if ( (typeof user.items.gear.owned.weapon_warrior_6 !== 'undefined') - && (typeof user.items.gear.owned.armor_warrior_5 !== 'undefined') - && (typeof user.items.gear.owned.head_warrior_5 !== 'undefined') - && (typeof user.items.gear.owned.shield_warrior_5 !== 'undefined') - ) { - achievements['warrior'] = true; - changeUser = true; - } - else { - achievements['warrior'] = false; - } - - if ( (typeof user.items.gear.owned.weapon_healer_6 !== 'undefined') - && (typeof user.items.gear.owned.armor_healer_5 !== 'undefined') - && (typeof user.items.gear.owned.head_healer_5 !== 'undefined') - && (typeof user.items.gear.owned.shield_healer_5 !== 'undefined') - ) { - achievements['healer'] = true; - changeUser = true; - } - else { - achievements['healer'] = false; - } - - if ( (typeof user.items.gear.owned.weapon_rogue_6 !== 'undefined') - && (typeof user.items.gear.owned.armor_rogue_5 !== 'undefined') - && (typeof user.items.gear.owned.head_rogue_5 !== 'undefined') - && (typeof user.items.gear.owned.shield_rogue_6 !== 'undefined') - ) { - achievements['rogue'] = true; - changeUser = true; - } - else { - achievements['rogue'] = false; - } - - // Changes 20150620: $set is now run for all users. - var set = {'migration':migrationName, 'achievements.ultimateGearSets':achievements}; - if (changeUser) { // user has at least one Ultimate Gear achievement - set['flags.armoireEnabled'] = true; - } - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); - if (user._id == '9' ) console.warn('lefnire' + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20150731_purple_gryphon.js b/migrations/20150731_purple_gryphon.js deleted file mode 100644 index 8e44361ae0..0000000000 --- a/migrations/20150731_purple_gryphon.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.update( - {}, - {$set:{'items.mounts.Gryphon-RoyalPurple':true}}, - {multi:true} -); diff --git a/migrations/20150731_veteran_tiger.js b/migrations/20150731_veteran_tiger.js deleted file mode 100644 index 55e46fb1af..0000000000 --- a/migrations/20150731_veteran_tiger.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.update( - {'items.pets.Wolf-Veteran':{$ne:null}}, - {$set:{'items.pets.Tiger-Veteran':5}}, - {multi:true} -); diff --git a/migrations/20150731_veteran_wolf.js b/migrations/20150731_veteran_wolf.js deleted file mode 100644 index 9d31d4591d..0000000000 --- a/migrations/20150731_veteran_wolf.js +++ /dev/null @@ -1,7 +0,0 @@ -// Run after the Veteran Tiger script, not before! - -db.users.update( - {'items.pets.Wolf-Veteran':{$exists:false}}, - {$set:{'items.pets.Wolf-Veteran':5}}, - {multi:true} -); diff --git a/migrations/20150906_groups_fix_leaders.js b/migrations/20150906_groups_fix_leaders.js deleted file mode 100644 index 0a1a226c91..0000000000 --- a/migrations/20150906_groups_fix_leaders.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Make sure leaders are existing users - */ - -var mongo = require('mongoskin'); -var async = require('async'); - -var dbserver = 'url'; -var dbname = 'dbname'; -var countGroups = 0; -var countUsers = 0; - -var db = mongo.db(dbserver + '/' + dbname + '?auto_reconnect'); -var dbUsers = db.collection('users'); -var dbGroups = db.collection('groups'); - -console.log('Begins work on db'); - -function findGroups(gt){ - var query = {}; - if(gt) query._id = {$gt: gt}; - - console.log(query) - - dbGroups.find(query, { - fields: {_id: 1, members: 1, leader: 1}, - limit: 10000, - sort: { - _id: 1 - } - }).toArray(function(err, groups){ - if(err) throw err; - - var lastGroup = null; - if(groups.length === 10000){ - lastGroup = groups[groups.length - 1]; - } - - async.eachLimit(groups, 30, function(group, cb1){ - countGroups++; - console.log('Group: ', countGroups, group._id); - - var members = group.members; - - dbUsers.findOne({_id: group.leader}, {fields: {_id: 1}}, function(err, user){ - if(err) return cb1(err); - - // If leader has deleted account - if(!user && (group._id !== 'habitrpg') && members && members[0]) { - dbGroups.update({ - _id: group._id - }, { - $set: { - // Set first user as new leader - leader: members[0] - } - }, { - multi: false - }, function(err, res){ - if(err) return cb1(err); - - console.log('Updated: ', res); - return cb1(); - }); - }else{ - return cb1(); - } - }); - }, function(err){ - if(err) throw err; - - if(lastGroup && lastGroup._id){ - findGroups(lastGroup._id); - } - }); - }); -}; - -findGroups(); \ No newline at end of file diff --git a/migrations/20150906_groups_remove_deleted_users.js b/migrations/20150906_groups_remove_deleted_users.js deleted file mode 100644 index 96146a8c0e..0000000000 --- a/migrations/20150906_groups_remove_deleted_users.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Remove deleted accounts from groups - */ - -var mongo = require('mongoskin'); -var async = require('async'); - -var dbserver = 'url'; -var dbname = 'dbname'; -var countGroups = 0; -var countUsers = 0; - -var db = mongo.db(dbserver + '/' + dbname + '?auto_reconnect'); -var dbUsers = db.collection('users'); -var dbGroups = db.collection('groups'); - -console.log('Begins work on db'); - -function findGroups(gt){ - var query = {}; - if(gt) query._id = {$gt: gt}; - - console.log(query) - - dbGroups.find(query, { - fields: {_id: 1, members: 1}, - limit: 10000, - sort: { - _id: 1 - } - }).toArray(function(err, groups){ - if(err) throw err; - - var lastGroup = null; - if(groups.length === 10000){ - lastGroup = groups[groups.length - 1]; - } - - async.eachLimit(groups, 3, function(group, cb1){ - countGroups++; - console.log('Group: ', countGroups, group._id); - - var members = group.members; - - // Remove users who deleted their account - async.eachLimit(members, 15, function(member, cb2){ - dbUsers.findOne({_id: member}, {fields: {_id: 1}}, function(err, user){ - if(err) return cb2(err); - - if(!user){ - countUsers++; - console.log('User removed n. ', countUsers, 'user id ', member, 'group id ', group._id); - - dbGroups.update({ - _id: group._id - }, { - $pull: {members: member}, - $inc: {memberCount: -1} - }, { - multi: false - }, function(err, res){ - if(err) return cb2(err); - - console.log('Updated: ', res); - return cb2(); - }); - }else{ - cb2(); - } - }); - }, function(err){ - if(err) return cb1(err); - - cb1(); - }); - - }, function(err){ - if(err) throw err; - - if(lastGroup && lastGroup._id){ - findGroups(lastGroup._id); - } - }); - }); -}; - -findGroups(); \ No newline at end of file diff --git a/migrations/20150906_groups_remove_empty.js b/migrations/20150906_groups_remove_empty.js deleted file mode 100644 index 44da0b600c..0000000000 --- a/migrations/20150906_groups_remove_empty.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Remove empty private groups - */ - -var mongo = require('mongoskin'); - -var dbserver = 'url'; -var dbname = 'name'; - -var db = mongo.db(dbserver + '/' + dbname + '?auto_reconnect'); -var dbGroups = db.collection('groups'); - -console.log('Begins work on db'); - -dbGroups.findEach({ - memberCount: 0, -}, {_id: 1}, function(err, res){ - if(err) throw err; - - console.log(res); -}); \ No newline at end of file diff --git a/migrations/20150906_sync_groups_with_firebase.js b/migrations/20150906_sync_groups_with_firebase.js deleted file mode 100644 index d7b4f12174..0000000000 --- a/migrations/20150906_sync_groups_with_firebase.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Sync groups with Firebase - */ - -var mongo = require('mongoskin'); -var Firebase = require('Firebase'); - -var dbserver = 'mongodb://url'; -var dbname = 'db'; - -var db = mongo.db(dbserver + '/' + dbname + '?auto_reconnect'); -var dbGroups = db.collection('groups'); -var countGroups = 0; - -var firebaseRef = new Firebase('https://' + 'firebase-app' + '.firebaseio.com'); - -// TODO handle sync errors with firebase? -firebaseRef.authWithCustomToken('firebase-secret', function(err, authData){ - if(err) throw new Error('Impossible to authenticate Firebase'); - - console.log('Firebase connected, begins work on db'); - - dbGroups.findEach({}, {_id: 1, members: 1}, {batchSize: 100}, function(err, group){ - if(err) throw err; - if(group._id !== 'habitrpg') return; - - countGroups++; - console.log('Group: ', countGroups); - - firebaseRef.child('rooms/' + group._id) - .set({ - name: group.name - }); - - group.members.forEach(function(member){ - firebaseRef.child('members/' + group._id + '/' + userId) - .set(true); - - firebaseRef.child('users/' + member + '/rooms/' + group._id) - .set(true); - }); - }); -}); \ No newline at end of file diff --git a/migrations/20151013_jackolanterns.js b/migrations/20151013_jackolanterns.js deleted file mode 100644 index 67ff0ac9a2..0000000000 --- a/migrations/20151013_jackolanterns.js +++ /dev/null @@ -1,67 +0,0 @@ -var migrationName = '20151013_jackolanterns.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Jack-O'-Lantern mounts to users who already have the pet version, award pet if they don't - */ - -var dbserver = 'localhost:27017'; // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.pets.JackOLantern-Base':1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // specify user data to change: - var set = {}; - if (user.items.pets['JackOLantern-Base']) { - set = {'migration':migrationName, 'items.mounts.JackOLantern-Base':true}; - } else { - set = {'migration':migrationName, 'items.pets.JackOLantern-Base':5}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20151021_usernames_emails_lowercase.js b/migrations/20151021_usernames_emails_lowercase.js deleted file mode 100644 index b40aaad9d7..0000000000 --- a/migrations/20151021_usernames_emails_lowercase.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Migrate email to lowerCase version and add auth.local.lowerCaseUsername email - */ - -var mongo = require('mongoskin'); -var async = require('async'); - -var dbserver = 'url'; -var dbname = 'dbname'; -var countUsers = 0; - -var db = mongo.db(dbserver + '/' + dbname + '?auto_reconnect'); -var dbUsers = db.collection('users'); - -console.log('Begins work on db'); - -function findUsers(gt){ - var query = {}; - if(gt) query._id = {$gt: gt}; - - console.log(query) - - dbUsers.find(query, { - fields: {_id: 1, auth: 1}, - limit: 10000, - sort: { - _id: 1 - } - }).toArray(function(err, users){ - if(err) throw err; - - var lastUser = null; - if(users.length === 10000){ - lastUser = users[users.length - 1]; - } - - async.eachLimit(users, 20, function(user, cb){ - countUsers++; - console.log('User: ', countUsers, user._id); - - var update = { - $set: {} - }; - - if(user.auth && user.auth.local) { - if(user.auth.local.username) update['$set']['auth.local.lowerCaseUsername'] = user.auth.local.username.toLowerCase(); - if(user.auth.local.email) update['$set']['auth.local.email'] = user.auth.local.email.toLowerCase(); - } - - dbUsers.update({ - _id: user._id - }, update, cb); - }, function(err){ - if(err) throw err; - - if(lastUser && lastUser._id){ - findUsers(lastUser._id); - } - }); - }); -}; - -findUsers(); diff --git a/migrations/20151105_tutorial_flags.js b/migrations/20151105_tutorial_flags.js deleted file mode 100644 index 6af069965c..0000000000 --- a/migrations/20151105_tutorial_flags.js +++ /dev/null @@ -1,63 +0,0 @@ -var migrationName = '20151105_tutorial_flags_v1'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done - -/* - * set flags.tutorial.ios and flags.tutorial.main flags to true in preparation - * for the release of a new iOS tutorial - * - */ - -// var dbserver = 'localhost:27017' // FOR TEST DATABASE -var dbserver = 'alys:@ds031379-a0.mongolab.com:31379' // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -var fields = { -}; - - -var query = { - 'auth.timestamps.loggedin':{$gt:new Date('2015-10-20')} -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // var set = {'migration':migrationName, 'flags.tutorial.ios':true, 'flags.tutorial.main':true }; - var set = {'migration':migrationName, 'flags.tutorial.ios':{} }; - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20151116_costume_contest_award.js b/migrations/20151116_costume_contest_award.js deleted file mode 100644 index 25891f9215..0000000000 --- a/migrations/20151116_costume_contest_award.js +++ /dev/null @@ -1,102 +0,0 @@ -var migrationName = '20151116_costume_contest.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Costume Contest achievement to 2015 winners - */ - -var dbserver = 'localhost:27017'; // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - _id: { - $in: [ - 'e411dab3-a4ca-414d-bdbd-b6940b3bdeb3', - '35ced5cc-c33a-45c8-93dc-16000ee66fde', - 'ab3f0549-7247-4fd5-975b-efcff98c79c3', - 'b1261fd2-eb25-46b4-97a9-ae7a0dc8a131', - '1f27893f-3808-4724-9725-f46dab93faca', - '216a0c23-6afd-4a5e-b434-d386a10862a2', - '2d6ef231-50b4-4a22-90e7-45eb97147a2c', - '98b8cf4f-89bd-4b0a-988d-02629a217232', - 'c5183dfa-c741-43ce-935e-c6d89b41a030', - '262a7afb-6b57-4d81-88e0-80d2e9f6cbdc', - '33991e0a-de55-4986-ac81-af78491a84de', - '7adf6ada-3c05-4054-b5df-fa7d49d3b9eb', - '235a1cbd-48c5-41b1-afb4-59d2f8645c57', - 'b7617a61-188b-4332-bf4d-32268fa77f2b', - '672c1ce0-9f47-44f0-a3f3-8cc3c6c5a9cb', - 'd0a3217a-7b92-48d6-b39a-b1b1be96702e', - '5ef910dc-1d22-47d9-aa38-a60132c60679', - '370a44c8-e94a-4a2c-91f2-33166926db1f', - '1b0b3ef3-28bd-4046-a49b-e1c83e281baf', - '75b93321-66b9-49bd-9076-052499c1d2bf', - 'd97516e4-81d0-4f60-bf03-95f7330925ab', - '3e13cc79-de38-420d-822e-9e9da309ce6b', - '0e471dc1-ecb0-4388-a891-b873a237d2cf', - 'ca3da398-4f73-4304-b838-af3669ed4cbb', - '44cdf105-8bda-4197-9d1a-1bcb83b4dc84', - '5419830c-b837-4573-ae82-4718ab95b7f1', - 'ac6fbe37-b0dc-40d8-ba14-77dde66fbfa8', - '8789ba18-a498-46b9-b367-3b929a0acb94', - '52fce1a9-9b0a-4e26-95dc-adc12f52e752', - '21bf71ac-399c-470b-abe0-cc49a03b6a8b', - 'f1618ce2-552e-4f23-bc76-e73d63ebedd0', - '4cc0c749-d943-4090-b529-42bc665b7244', - 'e259682e-cb5c-4d94-b472-ceedc66d7484', - 'fa197a4b-e065-4551-803a-c8a5b9970f9d' - ] - } -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // specify user data to change: - var set = {'migration':migrationName}; - var inc = {'achievements.costumeContests':1}; - - dbUsers.update({_id:user._id}, {$set:set}); - dbUsers.update({_id:user._id}, {$inc:inc}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20151116_costume_contest_to_number.js b/migrations/20151116_costume_contest_to_number.js deleted file mode 100644 index 7121e9bc31..0000000000 --- a/migrations/20151116_costume_contest_to_number.js +++ /dev/null @@ -1,64 +0,0 @@ -var migrationName = '20151116_costume_contest_to_number.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Change Costume Contest achievement from Boolean to Number, so people can win repeatedly - */ - -var dbserver = 'localhost:27017'; // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'achievements.costumeContest':true -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'achievements.costumeContest':1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // specify user data to change: - var set = {'achievements.costumeContests':1}; - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20151125_turkey_ladder.js b/migrations/20151125_turkey_ladder.js deleted file mode 100644 index e028b4f882..0000000000 --- a/migrations/20151125_turkey_ladder.js +++ /dev/null @@ -1,71 +0,0 @@ -var migrationName = '20151125_turkey_ladder.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Gilded Turkey pet to Turkey mount owners, Turkey Mount if they only have Turkey Pet, - * and Turkey Pet otherwise - */ - -var dbserver = 'localhost:27017'; // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.pets.Turkey-Base': 1, - 'items.mounts.Turkey-Base': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // specify user data to change: - var set = {}; - if (user.items.mounts['Turkey-Base']) { - set = {'migration':migrationName, 'items.pets.Turkey-Gilded':5}; - } else if (user.items.pets['Turkey-Base']) { - set = {'migration':migrationName, 'items.mounts.Turkey-Base':true}; - } else { - set = {'migration':migrationName, 'items.pets.Turkey-Base':5}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20151229_new_years_hats.js b/migrations/20151229_new_years_hats.js deleted file mode 100644 index 895e545dd0..0000000000 --- a/migrations/20151229_new_years_hats.js +++ /dev/null @@ -1,70 +0,0 @@ -var migrationName = '20151229_new_years_hats.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award 2015 party hat if user has 2014 hat, 2014 hat if they have the 2013 hat, - * and 2013 hat otherwise - */ - -var dbserver = 'localhost:27017'; // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.gear.owned': 1, -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // specify user data to change: - var set = {}; - if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('head_special_nye2014')) { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2015':false}; - } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('head_special_nye')) { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2014':false}; - } else { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye':false}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20160521_veteran_ladder.js b/migrations/20160521_veteran_ladder.js deleted file mode 100644 index 0cc19e4514..0000000000 --- a/migrations/20160521_veteran_ladder.js +++ /dev/null @@ -1,82 +0,0 @@ -var migrationName = '20160521_veteran_ladder.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Gilded Turkey pet to Turkey mount owners, Turkey Mount if they only have Turkey Pet, - * and Turkey Pet otherwise - */ - -var dbserver = 'localhost:27017'; // FOR TEST DATABASE -// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; - -var mongo = require('mongoskin'); -var _ = require('lodash'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'auth.timestamps.loggedin':{$gt:new Date('2016-05-01')} // remove when running migration a second time -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'migration': 1, - 'items.pets.Wolf-Veteran': 1, - 'items.pets.Tiger-Veteran': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - return displayData(); - } - count++; - - // specify user data to change: - var set = {}; - if (user.migration !== migrationName) { - if (user.items.pets['Tiger-Veteran']) { - set = {'migration':migrationName, 'items.pets.Lion-Veteran':5}; - } else if (user.items.pets['Wolf-Veteran']) { - set = {'migration':migrationName, 'items.pets.Tiger-Veteran':5}; - } else { - set = {'migration':migrationName, 'items.pets.Wolf-Veteran':5}; - } - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20160527_fix_empty_checklist_id.js b/migrations/20160527_fix_empty_checklist_id.js deleted file mode 100644 index 0276d3241e..0000000000 --- a/migrations/20160527_fix_empty_checklist_id.js +++ /dev/null @@ -1,84 +0,0 @@ -var uuid = require('uuid').v4; -var mongo = require('mongodb').MongoClient; -var _ = require('lodash'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -var taskIds = require('checklists-no-id.json').map(function (obj) { - return obj._id; -}); - -// Fix empty task.checklistt.id - -var progressCount = 100; -var count = 0; - -function displayData() { - console.warn('\n' + count + ' tasks processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } -} - -mongo.connect('db url') -.then(function (db) { - var dbTasks = db.collection('tasks'); - - // specify a query to limit the affected tasks (empty for all tasks): - var query = { - '_id':{ $in: taskIds }, - }; - - // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - var fields = { - 'checklist': 1, - }; - - console.warn('Updating tasks...'); - - dbTasks.find(query, fields, {batchSize: 250}).toArray(function(err, tasks) { - if (err) { return exiting(1, 'ERROR! ' + err); } - - tasks.forEach(function (task) { - var checklist = task.checklist || []; - checklist.forEach(function (item) { - if (!item.id || item.id === "") { - item.id = uuid(); - } - }); - - // specify user data to change: - var set = { - checklist: checklist, - }; - //console.log(set); - - dbTasks.update({_id: task._id}, {$set: set}, function (err, res) { - if (err) console.error('Error while updating', err); - }); - - count++; - if (count % progressCount == 0) console.warn(count + ' ' + task._id); - }); - - if (count === tasks.length) { - console.warn('All appropriate tasks found and modified.'); - return displayData(); - } - }); -}) -.catch(function (err) { - throw err; -}); \ No newline at end of file diff --git a/migrations/20160731_naming_day.js b/migrations/20160731_naming_day.js deleted file mode 100644 index 601798d14c..0000000000 --- a/migrations/20160731_naming_day.js +++ /dev/null @@ -1,82 +0,0 @@ -var migrationName = '20160731_naming_day.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Royal Purple Gryphon pet to Royal Purple Gryphon mount owners, mount to everyone else - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2016-07-30')} // Extend timeframe each run of migration -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.mounts': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - var inc = {}; - inc = { - 'achievements.habiticaDays': 1, - 'items.food.Cake_Skeleton': 1, - 'items.food.Cake_Base': 1, - 'items.food.Cake_CottonCandyBlue': 1, - 'items.food.Cake_CottonCandyPink': 1, - 'items.food.Cake_Shade': 1, - 'items.food.Cake_White': 1, - 'items.food.Cake_Golden': 1, - 'items.food.Cake_Zombie': 1, - 'items.food.Cake_Desert': 1, - 'items.food.Cake_Red': 1 - }; - if (user.items.mounts['Gryphon-RoyalPurple']) { - set = {'migration':migrationName, 'items.pets.Gryphon-RoyalPurple':5}; - } else { - set = {'migration':migrationName, 'items.mounts.Gryphon-RoyalPurple':true}; - } - - dbUsers.update({_id:user._id}, {$set:set, $inc:inc}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20160731_takeThis.js b/migrations/20160731_takeThis.js deleted file mode 100644 index b08700a4bd..0000000000 --- a/migrations/20160731_takeThis.js +++ /dev/null @@ -1,71 +0,0 @@ -var migrationName = '20160731_takeThis.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Take This Sword to Take This challenge participants who already own the Shield - * and Take This Shield to the rest of the list - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2016-07-30')}, // Extend timeframe each run of migration - 'challenges':{$in:['da8859b2-5c6e-4aa5-b8b2-8db93d5de9fc']} -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.gear.owned': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - - if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.weapon_special_takeThis':false}; - } else { - set = {'migration':migrationName, 'items.gear.owned.shield_special_takeThis':false}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20160831_takeThis.js b/migrations/20160831_takeThis.js deleted file mode 100644 index 853ade4044..0000000000 --- a/migrations/20160831_takeThis.js +++ /dev/null @@ -1,72 +0,0 @@ -var migrationName = '20160831_takeThis.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Take This Sword to Take This challenge participants who already own the Shield - * and Take This Shield to the rest of the list - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'challenges':{$in:['ee2b3c87-13f0-422a-af3c-309102d4f7e6']} -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.gear.owned': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - - if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.armor_special_takeThis':false}; - } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.weapon_special_takeThis':false}; - } else { - set = {'migration':migrationName, 'items.gear.owned.shield_special_takeThis':false}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20161002_takeThis.js b/migrations/20161002_takeThis.js deleted file mode 100644 index a3dafa3042..0000000000 --- a/migrations/20161002_takeThis.js +++ /dev/null @@ -1,73 +0,0 @@ -var migrationName = '20161002_takeThis.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Take This ladder items to participants in this month's challenge - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'challenges':{$in:['4bbf63b5-10bc-49f9-8e95-5bd2ac99cd1c']} -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.gear.owned': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - - if (typeof user.items.gear.owned.armor_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_takeThis':false}; - } else if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.armor_special_takeThis':false}; - } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.weapon_special_takeThis':false}; - } else { - set = {'migration':migrationName, 'items.gear.owned.shield_special_takeThis':false}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20161030-jackolanterns.js b/migrations/20161030-jackolanterns.js deleted file mode 100644 index bbea4d3455..0000000000 --- a/migrations/20161030-jackolanterns.js +++ /dev/null @@ -1,86 +0,0 @@ -var migrationName = '20161030-jackolanterns.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * set the newStuff flag in all user accounts so they see a Bailey message - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'auth.timestamps.loggedin':{$gt:new Date('2016-10-01')} // remove when running migration a second time -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'migration': 1, - 'items.pets.JackOLantern-Base': 1, - 'items.mounts.JackOLantern-Base': 1, -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - var inc = {}; - if (user.migration !== migrationName) { - if (user.items.mounts['JackOLantern-Base']) { - set = {'migration':migrationName, 'items.pets.JackOLantern-Ghost':5}; - } else if (user.items.pets['JackOLantern-Base']) { - set = {'migration':migrationName, 'items.mounts.JackOLantern-Base':true}; - } else { - set = {'migration':migrationName, 'items.pets.JackOLantern-Base':5}; - } - inc = { - 'items.food.Candy_Base': 1, - 'items.food.Candy_CottonCandyBlue': 1, - 'items.food.Candy_CottonCandyPink': 1, - 'items.food.Candy_Desert': 1, - 'items.food.Candy_Golden': 1, - 'items.food.Candy_Red': 1, - 'items.food.Candy_Shade': 1, - 'items.food.Candy_Skeleton': 1, - 'items.food.Candy_White': 1, - 'items.food.Candy_Zombie': 1, - } - } - - dbUsers.update({_id:user._id}, {$set:set, $inc:inc}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20161102_takeThis.js b/migrations/20161102_takeThis.js deleted file mode 100644 index d13d180ccf..0000000000 --- a/migrations/20161102_takeThis.js +++ /dev/null @@ -1,75 +0,0 @@ -var migrationName = '20161102_takeThis.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Take This ladder items to participants in this month's challenge - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'challenges':{$in:['d1be0965-e909-4d30-82fa-9a0011f885b2']} -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.gear.owned': 1 -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - - if (typeof user.items.gear.owned.head_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.body_special_takeThis':false}; - } else if (typeof user.items.gear.owned.armor_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_takeThis':false}; - } else if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.armor_special_takeThis':false}; - } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.weapon_special_takeThis':false}; - } else { - set = {'migration':migrationName, 'items.gear.owned.shield_special_takeThis':false}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20161122_turkey_ladder.js b/migrations/20161122_turkey_ladder.js deleted file mode 100644 index 4992ed272f..0000000000 --- a/migrations/20161122_turkey_ladder.js +++ /dev/null @@ -1,74 +0,0 @@ -var migrationName = '20161122_turkey_ladder.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Yearly Turkey Day award. Turkey pet, Turkey mount, Gilded Turkey pet, Gilded Turkey mount - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2016-10-31')} // Extend timeframe each run of migration -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'migration': 1, - 'items.mounts': 1, - 'items.pets': 1, -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - - if (user.items.pets['Turkey-Gilded']) { - set = {'migration':migrationName, 'items.mounts.Turkey-Gilded':true}; - } else if (user.items.mounts['Turkey-Base']) { - set = {'migration':migrationName, 'items.pets.Turkey-Gilded':5}; - } else if (user.items.pets['Turkey-Base']) { - set = {'migration':migrationName, 'items.mounts.Turkey-Base':true}; - } else { - set = {'migration':migrationName, 'items.pets.Turkey-Base':5}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} diff --git a/migrations/20161230_nye_hats.js b/migrations/20161230_nye_hats.js deleted file mode 100644 index 7eeb8dd7da..0000000000 --- a/migrations/20161230_nye_hats.js +++ /dev/null @@ -1,73 +0,0 @@ -var migrationName = '20161230_nye_hats.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Yearly New Year's party hat award - */ - -var mongo = require('mongoskin'); - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE - -var dbUsers = mongo.db(connectionString).collection('users'); - -// specify a query to limit the affected users (empty for all users): -var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2016-11-30')} // Remove after first run -}; - -// specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { - 'items.gear.owned': 1, -}; - -console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } - if (!user) { - console.warn('All appropriate users found and modified.'); - setTimeout(displayData, 300000); - return; - } - count++; - - // specify user data to change: - var set = {}; - - if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2016':false}; - } else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2015':false}; - } else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2014':false}; - } else { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye':false}; - } - - dbUsers.update({_id:user._id}, {$set:set}); - - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -}); - - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - diff --git a/migrations/20170120_missing_incentive.js b/migrations/20170120_missing_incentive.js deleted file mode 100644 index 8ee3c82c1b..0000000000 --- a/migrations/20170120_missing_incentive.js +++ /dev/null @@ -1,113 +0,0 @@ -var migrationName = '20170120_missing_incentive.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award missing Royal Purple Hatching Potion to users with 55+ check-ins - * Reduce users with impossible check-in counts to a reasonable number - */ - -import monk from 'monk'; -import common from '../website/common'; - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'loginIncentives': {$gt:54}, - 'migration': {$ne: migrationName}, - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var language = user.preferences.language || 'en'; - var set = {'migration': migrationName}; - var inc = {'items.hatchingPotions.RoyalPurple': 1}; - if (user.loginIncentives > 58) { - set = {'migration': migrationName, 'loginIncentives': 58}; - } - var push = { - 'notifications': { - 'type': 'LOGIN_INCENTIVE', - 'data': { - 'nextRewardAt': 60, - 'rewardKey': [ - 'Pet_HatchingPotion_Purple', - ], - 'rewardText': common.i18n.t('potion', {potionType: common.i18n.t('hatchingPotionRoyalPurple', language)}, language), - 'reward': [ - { - 'premium': true, - 'key': 'RoyalPurple', - 'limited': true, - 'value': 2, - } - ], - 'message': common.i18n.t('unlockedCheckInReward', language), - }, - 'id': common.uuid(), - } - }; - - dbUsers.update({_id: user._id}, {$set:set, $push:push, $inc:inc}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/20170131_habit_birthday.js b/migrations/20170131_habit_birthday.js deleted file mode 100644 index bb1571c71b..0000000000 --- a/migrations/20170131_habit_birthday.js +++ /dev/null @@ -1,109 +0,0 @@ -var migrationName = '20170131_habit_birthday.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award 2017 party robes if user has 2016 robes, 2016 robes if they have the 2015 robes, - * 2015 robes if they have the 2014 robes, and 2014 robes otherwise. Also cake! - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2017-01-24')}, // remove after first run to cover remaining users - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data) - 'items.gear.owned' - ], - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var set = {'migration':migrationName}; - if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2016')) { - set['items.gear.owned.armor_special_birthday2017'] = false; - } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2015')) { - set['items.gear.owned.armor_special_birthday2016'] = false; - } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday')) { - set['items.gear.owned.armor_special_birthday2015'] = false; - } else { - set['items.gear.owned.armor_special_birthday'] = false; - } - - var inc = { - 'items.food.Cake_Skeleton':1, - 'items.food.Cake_Base':1, - 'items.food.Cake_CottonCandyBlue':1, - 'items.food.Cake_CottonCandyPink':1, - 'items.food.Cake_Shade':1, - 'items.food.Cake_White':1, - 'items.food.Cake_Golden':1, - 'items.food.Cake_Zombie':1, - 'items.food.Cake_Desert':1, - 'items.food.Cake_Red':1, - 'achievements.habitBirthdays':1 - }; - - dbUsers.update({_id: user._id}, {$set:set, $inc:inc}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/20170418_subscriber_jackalopes.js b/migrations/20170418_subscriber_jackalopes.js deleted file mode 100644 index d32867de98..0000000000 --- a/migrations/20170418_subscriber_jackalopes.js +++ /dev/null @@ -1,88 +0,0 @@ -var migrationName = '20170418_subscriber_jackalopes.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Royal Purple Jackalope pet to all current subscribers - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); -var now = new Date(); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'purchased.plan.customerId': {$type: 2}, - $or: [ - {'purchased.plan.dateTerminated': null}, - {'purchased.plan.dateTerminated': {$exists: false}}, - {'purchased.plan.dateTerminated': {$gt: now}}, - ] - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var set = {'items.pets.Jackalope-RoyalPurple': 5}; - - dbUsers.update({_id: user._id}, {$set:set}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/20170711_orcas.js b/migrations/20170711_orcas.js deleted file mode 100644 index fbecd0cecd..0000000000 --- a/migrations/20170711_orcas.js +++ /dev/null @@ -1,90 +0,0 @@ -var migrationName = '20170711_orcas.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Orca pets to owners of Orca mount, and Orca mount to everyone else - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [ - 'items.mounts', - ] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var set = {}; - - if (user.items.mounts['Orca-Base']) { - set = {'migration':migrationName, 'items.pets.Orca-Base': 5}; - } else { - set = {'migration':migrationName, 'items.mounts.Orca-Base': true}; - } - - dbUsers.update({_id: user._id}, {$set:set}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/20170731_naming_day.js b/migrations/20170731_naming_day.js deleted file mode 100644 index a87ff6cb5a..0000000000 --- a/migrations/20170731_naming_day.js +++ /dev/null @@ -1,109 +0,0 @@ -var migrationName = '20170731_naming_day.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award Royal Purple Gryphon Helm to Royal Purple Gryphon pet owners, - * award Royal Purple Gryphon pet to Royal Purple Gryphon mount owners, - * award Royal Purple Gryphon mount to everyone else - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin': {$gt: new Date('2017-01-01')}, - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [ - 'items.mounts', - 'items.pets', - ] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var set = {}; - var inc = { - 'achievements.habiticaDays': 1, - 'items.food.Cake_Skeleton': 1, - 'items.food.Cake_Base': 1, - 'items.food.Cake_CottonCandyBlue': 1, - 'items.food.Cake_CottonCandyPink': 1, - 'items.food.Cake_Shade': 1, - 'items.food.Cake_White': 1, - 'items.food.Cake_Golden': 1, - 'items.food.Cake_Zombie': 1, - 'items.food.Cake_Desert': 1, - 'items.food.Cake_Red': 1 - }; - - if (user.items.pets['Gryphon-RoyalPurple']) { - set = {'migration':migrationName, 'items.gear.owned.head_special_namingDay2017': false}; - } else if (user.items.mounts['Gryphon-RoyalPurple']) { - set = {'migration':migrationName, 'items.pets.Gryphon-RoyalPurple': 5}; - } else { - set = {'migration':migrationName, 'items.mounts.Gryphon-RoyalPurple': true}; - } - - dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/20170928_redesign_guilds.js b/migrations/20170928_redesign_guilds.js deleted file mode 100644 index 62d68d4ac4..0000000000 --- a/migrations/20170928_redesign_guilds.js +++ /dev/null @@ -1,97 +0,0 @@ -var migrationName = '20170928_redesign_guilds.js'; - -/* - * Copy Guild Leader messages to end of Guild descriptions - * Copy Guild logos to beginning of Guild descriptions - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbGroups = monk(connectionString).get('groups', { castIds: false }); - -function processGroups(lastId) { - // specify a query to limit the affected groups (empty for all groups): - var query = { - }; - - var fields = { - 'description': 1, - 'logo': 1, - 'leaderMessage': 1, - } - - if (lastId) { - query._id = { - $gt: lastId - } - } - - return dbGroups.find(query, { - fields: fields, - sort: {_id: 1}, - limit: 250, - }) - .then(updateGroups) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateGroups (groups) { - if (!groups || groups.length === 0) { - console.warn('All appropriate groups found and modified.'); - displayData(); - return; - } - - var groupPromises = groups.map(updateGroup); - var lastGroup = groups[groups.length - 1]; - - return Promise.all(groupPromises) - .then(function () { - processGroups(lastGroup._id); - }); -} - -function updateGroup (group) { - count++; - - var description = group.description; - - if (group.logo) { - description = '![Guild Logo](' + group.logo + ')\n\n \n\n' + description; - } - - if (group.leaderMessage) { - description = description + '\n\n \n\n' + group.leaderMessage; - } - - var set = { - description: description, - }; - - if (count % progressCount == 0) console.warn(count + ' ' + group._id); - - return dbGroups.update({_id: group._id}, {$set:set}); -} - -function displayData() { - console.warn('\n' + count + ' groups processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processGroups; diff --git a/migrations/20171030_jackolanterns.js b/migrations/20171030_jackolanterns.js deleted file mode 100644 index 63be6de265..0000000000 --- a/migrations/20171030_jackolanterns.js +++ /dev/null @@ -1,111 +0,0 @@ -var migrationName = '20171030_jackolanterns.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award the Jack-O'-Lantern ladder: - * Ghost Jack-O-Lantern Mount to owners of Ghost Jack-O-Lantern Pet - * Ghost Jack-O-Lantern Pet to owners of Jack-O-Lantern Mount - * Jack-O-Lantern Mount to owners of Jack-O-Lantern Pet - * Jack-O-Lantern Pet to everyone else - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [ - 'items.pets', - 'items.mounts', - ] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var set = {}; - var inc = { - 'items.food.Candy_Skeleton': 1, - 'items.food.Candy_Base': 1, - 'items.food.Candy_CottonCandyBlue': 1, - 'items.food.Candy_CottonCandyPink': 1, - 'items.food.Candy_Shade': 1, - 'items.food.Candy_White': 1, - 'items.food.Candy_Golden': 1, - 'items.food.Candy_Zombie': 1, - 'items.food.Candy_Desert': 1, - 'items.food.Candy_Red': 1, - }; - - if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Ghost']) { - set = {'migration':migrationName, 'items.mounts.JackOLantern-Ghost': true}; - } else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Base']) { - set = {'migration':migrationName, 'items.pets.JackOLantern-Ghost': 5}; - } else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Base']) { - set = {'migration':migrationName, 'items.mounts.JackOLantern-Base': true}; - } else { - set = {'migration':migrationName, 'items.pets.JackOLantern-Base': 5}; - } - - dbUsers.update({_id: user._id}, {$set:set, $inc:inc}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/20171230_nye_hats.js b/migrations/20171230_nye_hats.js deleted file mode 100644 index 08db9a4158..0000000000 --- a/migrations/20171230_nye_hats.js +++ /dev/null @@ -1,103 +0,0 @@ -var migrationName = '20171230_nye_hats.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done - -/* - * Award New Year's Eve party hats to users in sequence - */ - -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); - -function processUsers(lastId) { - // specify a query to limit the affected users (empty for all users): - var query = { - 'migration': {$ne:migrationName}, - 'auth.timestamps.loggedin': {$gt:new Date('2017-11-30')}, - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbUsers.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [ - 'items.gear.owned', - ] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); -} - -function updateUser (user) { - count++; - - var set = {}; - var push = {}; - - if (typeof user.items.gear.owned.head_special_nye2016 !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2017':false}; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2017', '_id': monk.id()}}; - } else if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2016':false}; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2016', '_id': monk.id()}}; - } else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2015':false}; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2015', '_id': monk.id()}}; - } else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye2014':false}; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2014', '_id': monk.id()}}; - } else { - set = {'migration':migrationName, 'items.gear.owned.head_special_nye':false}; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye', '_id': monk.id()}}; - } - - dbUsers.update({_id: user._id}, {$set: set, $push: push}); - - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' users processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processUsers; diff --git a/migrations/api_v3/challenges.js b/migrations/api_v3/challenges.js deleted file mode 100644 index 94adbed6e5..0000000000 --- a/migrations/api_v3/challenges.js +++ /dev/null @@ -1,218 +0,0 @@ -// Migrate challenges collection to new schema (except for members) - -// The console-stamp module must be installed (not included in package.json) - -// It requires two environment variables: MONGODB_OLD and MONGODB_NEW - -// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). -// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 -console.log('Starting migrations/api_v3/challenges.js.'); - -require('babel-register'); -require('babel-polyfill'); - -var Bluebird = require('bluebird'); -var MongoDB = require('mongodb'); -var nconf = require('nconf'); -var mongoose = require('mongoose'); -var _ = require('lodash'); -var uuid = require('uuid'); -var consoleStamp = require('console-stamp'); -var fs = require('fs'); - -// Add timestamps to console messages -consoleStamp(console); - -// Initialize configuration -require('../../website/server/libs/api-v3/setupNconf')(); - -var MONGODB_OLD = nconf.get('MONGODB_OLD'); -var MONGODB_NEW = nconf.get('MONGODB_NEW'); - -var MongoClient = MongoDB.MongoClient; - -mongoose.Promise = Bluebird; // otherwise mongoose models won't work - -// Load new models -var NewChallenge = require('../../website/server/models/challenge').model; -var Tasks = require('../../website/server/models/task'); - -// To be defined later when MongoClient connects -var mongoDbOldInstance; -var oldChallengeCollection; - -var mongoDbNewInstance; -var newChallengeCollection; -var newTaskCollection; - -var BATCH_SIZE = 1000; - -var processedChallenges = 0; -var totoalProcessedTasks = 0; - -var newTasksIds = {}; // a map of old id -> [new id, challengeId] - -// Only process challenges that fall in a interval ie -> up to 0000-4000-0000-0000 -var AFTER_CHALLENGE_ID = nconf.get('AFTER_CHALLENGE_ID'); -var BEFORE_CHALLENGE_ID = nconf.get('BEFORE_CHALLENGE_ID'); - -function processChallenges (afterId) { - var processedTasks = 0; - var lastChallenge = null; - var oldChallenges; - - var query = {}; - - if (BEFORE_CHALLENGE_ID) { - query._id = {$lte: BEFORE_CHALLENGE_ID}; - } - - if ((afterId || AFTER_CHALLENGE_ID) && !query._id) { - query._id = {}; - } - - if (afterId) { - query._id.$gt = afterId; - } else if (AFTER_CHALLENGE_ID) { - query._id.$gt = AFTER_CHALLENGE_ID; - } - - var batchInsertTasks = newTaskCollection.initializeUnorderedBulkOp(); - var batchInsertChallenges = newChallengeCollection.initializeUnorderedBulkOp(); - - console.log(`Executing challenges query.\nMatching challenges after ${afterId ? afterId : AFTER_CHALLENGE_ID} and before ${BEFORE_CHALLENGE_ID} (included).`); - - return oldChallengeCollection - .find(query) - .sort({_id: 1}) - .limit(BATCH_SIZE) - .toArray() - .then(function (oldChallengesR) { - oldChallenges = oldChallengesR; - - console.log(`Processing ${oldChallenges.length} challenges. Already processed ${processedChallenges} challenges and ${totoalProcessedTasks} tasks.`); - - if (oldChallenges.length === BATCH_SIZE) { - lastChallenge = oldChallenges[oldChallenges.length - 1]._id; - } - - oldChallenges.forEach(function (oldChallenge) { - var oldTasks = oldChallenge.habits.concat(oldChallenge.dailys).concat(oldChallenge.rewards).concat(oldChallenge.todos); - delete oldChallenge.habits; - delete oldChallenge.dailys; - delete oldChallenge.rewards; - delete oldChallenge.todos; - - var createdAt = oldChallenge.timestamp; - - oldChallenge.memberCount = oldChallenge.members.length; - if (oldChallenge.prize <= 0) oldChallenge.prize = 0; - if (!oldChallenge.name) oldChallenge.name = 'challenge name'; - if (!oldChallenge.shortName) oldChallenge.name = 'challenge-name'; - - if (!oldChallenge.group) throw new Error('challenge.group is required'); - if (!oldChallenge.leader) throw new Error('challenge.leader is required'); - - - if (oldChallenge.leader === '9') { - oldChallenge.leader = '00000000-0000-4000-9000-000000000000'; - } - - if (oldChallenge.group === 'habitrpg') { - oldChallenge.group = '00000000-0000-4000-A000-000000000000'; - } - - delete oldChallenge.id; - - var newChallenge = new NewChallenge(oldChallenge); - - newChallenge.createdAt = createdAt; - - oldTasks.forEach(function (oldTask) { - oldTask._id = uuid.v4(); - oldTask._legacyId = oldTask.id; // store the old task id - delete oldTask.id; - - oldTask.challenge = oldTask.challenge || {}; - oldTask.challenge.id = newChallenge._id; - - if (newTasksIds[oldTask._legacyId + '-' + newChallenge._id]) { - throw new Error('duplicate :('); - } else { - newTasksIds[oldTask._legacyId + '-' + newChallenge._id] = oldTask._id; - } - - oldTask.tags = _.map(oldTask.tags || {}, function (tagPresent, tagId) { - return tagPresent && tagId; - }).filter(function (tag) { - return tag !== false; - }); - - if (!oldTask.text) oldTask.text = 'task text'; // required - - oldTask.createdAt = oldTask.dateCreated; - - newChallenge.tasksOrder[`${oldTask.type}s`].push(oldTask._id); - if (oldTask.completed) oldTask.completed = false; - - var newTask = new Tasks[oldTask.type](oldTask); - - batchInsertTasks.insert(newTask.toObject()); - processedTasks++; - }); - - batchInsertChallenges.insert(newChallenge.toObject()); - }); - - console.log(`Saving ${oldChallenges.length} challenges and ${processedTasks} tasks.`); - - return Bluebird.all([ - batchInsertChallenges.execute(), - batchInsertTasks.execute(), - ]); - }) - .then(function () { - totoalProcessedTasks += processedTasks; - processedChallenges += oldChallenges.length; - - console.log(`Saved ${oldChallenges.length} challenges and their tasks.`); - - if (lastChallenge) { - return processChallenges(lastChallenge); - } else { - console.log('Writing newTasksIds.json...') - fs.writeFileSync('newTasksIds.json', JSON.stringify(newTasksIds, null, 4), 'utf8'); - return console.log('Done!'); - } - }); -} - -// Connect to the databases -Bluebird.all([ - MongoClient.connect(MONGODB_OLD), - MongoClient.connect(MONGODB_NEW), -]) -.then(function (result) { - var oldInstance = result[0]; - var newInstance = result[1]; - - mongoDbOldInstance = oldInstance; - oldChallengeCollection = mongoDbOldInstance.collection('challenges'); - - mongoDbNewInstance = newInstance; - newChallengeCollection = mongoDbNewInstance.collection('challenges'); - newTaskCollection = mongoDbNewInstance.collection('tasks'); - - console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); - - return processChallenges(); -}) -.catch(function (err) { - console.error(err.stack || err); -}); diff --git a/migrations/api_v3/challengesMembers.js b/migrations/api_v3/challengesMembers.js deleted file mode 100644 index 349abde57b..0000000000 --- a/migrations/api_v3/challengesMembers.js +++ /dev/null @@ -1,149 +0,0 @@ -// Migrate challenges members -// Run AFTER users migration - -// The console-stamp module must be installed (not included in package.json) - -// It requires two environment variables: MONGODB_OLD and MONGODB_NEW - -// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). -// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM -console.log('Starting migrations/api_v3/challengesMembers.js.'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -require('babel-register'); -require('babel-polyfill'); - -var Bluebird = require('bluebird'); -var MongoDB = require('mongodb'); -var nconf = require('nconf'); -var mongoose = require('mongoose'); -var _ = require('lodash'); -var uuid = require('uuid'); -var consoleStamp = require('console-stamp'); - -// Add timestamps to console messages -consoleStamp(console); - -// Initialize configuration -require('../../website/server/libs/api-v3/setupNconf')(); - -var MONGODB_OLD = nconf.get('MONGODB_OLD'); -var MONGODB_NEW = nconf.get('MONGODB_NEW'); - -var MongoClient = MongoDB.MongoClient; - -mongoose.Promise = Bluebird; // otherwise mongoose models won't work - -// To be defined later when MongoClient connects -var mongoDbOldInstance; -var oldChallengeCollection; - -var mongoDbNewInstance; -var newUserCollection; - -var BATCH_SIZE = 1000; - -var processedChallenges = 0; - -// Only process challenges that fall in a interval ie -> up to 0000-4000-0000-0000 -var AFTER_CHALLENGE_ID = nconf.get('AFTER_CHALLENGE_ID'); -var BEFORE_CHALLENGE_ID = nconf.get('BEFORE_CHALLENGE_ID'); - -function processChallenges (afterId) { - var processedTasks = 0; - var lastChallenge = null; - var oldChallenges; - - var query = {}; - - if (BEFORE_CHALLENGE_ID) { - query._id = {$lte: BEFORE_CHALLENGE_ID}; - } - - if ((afterId || AFTER_CHALLENGE_ID) && !query._id) { - query._id = {}; - } - - if (afterId) { - query._id.$gt = afterId; - } else if (AFTER_CHALLENGE_ID) { - query._id.$gt = AFTER_CHALLENGE_ID; - } - - console.log(`Executing challenges query.\nMatching challenges after ${afterId ? afterId : AFTER_CHALLENGE_ID} and before ${BEFORE_CHALLENGE_ID} (included).`); - - return oldChallengeCollection - .find(query) - .sort({_id: 1}) - .limit(BATCH_SIZE) - .toArray() - .then(function (oldChallengesR) { - oldChallenges = oldChallengesR; - - var promises = []; - - console.log(`Processing ${oldChallenges.length} challenges. Already processed ${processedChallenges} challenges.`); - - if (oldChallenges.length === BATCH_SIZE) { - lastChallenge = oldChallenges[oldChallenges.length - 1]._id; - } - - oldChallenges.forEach(function (oldChallenge) { - // Tyler Renelle - oldChallenge.members.forEach(function (id, index) { - if (id === '9') { - oldChallenge.members[index] = '00000000-0000-4000-9000-000000000000'; - } - }); - - promises.push(newUserCollection.updateMany({ - _id: {$in: oldChallenge.members || []}, - }, { - $push: {challenges: oldChallenge._id}, - }, {multi: true})); - }); - - console.log(`Migrating members of ${oldChallenges.length} challenges.`); - - return Bluebird.all(promises); - }) - .then(function () { - processedChallenges += oldChallenges.length; - - console.log(`Migrated members of ${oldChallenges.length} challenges.`); - - if (lastChallenge) { - return processChallenges(lastChallenge); - } else { - return console.log('Done!'); - } - }); -} - -// Connect to the databases -Bluebird.all([ - MongoClient.connect(MONGODB_OLD), - MongoClient.connect(MONGODB_NEW), -]) -.then(function (result) { - var oldInstance = result[0]; - var newInstance = result[1]; - - mongoDbOldInstance = oldInstance; - oldChallengeCollection = mongoDbOldInstance.collection('challenges'); - - mongoDbNewInstance = newInstance; - newUserCollection = mongoDbNewInstance.collection('users'); - - console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); - - return processChallenges(); -}) -.catch(function (err) { - console.error(err.stack || err); -}); diff --git a/migrations/api_v3/coupons.js b/migrations/api_v3/coupons.js deleted file mode 100644 index 8b79deba8d..0000000000 --- a/migrations/api_v3/coupons.js +++ /dev/null @@ -1,142 +0,0 @@ -// Migrate coupons collection to new schema - -// The console-stamp module must be installed (not included in package.json) - -// It requires two environment variables: MONGODB_OLD and MONGODB_NEW - -// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). -// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM -console.log('Starting migrations/api_v3/coupons.js.'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -require('babel-register'); -require('babel-polyfill'); - -var Bluebird = require('bluebird'); -var MongoDB = require('mongodb'); -var nconf = require('nconf'); -var mongoose = require('mongoose'); -var _ = require('lodash'); -var uuid = require('uuid'); -var consoleStamp = require('console-stamp'); - -// Add timestamps to console messages -consoleStamp(console); - -// Initialize configuration -require('../../website/server/libs/api-v3/setupNconf')(); - -var MONGODB_OLD = nconf.get('MONGODB_OLD'); -var MONGODB_NEW = nconf.get('MONGODB_NEW'); - -var MongoClient = MongoDB.MongoClient; - -mongoose.Promise = Bluebird; // otherwise mongoose models won't work - -// Load new models -var Coupon = require('../../website/server/models/coupon').model; - -// To be defined later when MongoClient connects -var mongoDbOldInstance; -var oldCouponCollection; - -var mongoDbNewInstance; -var newCouponCollection; - -var BATCH_SIZE = 1000; - -var processedCoupons = 0; - -// Only process coupons that fall in a interval ie -> up to 0000-4000-0000-0000 -var AFTER_COUPON_ID = nconf.get('AFTER_COUPON_ID'); -var BEFORE_COUPON_ID = nconf.get('BEFORE_COUPON_ID'); - -function processCoupons (afterId) { - var processedTasks = 0; - var lastCoupon = null; - var oldCoupons; - - var query = {}; - - if (BEFORE_COUPON_ID) { - query._id = {$lte: BEFORE_COUPON_ID}; - } - - if ((afterId || AFTER_COUPON_ID) && !query._id) { - query._id = {}; - } - - if (afterId) { - query._id.$gt = afterId; - } else if (AFTER_COUPON_ID) { - query._id.$gt = AFTER_COUPON_ID; - } - - var batchInsertCoupons = newCouponCollection.initializeUnorderedBulkOp(); - - console.log(`Executing coupons query.\nMatching coupons after ${afterId ? afterId : AFTER_COUPON_ID} and before ${BEFORE_COUPON_ID} (included).`); - - return oldCouponCollection - .find(query) - .sort({_id: 1}) - .limit(BATCH_SIZE) - .toArray() - .then(function (oldCouponsR) { - oldCoupons = oldCouponsR; - - console.log(`Processing ${oldCoupons.length} coupons. Already processed ${processedCoupons} coupons.`); - - if (oldCoupons.length === BATCH_SIZE) { - lastCoupon = oldCoupons[oldCoupons.length - 1]._id; - } - - oldCoupons.forEach(function (oldCoupon) { - var newCoupon = new Coupon(oldCoupon); - - batchInsertCoupons.insert(newCoupon.toObject()); - }); - - console.log(`Saving ${oldCoupons.length} coupons.`); - - return batchInsertCoupons.execute(); - }) - .then(function () { - processedCoupons += oldCoupons.length; - - console.log(`Saved ${oldCoupons.length} coupons.`); - - if (lastCoupon) { - return processCoupons(lastCoupon); - } else { - return console.log('Done!'); - } - }); -} - -// Connect to the databases -Bluebird.all([ - MongoClient.connect(MONGODB_OLD), - MongoClient.connect(MONGODB_NEW), -]) -.then(function (result) { - var oldInstance = result[0]; - var newInstance = result[1]; - - mongoDbOldInstance = oldInstance; - oldCouponCollection = mongoDbOldInstance.collection('coupons'); - - mongoDbNewInstance = newInstance; - newCouponCollection = mongoDbNewInstance.collection('coupons'); - - console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); - - return processCoupons(); -}) -.catch(function (err) { - console.error(err.stack || err); -}); diff --git a/migrations/api_v3/emailUnsubscriptions.js b/migrations/api_v3/emailUnsubscriptions.js deleted file mode 100644 index 3e1629563e..0000000000 --- a/migrations/api_v3/emailUnsubscriptions.js +++ /dev/null @@ -1,143 +0,0 @@ -// Migrate unsubscriptions collection to new schema - -// The console-stamp module must be installed (not included in package.json) - -// It requires two environment variables: MONGODB_OLD and MONGODB_NEW - -// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). -// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM -console.log('Starting migrations/api_v3/unsubscriptions.js.'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -require('babel-register'); -require('babel-polyfill'); - -var Bluebird = require('bluebird'); -var MongoDB = require('mongodb'); -var nconf = require('nconf'); -var mongoose = require('mongoose'); -var _ = require('lodash'); -var uuid = require('uuid'); -var consoleStamp = require('console-stamp'); - -// Add timestamps to console messages -consoleStamp(console); - -// Initialize configuration -require('../../website/server/libs/api-v3/setupNconf')(); - -var MONGODB_OLD = nconf.get('MONGODB_OLD'); -var MONGODB_NEW = nconf.get('MONGODB_NEW'); - -var MongoClient = MongoDB.MongoClient; - -mongoose.Promise = Bluebird; // otherwise mongoose models won't work - -// Load new models -var EmailUnsubscription = require('../../website/server/models/emailUnsubscription').model; - -// To be defined later when MongoClient connects -var mongoDbOldInstance; -var oldUnsubscriptionCollection; - -var mongoDbNewInstance; -var newUnsubscriptionCollection; - -var BATCH_SIZE = 1000; - -var processedUnsubscriptions = 0; - -// Only process unsubscriptions that fall in a interval ie -> up to 0000-4000-0000-0000 -var AFTER_UNSUBSCRIPTION_ID = nconf.get('AFTER_UNSUBSCRIPTION_ID'); -var BEFORE_UNSUBSCRIPTION_ID = nconf.get('BEFORE_UNSUBSCRIPTION_ID'); - -function processUnsubscriptions (afterId) { - var processedTasks = 0; - var lastUnsubscription = null; - var oldUnsubscriptions; - - var query = {}; - - if (BEFORE_UNSUBSCRIPTION_ID) { - query._id = {$lte: BEFORE_UNSUBSCRIPTION_ID}; - } - - if ((afterId || AFTER_UNSUBSCRIPTION_ID) && !query._id) { - query._id = {}; - } - - if (afterId) { - query._id.$gt = afterId; - } else if (AFTER_UNSUBSCRIPTION_ID) { - query._id.$gt = AFTER_UNSUBSCRIPTION_ID; - } - - var batchInsertUnsubscriptions = newUnsubscriptionCollection.initializeUnorderedBulkOp(); - - console.log(`Executing unsubscriptions query.\nMatching unsubscriptions after ${afterId ? afterId : AFTER_UNSUBSCRIPTION_ID} and before ${BEFORE_UNSUBSCRIPTION_ID} (included).`); - - return oldUnsubscriptionCollection - .find(query) - .sort({_id: 1}) - .limit(BATCH_SIZE) - .toArray() - .then(function (oldUnsubscriptionsR) { - oldUnsubscriptions = oldUnsubscriptionsR; - - console.log(`Processing ${oldUnsubscriptions.length} unsubscriptions. Already processed ${processedUnsubscriptions} unsubscriptions.`); - - if (oldUnsubscriptions.length === BATCH_SIZE) { - lastUnsubscription = oldUnsubscriptions[oldUnsubscriptions.length - 1]._id; - } - - oldUnsubscriptions.forEach(function (oldUnsubscription) { - oldUnsubscription.email = oldUnsubscription.email.toLowerCase(); - var newUnsubscription = new EmailUnsubscription(oldUnsubscription); - - batchInsertUnsubscriptions.insert(newUnsubscription.toObject()); - }); - - console.log(`Saving ${oldUnsubscriptions.length} unsubscriptions.`); - - return batchInsertUnsubscriptions.execute(); - }) - .then(function () { - processedUnsubscriptions += oldUnsubscriptions.length; - - console.log(`Saved ${oldUnsubscriptions.length} unsubscriptions.`); - - if (lastUnsubscription) { - return processUnsubscriptions(lastUnsubscription); - } else { - return console.log('Done!'); - } - }); -} - -// Connect to the databases -Bluebird.all([ - MongoClient.connect(MONGODB_OLD), - MongoClient.connect(MONGODB_NEW), -]) -.then(function (result) { - var oldInstance = result[0]; - var newInstance = result[1]; - - mongoDbOldInstance = oldInstance; - oldUnsubscriptionCollection = mongoDbOldInstance.collection('emailunsubscriptions'); - - mongoDbNewInstance = newInstance; - newUnsubscriptionCollection = mongoDbNewInstance.collection('emailunsubscriptions'); - - console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); - - return processUnsubscriptions(); -}) -.catch(function (err) { - console.error(err.stack || err); -}); diff --git a/migrations/api_v3/groups.js b/migrations/api_v3/groups.js deleted file mode 100644 index e623b9d062..0000000000 --- a/migrations/api_v3/groups.js +++ /dev/null @@ -1,217 +0,0 @@ -/* - members are not stored anymore - invites are not stored anymore - - tavern id and leader must be updated -*/ - -// Migrate groups collection to new schema -// Run AFTER users migration - -// The console-stamp module must be installed (not included in package.json) - -// It requires two environment variables: MONGODB_OLD and MONGODB_NEW - -// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). -// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM -console.log('Starting migrations/api_v3/groups.js.'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -require('babel-register'); -require('babel-polyfill'); - -var Bluebird = require('bluebird'); -var MongoDB = require('mongodb'); -var nconf = require('nconf'); -var mongoose = require('mongoose'); -var _ = require('lodash'); -var uuid = require('uuid'); -var consoleStamp = require('console-stamp'); - -// Add timestamps to console messages -consoleStamp(console); - -// Initialize configuration -require('../../website/server/libs/api-v3/setupNconf')(); - -var MONGODB_OLD = nconf.get('MONGODB_OLD'); -var MONGODB_NEW = nconf.get('MONGODB_NEW'); - -var MongoClient = MongoDB.MongoClient; - -mongoose.Promise = Bluebird; // otherwise mongoose models won't work - -// Load new models -var NewGroup = require('../../website/server/models/group').model; - -var TAVERN_ID = require('../../website/server/models/group').TAVERN_ID; - -// To be defined later when MongoClient connects -var mongoDbOldInstance; -var oldGroupCollection; - -var mongoDbNewInstance; -var newGroupCollection; -var newUserCollection; - -var BATCH_SIZE = 1000; - -var processedGroups = 0; - -// Only process groups that fall in a interval ie -> up to 0000-4000-0000-0000 -var AFTER_GROUP_ID = nconf.get('AFTER_GROUP_ID'); -var BEFORE_GROUP_ID = nconf.get('BEFORE_GROUP_ID'); - -function processGroups (afterId) { - var processedTasks = 0; - var lastGroup = null; - var oldGroups; - - var query = {}; - - if (BEFORE_GROUP_ID) { - query._id = {$lte: BEFORE_GROUP_ID}; - } - - if ((afterId || AFTER_GROUP_ID) && !query._id) { - query._id = {}; - } - - if (afterId) { - query._id.$gt = afterId; - } else if (AFTER_GROUP_ID) { - query._id.$gt = AFTER_GROUP_ID; - } - - var batchInsertGroups = newGroupCollection.initializeUnorderedBulkOp(); - - console.log(`Executing groups query.\nMatching groups after ${afterId ? afterId : AFTER_GROUP_ID} and before ${BEFORE_GROUP_ID} (included).`); - - return oldGroupCollection - .find(query) - .sort({_id: 1}) - .limit(BATCH_SIZE) - .toArray() - .then(function (oldGroupsR) { - oldGroups = oldGroupsR; - - var promises = []; - - console.log(`Processing ${oldGroups.length} groups. Already processed ${processedGroups} groups.`); - - if (oldGroups.length === BATCH_SIZE) { - lastGroup = oldGroups[oldGroups.length - 1]._id; - } - - oldGroups.forEach(function (oldGroup) { - if ((!oldGroup.privacy || oldGroup.privacy === 'private') && (!oldGroup.members || oldGroup.members.length === 0)) return; // delete empty private groups TODO must also delete challenges or this won't work - - oldGroup.members = oldGroup.members || []; - oldGroup.memberCount = oldGroup.members ? oldGroup.members.length : 0; - oldGroup.challengeCount = oldGroup.challenges ? oldGroup.challenges.length : 0; - - if (oldGroup.balance <= 0) oldGroup.balance = 0; - if (!oldGroup.name) oldGroup.name = 'group name'; - if (!oldGroup.leaderOnly) oldGroup.leaderOnly = {}; - if (!oldGroup.leaderOnly.challenges) oldGroup.leaderOnly.challenges = false; - - // Tavern - if (oldGroup._id === 'habitrpg') { - oldGroup._id = TAVERN_ID; - oldGroup.leader = '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0'; // Siena Leslie - } - - if (!oldGroup.type) { - // throw new Error('group.type is required'); - oldGroup.type = 'guild'; - } - - if (!oldGroup.leader) { - if (oldGroup.members && oldGroup.members.length > 0) { - oldGroup.leader = oldGroup.members[0]; - } else { - throw new Error('group.leader is required and no member available!'); - } - } - - if (!oldGroup.privacy) { - // throw new Error('group.privacy is required'); - oldGroup.privacy = 'private'; - } - - var updateMembers = {}; - - if (oldGroup.type === 'guild') { - updateMembers.$push = {guilds: oldGroup._id}; - } else if (oldGroup.type === 'party') { - updateMembers.$set = {'party._id': oldGroup._id}; - } - - if (oldGroup.members) { - // Tyler Renelle - oldGroup.members.forEach(function (id, index) { - if (id === '9') { - oldGroup.members[index] = '00000000-0000-4000-9000-000000000000'; - } - }); - - promises.push(newUserCollection.updateMany({ - _id: {$in: oldGroup.members}, - }, updateMembers, {multi: true})); - } - - var newGroup = new NewGroup(oldGroup); - - batchInsertGroups.insert(newGroup.toObject()); - }); - - console.log(`Saving ${oldGroups.length} groups and migrating members to users collection.`); - - promises.push(batchInsertGroups.execute()); - return Bluebird.all(promises); - }) - .then(function () { - processedGroups += oldGroups.length; - - console.log(`Saved ${oldGroups.length} groups and migrated their members to the user collection.`); - - if (lastGroup) { - return processGroups(lastGroup); - } else { - return console.log('Done!'); - } - }); -} - -// Connect to the databases -Bluebird.all([ - MongoClient.connect(MONGODB_OLD), - MongoClient.connect(MONGODB_NEW), -]) -.then(function (result) { - var oldInstance = result[0]; - var newInstance = result[1]; - - mongoDbOldInstance = oldInstance; - oldGroupCollection = mongoDbOldInstance.collection('groups'); - - mongoDbNewInstance = newInstance; - newGroupCollection = mongoDbNewInstance.collection('groups'); - newUserCollection = mongoDbNewInstance.collection('users'); - - console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); - - // First delete the tavern group created by having required the group model - return newGroupCollection.deleteOne({_id: TAVERN_ID}); -}) -.then(function () { - return processGroups(); -}) -.catch(function (err) { - console.error(err.stack || err); -}); diff --git a/migrations/api_v3/users.js b/migrations/api_v3/users.js deleted file mode 100644 index f2c8e2f52f..0000000000 --- a/migrations/api_v3/users.js +++ /dev/null @@ -1,268 +0,0 @@ -// Migrate users collection to new schema -// This should run AFTER challenges migration - -// The console-stamp module must be installed (not included in package.json) - -// It requires two environment variables: MONGODB_OLD and MONGODB_NEW - -// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). -// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM -console.log('Starting migrations/api_v3/users.js.'); - -// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. -// We've now upgraded to lodash v4 but the code used in this migration has not been -// adapted to work with it. Before this migration is used again any lodash method should -// be checked for compatibility against the v4 changelog and changed if necessary. -// https://github.com/lodash/lodash/wiki/Changelog#v400 - -require('babel-register'); -require('babel-polyfill'); - -var Bluebird = require('bluebird'); -var MongoDB = require('mongodb'); -var nconf = require('nconf'); -var mongoose = require('mongoose'); -var _ = require('lodash'); -var uuid = require('uuid'); -var consoleStamp = require('console-stamp'); -var common = require('../../common'); -var moment = require('moment'); - -// Add timestamps to console messages -consoleStamp(console); - -// Initialize configuration -require('../../website/server/libs/api-v3/setupNconf')(); - -var MONGODB_OLD = nconf.get('MONGODB_OLD'); -var MONGODB_NEW = nconf.get('MONGODB_NEW'); - -var taskDefaults = common.taskDefaults; -var MongoClient = MongoDB.MongoClient; - -mongoose.Promise = Bluebird; // otherwise mongoose models won't work - -// Load new models -var NewUser = require('../../website/server/models/user').model; -var NewTasks = require('../../website/server/models/task'); - -// To be defined later when MongoClient connects -var mongoDbOldInstance; -var oldUserCollection; - -var mongoDbNewInstance; -var newUserCollection; -var newTaskCollection; - -var BATCH_SIZE = 1000; - -var processedUsers = 0; -var totoalProcessedTasks = 0; - -var challengeTaskWithMatchingId = 0; -var challengeTaskNoMatchingId = 0; - -// Load the new tasks ids for challenges tasks -var newTasksIds = require('./newTasksIds.json'); - -// Only process users that fall in a interval ie up to -> 0000-4000-0000-0000 -var AFTER_USER_ID = nconf.get('AFTER_USER_ID'); -var BEFORE_USER_ID = nconf.get('BEFORE_USER_ID'); - -function processUsers (afterId) { - var processedTasks = 0; - var lastUser = null; - var oldUsers; - - var now = new Date(); - - var query = {}; - - if (BEFORE_USER_ID) { - query._id = {$lte: BEFORE_USER_ID}; - } - - if ((afterId || AFTER_USER_ID) && !query._id) { - query._id = {}; - } - - if (afterId) { - query._id.$gt = afterId; - } else if (AFTER_USER_ID) { - query._id.$gt = AFTER_USER_ID; - } - - var batchInsertTasks = newTaskCollection.initializeUnorderedBulkOp(); - var batchInsertUsers = newUserCollection.initializeUnorderedBulkOp(); - - console.log(`Executing users query.\nMatching users after ${afterId ? afterId : AFTER_USER_ID} and before ${BEFORE_USER_ID} (included).`); - - return oldUserCollection - .find(query) - .sort({_id: 1}) - .limit(BATCH_SIZE) - .toArray() - .then(function (oldUsersR) { - oldUsers = oldUsersR; - - console.log(`Processing ${oldUsers.length} users. Already processed ${processedUsers} users and ${totoalProcessedTasks} tasks.`); - - if (oldUsers.length === BATCH_SIZE) { - lastUser = oldUsers[oldUsers.length - 1]._id; - } - - oldUsers.forEach(function (oldUser) { - var oldTasks = oldUser.habits.concat(oldUser.dailys).concat(oldUser.rewards).concat(oldUser.todos); - delete oldUser.habits; - delete oldUser.dailys; - delete oldUser.rewards; - delete oldUser.todos; - - delete oldUser.id; - - // spookDust -> spookySparkles - - if (oldUser.achievements && oldUser.achievements.spookDust) { - oldUser.achievements.spookySparkles = oldUser.achievements.spookDust; - delete oldUser.achievements.spookDust; - } - - if (oldUser.items && oldUser.items.special && oldUser.items.special.spookDust) { - oldUser.items.special.spookySparkles = oldUser.items.special.spookDust; - delete oldUser.items.special.spookDust; - } - - if (oldUser.stats && oldUser.stats.buffs && oldUser.stats.buffs.spookySparkles) { - oldUser.stats.buffs.spookySparkles = oldUser.stats.buffs.spookDust; - delete oldUser.stats.buffs.spookDust; - } - - // end spookDust -> spookySparkles - - oldUser.tags = oldUser.tags.map(function (tag) { - return { - id: tag.id, - name: tag.name || 'tag name', - challenge: tag.challenge, - }; - }); - - if (oldUser._id === '9') { // Tyler Renelle - oldUser._id = '00000000-0000-4000-9000-000000000000'; - } - - var newUser = new NewUser(oldUser); - var isSubscribed = newUser.isSubscribed(); - - oldTasks.forEach(function (oldTask) { - oldTask._id = uuid.v4(); // create a new unique uuid - oldTask.userId = newUser._id; - oldTask._legacyId = oldTask.id; // store the old task id - delete oldTask.id; - - oldTask.challenge = oldTask.challenge || {}; - if (oldTask.challenge.id) { - if (oldTask.challenge.broken) { - oldTask.challenge.taskId = oldTask._legacyId; - } else { - var newId = newTasksIds[oldTask._legacyId + '-' + oldTask.challenge.id]; - - // Challenges' tasks ids changed - if (!newId && !oldTask.challenge.broken) { - challengeTaskNoMatchingId++; - oldTask.challenge.taskId = oldTask._legacyId; - oldTask.challenge.broken = 'CHALLENGE_TASK_NOT_FOUND'; - } else { - challengeTaskWithMatchingId++; - oldTask.challenge.taskId = newId; - } - } - } - - // Delete old completed todos - if (oldTask.type === 'todo' && oldTask.completed && (!oldTask.challenge.id || oldTask.challenge.broken)) { - if (moment(now).subtract(isSubscribed ? 90 : 30, 'days').toDate() > moment(oldTask.dateCompleted).toDate()) { - return; - } - } - - oldTask.createdAt = oldTask.dateCreated; - - if (!oldTask.text) oldTask.text = 'task text'; // required - oldTask.tags = _.map(oldTask.tags, function (tagPresent, tagId) { - return tagPresent && tagId; - }).filter(function (tag) { - return tag !== false; - }); - - if (oldTask.type !== 'todo' || (oldTask.type === 'todo' && !oldTask.completed)) { - newUser.tasksOrder[`${oldTask.type}s`].push(oldTask._id); - } - - var allTasksFields = ['_id', 'type', 'text', 'notes', 'tags', 'value', 'priority', 'attribute', 'challenge', 'reminders', 'userId', '_legacyId', 'createdAt']; - // using mongoose models is too slow - if (oldTask.type === 'habit') { - oldTask = _.pick(oldTask, allTasksFields.concat(['history', 'up', 'down'])); - } else if (oldTask.type === 'daily') { - oldTask = _.pick(oldTask, allTasksFields.concat(['completed', 'collapseChecklist', 'checklist', 'history', 'frequency', 'everyX', 'startDate', 'repeat', 'streak'])); - } else if (oldTask.type === 'todo') { - oldTask = _.pick(oldTask, allTasksFields.concat(['completed', 'collapseChecklist', 'checklist', 'date', 'dateCompleted'])); - } else if (oldTask.type === 'reward') { - oldTask = _.pick(oldTask, allTasksFields); - } else { - throw new Error('Task with no or invalid type!'); - } - - batchInsertTasks.insert(taskDefaults(oldTask)); - processedTasks++; - }); - - batchInsertUsers.insert(newUser.toObject()); - }); - - console.log(`Saving ${oldUsers.length} users and ${processedTasks} tasks.`); - - return Bluebird.all([ - batchInsertUsers.execute(), - batchInsertTasks.execute(), - ]); - }) - .then(function () { - totoalProcessedTasks += processedTasks; - processedUsers += oldUsers.length; - - console.log(`Saved ${oldUsers.length} users and their tasks.`); - console.log('Challenges\' tasks no matching id: ', challengeTaskNoMatchingId); - console.log('Challenges\' tasks with matching id: ', challengeTaskWithMatchingId); - - if (lastUser) { - return processUsers(lastUser); - } else { - return console.log('Done!'); - } - }); -} - -// Connect to the databases -Bluebird.all([ - MongoClient.connect(MONGODB_OLD), - MongoClient.connect(MONGODB_NEW), -]) -.then(function (result) { - var oldInstance = result[0]; - var newInstance = result[1]; - - mongoDbOldInstance = oldInstance; - oldUserCollection = mongoDbOldInstance.collection('users'); - - mongoDbNewInstance = newInstance; - newUserCollection = mongoDbNewInstance.collection('users'); - newTaskCollection = mongoDbNewInstance.collection('tasks'); - - console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); - - return processUsers(); -}) -.catch(function (err) { - console.error(err.stack || err); -}); diff --git a/migrations/apology_gems.js b/migrations/apology_gems.js deleted file mode 100644 index e22a428047..0000000000 --- a/migrations/apology_gems.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({_id:{$in:['']}},{$inc:{balance:0.5}},{multi:true}); \ No newline at end of file diff --git a/migrations/archive/2013/20130128_add_missing_crons.js b/migrations/archive/2013/20130128_add_missing_crons.js new file mode 100644 index 0000000000..5a28b83e69 --- /dev/null +++ b/migrations/archive/2013/20130128_add_missing_crons.js @@ -0,0 +1,5 @@ +db.users.update( + { lastCron: { $exists: false} }, + { $set: { lastCron: Number(new Date()) } }, + { multi: true } +); \ No newline at end of file diff --git a/migrations/archive/2013/20130128_merge_completed_todo_ids.js b/migrations/archive/2013/20130128_merge_completed_todo_ids.js new file mode 100644 index 0000000000..6b3f3d39af --- /dev/null +++ b/migrations/archive/2013/20130128_merge_completed_todo_ids.js @@ -0,0 +1,15 @@ +db.users.find({ completedIds: { $exists: true } }).forEach(function (user) { + let newTodoIds = user.todoIds; + user.completedIds.forEach(function (value) { + if (newTodoIds.indexOf(value) === -1) { + newTodoIds.push(value); + } + }); + db.users.update( + { _id: user._id }, + { + $set: { todoIds: newTodoIds }, + $unset: { completedIds: 1 }, + } + ); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130129_add_missing_preferences.js b/migrations/archive/2013/20130129_add_missing_preferences.js new file mode 100644 index 0000000000..d2710a5dbf --- /dev/null +++ b/migrations/archive/2013/20130129_add_missing_preferences.js @@ -0,0 +1,5 @@ +db.users.update( + {preferences: {$exists: false}}, + {$set: {preferences: {gender: 'm', armorSet: 'v1'}}}, + {multi: true} +); diff --git a/migrations/20130204_count_habits.js b/migrations/archive/2013/20130204_count_habits.js similarity index 55% rename from migrations/20130204_count_habits.js rename to migrations/archive/2013/20130204_count_habits.js index 172bee9e60..b5e3b50d6c 100644 --- a/migrations/20130204_count_habits.js +++ b/migrations/archive/2013/20130204_count_habits.js @@ -7,14 +7,14 @@ // be checked for compatibility against the v4 changelog and changed if necessary. // https://github.com/lodash/lodash/wiki/Changelog#v400 -var habits = 0, - dailies = 0, - todos = 0, - registered = { $or: [ { 'auth.local': { $exists: true } }, { 'auth.facebook': { $exists: true} } ]}; +let habits = 0, + dailies = 0, + todos = 0, + registered = { $or: [{ 'auth.local': { $exists: true } }, { 'auth.facebook': { $exists: true} }]}; -db.user.find(registered).forEach(function(u){ - //TODO this isn't working?? - habits += _.where(u.tasks, {type:'habit'}).length; - dailies += _.where(u.tasks, {type:'daily'}).length; - todos += _.where(u.tasks, {type:'todo'}).length; -}) +db.user.find(registered).forEach(function (u) { + // TODO this isn't working?? + habits += _.where(u.tasks, {type: 'habit'}).length; + dailies += _.where(u.tasks, {type: 'daily'}).length; + todos += _.where(u.tasks, {type: 'todo'}).length; +}); diff --git a/migrations/archive/2013/20130204_user_public_private_paths.js b/migrations/archive/2013/20130204_user_public_private_paths.js new file mode 100644 index 0000000000..698187985c --- /dev/null +++ b/migrations/archive/2013/20130204_user_public_private_paths.js @@ -0,0 +1,101 @@ +// %mongo server:27017/dbname underscore.js my_commands.js +// %mongo server:27017/dbname underscore.js --shell + +// db.users.find({'auth.facebook.email': 'tylerrenelle@gmail.com'}).forEach(function(user){ +db.users.find().forEach(function (user) { + if (!user._id) { + print('User has null _id'); + return; // need to figure out how to delete these buggers if they don't have an id to delete from + } + + if (user.idLists) { + print(`User ${ user._id } has already been migrated`); + return; + } + + if (user._id.indexOf('$') === 0) { + print(`User id starts with $ (${ user._id })`); + return; + } + + // even though we're clobbering user later, sometimes these are undefined and crash the script + // this saves us some ternaries + user.stats = user.stats || {}; + user.items = user.items || {}; + user.preferences = user.preferences || {}; + user.notifications = user.notifications || {}; + user.flags = user.flags || {}; + user.habitIds = user.habitIds || []; + user.dailyIds = user.dailyIds || []; + user.todoIds = user.todoIds || []; + user.rewardIds = user.rewardIds || []; + + _.each(user.tasks, function (task, key) { + if (!task.type) { + delete user.tasks[key]; + // idList will take care of itself on page-load + return; + } + if (key === '$spec') { + print(`$spec was found: ${ user._id}`); + return; + } + if (key.indexOf('$_') === 0) { + let newKey = key.replace('$_', ''), + index = user[`${task.type }Ids`].indexOf(key); + user[`${task.type }Ids`][index] = newKey; + task.id = newKey; + user.tasks[newKey] = task; + // TODO make sure this is ok, that we're not deleting the original + // Otherwise use lodash.cloneDeep + delete user.tasks[key]; + } + }); + + // New user schema has public and private paths, so we can setup proper access control with racer + // Note 'public' and 'private' are reserved words + let newUser = { + auth: user.auth, // we need this top-level due to derby-auth + apiToken: user.preferences.api_token || null, // set on update, we need derby.uuid() + preferences: { + armorSet: user.preferences.armorSet || 'v1', + gender: user.preferences.gender || 'm', + }, + balance: user.balance || 2, + lastCron: user.lastCron || Number(new Date()), + history: user.history || [], + stats: { + gp: user.stats.money || 0, + hp: user.stats.hp || 50, + exp: user.stats.exp || 0, + lvl: user.stats.lvl || 1, + }, + items: { + armor: user.items.armor || 0, + weapon: user.items.weapon || 0, + }, + tasks: user.tasks || {}, + idLists: { + habit: user.habitIds || [], + daily: user.dailyIds || [], + todo: user.todoIds || [], + reward: user.rewardIds || [], + }, + flags: { + partyEnabled: false, + itemsEnabled: user.items.itemsEnabled || false, + kickstarter: user.notifications.kickstarter || 'show', + ads: user.flags.ads || null, // null because it's set on registration + }, + party: { + current: null, + invitation: null, + }, + }; + + try { + db.users.update({_id: user._id}, newUser); + } catch (e) { + print(e); + } +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130208_idLists_to_typeIds.js b/migrations/archive/2013/20130208_idLists_to_typeIds.js new file mode 100644 index 0000000000..ecf13fb341 --- /dev/null +++ b/migrations/archive/2013/20130208_idLists_to_typeIds.js @@ -0,0 +1,19 @@ +// move idList back to root-level, is what's causing the sort bug - see https://github.com/codeparty/racer/pull/73 + +// We could just delete user.idLists, since it's re-created on refresh. However, users's first refresh will scare them +// since everything will dissappear - second refresh will bring everything back. +db.users.find().forEach(function (user) { + if (!user.idLists) return; + db.users.update( + {_id: user._id}, + { + $set: { + habitIds: user.idLists.habit, + dailyIds: user.idLists.daily, + todoIds: user.idLists.todo, + rewardIds: user.idLists.reward, + }, + // $unset:{idLists:true} // run this after the code has been pushed + } + ); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130208_user_customizations.js b/migrations/archive/2013/20130208_user_customizations.js new file mode 100644 index 0000000000..93dee7aaf2 --- /dev/null +++ b/migrations/archive/2013/20130208_user_customizations.js @@ -0,0 +1,18 @@ +db.users.update( + {items: {$exists: 0}}, + {$set: {items: {weapon: 0, armor: 0, head: 0, shield: 0 }}}, + {multi: true} +); + +db.users.find().forEach(function (user) { + let updates = { + // I'm not racist, these were just the defaults before ;) + 'preferences.skin': 'white', + 'preferences.hair': 'blond', + + 'items.head': user.items.armor, + 'items.shield': user.items.armor, + }; + + db.users.update({_id: user._id}, {$set: updates}); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130307_exp_overflow.js b/migrations/archive/2013/20130307_exp_overflow.js new file mode 100644 index 0000000000..113a8989b2 --- /dev/null +++ b/migrations/archive/2013/20130307_exp_overflow.js @@ -0,0 +1,37 @@ +// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130307_normalize_algo_values.js + +/** + * Make sure people aren't overflowing their exp with the new system + */ +db.users.find().forEach(function (user) { + function oldTnl (level) { + return Math.pow(level, 2) * 10 + level * 10 + 80; + } + + function newTnl (level) { + let value = 0; + if (level >= 100) { + value = 0; + } else { + value = Math.round((Math.pow(level, 2) * 0.25 + 10 * level + 139.75) / 10) * 10; // round to nearest 10 + } + return value; + } + + var newTnl = newTnl(user.stats.lvl); + if (user.stats.exp > newTnl) { + let percent = user.stats.exp / oldTnl(user.stats.lvl); + percent = percent > 1 ? 1 : percent; + user.stats.exp = newTnl * percent; + + try { + db.users.update( + {_id: user._id}, + {$set: {'stats.exp': user.stats.exp}}, + {multi: true} + ); + } catch (e) { + print(e); + } + } +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130307_normalize_algo_values.js b/migrations/archive/2013/20130307_normalize_algo_values.js new file mode 100644 index 0000000000..a6f96754cc --- /dev/null +++ b/migrations/archive/2013/20130307_normalize_algo_values.js @@ -0,0 +1,46 @@ +// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130307_normalize_algo_values.js + +/** + * Users were experiencing a lot of extreme Exp multiplication (https://github.com/lefnire/habitrpg/issues/594). + * This sets things straight, and in preparation for another algorithm overhaul + */ +db.users.find().forEach(function (user) { + if (user.stats.exp >= 3580) { + user.stats.exp = 0; + } + + if (user.stats.lvl > 100) { + user.stats.lvl = 100; + } + + _.each(user.tasks, function (task, key) { + // remove corrupt tasks + if (!task) { + delete user.tasks[key]; + return; + } + + // Fix busted values + if (task.value > 21.27) { + task.value = 21.27; + } else if (task.value < -47.27) { + task.value = -47.27; + } + }); + + try { + db.users.update( + {_id: user._id}, + {$set: + { + 'stats.lvl': user.stats.lvl, + 'stats.exp': user.stats.exp, + tasks: user.tasks, + }, + }, + {multi: true} + ); + } catch (e) { + print(e); + } +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130307_remove_duff_histories.js b/migrations/archive/2013/20130307_remove_duff_histories.js new file mode 100644 index 0000000000..c2971df4ae --- /dev/null +++ b/migrations/archive/2013/20130307_remove_duff_histories.js @@ -0,0 +1,28 @@ +/** + * Remove duff histories for dailies + */ +// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130307_remove_duff_histories.js +db.users.find().forEach(function (user) { + _.each(user.tasks, function (task, key) { + if (task.type === 'daily') { + // remove busted history entries + task.history = _.filter(task.history, function (h) { + return Boolean(h.value); + }); + } + }); + + try { + db.users.update( + {_id: user._id}, + {$set: + { + tasks: user.tasks, + }, + }, + {multi: true} + ); + } catch (e) { + print(e); + } +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130326_migrate_pets.js b/migrations/archive/2013/20130326_migrate_pets.js new file mode 100644 index 0000000000..57c6ad7534 --- /dev/null +++ b/migrations/archive/2013/20130326_migrate_pets.js @@ -0,0 +1,98 @@ +/** + * Migrate old pets to new system + */ +// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130326_migrate_pets.js + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mapping = { + bearcub: {name: 'BearCub', modifier: 'Base'}, + cactus: {name: 'Cactus', modifier: 'Base'}, + dragon: {name: 'Dragon', modifier: 'Base'}, + flyingpig: {name: 'FlyingPig', modifier: 'Base'}, + fox: {name: 'Fox', modifier: 'Base'}, + lioncub: {name: 'LionCub', modifier: 'Base'}, + pandacub: {name: 'PandaCub', modifier: 'Base'}, + tigercub: {name: 'TigerCub', modifier: 'Base'}, + wolfBorder: {name: 'Wolf', modifier: 'Base'}, + wolfDesert: {name: 'Wolf', modifier: 'Desert'}, + wolfGolden: {name: 'Wolf', modifier: 'Golden'}, + wolfRed: {name: 'Wolf', modifier: 'Red'}, + wolfShade: {name: 'Wolf', modifier: 'Shade'}, + wolfSkeleton: {name: 'Wolf', modifier: 'Skeleton'}, + wolfVeteran: {name: 'Wolf', modifier: 'Veteran'}, + wolfWhite: {name: 'Wolf', modifier: 'White'}, + wolfZombie: {name: 'Wolf', modifier: 'Zombie'}, +}; + +/** + === Old Style == + pet: Object + icon: "Pet-Wolf-White.png" + index: 14 + name: "wolfWhite" + text: "White Wolf" + value: 3 + pets: Object + bearcub: true + cactus: true + + === New Style == + currentPet: Object + modifier: "Red" + name: "Wolf" + notes: "Find some Hatching Powder to sprinkle on this egg, and one day it will hatch into a loyal pet." + str: "Wolf-Red" + text: "Wolf" + value: 3 + pets: Array + 0: "PandaCub-Base" + 1: "Wolf-Base" + */ + + +db.users.find().forEach(function (user) { + if (!user.items || !user.items.pets && !user.items.pet) return; + + // migrate items.pet to items.currentPet + if (user.items.pet) { + let mapped = mapping[user.items.pet.name]; + delete user.items.pet; + user.items.currentPet = { + modifier: mapped.modifier, + name: mapped.name, + str: `${mapped.name }-${ mapped.modifier}`, + text: '', // FIXME? + }; + } + + // migrate items.pets + if (user.items.pets) { + let newPets = []; + _.each(user.items.pets, function (val, key) { + if (_.isNumber(key)) { + newPets.push(val); + // FIXME why is this happening? seems the user gets migrated already... + // throw "Error: User appears already migrated, this shouldn't be happening!" + } else { + newPets.push(`${mapping[key].name }-${ mapping[key].modifier}`); + } + }); + user.items.pets = newPets; + } + + try { + db.users.update( + {_id: user._id}, + {$set: + { items: user.items }, + } + ); + } catch (e) { + print(e); + } +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130327_apply_tokens.js b/migrations/archive/2013/20130327_apply_tokens.js new file mode 100644 index 0000000000..5a6a519b28 --- /dev/null +++ b/migrations/archive/2013/20130327_apply_tokens.js @@ -0,0 +1,109 @@ +/** + * Applies backer tokens & items (this file will be updated periodically + */ + +// mongo habitrpg ./node_modules/underscore/underscore.js migrations/20130327_apply_tokens.js + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mapping = [ + { + tier: 1, + tokens: 0, + users: [], + }, + { + tier: 5, + tokens: 20, + users: [], + }, + { + tier: 10, + tokens: 50, + users: [], + }, + { + tier: 15, + tokens: 100, + users: [], + }, + { + tier: 30, + tokens: 150, + users: [], + }, + { + tier: 45, + tokens: 170, + users: [], + }, + { + tier: 60, + tokens: 200, + users: [], + }, + { + tier: 70, + tokens: 240, + users: [], + }, + { + tier: 80, + tokens: 240, + users: [], + }, + { + tier: 90, + tokens: 280, + users: [], + }, + { + tier: 300, + tokens: 500, + users: [], + }, + { + tier: 800, + tokens: 500, + users: [], + }, +]; + +db.users.find().forEach(function (user) { + if (!user._id) return; + + let possibleUserIds = [user._id]; + if (user.local) { + if (user.local.username) possibleUserIds.push(user.local.username); + if (user.local.email) possibleUserIds.push(user.local.email); + } + + _.each(mapping, function (tier) { + let userInTier = !_.isEmpty(_.intersection(tier.users, possibleUserIds)); + if (userInTier) { + let tokenInc = 0, + backer = user.backer || {}; + if (!backer.tokensApplied) { + tokenInc = tier.tokens; + backer.tokensApplied = true; + } + backer.tier = tier.tier; + + try { + db.users.update( + {_id: user._id}, + { + $set: { backer, 'flags.ads': 'hide' }, + $inc: { balance: tokenInc / 4 }, + } + ); + } catch (e) { + print(e); + } + } + }); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130503_max_gear_achievement.js b/migrations/archive/2013/20130503_max_gear_achievement.js new file mode 100644 index 0000000000..44cfe0a877 --- /dev/null +++ b/migrations/archive/2013/20130503_max_gear_achievement.js @@ -0,0 +1,23 @@ +/** + * For users who already have max gear, they earned the achievement + */ +// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130503_max_gear_achievement.js +db.users.find().forEach(function (user) { + let items = user.items; + if (!items) { + return; + } + if (parseInt(items.armor) === 5 && + parseInt(items.head) === 5 && + parseInt(items.shield) === 5 && + parseInt(items.weapon) === 6) { + try { + db.users.update( + {_id: user._id}, + {$set: {'achievements.ultimateGear': true}} + ); + } catch (e) { + print(e); + } + } +}); \ No newline at end of file diff --git a/migrations/20130507_fix_broken_tags.js b/migrations/archive/2013/20130507_fix_broken_tags.js similarity index 58% rename from migrations/20130507_fix_broken_tags.js rename to migrations/archive/2013/20130507_fix_broken_tags.js index 1818442acd..9005a12dc4 100644 --- a/migrations/20130507_fix_broken_tags.js +++ b/migrations/archive/2013/20130507_fix_broken_tags.js @@ -4,9 +4,8 @@ * mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/20130507_fix_broken_tags.js */ -db.users.find().forEach(function(user){ - if(!_.isArray(user.tags)) { - db.users.update({_id:user._id}, {$set:{tags:[]}}); - } - -}) \ No newline at end of file +db.users.find().forEach(function (user) { + if (!_.isArray(user.tags)) { + db.users.update({_id: user._id}, {$set: {tags: []}}); + } +}); \ No newline at end of file diff --git a/migrations/archive/2013/20130508_add_backer_pets.js b/migrations/archive/2013/20130508_add_backer_pets.js new file mode 100644 index 0000000000..c6541580e7 --- /dev/null +++ b/migrations/archive/2013/20130508_add_backer_pets.js @@ -0,0 +1 @@ +db.users.update({'backer.tier': {$gte: 80}}, {$push: {'items.pets': 'Wolf-Cerberus'}}, {multi: true}); \ No newline at end of file diff --git a/migrations/20130508_fix_duff_party_subscriptions.js b/migrations/archive/2013/20130508_fix_duff_party_subscriptions.js similarity index 51% rename from migrations/20130508_fix_duff_party_subscriptions.js rename to migrations/archive/2013/20130508_fix_duff_party_subscriptions.js index 918e323e42..c6c53a3e79 100644 --- a/migrations/20130508_fix_duff_party_subscriptions.js +++ b/migrations/archive/2013/20130508_fix_duff_party_subscriptions.js @@ -13,29 +13,28 @@ // https://github.com/lodash/lodash/wiki/Changelog#v400 // since our primary subscription will first hit parties now, we *definitely* need an index there -db.parties.ensureIndex( { 'members': 1}, {background: true} ); +db.parties.ensureIndex({ members: 1}, {background: true}); -db.parties.find().forEach(function(party){ +db.parties.find().forEach(function (party) { + if (!party.members) { + return db.parties.remove({_id: party._id}); + } - if(!party.members) { - return db.parties.remove({_id:party._id}); + // Find all members + db.users.find({_id: {$in: party.members} }, {_id: 1, party: 1}).forEach(function (user) { + // user somehow is subscribed to this party in the background, but they're it's not their primary party + if (user.party && user.party.current !== party._id) { + let i = party.members.indexOf(user._id); + party.members.splice(i, 1); } - // Find all members - db.users.find( {_id: {$in:party.members} }, {_id:1,party:1} ).forEach(function(user){ - // user somehow is subscribed to this party in the background, but they're it's not their primary party - if (user.party && user.party.current !== party._id) { - var i = party.members.indexOf(user._id); - party.members.splice(i, 1); - } + // if after we remove the user, the party is empty - delete this party + if (_.isEmpty(party.members)) { + db.parties.remove({_id: party._id}); - // if after we remove the user, the party is empty - delete this party - if (_.isEmpty(party.members)) { - db.parties.remove({_id:party._id}); - - // else just set it - } else { - db.parties.update({_id:party._id}, {$set:{members:party.members}}); - } - }) -}) + // else just set it + } else { + db.parties.update({_id: party._id}, {$set: {members: party.members}}); + } + }); +}); diff --git a/migrations/20130518_setup_groups.js b/migrations/archive/2013/20130518_setup_groups.js similarity index 54% rename from migrations/20130518_setup_groups.js rename to migrations/archive/2013/20130518_setup_groups.js index 0e04bfa1b9..3240c1f809 100644 --- a/migrations/20130518_setup_groups.js +++ b/migrations/archive/2013/20130518_setup_groups.js @@ -15,34 +15,34 @@ * 5) subscribe everyone to habitrpg (be sure to set that for default user too!) */ -db.parties.renameCollection('groups',true); -//db.parties.dropCollection(); // doesn't seem to do this step during rename... -//db.parties.ensureIndex( { 'members': 1, 'background': 1} ); +db.parties.renameCollection('groups', true); +// db.parties.dropCollection(); // doesn't seem to do this step during rename... +// db.parties.ensureIndex( { 'members': 1, 'background': 1} ); -db.groups.update({}, {$set:{type:'party'}}, {multi:true}); +db.groups.update({}, {$set: {type: 'party'}}, {multi: true}); -//migrate invitation mechanisms +// migrate invitation mechanisms db.users.update( - {}, - { - $remove:{party:1}, - $set:{invitations:{party:null,guilds:[]}} - }, - {multi:1} + {}, + { + $remove: {party: 1}, + $set: {invitations: {party: null, guilds: []}}, + }, + {multi: 1} ); tavern = db.tavern.findOne(); db.tavern.drop(); -//TODO make as a callback of previous, or make sure group.type is still 'guild' for habitrpg in the end +// TODO make as a callback of previous, or make sure group.type is still 'guild' for habitrpg in the end db.groups.insert({ - _id: "habitrpg", - leader: '9', - type: 'guild', - name: "HabitRPG", - chat: tavern.messages, - info: { - blurb: '', - websites: [] - } + _id: 'habitrpg', + leader: '9', + type: 'guild', + name: 'HabitRPG', + chat: tavern.messages, + info: { + blurb: '', + websites: [], + }, }); \ No newline at end of file diff --git a/migrations/archive/2013/20130602_survey_rewards.js b/migrations/archive/2013/20130602_survey_rewards.js new file mode 100644 index 0000000000..4c819c6e2e --- /dev/null +++ b/migrations/archive/2013/20130602_survey_rewards.js @@ -0,0 +1,31 @@ +// mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130602_survey_rewards.js + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let members = []; +members = _.uniq(members); + +let query = { + _id: {$exists: 1}, + $or: [ + {_id: {$in: members}}, + // {'profile.name': {$in: members}}, + {'auth.facebook.name': {$in: members}}, + {'auth.local.username': {$in: members}}, + {'auth.local.email': {$in: members}}, + ], +}; + +print(db.users.count(query)); + +db.users.update(query, + { + $set: { 'achievements.helpedHabit': true }, + $inc: { balance: 2.5 }, + }, + {multi: true} +); \ No newline at end of file diff --git a/migrations/archive/2013/20130612_survey_rewards_individual.js b/migrations/archive/2013/20130612_survey_rewards_individual.js new file mode 100644 index 0000000000..3a2e1fbed4 --- /dev/null +++ b/migrations/archive/2013/20130612_survey_rewards_individual.js @@ -0,0 +1,9 @@ +// mongo habitrpg migrations/20130612_survey_rewards_individual.js + +let query = {_id: ''}; + +db.users.update(query, + { + $set: { 'achievements.helpedHabit': true }, + $inc: { balance: 2.5 }, + }); \ No newline at end of file diff --git a/migrations/archive/2013/20130615_add_extra_indexes.js b/migrations/archive/2013/20130615_add_extra_indexes.js new file mode 100644 index 0000000000..233f266835 --- /dev/null +++ b/migrations/archive/2013/20130615_add_extra_indexes.js @@ -0,0 +1,4 @@ +db.users.ensureIndex({ _id: 1, apiToken: 1 }, {background: true}); +db.groups.ensureIndex({ members: 1 }, {background: true}); +db.groups.ensureIndex({ type: 1 }, {background: true}); +db.groups.ensureIndex({ type: 1, privacy: 1 }, {background: true}); \ No newline at end of file diff --git a/migrations/archive/2013/20130908_cleanup_corrupt_tags.js b/migrations/archive/2013/20130908_cleanup_corrupt_tags.js new file mode 100644 index 0000000000..8fdb6f9f54 --- /dev/null +++ b/migrations/archive/2013/20130908_cleanup_corrupt_tags.js @@ -0,0 +1,16 @@ +// mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130908_cleanup_corrupt_tags.js + +// Racer was notorious for adding duplicates, randomly deleting documents, etc. Once we pull the plug on old.habit, +// run this migration to cleanup all the corruption + +db.users.find().forEach(function (user) { + user.tags = _.filter(user.tags, function (t) { + return t ? t.id : false; + }); + + try { + db.users.update({_id: user._id}, {$set: {tags: user.tags}}); + } catch (e) { + print(e); + } +}); diff --git a/migrations/20130908_cleanup_derby_corruption.js b/migrations/archive/2013/20130908_cleanup_derby_corruption.js similarity index 61% rename from migrations/20130908_cleanup_derby_corruption.js rename to migrations/archive/2013/20130908_cleanup_derby_corruption.js index 6cac534587..d25eea6de9 100644 --- a/migrations/20130908_cleanup_derby_corruption.js +++ b/migrations/archive/2013/20130908_cleanup_derby_corruption.js @@ -1,4 +1,4 @@ -//mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130908_cleanup_derby_corruption.js +// mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130908_cleanup_derby_corruption.js // Racer was notorious for adding duplicates, randomly deleting documents, etc. Once we pull the plug on old.habit, // run this migration to cleanup all the corruption @@ -9,49 +9,48 @@ // be checked for compatibility against the v4 changelog and changed if necessary. // https://github.com/lodash/lodash/wiki/Changelog#v400 -db.users.find().forEach(function(user){ - +db.users.find().forEach(function (user) { // remove corrupt tasks, which will either be null-value or no id - user.tasks = _.reduce(user.tasks, function(m,task,k) { + user.tasks = _.reduce(user.tasks, function (m, task, k) { if (!task || !task.id) return m; - if (isNaN(+task.value)) task.value = 0; + if (isNaN(Number(task.value))) task.value = 0; m[k] = task; return m; }, {}); // fix NaN stats - _.each(user.stats, function(v,k) { - if (!v || isNaN(+v)) user.stats[k] = 0; + _.each(user.stats, function (v, k) { + if (!v || isNaN(Number(v))) user.stats[k] = 0; return true; }); // remove duplicates, restore ghost tasks - ['habit', 'daily', 'todo', 'reward'].forEach(function(type) { - var idList = user[type + "Ids"]; - var taskIds = _.pluck(_.where(user.tasks, {type: type}), 'id'); - var union = _.union(idList, taskIds); - var preened = _.filter(union, function(id) { + ['habit', 'daily', 'todo', 'reward'].forEach(function (type) { + let idList = user[`${type }Ids`]; + let taskIds = _.pluck(_.where(user.tasks, {type}), 'id'); + let union = _.union(idList, taskIds); + let preened = _.filter(union, function (id) { return id && _.contains(taskIds, id); }); if (!_.isEqual(idList, preened)) { - user[type + "Ids"] = preened; + user[`${type }Ids`] = preened; } }); // temporarily remove broken eggs. we'll need to write a migration script to grant gems for and remove these instead if (user.items && user.items.eggs) { - user.items.eggs = _.filter(user.items.eggs,function(egg){ + user.items.eggs = _.filter(user.items.eggs, function (egg) { if (_.isString(egg)) { user.balance += 0.75; // give them 3 gems for each broken egg } else { return true; } - }) + }); } try { - db.users.update({_id:user._id}, user); - } catch(e) { + db.users.update({_id: user._id}, user); + } catch (e) { print(e); } -}) +}); diff --git a/migrations/20130908_remove_staged_users.js b/migrations/archive/2013/20130908_remove_staged_users.js similarity index 86% rename from migrations/20130908_remove_staged_users.js rename to migrations/archive/2013/20130908_remove_staged_users.js index 7bf75c0096..a9b575c5dd 100644 --- a/migrations/20130908_remove_staged_users.js +++ b/migrations/archive/2013/20130908_remove_staged_users.js @@ -8,7 +8,7 @@ * If we experience any troubles with removed staging users, come back to a snapshot and restore accounts. This will * give a peak into possible conflict accounts: */ -/*db.users.count({ +/* db.users.count({ "auth.local": {$exists: false}, "auth.facebook": {$exists: false}, "history.exp.5": {$exists: 1}, @@ -22,9 +22,9 @@ * in we'll be using localStorage anyway instead of creating a new database record */ db.users.remove({ - // Un-registered users - "auth.local": {$exists: false}, - "auth.facebook": {$exists: false} + // Un-registered users + 'auth.local': {$exists: false}, + 'auth.facebook': {$exists: false}, }); /** @@ -32,6 +32,6 @@ db.users.remove({ * Another vestige of Racer. Empty parties shouldn't be being created anymore in the new site */ db.groups.remove({ - 'type': 'party', - $where: "return this.members.length === 0" + type: 'party', + $where: 'return this.members.length === 0', }); \ No newline at end of file diff --git a/migrations/archive/2013/20131022_purchased_and_newStuff.js b/migrations/archive/2013/20131022_purchased_and_newStuff.js new file mode 100644 index 0000000000..0de25a7fe1 --- /dev/null +++ b/migrations/archive/2013/20131022_purchased_and_newStuff.js @@ -0,0 +1,5 @@ +db.users.find().forEach(function (user) { + if (!user.purchased) user.purchased = {hair: {}, skin: {}}; + user.purchased.ads = user.flags && Boolean(user.flags.ads); + db.users.update({_id: user._id}, {$set: {purchased: user.purchased, 'flags.newStuff': true}, $unset: {'flags.ads': 1}}); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20131022_restore_ads.js b/migrations/archive/2013/20131022_restore_ads.js new file mode 100644 index 0000000000..141d6ea1cd --- /dev/null +++ b/migrations/archive/2013/20131022_restore_ads.js @@ -0,0 +1,12 @@ +// node .migrations/20131022_restore_ads.js +let mongo = require('mongoskin'); +let _ = require('lodash'); +let dbBackup = mongo.db('localhost:27017/habitrpg?auto_reconnect'); +let dbLive = mongo.db('localhost:27017/habitrpg2?auto_reconnect'); +let count = 89474; +dbBackup.collection('users').findEach({$or: [{'flags.ads': 'show'}, {'flags.ads': null}]}, {batchSize: 10}, function (err, item) { + if (err) return console.error({err}); + if (!item || !item._id) return console.error('blank user'); + dbLive.collection('users').update({_id: item._id}, {$set: {'purchased.ads': false}, $unset: {'flags.ads': 1}}); + if (--count <= 0) console.log('DONE!'); +}); \ No newline at end of file diff --git a/migrations/20131028_task_subdocs_tags_invites.js b/migrations/archive/2013/20131028_task_subdocs_tags_invites.js similarity index 51% rename from migrations/20131028_task_subdocs_tags_invites.js rename to migrations/archive/2013/20131028_task_subdocs_tags_invites.js index f4a8b720c2..7e4c38b286 100644 --- a/migrations/20131028_task_subdocs_tags_invites.js +++ b/migrations/archive/2013/20131028_task_subdocs_tags_invites.js @@ -3,7 +3,7 @@ // TODO it might be better we just find() and save() all user objects using mongoose, and rely on our defined pre('save') // and default values to "migrate" users. This way we can make sure those parts are working properly too // @see http://stackoverflow.com/questions/14867697/mongoose-full-collection-scan -//Also, what do we think of a Mongoose Migration module? something like https://github.com/madhums/mongoose-migrate +// Also, what do we think of a Mongoose Migration module? something like https://github.com/madhums/mongoose-migrate // IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. // We've now upgraded to lodash v4 but the code used in this migration has not been @@ -11,28 +11,27 @@ // be checked for compatibility against the v4 changelog and changed if necessary. // https://github.com/lodash/lodash/wiki/Changelog#v400 -db.users.find().forEach(function(user){ - +db.users.find().forEach(function (user) { // Add invites to groups // ------------------------- - if(user.invitations){ - if(user.invitations.party){ - db.groups.update({_id: user.invitations.party.id}, {$addToSet:{invites:user._id}}); + if (user.invitations) { + if (user.invitations.party) { + db.groups.update({_id: user.invitations.party.id}, {$addToSet: {invites: user._id}}); } - if(user.invitations.guilds){ - _.each(user.invitations.guilds, function(guild){ - db.groups.update({_id: guild.id}, {$addToSet:{invites:user._id}}); + if (user.invitations.guilds) { + _.each(user.invitations.guilds, function (guild) { + db.groups.update({_id: guild.id}, {$addToSet: {invites: user._id}}); }); } } // Cleanup broken tags // ------------------------- - _.each(user.tasks, function(task){ - _.each(task.tags, function(val, key){ - _.each(user.tags, function(tag){ - if(key == tag.id) delete task.tags[key]; + _.each(user.tasks, function (task) { + _.each(task.tags, function (val, key) { + _.each(user.tags, function (tag) { + if (key === tag.id) delete task.tags[key]; }); }); }); @@ -40,25 +39,25 @@ db.users.find().forEach(function(user){ // Fix corrupt dates // ------------------------- user.lastCron = new Date(user.lastCron); - if (user.lastCron == 'Invalid Date') user.lastCron = new Date(); + if (user.lastCron === 'Invalid Date') user.lastCron = new Date(); if (user.auth) { // what to do with !auth? - _.defaults(user.auth, {timestamps: {created:undefined, loggedin: undefined}}); + _.defaults(user.auth, {timestamps: {created: undefined, loggedin: undefined}}); _.defaults(user.auth.timestamps, {created: new Date(user.lastCron), loggedin: new Date(user.lastCron)}); } // Fix missing history // ------------------------- - _.defaults(user, {history:{}}); - _.defaults(user.history,{exp:[], todos:[]}); + _.defaults(user, {history: {}}); + _.defaults(user.history, {exp: [], todos: []}); // Add username // ------------------------- - if (!user.profile) user.profile = {name:undefined}; + if (!user.profile) user.profile = {name: undefined}; if (_.isEmpty(user.profile.name) && user.auth) { - var fb = user.auth.facebook; + let fb = user.auth.facebook; user.profile.name = - (user.auth.local && user.auth.local.username) || - (fb && (fb.displayName || fb.name || fb.username || (fb.first_name && fb.first_name + ' ' + fb.last_name))) || + user.auth.local && user.auth.local.username || + fb && (fb.displayName || fb.name || fb.username || fb.first_name && `${fb.first_name } ${ fb.last_name}`) || 'Anonymous'; } @@ -71,62 +70,62 @@ db.users.find().forEach(function(user){ print(user._id); } } else { - _.each(['habit', 'daily', 'todo', 'reward'], function(type) { + _.each(['habit', 'daily', 'todo', 'reward'], function (type) { // we use _.transform instead of a simple _.where in order to maintain sort-order - user[type + "s"] = _.reduce(user[type + "Ids"], function(m, tid) { - var task = user.tasks[tid], + user[`${type }s`] = _.reduce(user[`${type }Ids`], function (m, tid) { + let task = user.tasks[tid], newTask = {}; if (!task) return m; // remove null tasks // Cleanup tasks for TaskSchema newTask._id = newTask.id = task.id; - newTask.text = (_.isString(task.text)) ? task.text : ''; + newTask.text = _.isString(task.text) ? task.text : ''; if (_.isString(task.notes)) newTask.notes = task.notes; - newTask.tags = (_.isObject(task.tags)) ? task.tags : {}; - newTask.type = (_.isString(task.type)) ? task.type : 'habit'; - newTask.value = (_.isNumber(task.value)) ? task.value : 0; - newTask.priority = (_.isString(task.priority)) ? task.priority : '!'; + newTask.tags = _.isObject(task.tags) ? task.tags : {}; + newTask.type = _.isString(task.type) ? task.type : 'habit'; + newTask.value = _.isNumber(task.value) ? task.value : 0; + newTask.priority = _.isString(task.priority) ? task.priority : '!'; switch (newTask.type) { case 'habit': - newTask.up = (_.isBoolean(task.up)) ? task.up : true; - newTask.down = (_.isBoolean(task.down)) ? task.down : true; - newTask.history = (_.isArray(task.history)) ? task.history : []; + newTask.up = _.isBoolean(task.up) ? task.up : true; + newTask.down = _.isBoolean(task.down) ? task.down : true; + newTask.history = _.isArray(task.history) ? task.history : []; break; case 'daily': - newTask.repeat = (_.isObject(task.repeat)) ? task.repeat : {m:1, t:1, w:1, th:1, f:1, s:1, su:1}; - newTask.streak = (_.isNumber(task.streak)) ? task.streak : 0; - newTask.completed = (_.isBoolean(task.completed)) ? task.completed : false; - newTask.history = (_.isArray(task.history)) ? task.history : []; + newTask.repeat = _.isObject(task.repeat) ? task.repeat : {m: 1, t: 1, w: 1, th: 1, f: 1, s: 1, su: 1}; + newTask.streak = _.isNumber(task.streak) ? task.streak : 0; + newTask.completed = _.isBoolean(task.completed) ? task.completed : false; + newTask.history = _.isArray(task.history) ? task.history : []; break; case 'todo': - newTask.completed = (_.isBoolean(task.completed)) ? task.completed : false; + newTask.completed = _.isBoolean(task.completed) ? task.completed : false; break; } m.push(newTask); return m; }, []); - delete user[type + 'Ids']; + delete user[`${type }Ids`]; }); delete user.tasks; } try { - db.users.update({_id:user._id}, user); - } catch(e) { + db.users.update({_id: user._id}, user); + } catch (e) { print(e); } }); // Remove old groups.*.challenges, they're not compatible with the new system, set member counts // ------------------------- -db.groups.find().forEach(function(group){ - db.groups.update({_id:group._id}, { - $set:{memberCount: _.size(group.members)}, - $pull:{challenges:1} - }) +db.groups.find().forEach(function (group) { + db.groups.update({_id: group._id}, { + $set: {memberCount: _.size(group.members)}, + $pull: {challenges: 1}, + }); }); // HabitRPG => Tavern // ------------------------- -db.groups.update({_id:'habitrpg'}, {$set:{name:'Tavern'}}); \ No newline at end of file +db.groups.update({_id: 'habitrpg'}, {$set: {name: 'Tavern'}}); \ No newline at end of file diff --git a/migrations/archive/2013/20131102_restore_task_ids.js b/migrations/archive/2013/20131102_restore_task_ids.js new file mode 100644 index 0000000000..89361a4777 --- /dev/null +++ b/migrations/archive/2013/20131102_restore_task_ids.js @@ -0,0 +1,25 @@ +// mongo habitrpg ./node_modules/lodash/lodash.js ./migrations/20131028_task_subdocs_tags_invites.js + +db.challenges.find().forEach(function (chal) { + _.each(chal.habits.concat(chal.dailys).concat(chal.todos).concat(chal.rewards), function (task) { + task.id = task.id || task._id; + }); + try { + db.challenges.update({_id: chal._id}, chal); + db.groups.update({_id: chal.group}, {$addToSet: {challenges: chal._id}}); + } catch (e) { + print(e); + } +}); + +db.users.find().forEach(function (user) { + _.each(user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards), function (task) { + task.id = task.id || task._id; + }); + try { + db.users.update({_id: user._id}, user); + } catch (e) { + print(e); + } +}); + diff --git a/migrations/archive/2013/20131104_remove_invalid_dues.js b/migrations/archive/2013/20131104_remove_invalid_dues.js new file mode 100644 index 0000000000..696a18004e --- /dev/null +++ b/migrations/archive/2013/20131104_remove_invalid_dues.js @@ -0,0 +1,7 @@ +db.users.find({}, {todos: 1}).forEach(function (user) { + _.each(user.todos, function (task) { + if (moment(task.date).toDate() === 'Invalid Date') + task.date = moment().format('MM/DD/YYYY'); + }); + db.users.update({_id: user._id}, {$set: {todos: user.todos}}); +}); \ No newline at end of file diff --git a/migrations/20131104_restore_lost_task_data.js b/migrations/archive/2013/20131104_restore_lost_task_data.js similarity index 55% rename from migrations/20131104_restore_lost_task_data.js rename to migrations/archive/2013/20131104_restore_lost_task_data.js index e77f57de3f..26b8692401 100644 --- a/migrations/20131104_restore_lost_task_data.js +++ b/migrations/archive/2013/20131104_restore_lost_task_data.js @@ -5,8 +5,8 @@ * schemas became more strict. See conversation at https://github.com/HabitRPG/habitrpg/issues/1712 , * this restores task tags, streaks, due-dates, values */ -var mongo = require('mongoskin'); -var _ = require('lodash'); +let mongo = require('mongoskin'); +let _ = require('lodash'); // IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. // We've now upgraded to lodash v4 but the code used in this migration has not been @@ -14,47 +14,47 @@ var _ = require('lodash'); // be checked for compatibility against the v4 changelog and changed if necessary. // https://github.com/lodash/lodash/wiki/Changelog#v400 -var backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); -var liveUsers = mongo.db('localhost:27017/habitrpg_new?auto_reconnect').collection('users'); +let backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); +let liveUsers = mongo.db('localhost:27017/habitrpg_new?auto_reconnect').collection('users'); -backupUsers.count(function(err, count){ +backupUsers.count(function (err, count) { if (err) return console.error(err); - backupUsers.findEach({}, {batchSize:250}, function(err, before){ + backupUsers.findEach({}, {batchSize: 250}, function (err, before) { if (err) return console.error(err); if (!before) return console.log('!before'); - liveUsers.findById(before._id, function(err, after){ + liveUsers.findOne({_id: before._id}, function (err, after) { if (err) return console.error(err); if (!after) { count--; - return console.log(before._id + ' deleted?'); + return console.log(`${before._id } deleted?`); } - if (before._id == '9') console.log('lefnire processed'); - _.each(before.tasks, function(tBefore){ - var tAfter = _.find(after[tBefore.type+'s'], {id:tBefore.id}); + if (before._id === '9') console.log('lefnire processed'); + _.each(before.tasks, function (tBefore) { + let tAfter = _.find(after[`${tBefore.type}s`], {id: tBefore.id}); if (!tAfter) return; // task has been deleted since launch // Restore deleted tags if (!_.isEmpty(tBefore.tags) && _.isEmpty(tAfter.tags)) tAfter.tags = tBefore.tags; // Except tags which are no longer available on the updated user - _.each(tAfter.tags, function(v,k){ //value is true, key is tag.id - if (!_.find(after.tags,{id:k})) delete tAfter.tags[k]; - }) + _.each(tAfter.tags, function (v, k) { // value is true, key is tag.id + if (!_.find(after.tags, {id: k})) delete tAfter.tags[k]; + }); // Restore deleted streaks - if (+tBefore.streak > tAfter.streak) - tAfter.streak = +tBefore.streak; + if (Number(tBefore.streak) > tAfter.streak) + tAfter.streak = Number(tBefore.streak); - if (!!tBefore.date && !tAfter.date) + if (Boolean(tBefore.date) && !tAfter.date) tAfter.date = tBefore.date; // Restore deleted values - if (+tBefore.value != 0 && tAfter.value == 0) - tAfter.value = +tBefore.value; - }) + if (Number(tBefore.value) != 0 && tAfter.value === 0) + tAfter.value = Number(tBefore.value); + }); after._v++; - liveUsers.update({_id:after._id}, after); - if (--count <= 0) console.log("DONE!"); - }) + liveUsers.update({_id: after._id}, after); + if (--count <= 0) console.log('DONE!'); + }); }); }); \ No newline at end of file diff --git a/migrations/archive/2013/20131105_remove_history_ids.js b/migrations/archive/2013/20131105_remove_history_ids.js new file mode 100644 index 0000000000..c7e09a334a --- /dev/null +++ b/migrations/archive/2013/20131105_remove_history_ids.js @@ -0,0 +1,21 @@ +function deleteId (h) { + delete h._id; +} + +db.users.find({}, {habits: 1, dailys: 1, history: 1}).forEach(function (user) { + if (user.history) { + _.each(['todos', 'exp'], function (type) { + if (user.history[type]) { + _.each(user.history.exp, deleteId); + } + }); + } else { + user.history = {exp: [], todos: []}; + } + + _.each(['habits', 'dailys'], function (type) { + _.each(user[type].history, deleteId); + }); + + db.users.update({_id: user._id}, {$set: {history: user.history, habits: user.habits, dailys: user.dailys}}); +}); \ No newline at end of file diff --git a/migrations/20131107_from_backer_to_contributor.js b/migrations/archive/2013/20131107_from_backer_to_contributor.js similarity index 63% rename from migrations/20131107_from_backer_to_contributor.js rename to migrations/archive/2013/20131107_from_backer_to_contributor.js index d5a4ee851b..1c083ad6ff 100644 --- a/migrations/20131107_from_backer_to_contributor.js +++ b/migrations/archive/2013/20131107_from_backer_to_contributor.js @@ -1,9 +1,9 @@ db.users.find({ $or: [ - {'backer.admin':{$exists:1}}, - {'backer.contributor':{$exists:1}} - ] -},{backer:1}).forEach(function(user){ + {'backer.admin': {$exists: 1}}, + {'backer.contributor': {$exists: 1}}, + ], +}, {backer: 1}).forEach(function (user) { user.contributor = {}; user.contributor.admin = user.backer.admin; delete user.backer.admin; @@ -14,5 +14,5 @@ db.users.find({ delete user.backer.contributor; } - db.users.update({_id:user._id}, {$set:{backer:user.backer, contributor:user.contributor}}); + db.users.update({_id: user._id}, {$set: {backer: user.backer, contributor: user.contributor}}); }); \ No newline at end of file diff --git a/migrations/archive/2013/20131108_add_gems_for_contribs.js b/migrations/archive/2013/20131108_add_gems_for_contribs.js new file mode 100644 index 0000000000..c05c88c4ec --- /dev/null +++ b/migrations/archive/2013/20131108_add_gems_for_contribs.js @@ -0,0 +1,4 @@ +// Increase everyone's gems per their contribution level +db.users.find({'contributor.level': {$gt: 0}}, {contributor: 1, balance: 1}).forEach(function (user) { + db.users.update({_id: user._id}, {$inc: {balance: user.contributor.level * 0.5} }); +}); \ No newline at end of file diff --git a/migrations/20131109_refactor_pets.js b/migrations/archive/2013/20131109_refactor_pets.js similarity index 61% rename from migrations/20131109_refactor_pets.js rename to migrations/archive/2013/20131109_refactor_pets.js index f5d9f7d567..2d73442077 100644 --- a/migrations/20131109_refactor_pets.js +++ b/migrations/archive/2013/20131109_refactor_pets.js @@ -1,10 +1,11 @@ db.users.find( - {$where: "Array.isArray(this.items.pets) || Array.isArray(this.items.eggs) || Array.isArray(this.items.hatchingPotions)"}, - {backer: 1, items:1} -).forEach(function(user){ - + {$where: 'Array.isArray(this.items.pets) || Array.isArray(this.items.eggs) || Array.isArray(this.items.hatchingPotions)'}, + {backer: 1, items: 1} +).forEach(function (user) { if (_.isArray(user.items.pets)) { - user.items.pets = _.reduce(user.items.pets, function(m,v){ m[v] = 5; return m;}, {}); + user.items.pets = _.reduce(user.items.pets, function (m, v) { + m[v] = 5; return m; + }, {}); } if (!_.isString(user.items.currentPet)) { @@ -12,7 +13,7 @@ db.users.find( } if (_.isArray(user.items.eggs)) { - user.items.eggs = _.reduce(user.items.eggs, function(m,v){ + user.items.eggs = _.reduce(user.items.eggs, function (m, v) { if (!m[v.name]) m[v.name] = 0; m[v.name]++; return m; @@ -20,7 +21,7 @@ db.users.find( } if (_.isArray(user.items.hatchingPotions)) { - user.items.hatchingPotions = _.reduce(user.items.hatchingPotions, function(m,v){ + user.items.hatchingPotions = _.reduce(user.items.hatchingPotions, function (m, v) { if (!m[v]) m[v] = 0; m[v]++; return m; @@ -35,5 +36,5 @@ db.users.find( user.items.mounts['LionCub-Ethereal'] = true; } - db.users.update({_id:user._id}, {$set:{items:user.items}}); + db.users.update({_id: user._id}, {$set: {items: user.items}}); }); diff --git a/migrations/archive/2013/20131111_task_NaN.js b/migrations/archive/2013/20131111_task_NaN.js new file mode 100644 index 0000000000..e4df7c5ca6 --- /dev/null +++ b/migrations/archive/2013/20131111_task_NaN.js @@ -0,0 +1,15 @@ +// This migration has already been run in the past. It's vital to fix these users presently, but we need to find +// out why task values are ever getting in as NaN. My guess is API PUT /tasks/:tid routes +db.users.find({}, {habits: 1, dailys: 1, todos: 1, rewards: 1}).forEach(function (user) { + _.each(['habits', 'dailys', 'todos', 'rewards'], function (type) { + _.each(user[type], function (task) { + task.value = Number(task.value); + if (_.isNaN(task.value)) { + task.value = 0; + print(user._id); + } + }); + }); + + db.users.update({_id: user._id}, {$set: {habits: user.habits, dailys: user.dailys, todos: user.todos, rewards: user.rewards}}); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20131114_migrate_websites_to_blurb.js b/migrations/archive/2013/20131114_migrate_websites_to_blurb.js new file mode 100644 index 0000000000..f398be79a2 --- /dev/null +++ b/migrations/archive/2013/20131114_migrate_websites_to_blurb.js @@ -0,0 +1,14 @@ +// Migrate all users websites to the profile blurb field +db.users.find({'profile.websites': {$exists: true}}).forEach(function (user) { + db.users.update({_id: user._id}, { + $set: {'profile.blurb': `${user.profile.blurb }\n * ${ user.profile.websites.join('\n * ')}`}, + $unset: {'profile.websites': 1}, + }); +}); + +db.groups.find({'websites.0': {$exists: true}}).forEach(function (group) { + db.groups.update({_id: group._id}, { + $set: {description: `${group.description }\n * ${ group.websites.join('\n * ')}`}, + $unset: {websites: 1}, + }); +}); diff --git a/migrations/archive/2013/20131115_update_gear_preferences.js b/migrations/archive/2013/20131115_update_gear_preferences.js new file mode 100644 index 0000000000..d6bb363762 --- /dev/null +++ b/migrations/archive/2013/20131115_update_gear_preferences.js @@ -0,0 +1,10 @@ +// Add defaults to show gears in all users +db.users.update( + {}, + {$set: { + 'preferences.showWeapon': true, + 'preferences.showShield': true, + 'preferences.showArmor': true, + }}, + {multi: true} +); diff --git a/migrations/archive/2013/20131117_fix_task_types.js b/migrations/archive/2013/20131117_fix_task_types.js new file mode 100644 index 0000000000..570f315bb1 --- /dev/null +++ b/migrations/archive/2013/20131117_fix_task_types.js @@ -0,0 +1,18 @@ +// TODO figure out why this is happening in the first place + +db.users.find({}, {habits: 1, dailys: 1, todos: 1, rewards: 1}).forEach(function (user) { + _.each(user.habits, function (task) { + task.type = 'habit'; + }); + _.each(user.dailys, function (task) { + task.type = 'daily'; + }); + _.each(user.todos, function (task) { + task.type = 'todo'; + }); + _.each(user.rewards, function (task) { + task.type = 'reward'; + }); + + db.users.update({_id: user._id}, {$set: {habits: user.habits, dailys: user.dailys, todos: user.todos, rewards: user.rewards}}); +}); diff --git a/migrations/archive/2013/20131117_remove_undefined_pets.js b/migrations/archive/2013/20131117_remove_undefined_pets.js new file mode 100644 index 0000000000..bcfbe3d216 --- /dev/null +++ b/migrations/archive/2013/20131117_remove_undefined_pets.js @@ -0,0 +1,12 @@ +// once and for all! + +db.users.find({'items.pets': {$exists: 1}}, {'items.pets': 1}).forEach(function (user) { + _.reduce(user.items.pets, function (m, v, k) { + if (!k.indexOf('undefined')) m.push(k); + return m; + }, []).forEach(function (key) { + delete user.items.pets[key]; + }); + + db.users.update({_id: user._id}, { $set: {'items.pets': user.items.pets} }); +}); diff --git a/migrations/archive/2013/20131122_deleted_tags.js b/migrations/archive/2013/20131122_deleted_tags.js new file mode 100644 index 0000000000..0ca01616dc --- /dev/null +++ b/migrations/archive/2013/20131122_deleted_tags.js @@ -0,0 +1,13 @@ +// Cleanup broken tags +// ------------------------- +db.users.find().forEach(function (user) { + let tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards); + + _.each(tasks, function (task) { + _.each(task.tags, function (value, key) { // value is true, key is tag.id + if (!_.find(user.tags, {id: key})) delete task.tags[key]; + }); + }); + + db.users.update({_id: user._id}, user); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20131123_set_default_party_order.js b/migrations/archive/2013/20131123_set_default_party_order.js new file mode 100644 index 0000000000..07a222035b --- /dev/null +++ b/migrations/archive/2013/20131123_set_default_party_order.js @@ -0,0 +1,8 @@ +// Add default to randomize party members list +db.users.update( + {}, + {$set: { + 'party.order': 'random', + }}, + {multi: true} +); diff --git a/migrations/archive/2013/20131126_clean_dayStart.js b/migrations/archive/2013/20131126_clean_dayStart.js new file mode 100644 index 0000000000..12a0eb0b8f --- /dev/null +++ b/migrations/archive/2013/20131126_clean_dayStart.js @@ -0,0 +1,5 @@ +db.users.find({'preferences.dayStart': {$exists: 1}}, {'preferences.dayStart': 1}).forEach(function (user) { + let dayStart = Number(user.preferences.dayStart); + dayStart = _.isNaN(dayStart) || dayStart < 0 || dayStart > 24 ? 0 : dayStart; + db.users.update({_id: user._id}, {$set: {'preferences.dayStart': dayStart}}); +}); diff --git a/migrations/archive/2013/20131126_turkey_pet.js b/migrations/archive/2013/20131126_turkey_pet.js new file mode 100644 index 0000000000..f93848e926 --- /dev/null +++ b/migrations/archive/2013/20131126_turkey_pet.js @@ -0,0 +1 @@ +db.users.update({}, {$set: {'items.pets.Turkey-Base': 5, 'flags.newStuff': true}}, {multi: true}); \ No newline at end of file diff --git a/migrations/archive/2013/20131127_restore_dayStart.js b/migrations/archive/2013/20131127_restore_dayStart.js new file mode 100644 index 0000000000..e23bc00b59 --- /dev/null +++ b/migrations/archive/2013/20131127_restore_dayStart.js @@ -0,0 +1,42 @@ +// node .migrations/20131127_restore_dayStart.js + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); +let liveUsers = mongo.db('localhost:27017/habitrpg_new?auto_reconnect').collection('users'); + +let query = {'preferences.dayStart': {$exists: 1, $ne: 0}}; +let select = {'preferences.dayStart': 1}; + +backupUsers.count(query, function (err, count) { + if (err) return console.error(err); + backupUsers.findEach(query, select, {batchSize: 20}, function (err, before) { + if (err) return console.error(err); + if (!before) { + count--; return console.log('!before'); + } + liveUsers.findOne({_id: before._id}, function (err, after) { + if (err) return console.error(err); + if (!after) { + count--; return console.log(`${before._id } deleted?`); + } + + let dayStart = Number(before.preferences.dayStart); + if (after.preferences.dayStart === 0 && dayStart != 0) { + dayStart = _.isNaN(dayStart) || dayStart < 0 || dayStart > 24 ? 0 : dayStart; + } else { + dayStart = after.preferences.dayStart; + } + + liveUsers.update({_id: after._id}, {$inc: {_v: 1}, $set: {'preferences.dayStart': dayStart}}); + if (--count <= 0) console.log('DONE!'); + }); + }); +}); \ No newline at end of file diff --git a/migrations/20131214_classes.coffee b/migrations/archive/2013/20131214_classes.coffee similarity index 100% rename from migrations/20131214_classes.coffee rename to migrations/archive/2013/20131214_classes.coffee diff --git a/migrations/20131217_unearned_backer_gear.js b/migrations/archive/2013/20131217_unearned_backer_gear.js similarity index 51% rename from migrations/20131217_unearned_backer_gear.js rename to migrations/archive/2013/20131217_unearned_backer_gear.js index 2c1baf9dc7..dd010912e5 100644 --- a/migrations/20131217_unearned_backer_gear.js +++ b/migrations/archive/2013/20131217_unearned_backer_gear.js @@ -1,20 +1,20 @@ -var query = { - '$or': [ +let query = { + $or: [ {'items.gear.owned.weapon_special_0': true}, {'items.gear.owned.armor_special_0': true}, {'items.gear.owned.head_special_0': true}, - {'items.gear.owned.shield_special_0': true} - ] + {'items.gear.owned.shield_special_0': true}, + ], }; -db.users.find(query, {'items.gear.owned':1,backer:1}).forEach(function(user){ - var owned = user.items.gear.owned; - var tier = (user.backer && user.backer.tier) || 0; +db.users.find(query, {'items.gear.owned': 1, backer: 1}).forEach(function (user) { + let owned = user.items.gear.owned; + let tier = user.backer && user.backer.tier || 0; if (tier < 70) delete owned.weapon_special_0; if (tier < 45) delete owned.armor_special_0; if (tier < 45) delete owned.head_special_0; if (tier < 45) delete owned.shield_special_0; - db.users.update({_id:user._id}, {$set:{'items.gear.owned':owned}}); + db.users.update({_id: user._id}, {$set: {'items.gear.owned': owned}}); }); diff --git a/migrations/archive/2013/20131221_restore_NaN_history.js b/migrations/archive/2013/20131221_restore_NaN_history.js new file mode 100644 index 0000000000..babb7c3a9e --- /dev/null +++ b/migrations/archive/2013/20131221_restore_NaN_history.js @@ -0,0 +1,55 @@ +// node .migrations/20131221_restore_NaN_history.js + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +/** + * After the classes migration, users lost some history entries + */ +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); +let liveUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); + +function filterNaNs (h) { + return h && _.isNumber(Number(h.value)) && !_.isNaN(Number(h.value)); +} + +let fields = {history: 1, habits: 1, dailys: 1, migration: 1}; +let count = 0; +liveUsers.findEach({migration: {$ne: '20131221_restore_NaN_history'}}, fields, {batchSize: 500}, function (err, after) { + if (!after) err = '!after'; + if (err) { + count++; return console.error(err); + } + + backupUsers.findOne({_id: after._id}, fields, function (err, before) { + if (err) { + count++; return console.error(err); + } + + _.each(['todos', 'exp'], function (type) { + if (!_.isEmpty(after.history[type])) + after.history[type] = _.filter(after.history[type], filterNaNs); + if (before && !_.isEmpty(before.history[type])) + after.history[type] = before.history[type].concat(after.history[type]); + }); + + _.each(['habits', 'dailys'], function (type) { + _.each(after[type], function (t) { + t.history = _.filter(t.history, filterNaNs); + let found = before && _.find(before[type], {id: t.id}); + if (found && found.history) t.history = found.history.concat(t.history); + }); + }); + + liveUsers.update({_id: after._id}, {$set: {history: after.history, dailys: after.dailys, habits: after.habits, migration: '20131221_restore_NaN_history'}, $inc: {_v: 1}}); + // if (--count <= 0) console.log("DONE! " + after._id); + if (++count % 1000 === 0) console.log(count); + if (after._id === '9') console.log('lefnire processed'); + }); +}); \ No newline at end of file diff --git a/migrations/archive/2013/20131225_restore_streaks.js b/migrations/archive/2013/20131225_restore_streaks.js new file mode 100644 index 0000000000..e161ee1c91 --- /dev/null +++ b/migrations/archive/2013/20131225_restore_streaks.js @@ -0,0 +1,42 @@ +// node .migrations/20131225_restore_streaks.js + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +/** + * After the classes migration, users lost some history entries + */ +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); +let liveUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); + +let fields = {dailys: 1, migration: 1}; +let count = 0; +liveUsers.findEach({migration: {$ne: '20131225_restore_streaks'}}, fields, {batchSize: 250}, function (err, after) { + if (!after) err = '!after'; + if (err) { + count++; return console.error(err); + } + + backupUsers.findOne({_id: after._id}, fields, function (err, before) { + if (!before) err = '!before'; + if (err) { + count++; return console.error(err); + } + + _.each(before.dailys, function (d) { + let found = _.find(after.dailys, {id: d.id}); + if (found && !found.streak) found.streak = d.streak; + }); + + liveUsers.update({_id: after._id}, {$set: {dailys: after.dailys, migration: '20131225_restore_streaks'}, $inc: {_v: 1}}); + // if (--count <= 0) console.log("DONE! " + after._id); + if (++count % 1000 === 0) console.log(count); + if (after._id === '9') console.log('lefnire processed'); + }); +}); \ No newline at end of file diff --git a/migrations/archive/2014/20140119_task_creation_completion_dates.js b/migrations/archive/2014/20140119_task_creation_completion_dates.js new file mode 100644 index 0000000000..9414117cd8 --- /dev/null +++ b/migrations/archive/2014/20140119_task_creation_completion_dates.js @@ -0,0 +1,8 @@ +db.users.find({}, {todos: 1, dailys: 1, rewards: 1, habits: 1}).forEach(function (user) { + _.each(user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards), function (t) { + t.dateCreated = t.created || new Date(); + delete t.created; + if (t.type === 'todo' && t.completed) t.dateCompleted = new Date(); + }); + db.users.update({_id: user._id}, {$set: {habits: user.habits, dailys: user.dailys, todos: user.todos, rewards: user.rewards}}); +}); diff --git a/migrations/archive/2014/20140130_birthdayEnd.js b/migrations/archive/2014/20140130_birthdayEnd.js new file mode 100644 index 0000000000..4c235d52eb --- /dev/null +++ b/migrations/archive/2014/20140130_birthdayEnd.js @@ -0,0 +1 @@ +db.users.update({}, {$set: {'achievements.habitBirthday': true}}, {multi: 1}); diff --git a/migrations/archive/2014/20140130_birthdayStart.js b/migrations/archive/2014/20140130_birthdayStart.js new file mode 100644 index 0000000000..93283c720b --- /dev/null +++ b/migrations/archive/2014/20140130_birthdayStart.js @@ -0,0 +1,12 @@ +db.users.update({}, {$set: { + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, +}}, {multi: 1}); diff --git a/migrations/archive/2014/20140220_challenge_memberCount.js b/migrations/archive/2014/20140220_challenge_memberCount.js new file mode 100644 index 0000000000..4444165e86 --- /dev/null +++ b/migrations/archive/2014/20140220_challenge_memberCount.js @@ -0,0 +1,3 @@ +db.challenges.find({}, {members: 1}).forEach(function (chal) { + db.challenges.update({_id: chal._id}, {$set: {memberCount: chal.members.length}}); +}); diff --git a/migrations/archive/2014/20140301_missing_mysteries.js b/migrations/archive/2014/20140301_missing_mysteries.js new file mode 100644 index 0000000000..f5fb4019ed --- /dev/null +++ b/migrations/archive/2014/20140301_missing_mysteries.js @@ -0,0 +1,14 @@ +db.users.update( + { + 'purchased.plan.dateCreated': {$gte: new Date('2014-02-22'), $lt: new Date('2014-02-29')}, + 'items.gear.owned.armor_mystery_201402': null, + 'items.gear.owned.head_mystery_201402': null, + 'items.gear.owned.back_mystery_201402': null, + 'purchased.plan.mysteryItems': {$nin: ['armor_mystery_201402', 'head_mystery_201402', 'back_mystery_201402']}, + }, + // {_id:1,'purchased.plan':1,'items.gear.owned':1} + {$push: {'purchased.plan.mysteryItems': {$each: ['armor_mystery_201402', 'head_mystery_201402', 'back_mystery_201402']}}}, + {multi: true} +);/* .forEach(function(user){ + printjson(user); + });*/ diff --git a/migrations/archive/2014/20140610_missing_backer_mount.js b/migrations/archive/2014/20140610_missing_backer_mount.js new file mode 100644 index 0000000000..6b678d5869 --- /dev/null +++ b/migrations/archive/2014/20140610_missing_backer_mount.js @@ -0,0 +1 @@ +db.users.update({'backer.tier': {$gt: 69}}, {$set: {'items.mounts.LionCub-Ethereal': true}}, {multi: 1}); \ No newline at end of file diff --git a/migrations/archive/2014/20140712_wiped_quest_membership.js b/migrations/archive/2014/20140712_wiped_quest_membership.js new file mode 100644 index 0000000000..8ccd44bb40 --- /dev/null +++ b/migrations/archive/2014/20140712_wiped_quest_membership.js @@ -0,0 +1,11 @@ +// mongo habitrpg node_modules/lodash/lodash.js ./migrations/20140712_wiped_quest_membership.js +db.groups.find({type: 'party', 'quest.key': {$ne: null}, 'quest.active': true}, {quest: 1}).forEach(function (group) { + let activeMembers = _.reduce(group.quest.members, function (m, v, k) { + if (v === true) m.push(k); return m; + }, []); + db.users.update( + {_id: {$in: activeMembers}}, + {$set: {'party.quest.key': group.quest.key, 'party.quest.completed': null}}, + {multi: true} + ); +}); diff --git a/migrations/archive/2014/20140803_remove_undefined_notifications.js b/migrations/archive/2014/20140803_remove_undefined_notifications.js new file mode 100644 index 0000000000..1033244adc --- /dev/null +++ b/migrations/archive/2014/20140803_remove_undefined_notifications.js @@ -0,0 +1,13 @@ +let _ = require('lodash'); + +db.users.find({}).forEach(function (user) { + let newNewMessages = {}; + + _.each(user.newMessages, function (val, key) { + if (key != 'undefined') { + newNewMessages[key] = val; + } + }); + + db.users.update({_id: user._id}, {$set: {newMessages: newNewMessages}}); +}); diff --git a/migrations/20140823_remove_undefined_and_false_notifications.js b/migrations/archive/2014/20140823_remove_undefined_and_false_notifications.js similarity index 53% rename from migrations/20140823_remove_undefined_and_false_notifications.js rename to migrations/archive/2014/20140823_remove_undefined_and_false_notifications.js index a6eed2b838..5f949e4399 100644 --- a/migrations/20140823_remove_undefined_and_false_notifications.js +++ b/migrations/archive/2014/20140823_remove_undefined_and_false_notifications.js @@ -1,9 +1,9 @@ // node .migrations/20140823_remove_undefined_and_false_notifications.js -var migrationName = '20140823_remove_undefined_and_false_notifications'; +let migrationName = '20140823_remove_undefined_and_false_notifications'; -var authorName = 'Alys'; // in case script author needs to know when their ... -var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done // IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. // We've now upgraded to lodash v4 but the code used in this migration has not been @@ -15,8 +15,8 @@ var authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; //... own data is done * https://github.com/HabitRPG/habitrpg/pull/3907 */ -var mongo = require('mongoskin'); -var _ = require('lodash'); +let mongo = require('mongoskin'); +let _ = require('lodash'); // XXX @lefnire, choose wisely: // var liveUsers = mongo.db('lefnire:mAdn3s5s@charlotte.mongohq.com:10015/habitrpg_large?auto_reconnect').collection('users'); @@ -26,26 +26,28 @@ var _ = require('lodash'); // var liveUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); -var fields = {migration:1,newMessages:1}; -var progressCount = 1000; +let fields = {migration: 1, newMessages: 1}; +let progressCount = 1000; // var progressCount = 1; -var count = 0; -liveUsers.findEach({migration: {$ne:migrationName}}, fields, {batchSize:250}, function(err, user){ +let count = 0; +liveUsers.findEach({migration: {$ne: migrationName}}, fields, {batchSize: 250}, function (err, user) { count++; if (!user) err = '!user'; - if (err) {return console.error(err);} + if (err) { + return console.error(err); + } - var newNewMessages = {}; - _.each(user.newMessages,function(val,key){ + let newNewMessages = {}; + _.each(user.newMessages, function (val, key) { // console.log(key + " " + val.name); - if(key != "undefined" && val['value']){ + if (key != 'undefined' && val.value) { newNewMessages[key] = val; } - }) + }); - liveUsers.update({_id:user._id}, {$set:{newMessages:newNewMessages, migration:migrationName}, $inc:{_v:1}}); + liveUsers.update({_id: user._id}, {$set: {newMessages: newNewMessages, migration: migrationName}, $inc: {_v: 1}}); - if (count%progressCount == 0) console.log(count + ' ' + user._id); - if (user._id == '9') console.log('lefnire processed'); - if (user._id == authorUuid) console.log(authorName + ' processed'); + if (count % progressCount === 0) console.log(`${count } ${ user._id}`); + if (user._id === '9') console.log('lefnire processed'); + if (user._id === authorUuid) console.log(`${authorName } processed`); }); diff --git a/migrations/archive/2014/20140829_change_headAccessory_to_eyewear.js b/migrations/archive/2014/20140829_change_headAccessory_to_eyewear.js new file mode 100644 index 0000000000..4d73a951ce --- /dev/null +++ b/migrations/archive/2014/20140829_change_headAccessory_to_eyewear.js @@ -0,0 +1,83 @@ +// node .migrations/20140829_change_headAccessory_to_eyewear.js + +let migrationName = '20140829_change_headAccessory_to_eyewear'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +/** + * https://github.com/HabitRPG/habitrpg/issues/3645 + */ +let mongo = require('mongoskin'); +let _ = require('lodash'); +let liveUsers = mongo.db('localhost:27017/habitrpg2?auto_reconnect').collection('users'); + +let fields = {migration: 1, + 'items.gear.costume.headAccessory': 1, + 'items.gear.equipped.headAccessory': 1, + 'items.gear.owned.headAccessory_special_wondercon_black': 1, + 'items.gear.owned.headAccessory_special_wondercon_red': 1, + 'items.gear.owned.headAccessory_special_summerRogue': 1, + 'items.gear.owned.headAccessory_special_summerWarrior': 1, +}; + +let progressCount = 1000; +let count = 0; +liveUsers.findEach({ $and: [ + { migration: {$ne: migrationName} }, + { $or: [ + {'items.gear.owned.headAccessory_special_summerRogue': {$exists: true}}, + {'items.gear.owned.headAccessory_special_summerWarrior': {$exists: true}}, + {'items.gear.owned.headAccessory_special_wondercon_red': {$exists: true}}, + {'items.gear.owned.headAccessory_special_wondercon_black': {$exists: true}}, + ]}, +]}, fields, {batchSize: 250}, function (err, user) { + count++; + if (!user) err = '!user'; + if (err) { + return console.error(err); + } + + let set = {migration: migrationName}; + let unset = {}; + + let oldToNew = { + headAccessory_special_summerRogue: 'eyewear_special_summerRogue', + headAccessory_special_summerWarrior: 'eyewear_special_summerWarrior', + headAccessory_special_wondercon_red: 'eyewear_special_wondercon_red', + headAccessory_special_wondercon_black: 'eyewear_special_wondercon_black', + }; + + // items.gear.costume, items.gear.equipped: + _.each(['costume', 'equipped'], function (type) { + _.each(oldToNew, function (newName, oldName) { + if (user.items.gear[type].headAccessory === oldName) { + unset[`items.gear.${type}.headAccessory`] = ''; + set[`items.gear.${type}.eyewear`] = newName; + } + }); + }); + + // items.gear.owned: + _.each(oldToNew, function (newName, oldName) { + if (oldName in user.items.gear.owned) { + unset[`items.gear.owned.${oldName}`] = ''; + set[`items.gear.owned.${newName}`] = user.items.gear.owned[oldName]; + } + }); + + // console.log(JSON.stringify(user, null, " ")); + // console.log("set: " + JSON.stringify(set, null, " ")); + // console.log("unset: " + JSON.stringify(unset, null, " ")); + + liveUsers.update({_id: user._id}, {$set: set, $unset: unset, $inc: {_v: 1}}); + + if (count % progressCount === 0) console.log(`${count } ${ user._id}`); + if (user._id === '9') console.log('lefnire processed'); + if (user._id === authorUuid) console.log(`${authorName } processed`); +}); diff --git a/migrations/archive/2014/20140831_increase_gems_for_previous_contributions.js b/migrations/archive/2014/20140831_increase_gems_for_previous_contributions.js new file mode 100644 index 0000000000..a90a85ae36 --- /dev/null +++ b/migrations/archive/2014/20140831_increase_gems_for_previous_contributions.js @@ -0,0 +1,144 @@ +// IMPORTANT: +// +// run like this to capture all output: +// +// node 20140831_increase_gems_for_previous_contributions.js > 20140831_increase_gems_for_previous_contributions_output.txt + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let migrationName = '20140831_increase_gems_for_previous_contributions'; + +/** + * https://github.com/HabitRPG/habitrpg/issues/3933 + * Increase Number of Gems for Contributors + * author: Alys (d904bd62-da08-416b-a816-ba797c9ee265) + * + * Increase everyone's gems per their contribution level. + * Originally they were given 2 gems per tier. + * Now they are given 3 gems per tier for tiers 1,2,3 + * and 4 gems per tier for tiers 4,5,6,7 + * So that means an EXTRA 1 for tier 1, + * 2 for tier 2, + * 3 for tier 3, + * 5 for tier 4, + * 7 for tier 5, + * 9 for tier 6, + * 11 for tier 7, + * 11 for tier 8 (moderators = tier 7 + admin privileges), + * none for tier 9 (staff) + */ + +let mongo = require('mongoskin'); +let _ = require('lodash'); + + +let dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); + + +let query = { + 'contributor.level': {$gt: 0, $lt: 9}, + migration: {$ne: migrationName}, +}; + +let fields = { + migration: 1, + 'contributor.level': 1, + balance: 1, +}; + +let userResults = {}; // each key is a UUID, each value is a string +// describing what changed for that user + +console.warn('Updating users...'); +let progressCount = 50; +let count = 0; +dbUsers.findEach(query, fields, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All users found. Fetching final balances...'); + return fetchFinalBalances(); + } + count++; + + let set = {migration: migrationName}; + + let tier = user.contributor.level; + let extraGems = tier; // tiers 1,2,3 + if (tier > 3) { + extraGems = 3 + (tier - 3) * 2; + } + if (tier === 8) { + extraGems = 11; + } + let extraBalance = extraGems / 4; + set.balance = user.balance + extraBalance; + + // Capture current state of user: + userResults[user._id] = + `${user._id } ` + ':\n' + + ` contrib tier : ${ tier }\n` + + ` balance before : ${ user.balance }\n` + + ` balance (gems) added : ${ extraBalance } (${ + extraGems })` + '\n' + + ` expected balance after: ${ user.balance + extraBalance }\n`; + + // Update user: + dbUsers.update({_id: user._id}, {$set: set, $inc: {_v: 1}}); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); +}); + + +function fetchFinalBalances () { + let query = {_id: {$in: Object.keys(userResults)}}; + let fields = { + balance: 1, + }; + + let count1 = 0; + dbUsers.findEach(query, fields, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All final balances found.'); + return displayData(); + } + count1++; + userResults[user._id] = `${userResults[user._id] + + user._id } ` + ':\n' + + ` actual balance after : ${ user.balance }\n`; + if (count1 % progressCount === 0) console.warn(`${count1 } ${ user._id}`); + }); +} + + +function displayData () { + _.each(userResults, function (text, uuid) { + console.log(text); // text contains uuid + }); + console.log(`\n${ count + } users processed (should be roughly 335 according to the Hall)\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2014/20140914_upgrade_admin_contrib_tiers.js b/migrations/archive/2014/20140914_upgrade_admin_contrib_tiers.js new file mode 100644 index 0000000000..d2187d48ef --- /dev/null +++ b/migrations/archive/2014/20140914_upgrade_admin_contrib_tiers.js @@ -0,0 +1,86 @@ +let migrationName = '20140914_upgrade_admin_contrib_tiers'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/** + * https://github.com/HabitRPG/habitrpg/issues/3801 + * Convert Tier 8 contributors to Tier 9 (staff) (all current Tier 8s are admins). + * Convert Tier 7 contributors with admin flag to Tier 8 (moderators). + */ + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db('localhost:27017/habitrpg?auto_reconnect').collection('users'); + +let query = + { 'contributor.level': {$gte: 7}, 'contributor.admin': true, migration: {$ne: migrationName} }; + +let fields = {migration: 1, + 'contributor.admin': 1, + 'contributor.level': 1, + 'auth.local.username': 1, + 'profile.name': 1, +}; + +let userResults = {}; // each key is a UUID, each value is a username; +// contains only the users changed + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + let set = {migration: migrationName}; + let inc = {'contributor.level': 1, _v: 1}; + + userResults[user._id] = user.profile.name; + + dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (user._id === '9') console.warn('lefnire' + ' processed'); +}); + + +function displayData () { + console.log('users modified:'); + _.each(userResults, function (name, uuid) { + console.log(name); + }); + console.warn(`\n${ count + } users processed (should be 11 according to the Hall)\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2014/20140922_free_candy.js b/migrations/archive/2014/20140922_free_candy.js new file mode 100644 index 0000000000..c503fed034 --- /dev/null +++ b/migrations/archive/2014/20140922_free_candy.js @@ -0,0 +1,18 @@ +db.users.update( + {}, + { + $inc: { + 'items.food.Candy_Base': 1, + 'items.food.Candy_CottonCandyBlue': 1, + 'items.food.Candy_CottonCandyPink': 1, + 'items.food.Candy_Desert': 1, + 'items.food.Candy_Golden': 1, + 'items.food.Candy_Red': 1, + 'items.food.Candy_Shade': 1, + 'items.food.Candy_Skeleton': 1, + 'items.food.Candy_White': 1, + 'items.food.Candy_Zombie': 1, + }, + }, + {multi: 1} +); \ No newline at end of file diff --git a/migrations/archive/2014/20141006_jackolantern_pet.js b/migrations/archive/2014/20141006_jackolantern_pet.js new file mode 100644 index 0000000000..f55debe7ee --- /dev/null +++ b/migrations/archive/2014/20141006_jackolantern_pet.js @@ -0,0 +1 @@ +db.users.update({_id: '9'}, {$set: {'items.pets.JackOLantern-Base': 5, 'flags.newStuff': true}}, {multi: true}); \ No newline at end of file diff --git a/migrations/20141117_consecutive_months.js b/migrations/archive/2014/20141117_consecutive_months.js similarity index 54% rename from migrations/20141117_consecutive_months.js rename to migrations/archive/2014/20141117_consecutive_months.js index 7b2f418d94..6a416a7079 100644 --- a/migrations/20141117_consecutive_months.js +++ b/migrations/archive/2014/20141117_consecutive_months.js @@ -6,15 +6,15 @@ // require moment, lodash db.users.find( - {'purchased.plan.customerId':{$ne:null}}, - {_id:1, 'purchased.plan':1} -).forEach(function(user){ - var p = user.purchased.plan - , latestMonth = p.dateTerminated || new Date() // their last sub date, or on-going (now) - , count = moment(latestMonth).diff(p.dateCreated, 'months'); + {'purchased.plan.customerId': {$ne: null}}, + {_id: 1, 'purchased.plan': 1} +).forEach(function (user) { + let p = user.purchased.plan, + latestMonth = p.dateTerminated || new Date(), // their last sub date, or on-going (now) + count = moment(latestMonth).diff(p.dateCreated, 'months'); db.users.update({_id: user._id}, {$set: { 'purchased.plan.consecutive.count': count, - 'purchased.plan.consecutive.gemCapExtra': _.min([ Math.floor(count/3)*5, 25 ]), - 'purchased.plan.consecutive.trinkets': Math.floor(count/3) + 'purchased.plan.consecutive.gemCapExtra': _.min([Math.floor(count / 3) * 5, 25]), + 'purchased.plan.consecutive.trinkets': Math.floor(count / 3), }}); }); diff --git a/migrations/archive/2014/20141126_turkey_mounts.js b/migrations/archive/2014/20141126_turkey_mounts.js new file mode 100644 index 0000000000..a72e9e57a9 --- /dev/null +++ b/migrations/archive/2014/20141126_turkey_mounts.js @@ -0,0 +1,11 @@ +db.users.update( + {'items.pets.Turkey-Base': {$ne: null}}, + {$set: {'items.mounts.Turkey-Base': true}}, + {multi: 1} +); + +db.users.update( + {'items.pets.Turkey-Base': null}, + {$set: {'items.pets.Turkey-Base': 5}}, + {multi: 1} +); \ No newline at end of file diff --git a/migrations/archive/2014/20141211_NaN_consecutives.js b/migrations/archive/2014/20141211_NaN_consecutives.js new file mode 100644 index 0000000000..a718304d75 --- /dev/null +++ b/migrations/archive/2014/20141211_NaN_consecutives.js @@ -0,0 +1,4 @@ +db.users.update({'purchased.plan.consecutive.count': NaN}, {$set: {'purchased.plan.consecutive.count': 0}}, {multi: 1}); +db.users.update({'purchased.plan.consecutive.offset': NaN}, {$set: {'purchased.plan.consecutive.offset': 0}}, {multi: 1}); +db.users.update({'purchased.plan.consecutive.gemCapExtra': NaN}, {$set: {'purchased.plan.consecutive.gemCapExtra': 0}}, {multi: 1}); +db.users.update({'purchased.plan.consecutive.trinkets': NaN}, {$set: {'purchased.plan.consecutive.trinkets': 0}}, {multi: 1}); \ No newline at end of file diff --git a/migrations/archive/2014/20141230_new_years_hats.js b/migrations/archive/2014/20141230_new_years_hats.js new file mode 100644 index 0000000000..d2244135d7 --- /dev/null +++ b/migrations/archive/2014/20141230_new_years_hats.js @@ -0,0 +1,11 @@ +db.users.update( + {'items.gear.owned.head_special_nye': {$ne: null}}, + {$set: {'items.gear.owned.head_special_nye2014': false}}, + {multi: 1} +); + +db.users.update( + {'items.gear.owned.head_special_nye': null}, + {$set: {'items.gear.owned.head_special_nye': false}}, + {multi: 1} +); diff --git a/migrations/archive/2015/20150107_plan_dateUpdated_null.js b/migrations/archive/2015/20150107_plan_dateUpdated_null.js new file mode 100644 index 0000000000..865da3ed60 --- /dev/null +++ b/migrations/archive/2015/20150107_plan_dateUpdated_null.js @@ -0,0 +1,8 @@ +db.users.update( + {'purchased.plan.customerId': {$ne: null}, 'purchased.plan.dateUpdated': null}, + { + $set: {'purchased.plan.dateUpdated': new Date('12/01/2014')}, + $unset: {'purchased.plan.datedUpdated': ''}, + }, + {multi: true} +); diff --git a/migrations/archive/2015/20150124_mountmaster_fix.js b/migrations/archive/2015/20150124_mountmaster_fix.js new file mode 100644 index 0000000000..5a0bbce030 --- /dev/null +++ b/migrations/archive/2015/20150124_mountmaster_fix.js @@ -0,0 +1,95 @@ +let migrationName = '20150124_mountmaster_fix.js'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/** + * https://github.com/HabitRPG/habitrpg/pull/4374#issuecomment-71038795 + * Convert false to null for mounts that used to be owned. + */ + +let dbserver = 'localhost:27017'; // CHANGE THIS FOR PRODUCTION DATABASE + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/habitrpg?auto_reconnect`).collection('users'); + +let query = { + 'items.mounts': {$exists: true}, +}; + +let fields = { + 'items.mounts': 1, +}; + +let animals = ['Wolf-Base', 'Wolf-White', 'Wolf-Desert', 'Wolf-Red', 'Wolf-Shade', 'Wolf-Skeleton', 'Wolf-Zombie', 'Wolf-CottonCandyPink', 'Wolf-CottonCandyBlue', 'Wolf-Golden', 'TigerCub-Base', 'TigerCub-White', 'TigerCub-Desert', 'TigerCub-Red', 'TigerCub-Shade', 'TigerCub-Skeleton', 'TigerCub-Zombie', 'TigerCub-CottonCandyPink', 'TigerCub-CottonCandyBlue', 'TigerCub-Golden', 'PandaCub-Base', 'PandaCub-White', 'PandaCub-Desert', 'PandaCub-Red', 'PandaCub-Shade', 'PandaCub-Skeleton', 'PandaCub-Zombie', 'PandaCub-CottonCandyPink', 'PandaCub-CottonCandyBlue', 'PandaCub-Golden', 'LionCub-Base', 'LionCub-White', 'LionCub-Desert', 'LionCub-Red', 'LionCub-Shade', 'LionCub-Skeleton', 'LionCub-Zombie', 'LionCub-CottonCandyPink', 'LionCub-CottonCandyBlue', 'LionCub-Golden', 'Fox-Base', 'Fox-White', 'Fox-Desert', 'Fox-Red', 'Fox-Shade', 'Fox-Skeleton', 'Fox-Zombie', 'Fox-CottonCandyPink', 'Fox-CottonCandyBlue', 'Fox-Golden', 'FlyingPig-Base', 'FlyingPig-White', 'FlyingPig-Desert', 'FlyingPig-Red', 'FlyingPig-Shade', 'FlyingPig-Skeleton', 'FlyingPig-Zombie', 'FlyingPig-CottonCandyPink', 'FlyingPig-CottonCandyBlue', 'FlyingPig-Golden', 'Dragon-Base', 'Dragon-White', 'Dragon-Desert', 'Dragon-Red', 'Dragon-Shade', 'Dragon-Skeleton', 'Dragon-Zombie', 'Dragon-CottonCandyPink', 'Dragon-CottonCandyBlue', 'Dragon-Golden', 'Cactus-Base', 'Cactus-White', 'Cactus-Desert', 'Cactus-Red', 'Cactus-Shade', 'Cactus-Skeleton', 'Cactus-Zombie', 'Cactus-CottonCandyPink', 'Cactus-CottonCandyBlue', 'Cactus-Golden', 'BearCub-Base', 'BearCub-White', 'BearCub-Desert', 'BearCub-Red', 'BearCub-Shade', 'BearCub-Skeleton', 'BearCub-Zombie', 'BearCub-CottonCandyPink', 'BearCub-CottonCandyBlue', 'BearCub-Golden']; // all Gen1 mounts + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + let mounts = user.items.mounts; + let changed = false; + for (let a in animals) { + if (mounts[animals[a]] === false) { + mounts[animals[a]] = null; + changed = true; + } + } + + if (changed) { + dbUsers.update( + { _id: user._id}, + { + $set: { migration: migrationName, + 'items.mounts': mounts, + }, + } + ); + } + + // var set = {'migration': migrationName}; + // var inc = {'xyz':1, _v:1}; + // dbUsers.update({_id:user._id}, {$set:set, $inc:inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (user._id === '9') console.warn('lefnire' + ' processed'); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20150130_birthday_goodies.js b/migrations/archive/2015/20150130_birthday_goodies.js new file mode 100644 index 0000000000..e9a141c0af --- /dev/null +++ b/migrations/archive/2015/20150130_birthday_goodies.js @@ -0,0 +1,36 @@ +db.users.update( + {'items.gear.owned.armor_special_birthday': {$ne: null}}, + {$set: {'items.gear.owned.armor_special_birthday2015': false}}, + {multi: 1} +); + +db.users.update( + {'items.gear.owned.armor_special_birthday': null}, + {$set: {'items.gear.owned.armor_special_birthday': false}}, + {multi: 1} +); + +db.users.update({}, {$inc: { + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, +}}, {multi: 1}); + +db.users.update( + {'achievements.habitBirthday': true}, + {$set: {'achievements.habitBirthdays': 1}}, + {multi: 1} +); + +db.users.update( + {}, + {$inc: {'achievements.habitBirthdays': 1}}, + {multi: 1} +); \ No newline at end of file diff --git a/migrations/archive/2015/20150131_birthday_goodies_fix_remove_robe.js b/migrations/archive/2015/20150131_birthday_goodies_fix_remove_robe.js new file mode 100644 index 0000000000..2ed8b2dc34 --- /dev/null +++ b/migrations/archive/2015/20150131_birthday_goodies_fix_remove_robe.js @@ -0,0 +1,85 @@ +let migrationName = '20150131_birthday_goodies_fix__one_birthday__1'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/* + * remove new birthday robes and second achievement from people who shouldn't have them + */ + +let dbserver = 'localhost:27017'; // CHANGE THIS FOR PRODUCTION DATABASE + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/habitrpg?auto_reconnect`).collection('users'); + +// 'auth.timestamps.created':{$gt:new Date('2014-02-01')}, +let query = { + 'achievements.habitBirthdays': 1, + 'auth.timestamps.loggedin': {$gt: new Date('2014-12-20')}, +}; + +// '_id': 'c03e41bd-501f-438c-9553-a7afdf52a08c', +// 'achievements.habitBirthday':{$exists:false}, +// 'items.gear.owned.armor_special_birthday2015':1 + +let fields = { + // 'auth.timestamps.created':1, + // 'achievements.habitBirthday':1, + // 'achievements.habitBirthdays':1, + 'items.gear.owned.armor_special_birthday2015': 1, + // 'items.gear.owned.armor_special':1 +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + let unset = {'items.gear.owned.armor_special_birthday2015': 1}; + // var set = {'migration':migrationName, 'achievements.habitBirthdays':1 }; + // var inc = {'xyz':1, _v:1}; + dbUsers.update({_id: user._id}, {$unset: unset}); // , $inc:inc}); + // dbUsers.update({_id:user._id}, {$unset:unset, $set:set}); + // console.warn(user.auth.timestamps.created); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (user._id === '9') console.warn('lefnire' + ' processed'); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20150201_convert_creation_date_from_string_to_object.js b/migrations/archive/2015/20150201_convert_creation_date_from_string_to_object.js new file mode 100644 index 0000000000..f5c9a87b06 --- /dev/null +++ b/migrations/archive/2015/20150201_convert_creation_date_from_string_to_object.js @@ -0,0 +1,119 @@ +let migrationName = '20150201_convert_creation_date_from_string_to_object__no_date_recent_signup'; +// // var migrationName = '20150201_convert_creation_date_from_string_to_object'; + +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/* + * For users that have no value for auth.timestamps.created, assign them + * a recent value. + * + * NOTE: + * Before this script was used as described above, it was first used to + * find all users that have a auth.timestamps.created field that is a string + * rather than a date object and set it to be a date object. The code used + * for this has been commented out with four slashes: //// + * + * https://github.com/HabitRPG/habitrpg/issues/4601#issuecomment-72339846 + */ + +let dbserver = 'localhost:27017'; // CHANGE THIS FOR PRODUCTION DATABASE + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let mongo = require('mongoskin'); +let _ = require('lodash'); +let moment = require('moment'); + +let dbUsers = mongo.db(`${dbserver }/habitrpg?auto_reconnect`).collection('users'); + +let uuidArrayRecent = [ // recent users with no creation dates + '1a0d4b75-73ed-4937-974d-d504d6398884', + '1c7ebe27-1250-4f95-ba10-965580adbfd7', + '5f972121-4a6d-411c-95e9-7093d3e89b66', + 'ae85818a-e336-4ccd-945e-c15cef975102', + 'ba273976-d9fc-466c-975f-38559d34a824', +]; + +let query = { + _id: {$in: uuidArrayRecent}, + // // 'auth':{$exists:true}, + // // 'auth.timestamps':{$exists:true}, + // // 'auth.timestamps.created':{$not: {$lt:new Date('2018-01-01')}} +}; + +let fields = { + _id: 1, + 'auth.timestamps.created': 1, +}; +// 'achievements.habitBirthdays':1 + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // // var oldDate = user.auth.timestamps.created; + // // var newDate = moment(oldDate).toDate(); + let oldDate = 'none'; + let newDate = moment('2015-01-11').toDate(); + console.warn(`${user._id } === ${ oldDate } === ${ newDate}`); + + // // var set = { 'migration': migrationName, + // // 'auth.timestamps.created': newDate, + // // 'achievements.habitBirthdays': 2, + // // 'items.gear.owned.head_special_nye':true, + // // 'items.gear.owned.head_special_nye2014':true, + // // 'items.gear.owned.armor_special_birthday':true, + // // 'items.gear.owned.armor_special_birthday2015':true, + // // }; + + let set = { migration: migrationName, + 'auth.timestamps.created': newDate, + 'achievements.habitBirthdays': 1, + 'items.gear.owned.armor_special_birthday': true, + }; + + // var unset = {'items.gear.owned.armor_special_birthday2015': 1}; + // var inc = {'xyz':1, _v:1}; + dbUsers.update({_id: user._id}, {$set: set}); + // dbUsers.update({_id:user._id}, {$unset:unset, $set:set, $inc:inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (user._id === '9') console.warn('lefnire' + ' processed'); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20150201_recapture_emails_phase_update.js b/migrations/archive/2015/20150201_recapture_emails_phase_update.js new file mode 100644 index 0000000000..26cf9a25d1 --- /dev/null +++ b/migrations/archive/2015/20150201_recapture_emails_phase_update.js @@ -0,0 +1,7 @@ +db.users.update({ + 'flags.recaptureEmailsPhase': { + $gt: 0, + }, +}, {$inc: { + 'flags.recaptureEmailsPhase': 1, +}}, {multi: 1}); \ No newline at end of file diff --git a/migrations/archive/2015/20150218_interactive_tour.js b/migrations/archive/2015/20150218_interactive_tour.js new file mode 100644 index 0000000000..6223f17d6a --- /dev/null +++ b/migrations/archive/2015/20150218_interactive_tour.js @@ -0,0 +1,10 @@ +db.users.update({}, {$set: { + 'flags.tour.intro': -2, + // 'flags.tour.classes':-2, + 'flags.tour.stats': -2, + 'flags.tour.tavern': -2, + 'flags.tour.party': -2, + 'flags.tour.guilds': -2, + 'flags.tour.challenges': -2, + 'flags.tour.market': -2, +}}, {multi: 1}); \ No newline at end of file diff --git a/migrations/archive/2015/20150224_force_resting_in_inn.js b/migrations/archive/2015/20150224_force_resting_in_inn.js new file mode 100644 index 0000000000..d148419628 --- /dev/null +++ b/migrations/archive/2015/20150224_force_resting_in_inn.js @@ -0,0 +1,71 @@ +let migrationName = '20150224_force_resting_in_inn'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/* + * force all active players to rest in the inn due to massive server fail + */ + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let dbserver = 'localhost:27017'; // CHANGE THIS FOR PRODUCTION DATABASE + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/habitrpg?auto_reconnect`).collection('users'); + +let query = { + 'auth.timestamps.loggedin': {$gt: new Date('2015-02-22')}, +}; + +let fields = { + 'preferences.sleep': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + let set = {migration: migrationName, 'preferences.sleep': 1 }; + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (user._id === '9') console.warn('lefnire' + ' processed'); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20150310_survey_achievements.js b/migrations/archive/2015/20150310_survey_achievements.js new file mode 100644 index 0000000000..ea343416d5 --- /dev/null +++ b/migrations/archive/2015/20150310_survey_achievements.js @@ -0,0 +1,5 @@ +db.users.update( + {'achievements.helpedHabit': true}, + {$set: {'achievements.habitSurveys': 1}}, + {multi: 1} +); \ No newline at end of file diff --git a/migrations/20150325_egg_quest.js b/migrations/archive/2015/20150325_egg_quest.js similarity index 56% rename from migrations/20150325_egg_quest.js rename to migrations/archive/2015/20150325_egg_quest.js index 43ca0ad1b7..d28b7dccea 100644 --- a/migrations/20150325_egg_quest.js +++ b/migrations/archive/2015/20150325_egg_quest.js @@ -3,6 +3,6 @@ */ db.users.update( {}, - {$inc:{'items.quests.egg':1}}, - {multi:1} -) \ No newline at end of file + {$inc: {'items.quests.egg': 1}}, + {multi: 1} +); \ No newline at end of file diff --git a/migrations/archive/2015/20150604_ultimateGearSets.js b/migrations/archive/2015/20150604_ultimateGearSets.js new file mode 100644 index 0000000000..aa69647666 --- /dev/null +++ b/migrations/archive/2015/20150604_ultimateGearSets.js @@ -0,0 +1,141 @@ +// var migrationName = '20150604_ultimateGearSets'; +// var authorName = 'Sabe'; // in case script author needs to know when their ... +// var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done + +let migrationName = '20150620_ultimateGearSets'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/* + * grant the new ultimateGearSets achievement for existing users' collected equipment + * + * + * Changed by Alys on 20150620 to assign false values to + * 'achievements.ultimateGearSets' when true values are not appropriate, + * because of https://github.com/HabitRPG/habitrpg/issues/5427 + * + * Minimal changes were made so the code isn't as efficient or clean + * as it could be, but it's (hopefully) one-use-only and minimal changes + * means minimal new testing. + */ + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379' // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +let fields = { + 'achievements.ultimateGearSets': 1, + 'items.gear.owned': 1, +}; + + +// Changes 20150620: All users have to be processed now (non-achievers need +// false values). +let query = { +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + let achievements = {}; + let changeUser = false; + // Changes 20150620: 'changeUser' now indicates that the user must have the + // Enchanted Armoire unlocked. + if (typeof user.items.gear.owned.weapon_wizard_6 !== 'undefined' && + typeof user.items.gear.owned.armor_wizard_5 !== 'undefined' && + typeof user.items.gear.owned.head_wizard_5 !== 'undefined' + ) { + achievements.wizard = true; + changeUser = true; + } else { + // Changes 20150620: false added for all classes (here and below) + achievements.wizard = false; + } + + if (typeof user.items.gear.owned.weapon_warrior_6 !== 'undefined' && + typeof user.items.gear.owned.armor_warrior_5 !== 'undefined' && + typeof user.items.gear.owned.head_warrior_5 !== 'undefined' && + typeof user.items.gear.owned.shield_warrior_5 !== 'undefined' + ) { + achievements.warrior = true; + changeUser = true; + } else { + achievements.warrior = false; + } + + if (typeof user.items.gear.owned.weapon_healer_6 !== 'undefined' && + typeof user.items.gear.owned.armor_healer_5 !== 'undefined' && + typeof user.items.gear.owned.head_healer_5 !== 'undefined' && + typeof user.items.gear.owned.shield_healer_5 !== 'undefined' + ) { + achievements.healer = true; + changeUser = true; + } else { + achievements.healer = false; + } + + if (typeof user.items.gear.owned.weapon_rogue_6 !== 'undefined' && + typeof user.items.gear.owned.armor_rogue_5 !== 'undefined' && + typeof user.items.gear.owned.head_rogue_5 !== 'undefined' && + typeof user.items.gear.owned.shield_rogue_6 !== 'undefined' + ) { + achievements.rogue = true; + changeUser = true; + } else { + achievements.rogue = false; + } + + // Changes 20150620: $set is now run for all users. + let set = {migration: migrationName, 'achievements.ultimateGearSets': achievements}; + if (changeUser) { // user has at least one Ultimate Gear achievement + set['flags.armoireEnabled'] = true; + } + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (user._id === '9') console.warn('lefnire' + ' processed'); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/20150706_orca_mounts.js b/migrations/archive/2015/20150706_orca_mounts.js similarity index 52% rename from migrations/20150706_orca_mounts.js rename to migrations/archive/2015/20150706_orca_mounts.js index e8b6fe662a..92dc55e77c 100644 --- a/migrations/20150706_orca_mounts.js +++ b/migrations/archive/2015/20150706_orca_mounts.js @@ -3,6 +3,6 @@ */ db.users.update( {}, - {$set:{'items.mounts.Orca-Base':true}}, - {multi:true} + {$set: {'items.mounts.Orca-Base': true}}, + {multi: true} ); diff --git a/migrations/archive/2015/20150731_purple_gryphon.js b/migrations/archive/2015/20150731_purple_gryphon.js new file mode 100644 index 0000000000..e75f8e9c97 --- /dev/null +++ b/migrations/archive/2015/20150731_purple_gryphon.js @@ -0,0 +1,5 @@ +db.users.update( + {}, + {$set: {'items.mounts.Gryphon-RoyalPurple': true}}, + {multi: true} +); diff --git a/migrations/archive/2015/20150731_veteran_tiger.js b/migrations/archive/2015/20150731_veteran_tiger.js new file mode 100644 index 0000000000..1494dd0ad8 --- /dev/null +++ b/migrations/archive/2015/20150731_veteran_tiger.js @@ -0,0 +1,5 @@ +db.users.update( + {'items.pets.Wolf-Veteran': {$ne: null}}, + {$set: {'items.pets.Tiger-Veteran': 5}}, + {multi: true} +); diff --git a/migrations/archive/2015/20150731_veteran_wolf.js b/migrations/archive/2015/20150731_veteran_wolf.js new file mode 100644 index 0000000000..f060100957 --- /dev/null +++ b/migrations/archive/2015/20150731_veteran_wolf.js @@ -0,0 +1,7 @@ +// Run after the Veteran Tiger script, not before! + +db.users.update( + {'items.pets.Wolf-Veteran': {$exists: false}}, + {$set: {'items.pets.Wolf-Veteran': 5}}, + {multi: true} +); diff --git a/migrations/archive/2015/20150906_groups_fix_leaders.js b/migrations/archive/2015/20150906_groups_fix_leaders.js new file mode 100644 index 0000000000..252328571d --- /dev/null +++ b/migrations/archive/2015/20150906_groups_fix_leaders.js @@ -0,0 +1,79 @@ +/* + * Make sure leaders are existing users + */ + +let mongo = require('mongoskin'); +let async = require('async'); + +let dbserver = 'url'; +let dbname = 'dbname'; +let countGroups = 0; +let countUsers = 0; + +let db = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`); +let dbUsers = db.collection('users'); +let dbGroups = db.collection('groups'); + +console.log('Begins work on db'); + +function findGroups (gt) { + let query = {}; + if (gt) query._id = {$gt: gt}; + + console.log(query); + + dbGroups.find(query, { + fields: {_id: 1, members: 1, leader: 1}, + limit: 10000, + sort: { + _id: 1, + }, + }).toArray(function (err, groups) { + if (err) throw err; + + let lastGroup = null; + if (groups.length === 10000) { + lastGroup = groups[groups.length - 1]; + } + + async.eachLimit(groups, 30, function (group, cb1) { + countGroups++; + console.log('Group: ', countGroups, group._id); + + let members = group.members; + + dbUsers.findOne({_id: group.leader}, {fields: {_id: 1}}, function (err, user) { + if (err) return cb1(err); + + // If leader has deleted account + if (!user && group._id !== 'habitrpg' && members && members[0]) { + dbGroups.update({ + _id: group._id, + }, { + $set: { + // Set first user as new leader + leader: members[0], + }, + }, { + multi: false, + }, function (err, res) { + if (err) return cb1(err); + + console.log('Updated: ', res); + return cb1(); + }); + } else { + return cb1(); + } + }); + }, function (err) { + if (err) throw err; + + if (lastGroup && lastGroup._id) { + findGroups(lastGroup._id); + } + }); + }); +} + +findGroups(); \ No newline at end of file diff --git a/migrations/archive/2015/20150906_groups_remove_deleted_users.js b/migrations/archive/2015/20150906_groups_remove_deleted_users.js new file mode 100644 index 0000000000..d04b91341b --- /dev/null +++ b/migrations/archive/2015/20150906_groups_remove_deleted_users.js @@ -0,0 +1,86 @@ +/* + * Remove deleted accounts from groups + */ + +let mongo = require('mongoskin'); +let async = require('async'); + +let dbserver = 'url'; +let dbname = 'dbname'; +let countGroups = 0; +let countUsers = 0; + +let db = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`); +let dbUsers = db.collection('users'); +let dbGroups = db.collection('groups'); + +console.log('Begins work on db'); + +function findGroups (gt) { + let query = {}; + if (gt) query._id = {$gt: gt}; + + console.log(query); + + dbGroups.find(query, { + fields: {_id: 1, members: 1}, + limit: 10000, + sort: { + _id: 1, + }, + }).toArray(function (err, groups) { + if (err) throw err; + + let lastGroup = null; + if (groups.length === 10000) { + lastGroup = groups[groups.length - 1]; + } + + async.eachLimit(groups, 3, function (group, cb1) { + countGroups++; + console.log('Group: ', countGroups, group._id); + + let members = group.members; + + // Remove users who deleted their account + async.eachLimit(members, 15, function (member, cb2) { + dbUsers.findOne({_id: member}, {fields: {_id: 1}}, function (err, user) { + if (err) return cb2(err); + + if (!user) { + countUsers++; + console.log('User removed n. ', countUsers, 'user id ', member, 'group id ', group._id); + + dbGroups.update({ + _id: group._id, + }, { + $pull: {members: member}, + $inc: {memberCount: -1}, + }, { + multi: false, + }, function (err, res) { + if (err) return cb2(err); + + console.log('Updated: ', res); + return cb2(); + }); + } else { + cb2(); + } + }); + }, function (err) { + if (err) return cb1(err); + + cb1(); + }); + }, function (err) { + if (err) throw err; + + if (lastGroup && lastGroup._id) { + findGroups(lastGroup._id); + } + }); + }); +} + +findGroups(); \ No newline at end of file diff --git a/migrations/archive/2015/20150906_groups_remove_empty.js b/migrations/archive/2015/20150906_groups_remove_empty.js new file mode 100644 index 0000000000..b82313e014 --- /dev/null +++ b/migrations/archive/2015/20150906_groups_remove_empty.js @@ -0,0 +1,21 @@ +/* + * Remove empty private groups + */ + +let mongo = require('mongoskin'); + +let dbserver = 'url'; +let dbname = 'name'; + +let db = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`); +let dbGroups = db.collection('groups'); + +console.log('Begins work on db'); + +dbGroups.findEach({ + memberCount: 0, +}, {_id: 1}, function (err, res) { + if (err) throw err; + + console.log(res); +}); \ No newline at end of file diff --git a/migrations/archive/2015/20150906_sync_groups_with_firebase.js b/migrations/archive/2015/20150906_sync_groups_with_firebase.js new file mode 100644 index 0000000000..9b17d02a09 --- /dev/null +++ b/migrations/archive/2015/20150906_sync_groups_with_firebase.js @@ -0,0 +1,43 @@ +/* + * Sync groups with Firebase + */ + +let mongo = require('mongoskin'); +let Firebase = require('Firebase'); + +let dbserver = 'mongodb://url'; +let dbname = 'db'; + +let db = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`); +let dbGroups = db.collection('groups'); +let countGroups = 0; + +let firebaseRef = new Firebase('https://' + 'firebase-app' + '.firebaseio.com'); + +// TODO handle sync errors with firebase? +firebaseRef.authWithCustomToken('firebase-secret', function (err, authData) { + if (err) throw new Error('Impossible to authenticate Firebase'); + + console.log('Firebase connected, begins work on db'); + + dbGroups.findEach({}, {_id: 1, members: 1}, {batchSize: 100}, function (err, group) { + if (err) throw err; + if (group._id !== 'habitrpg') return; + + countGroups++; + console.log('Group: ', countGroups); + + firebaseRef.child(`rooms/${ group._id}`) + .set({ + name: group.name, + }); + + group.members.forEach(function (member) { + firebaseRef.child(`members/${ group._id }/${ userId}`) + .set(true); + + firebaseRef.child(`users/${ member }/rooms/${ group._id}`) + .set(true); + }); + }); +}); \ No newline at end of file diff --git a/migrations/archive/2015/20151013_jackolanterns.js b/migrations/archive/2015/20151013_jackolanterns.js new file mode 100644 index 0000000000..358678f2fa --- /dev/null +++ b/migrations/archive/2015/20151013_jackolanterns.js @@ -0,0 +1,74 @@ +let migrationName = '20151013_jackolanterns.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Jack-O'-Lantern mounts to users who already have the pet version, award pet if they don't + */ + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.pets.JackOLantern-Base': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + let set = {}; + if (user.items.pets['JackOLantern-Base']) { + set = {migration: migrationName, 'items.mounts.JackOLantern-Base': true}; + } else { + set = {migration: migrationName, 'items.pets.JackOLantern-Base': 5}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20151021_usernames_emails_lowercase.js b/migrations/archive/2015/20151021_usernames_emails_lowercase.js new file mode 100644 index 0000000000..ec46c5642b --- /dev/null +++ b/migrations/archive/2015/20151021_usernames_emails_lowercase.js @@ -0,0 +1,63 @@ +/* + * Migrate email to lowerCase version and add auth.local.lowerCaseUsername email + */ + +let mongo = require('mongoskin'); +let async = require('async'); + +let dbserver = 'url'; +let dbname = 'dbname'; +let countUsers = 0; + +let db = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`); +let dbUsers = db.collection('users'); + +console.log('Begins work on db'); + +function findUsers (gt) { + let query = {}; + if (gt) query._id = {$gt: gt}; + + console.log(query); + + dbUsers.find(query, { + fields: {_id: 1, auth: 1}, + limit: 10000, + sort: { + _id: 1, + }, + }).toArray(function (err, users) { + if (err) throw err; + + let lastUser = null; + if (users.length === 10000) { + lastUser = users[users.length - 1]; + } + + async.eachLimit(users, 20, function (user, cb) { + countUsers++; + console.log('User: ', countUsers, user._id); + + let update = { + $set: {}, + }; + + if (user.auth && user.auth.local) { + if (user.auth.local.username) update.$set['auth.local.lowerCaseUsername'] = user.auth.local.username.toLowerCase(); + if (user.auth.local.email) update.$set['auth.local.email'] = user.auth.local.email.toLowerCase(); + } + + dbUsers.update({ + _id: user._id, + }, update, cb); + }, function (err) { + if (err) throw err; + + if (lastUser && lastUser._id) { + findUsers(lastUser._id); + } + }); + }); +} + +findUsers(); diff --git a/migrations/archive/2015/20151105_tutorial_flags.js b/migrations/archive/2015/20151105_tutorial_flags.js new file mode 100644 index 0000000000..7023af9fae --- /dev/null +++ b/migrations/archive/2015/20151105_tutorial_flags.js @@ -0,0 +1,70 @@ +let migrationName = '20151105_tutorial_flags_v1'; +let authorName = 'Alys'; // in case script author needs to know when their ... +let authorUuid = 'd904bd62-da08-416b-a816-ba797c9ee265'; // ... own data is done + +/* + * set flags.tutorial.ios and flags.tutorial.main flags to true in preparation + * for the release of a new iOS tutorial + * + */ + +// var dbserver = 'localhost:27017' // FOR TEST DATABASE +let dbserver = 'alys:@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +let fields = { +}; + + +let query = { + 'auth.timestamps.loggedin': {$gt: new Date('2015-10-20')}, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // var set = {'migration':migrationName, 'flags.tutorial.ios':true, 'flags.tutorial.main':true }; + let set = {migration: migrationName, 'flags.tutorial.ios': {} }; + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20151116_costume_contest_award.js b/migrations/archive/2015/20151116_costume_contest_award.js new file mode 100644 index 0000000000..556697f6ba --- /dev/null +++ b/migrations/archive/2015/20151116_costume_contest_award.js @@ -0,0 +1,109 @@ +let migrationName = '20151116_costume_contest.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Costume Contest achievement to 2015 winners + */ + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + _id: { + $in: [ + 'e411dab3-a4ca-414d-bdbd-b6940b3bdeb3', + '35ced5cc-c33a-45c8-93dc-16000ee66fde', + 'ab3f0549-7247-4fd5-975b-efcff98c79c3', + 'b1261fd2-eb25-46b4-97a9-ae7a0dc8a131', + '1f27893f-3808-4724-9725-f46dab93faca', + '216a0c23-6afd-4a5e-b434-d386a10862a2', + '2d6ef231-50b4-4a22-90e7-45eb97147a2c', + '98b8cf4f-89bd-4b0a-988d-02629a217232', + 'c5183dfa-c741-43ce-935e-c6d89b41a030', + '262a7afb-6b57-4d81-88e0-80d2e9f6cbdc', + '33991e0a-de55-4986-ac81-af78491a84de', + '7adf6ada-3c05-4054-b5df-fa7d49d3b9eb', + '235a1cbd-48c5-41b1-afb4-59d2f8645c57', + 'b7617a61-188b-4332-bf4d-32268fa77f2b', + '672c1ce0-9f47-44f0-a3f3-8cc3c6c5a9cb', + 'd0a3217a-7b92-48d6-b39a-b1b1be96702e', + '5ef910dc-1d22-47d9-aa38-a60132c60679', + '370a44c8-e94a-4a2c-91f2-33166926db1f', + '1b0b3ef3-28bd-4046-a49b-e1c83e281baf', + '75b93321-66b9-49bd-9076-052499c1d2bf', + 'd97516e4-81d0-4f60-bf03-95f7330925ab', + '3e13cc79-de38-420d-822e-9e9da309ce6b', + '0e471dc1-ecb0-4388-a891-b873a237d2cf', + 'ca3da398-4f73-4304-b838-af3669ed4cbb', + '44cdf105-8bda-4197-9d1a-1bcb83b4dc84', + '5419830c-b837-4573-ae82-4718ab95b7f1', + 'ac6fbe37-b0dc-40d8-ba14-77dde66fbfa8', + '8789ba18-a498-46b9-b367-3b929a0acb94', + '52fce1a9-9b0a-4e26-95dc-adc12f52e752', + '21bf71ac-399c-470b-abe0-cc49a03b6a8b', + 'f1618ce2-552e-4f23-bc76-e73d63ebedd0', + '4cc0c749-d943-4090-b529-42bc665b7244', + 'e259682e-cb5c-4d94-b472-ceedc66d7484', + 'fa197a4b-e065-4551-803a-c8a5b9970f9d', + ], + }, +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + let set = {migration: migrationName}; + let inc = {'achievements.costumeContests': 1}; + + dbUsers.update({_id: user._id}, {$set: set}); + dbUsers.update({_id: user._id}, {$inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2015/20151116_costume_contest_to_number.js b/migrations/archive/2015/20151116_costume_contest_to_number.js new file mode 100644 index 0000000000..68660941f3 --- /dev/null +++ b/migrations/archive/2015/20151116_costume_contest_to_number.js @@ -0,0 +1,71 @@ +let migrationName = '20151116_costume_contest_to_number.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Change Costume Contest achievement from Boolean to Number, so people can win repeatedly + */ + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + 'achievements.costumeContest': true, +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'achievements.costumeContest': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + let set = {'achievements.costumeContests': 1}; + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2015/20151125_turkey_ladder.js b/migrations/archive/2015/20151125_turkey_ladder.js new file mode 100644 index 0000000000..6328030f25 --- /dev/null +++ b/migrations/archive/2015/20151125_turkey_ladder.js @@ -0,0 +1,78 @@ +let migrationName = '20151125_turkey_ladder.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Gilded Turkey pet to Turkey mount owners, Turkey Mount if they only have Turkey Pet, + * and Turkey Pet otherwise + */ + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.pets.Turkey-Base': 1, + 'items.mounts.Turkey-Base': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + let set = {}; + if (user.items.mounts['Turkey-Base']) { + set = {migration: migrationName, 'items.pets.Turkey-Gilded': 5}; + } else if (user.items.pets['Turkey-Base']) { + set = {migration: migrationName, 'items.mounts.Turkey-Base': true}; + } else { + set = {migration: migrationName, 'items.pets.Turkey-Base': 5}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2015/20151229_new_years_hats.js b/migrations/archive/2015/20151229_new_years_hats.js new file mode 100644 index 0000000000..74788369a1 --- /dev/null +++ b/migrations/archive/2015/20151229_new_years_hats.js @@ -0,0 +1,77 @@ +let migrationName = '20151229_new_years_hats.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award 2015 party hat if user has 2014 hat, 2014 hat if they have the 2013 hat, + * and 2013 hat otherwise + */ + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.gear.owned': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + let set = {}; + if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('head_special_nye2014')) { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2015': false}; + } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('head_special_nye')) { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2014': false}; + } else { + set = {migration: migrationName, 'items.gear.owned.head_special_nye': false}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/20160111_challenges_condense_same_day_history_entries.js b/migrations/archive/2016/20160111_challenges_condense_same_day_history_entries.js similarity index 56% rename from migrations/20160111_challenges_condense_same_day_history_entries.js rename to migrations/archive/2016/20160111_challenges_condense_same_day_history_entries.js index 69411e8530..76a7e14dfb 100644 --- a/migrations/20160111_challenges_condense_same_day_history_entries.js +++ b/migrations/archive/2016/20160111_challenges_condense_same_day_history_entries.js @@ -1,11 +1,11 @@ -var migrationName = '20160111_challenges_condense_same_day_history_entries.js'; +let migrationName = '20160111_challenges_condense_same_day_history_entries.js'; /* * Compress challenges tasks history entries so that only one entry per day is kept */ -var dbserver = ''; -var dbname = ''; +let dbserver = ''; +let dbname = ''; // IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. // We've now upgraded to lodash v4 but the code used in this migration has not been @@ -13,34 +13,34 @@ var dbname = ''; // be checked for compatibility against the v4 changelog and changed if necessary. // https://github.com/lodash/lodash/wiki/Changelog#v400 -var mongo = require('mongoskin'); -var _ = require('lodash'); -var moment = require('moment'); +let mongo = require('mongoskin'); +let _ = require('lodash'); +let moment = require('moment'); -var dbChallenges = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('challenges'); +let dbChallenges = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('challenges'); // Find all challenges -var query = { +let query = { }; // we only want habits and dailies (rewards and todos don't have history) -var fields = { - 'habits': 1, - 'dailys': 1, +let fields = { + habits: 1, + dailys: 1, }; function compressEntries (history) { return _.chain(history) - .filter(function(entry) { - return !!entry; + .filter(function (entry) { + return Boolean(entry); }) - .groupBy(function(entry) { // group by day + .groupBy(function (entry) { // group by day return moment(entry.date).format('YYYYMMDD'); }) - .sortBy(function(entry, key) { // sort by date and transform back to array of array of entries + .sortBy(function (entry, key) { // sort by date and transform back to array of array of entries return key; }) - .map(function(entries) { // aggregate the value + .map(function (entries) { // aggregate the value return { date: Number(entries[0].date), value: _.reduce(entries, function (previousValue, entry) { @@ -49,14 +49,16 @@ function compressEntries (history) { }; }) .value(); -}; +} console.warn('Updating challenges...'); -var progressCount = 100; -var count = 0; +let progressCount = 100; +let count = 0; -dbChallenges.findEach(query, fields, {batchSize: 250}, function(err, challenge) { - if (err) { return exiting(1, 'ERROR! ' + err); } +dbChallenges.findEach(query, fields, {batchSize: 250}, function (err, challenge) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } if (!challenge) { console.warn('All appropriate challenges found.'); return displayData(); @@ -64,49 +66,54 @@ dbChallenges.findEach(query, fields, {batchSize: 250}, function(err, challenge) count++; // specify challenge data to change: - var set = {}; + let set = {}; if (challenge.habits && challenge.habits.length > 0) { - challenge.habits.forEach(function(habit, index) { + challenge.habits.forEach(function (habit, index) { if (habit.history && habit.history.length > 1) { - var originalL = habit.history.length; + let originalL = habit.history.length; habit.history = compressEntries(habit.history); if (originalL > 1000) console.log(originalL, habit.history.length); - set['habits.' + index + '.history'] = habit.history; + set[`habits.${ index }.history`] = habit.history; } }); } if (challenge.dailys && challenge.dailys.length > 0) { - challenge.dailys.forEach(function(daily, index) { + challenge.dailys.forEach(function (daily, index) { if (daily.history && daily.history.length > 1) { - var originalL = daily.history.length; + let originalL = daily.history.length; daily.history = compressEntries(daily.history); if (originalL > 1000) console.log(originalL, daily.history.length); - set['dailys.' + index + '.history'] = daily.history; + set[`dailys.${ index }.history`] = daily.history; } }); } - dbChallenges.update({_id: challenge._id}, {$set: set}, function(err) { - if(err) throw err; + dbChallenges.update({_id: challenge._id}, {$set: set}, function (err) { + if (err) throw err; console.log('updated a challenge'); }); - if (count%progressCount == 0) console.warn(count + ' ' + challenge._id); + if (count % progressCount === 0) console.warn(`${count } ${ challenge._id}`); }); -function displayData() { - console.warn('\n' + count + ' challenges processed\n'); +function displayData () { + console.warn(`\n${ count } challenges processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/20160129_habit_birthday.js b/migrations/archive/2016/20160129_habit_birthday.js similarity index 50% rename from migrations/20160129_habit_birthday.js rename to migrations/archive/2016/20160129_habit_birthday.js index f4be13c50e..25e50ea0dd 100644 --- a/migrations/20160129_habit_birthday.js +++ b/migrations/archive/2016/20160129_habit_birthday.js @@ -1,15 +1,15 @@ -var migrationName = '20160129_habit_birthday.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = '20160129_habit_birthday.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Award 2016 party robes if user has 2015 robes, 2015 robes if they have the 2014 robes, * and 2014 robes otherwise */ -var dbserver = 'localhost:27017'; // FOR TEST DATABASE +let dbserver = 'localhost:27017'; // FOR TEST DATABASE // var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE -var dbname = 'habitrpg'; +let dbname = 'habitrpg'; // IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. // We've now upgraded to lodash v4 but the code used in this migration has not been @@ -17,25 +17,27 @@ var dbname = 'habitrpg'; // be checked for compatibility against the v4 changelog and changed if necessary. // https://github.com/lodash/lodash/wiki/Changelog#v400 -var mongo = require('mongoskin'); -var _ = require('lodash'); +let mongo = require('mongoskin'); +let _ = require('lodash'); -var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); // specify a query to limit the affected users (empty for all users): -var query = { +let query = { }; // specify fields we are interested in to limit retrieved data (empty if we're not reading data): -var fields = { +let fields = { 'items.gear.owned': 1, }; console.warn('Updating users...'); -var progressCount = 1000; -var count = 0; -dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { - if (err) { return exiting(1, 'ERROR! ' + err); } +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } if (!user) { console.warn('All appropriate users found and modified.'); return displayData(); @@ -43,7 +45,7 @@ dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { count++; // specify user data to change: - var set = {'migration':migrationName}; + let set = {migration: migrationName}; if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2015')) { set['items.gear.owned.armor_special_birthday2016'] = false; } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday')) { @@ -52,40 +54,45 @@ dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { set['items.gear.owned.armor_special_birthday'] = false; } - var inc = { - 'items.food.Cake_Skeleton':1, - 'items.food.Cake_Base':1, - 'items.food.Cake_CottonCandyBlue':1, - 'items.food.Cake_CottonCandyPink':1, - 'items.food.Cake_Shade':1, - 'items.food.Cake_White':1, - 'items.food.Cake_Golden':1, - 'items.food.Cake_Zombie':1, - 'items.food.Cake_Desert':1, - 'items.food.Cake_Red':1, - 'achievements.habitBirthdays':1 + let inc = { + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, + 'achievements.habitBirthdays': 1, }; - dbUsers.update({_id:user._id}, {$set:set}); - dbUsers.update({_id:user._id}, {$inc:inc}); + dbUsers.update({_id: user._id}, {$set: set}); + dbUsers.update({_id: user._id}, {$inc: inc}); - if (count%progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); }); -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); -} +} diff --git a/migrations/archive/2016/20160521_veteran_ladder.js b/migrations/archive/2016/20160521_veteran_ladder.js new file mode 100644 index 0000000000..cc538faf6d --- /dev/null +++ b/migrations/archive/2016/20160521_veteran_ladder.js @@ -0,0 +1,89 @@ +let migrationName = '20160521_veteran_ladder.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Gilded Turkey pet to Turkey mount owners, Turkey Mount if they only have Turkey Pet, + * and Turkey Pet otherwise + */ + +let dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +let dbname = 'habitrpg'; + +let mongo = require('mongoskin'); +let _ = require('lodash'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let dbUsers = mongo.db(`${dbserver }/${ dbname }?auto_reconnect`).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + 'auth.timestamps.loggedin': {$gt: new Date('2016-05-01')}, // remove when running migration a second time +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + migration: 1, + 'items.pets.Wolf-Veteran': 1, + 'items.pets.Tiger-Veteran': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + let set = {}; + if (user.migration !== migrationName) { + if (user.items.pets['Tiger-Veteran']) { + set = {migration: migrationName, 'items.pets.Lion-Veteran': 5}; + } else if (user.items.pets['Wolf-Veteran']) { + set = {migration: migrationName, 'items.pets.Tiger-Veteran': 5}; + } else { + set = {migration: migrationName, 'items.pets.Wolf-Veteran': 5}; + } + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2016/20160527_fix_empty_checklist_id.js b/migrations/archive/2016/20160527_fix_empty_checklist_id.js new file mode 100644 index 0000000000..eacb7498de --- /dev/null +++ b/migrations/archive/2016/20160527_fix_empty_checklist_id.js @@ -0,0 +1,91 @@ +let uuid = require('uuid').v4; +let mongo = require('mongodb').MongoClient; +let _ = require('lodash'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +let taskIds = require('checklists-no-id.json').map(function (obj) { + return obj._id; +}); + +// Fix empty task.checklistt.id + +let progressCount = 100; +let count = 0; + +function displayData () { + console.warn(`\n${ count } tasks processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } +} + +mongo.connect('db url') + .then(function (db) { + let dbTasks = db.collection('tasks'); + + // specify a query to limit the affected tasks (empty for all tasks): + let query = { + _id: { $in: taskIds }, + }; + + // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + let fields = { + checklist: 1, + }; + + console.warn('Updating tasks...'); + + dbTasks.find(query, fields, {batchSize: 250}).toArray(function (err, tasks) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + + tasks.forEach(function (task) { + let checklist = task.checklist || []; + checklist.forEach(function (item) { + if (!item.id || item.id === '') { + item.id = uuid(); + } + }); + + // specify user data to change: + let set = { + checklist, + }; + // console.log(set); + + dbTasks.update({_id: task._id}, {$set: set}, function (err, res) { + if (err) console.error('Error while updating', err); + }); + + count++; + if (count % progressCount === 0) console.warn(`${count } ${ task._id}`); + }); + + if (count === tasks.length) { + console.warn('All appropriate tasks found and modified.'); + return displayData(); + } + }); + }) + .catch(function (err) { + throw err; + }); \ No newline at end of file diff --git a/migrations/20160529_fix_challenges.js b/migrations/archive/2016/20160529_fix_challenges.js similarity index 87% rename from migrations/20160529_fix_challenges.js rename to migrations/archive/2016/20160529_fix_challenges.js index 51c31ee0c9..035a5c30ed 100644 --- a/migrations/20160529_fix_challenges.js +++ b/migrations/archive/2016/20160529_fix_challenges.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Reason: After the api v3 maintenance migration, some challenge tasks * became unlinked from their challenges. We're still not sure why, * but this re-links them @@ -33,7 +33,7 @@ const TASK_UPDATE_DATA = require('../challenge_fixes.json'); let db; let count = 0; -var timer = setInterval(function(){ +let timer = setInterval(function () { count++; if (count % 30 === 0) { logger.warn('Process has been running for', count / 60, 'minutes'); @@ -48,7 +48,7 @@ connectToDb() // .then(correctUserTasks) .then(updateTasks) .then(closeDb) - .catch(reportError) + .catch(reportError); function connectToDb () { return new Promise((resolve, reject) => { @@ -81,11 +81,11 @@ function findBrokenChallengeTasks () { logger.info('Looking for broken tasks...'); // return db.collection('tasks').find({'challenge.broken': 'CHALLENGE_TASK_NOT_FOUND'}).toArray() - return db.collection('tasks').find({'_id': { '$in': TASK_IDS }}).toArray() - .then((tasks) => { - logger.success('Found', tasks.length, 'broken tasks.'); - return Promise.resolve(tasks); - }); + return db.collection('tasks').find({_id: { $in: TASK_IDS }}).toArray() + .then((tasks) => { + logger.success('Found', tasks.length, 'broken tasks.'); + return Promise.resolve(tasks); + }); } function getDataFromTasks (tasks) { @@ -114,12 +114,12 @@ function getDataFromTasks (tasks) { function getUserChallenges (data) { logger.info('Collecting user challenges...'); - return db.collection('users').find({_id: { '$in': data.users }}, {challenges: 1}).toArray().then((docs) => { + return db.collection('users').find({_id: { $in: data.users }}, {challenges: 1}).toArray().then((docs) => { logger.success('Found', docs.length, 'users from broken challenge tasks.'); let challenges = []; docs.forEach((user) => { - challenges.push.apply(challenges, user.challenges); + challenges.push(...user.challenges); }); challenges = unique(challenges); @@ -146,7 +146,7 @@ function getUserChallenges (data) { function getChallengeTasks (data) { logger.info('Looking up original challenge tasks...'); - return db.collection('tasks').find({'userId': null, 'challenge.id': { '$in': data.challenges }}, [ 'text', 'type', 'challenge', '_legacyId' ]).toArray().then((docs) => { + return db.collection('tasks').find({userId: null, 'challenge.id': { $in: data.challenges }}, ['text', 'type', 'challenge', '_legacyId']).toArray().then((docs) => { logger.success('Found', docs.length, 'challenge tasks.'); let challengeTasks = {}; @@ -190,14 +190,14 @@ function correctUserTasks (data) { let foundTask = userTasks.find((task) => { return TASK_IDS.indexOf(task._id) > -1 && task._legacyId === legacyId && task.type === type && task.text === text; - }) + }); if (foundTask && !tasksToUpdate[foundTask._id]) { tasksToUpdate[foundTask._id] = { id: chal, broken: null, // NOTE: this caused a lot of problems taskId, - } + }; } else if (foundTask && taskId !== tasksToUpdate[foundTask._id].taskId) { logger.error('Duplicate task found, id:', foundTask._id); duplicateTasks[foundTask._id] = duplicateTasks[foundTask._id] || [tasksToUpdate[foundTask._id].taskId]; @@ -236,12 +236,12 @@ function updateTasks (data) { logger.info(promiseCount, 'updates started'); } - return db.collection('tasks').findOneAndUpdate({_id: taskId, 'challenge.broken': 'CHALLENGE_TASK_NOT_FOUND'}, {$set: {challenge: tasksToUpdate[taskId]}}, {returnOriginal: false}) + return db.collection('tasks').findOneAndUpdate({_id: taskId, 'challenge.broken': 'CHALLENGE_TASK_NOT_FOUND'}, {$set: {challenge: tasksToUpdate[taskId]}}, {returnOriginal: false}); } return Promise.map(taskIdsToUpdate, queue.wrap(updateTaskById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !res.lastErrorObject.updatedExisting); + let updates = result.filter(res => res && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !res.lastErrorObject.updatedExisting); logger.success(updates.length, 'tasks have been fixed'); @@ -256,9 +256,9 @@ function updateTasks (data) { } function closeDb (data) { - logger.success('The process took ' + count + ' seconds'); + logger.success(`The process took ${ count } seconds`); - clearInterval(timer) + clearInterval(timer); db.close(); } diff --git a/migrations/20160530_fix_tasks_from_null_value_in_challenges_broken.js b/migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js similarity index 88% rename from migrations/20160530_fix_tasks_from_null_value_in_challenges_broken.js rename to migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js index f5ae6c9925..e010e34b35 100644 --- a/migrations/20160530_fix_tasks_from_null_value_in_challenges_broken.js +++ b/migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Reason: After running the 20160529_fix_challenges.js migration * challenge.broken was set to null, which is not a valid value * which caused cron to fail and run many times, messing up daily values, @@ -28,7 +28,7 @@ const NEW_DB_URI = 'mongodb://username:password@dsXXXXXX-a0.mlab.com:XXXXX,dsXXX let oldDb, newDb, OldTasks, NewTasks, OldUsers, NewUsers; let count = 0; -var timer = setInterval(function(){ +let timer = setInterval(function () { count++; if (count % 30 === 0) { logger.warn('Process has been running for', count / 60, 'minutes'); @@ -46,7 +46,7 @@ Promise.all([ .then(getValuesOfOldTasksFromBackup) .then(updateNewTasks) .then(closeDb) - .catch(reportError) + .catch(reportError); function connectToDb (dbUri, type) { return new Promise((resolve, reject) => { @@ -92,14 +92,12 @@ function getAffectedUsersEmail () { users.forEach((user) => { if (user.preferences.emailNotifications.newPM && user.inbox.optOut !== true) { pmsWithEmail.push(user._id); + } else if (user.auth && user.auth.local && user.auth.local.email) { + emails.push(user.auth.local.email); + } else if (user.auth && user.auth.facebook && user.auth.facebook.email) { + emails.push(user.auth.facebook.email); } else { - if (user.auth && user.auth.local && user.auth.local.email) { - emails.push(user.auth.local.email); - } else if (user.auth && user.auth.facebook && user.auth.facebook.email) { - emails.push(user.auth.facebook.email); - } else { - missing.push(user._id); - } + missing.push(user._id); } }); @@ -156,7 +154,9 @@ function determineIfTasksNeedAdjusting (tasks) { let prodTask = tasks[i]; let backupTask = backupTasksAsObject[prodTask._id]; - if (!backupTask) { continue; } + if (!backupTask) { + continue; + } let historyDifference = prodTask.history.length - backupTask.history.length; @@ -194,16 +194,16 @@ function updateNewTasks (oldTasks) { function updateTaskById (task) { promiseCount++; - if (promiseCount % 100=== 0) { + if (promiseCount % 100 === 0) { logger.info(promiseCount, 'updates started'); } - return NewTasks.findOneAndUpdate({_id: task._id}, {$set: {value: task.value, streak: task.streak, history: task.history}}, {returnOriginal: false}) + return NewTasks.findOneAndUpdate({_id: task._id}, {$set: {value: task.value, streak: task.streak, history: task.history}}, {returnOriginal: false}); } return Promise.map(oldTasks, queue.wrap(updateTaskById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + let updates = result.filter(res => res && res.lastErrorObject && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); logger.success(updates.length, 'tasks have been fixed'); @@ -220,9 +220,9 @@ function unique (array) { } function closeDb () { - logger.success('The process took ' + count + ' seconds'); + logger.success(`The process took ${ count } seconds`); - clearInterval(timer) + clearInterval(timer); oldDb.close(); newDb.close(); diff --git a/migrations/20160602_convert_quest_collection.js b/migrations/archive/2016/20160602_convert_quest_collection.js similarity index 87% rename from migrations/20160602_convert_quest_collection.js rename to migrations/archive/2016/20160602_convert_quest_collection.js index 172575cf1e..04db90f1c2 100644 --- a/migrations/20160602_convert_quest_collection.js +++ b/migrations/archive/2016/20160602_convert_quest_collection.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Author: Blade Barringer @crookedneighbor * * Reason: Collection quest data on the client is unreliable @@ -33,7 +33,7 @@ const COLLECTION_QUESTS = [ 'moonstone1', 'goldenknight1', 'dilatoryDistress1', -] +]; let Users, Groups; @@ -43,14 +43,14 @@ connectToDb(DB_URI).then((db) => { return Promise.resolve(); }) -.then(findUsersWithCollectionData) -.then(getUsersCollectionData) -.then(transformCollectionData) -.then(cleanUpEmptyCollectionData) -.then(() => { - timer.stop(); - closeDb(); -}).catch(reportError); + .then(findUsersWithCollectionData) + .then(getUsersCollectionData) + .then(transformCollectionData) + .then(cleanUpEmptyCollectionData) + .then(() => { + timer.stop(); + closeDb(); + }).catch(reportError); function reportError (err) { logger.error('Uh oh, an error occurred'); @@ -68,14 +68,14 @@ function findUsersWithCollectionData () { let members = groups.reduce((array, party) => { let questers = Object.keys(party.quest.members); - array.push.apply(array, questers); + array.push(...questers); return array; }, []); logger.success('Found', members.length, 'users on collection quests'); return Promise.resolve(members); - }) + }); } function getUsersCollectionData (users) { @@ -89,7 +89,7 @@ function getUsersCollectionData (users) { if (!collect) return array; if (typeof collect === 'number') return array; - for (var i in collect) { + for (let i in collect) { if (collect.hasOwnProperty(i)) { total += collect[i]; } @@ -104,7 +104,7 @@ function getUsersCollectionData (users) { } function updateUserById (user) { - return Users.findOneAndUpdate({_id: user._id}, {$set: {'party.quest.progress.collect': user.collect}}, {returnOriginal: false}) + return Users.findOneAndUpdate({_id: user._id}, {$set: {'party.quest.progress.collect': user.collect}}, {returnOriginal: false}); } @@ -114,8 +114,8 @@ function transformCollectionData (users) { logger.info('About to update', users.length, 'user collection items...'); return Promise.map(users, queue.wrap(updateUserById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + let updates = result.filter(res => res && res.lastErrorObject && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); logger.success(updates.length, 'users have been fixed'); diff --git a/migrations/20160605_convert_quest_collection_again.js b/migrations/archive/2016/20160605_convert_quest_collection_again.js similarity index 86% rename from migrations/20160605_convert_quest_collection_again.js rename to migrations/archive/2016/20160605_convert_quest_collection_again.js index a4e2e0b29e..5b9cc1e95c 100644 --- a/migrations/20160605_convert_quest_collection_again.js +++ b/migrations/archive/2016/20160605_convert_quest_collection_again.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Author: Blade Barringer @crookedneighbor * * Reason: The android app uses quest.progress.collect @@ -30,7 +30,7 @@ const COLLECTION_QUESTS = [ 'moonstone1', 'goldenknight1', 'dilatoryDistress1', -] +]; let Users, Groups; @@ -40,14 +40,14 @@ connectToDb(DB_URI).then((db) => { return Promise.resolve(); }) -.then(findUsersWithCollectionData) -.then(getUsersCollectionData) -.then(transferCollectionData) -.then(cleanUpBadCollectionData) -.then(() => { - timer.stop(); - closeDb(); -}).catch(reportError); + .then(findUsersWithCollectionData) + .then(getUsersCollectionData) + .then(transferCollectionData) + .then(cleanUpBadCollectionData) + .then(() => { + timer.stop(); + closeDb(); + }).catch(reportError); function reportError (err) { logger.error('Uh oh, an error occurred'); @@ -65,14 +65,14 @@ function findUsersWithCollectionData () { let members = groups.reduce((array, party) => { let questers = Object.keys(party.quest.members); - array.push.apply(array, questers); + array.push(...questers); return array; }, []); logger.success('Found', members.length, 'users on collection quests'); return Promise.resolve(members); - }) + }); } function getUsersCollectionData (users) { @@ -95,7 +95,7 @@ function getUsersCollectionData (users) { } function updateUserById (user) { - return Users.findOneAndUpdate({_id: user._id}, {$set: {'party.quest.progress.collectedItems': user.collect}}, {returnOriginal: false}) + return Users.findOneAndUpdate({_id: user._id}, {$set: {'party.quest.progress.collectedItems': user.collect}}, {returnOriginal: false}); } @@ -105,8 +105,8 @@ function transferCollectionData (users) { logger.info('About to update', users.length, 'user collection items...'); return Promise.map(users, queue.wrap(updateUserById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + let updates = result.filter(res => res && res.lastErrorObject && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); logger.success(updates.length, 'users have been fixed'); diff --git a/migrations/20160615_fix_bad_emails.js b/migrations/archive/2016/20160615_fix_bad_emails.js similarity index 82% rename from migrations/20160615_fix_bad_emails.js rename to migrations/archive/2016/20160615_fix_bad_emails.js index 0413452e31..97f29cefcf 100644 --- a/migrations/20160615_fix_bad_emails.js +++ b/migrations/archive/2016/20160615_fix_bad_emails.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Author: Blade Barringer @crookedneighbor * * Reason: Old code didn't properly validate email @@ -33,11 +33,11 @@ connectToDb(DB_URI).then((db) => { }) // cached the lookup as a json file // .then(findUsersWithBadEmails) -.then(correctEmails) -.then(() => { - timer.stop(); - closeDb(); -}).catch(reportError); + .then(correctEmails) + .then(() => { + timer.stop(); + closeDb(); + }).catch(reportError); function reportError (err) { logger.error('Uh oh, an error occurred'); @@ -58,8 +58,8 @@ function findUsersWithBadEmails (users) { return { _id: user._id, email: user.auth.local.email }; }); - logger.warn('number of invalid emails:', invalidEmails.length) - console.log(result) + logger.warn('number of invalid emails:', invalidEmails.length); + console.log(result); return Promise.resolve(invalidEmails); }); @@ -68,8 +68,8 @@ function findUsersWithBadEmails (users) { function updateUserById (user) { return Users.findOneAndUpdate({ _id: user._id}, - {$set: {'auth.local.email': user._id + '@example.com'} - }, {returnOriginal: false}) + {$set: {'auth.local.email': `${user._id }@example.com`}, + }, {returnOriginal: false}); } // cached lookup of bad emails @@ -81,8 +81,8 @@ function correctEmails () { logger.warn('About to update', emails.length, 'user email addresses...'); return Promise.map(emails, queue.wrap(updateUserById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + let updates = result.filter(res => res && res.lastErrorObject && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); logger.warn(updates.length, 'users have been fixed'); diff --git a/migrations/archive/2016/20160731_naming_day.js b/migrations/archive/2016/20160731_naming_day.js new file mode 100644 index 0000000000..dfbbf362b9 --- /dev/null +++ b/migrations/archive/2016/20160731_naming_day.js @@ -0,0 +1,89 @@ +let migrationName = '20160731_naming_day.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Royal Purple Gryphon pet to Royal Purple Gryphon mount owners, mount to everyone else + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2016-07-30')}, // Extend timeframe each run of migration +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.mounts': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + let inc = {}; + inc = { + 'achievements.habiticaDays': 1, + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, + }; + if (user.items.mounts['Gryphon-RoyalPurple']) { + set = {migration: migrationName, 'items.pets.Gryphon-RoyalPurple': 5}; + } else { + set = {migration: migrationName, 'items.mounts.Gryphon-RoyalPurple': true}; + } + + dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2016/20160731_takeThis.js b/migrations/archive/2016/20160731_takeThis.js new file mode 100644 index 0000000000..6a7e858840 --- /dev/null +++ b/migrations/archive/2016/20160731_takeThis.js @@ -0,0 +1,78 @@ +let migrationName = '20160731_takeThis.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Take This Sword to Take This challenge participants who already own the Shield + * and Take This Shield to the rest of the list + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2016-07-30')}, // Extend timeframe each run of migration + challenges: {$in: ['da8859b2-5c6e-4aa5-b8b2-8db93d5de9fc']}, +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.gear.owned': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + + if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.weapon_special_takeThis': false}; + } else { + set = {migration: migrationName, 'items.gear.owned.shield_special_takeThis': false}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2016/20160831_takeThis.js b/migrations/archive/2016/20160831_takeThis.js new file mode 100644 index 0000000000..733b514b19 --- /dev/null +++ b/migrations/archive/2016/20160831_takeThis.js @@ -0,0 +1,79 @@ +let migrationName = '20160831_takeThis.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Take This Sword to Take This challenge participants who already own the Shield + * and Take This Shield to the rest of the list + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + challenges: {$in: ['ee2b3c87-13f0-422a-af3c-309102d4f7e6']}, +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.gear.owned': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + + if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.armor_special_takeThis': false}; + } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.weapon_special_takeThis': false}; + } else { + set = {migration: migrationName, 'items.gear.owned.shield_special_takeThis': false}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/20161002_add_missing_webhook_type.js b/migrations/archive/2016/20161002_add_missing_webhook_type.js similarity index 81% rename from migrations/20161002_add_missing_webhook_type.js rename to migrations/archive/2016/20161002_add_missing_webhook_type.js index f3f7b93422..8a0dd5ecbe 100644 --- a/migrations/20161002_add_missing_webhook_type.js +++ b/migrations/archive/2016/20161002_add_missing_webhook_type.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Author: Blade Barringer @crookedneighbor * * Reason: Webhooks have been moved from @@ -24,7 +24,7 @@ const MIGRATION_NAME = '20161002_add_missing_webhook_type.js'; const DB_URI = 'mongodb://localhost/prod-copy-1'; const LOGGEDIN_DATE_RANGE = { - $gte: new Date("2016-09-30T00:00:00.000Z"), + $gte: new Date('2016-09-30T00:00:00.000Z'), // $lte: new Date("2016-09-25T00:00:00.000Z"), }; @@ -33,12 +33,12 @@ let Users; connectToDb(DB_URI).then((db) => { Users = db.collection('users'); }) -.then(findUsersWithWebhooks) -.then(correctWebhooks) -.then(() => { - timer.stop(); - closeDb(); -}).catch(reportError); + .then(findUsersWithWebhooks) + .then(correctWebhooks) + .then(() => { + timer.stop(); + closeDb(); + }).catch(reportError); function reportError (err) { logger.error('Uh oh, an error occurred'); @@ -53,14 +53,14 @@ const USER_IDS = require('../../ids_of_webhooks_to_update.json'); function findUsersWithWebhooks () { logger.warn('Fetching users with webhooks...'); - return Users.find({'_id': {$in: USER_IDS}}, ['preferences.webhooks']).toArray().then((docs) => { + return Users.find({_id: {$in: USER_IDS}}, ['preferences.webhooks']).toArray().then((docs) => { // return Users.find({'preferences.webhooks': {$ne: {} }}, ['preferences.webhooks']).toArray().then((docs) => { // TODO: Run this after the initial migration to catch any webhooks that may have been aded since the prod backup download // return Users.find({'preferences.webhooks': {$ne: {} }, 'auth.timestamps.loggedin': LOGGEDIN_DATE_RANGE}, ['preferences.webhooks']).toArray().then((docs) => { let updates = docs.map((user) => { let oldWebhooks = user.preferences.webhooks; let webhooks = Object.keys(oldWebhooks).map((id) => { - let webhook = oldWebhooks[id] + let webhook = oldWebhooks[id]; webhook.type = 'taskActivity'; webhook.label = ''; @@ -79,7 +79,7 @@ function findUsersWithWebhooks () { return { webhooks, id: user._id, - } + }; }); return Promise.resolve(updates); @@ -92,8 +92,8 @@ function updateUserById (user) { return Users.findOneAndUpdate({ _id: userId}, - {$set: {webhooks: webhooks, migration: MIGRATION_NAME} - }, {returnOriginal: false}) + {$set: {webhooks, migration: MIGRATION_NAME}, + }, {returnOriginal: false}); } function correctWebhooks (users) { @@ -102,8 +102,8 @@ function correctWebhooks (users) { logger.warn('About to update', users.length, 'users...'); return Promise.map(users, queue.wrap(updateUserById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + let updates = result.filter(res => res && res.lastErrorObject && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); logger.warn(updates.length, 'users have been fixed'); diff --git a/migrations/archive/2016/20161002_takeThis.js b/migrations/archive/2016/20161002_takeThis.js new file mode 100644 index 0000000000..f8880a6c7b --- /dev/null +++ b/migrations/archive/2016/20161002_takeThis.js @@ -0,0 +1,80 @@ +let migrationName = '20161002_takeThis.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Take This ladder items to participants in this month's challenge + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + challenges: {$in: ['4bbf63b5-10bc-49f9-8e95-5bd2ac99cd1c']}, +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.gear.owned': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + + if (typeof user.items.gear.owned.armor_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_takeThis': false}; + } else if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.armor_special_takeThis': false}; + } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.weapon_special_takeThis': false}; + } else { + set = {migration: migrationName, 'items.gear.owned.shield_special_takeThis': false}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2016/20161030-jackolanterns.js b/migrations/archive/2016/20161030-jackolanterns.js new file mode 100644 index 0000000000..6be94e311f --- /dev/null +++ b/migrations/archive/2016/20161030-jackolanterns.js @@ -0,0 +1,93 @@ +let migrationName = '20161030-jackolanterns.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * set the newStuff flag in all user accounts so they see a Bailey message + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + 'auth.timestamps.loggedin': {$gt: new Date('2016-10-01')}, // remove when running migration a second time +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + migration: 1, + 'items.pets.JackOLantern-Base': 1, + 'items.mounts.JackOLantern-Base': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + let inc = {}; + if (user.migration !== migrationName) { + if (user.items.mounts['JackOLantern-Base']) { + set = {migration: migrationName, 'items.pets.JackOLantern-Ghost': 5}; + } else if (user.items.pets['JackOLantern-Base']) { + set = {migration: migrationName, 'items.mounts.JackOLantern-Base': true}; + } else { + set = {migration: migrationName, 'items.pets.JackOLantern-Base': 5}; + } + inc = { + 'items.food.Candy_Base': 1, + 'items.food.Candy_CottonCandyBlue': 1, + 'items.food.Candy_CottonCandyPink': 1, + 'items.food.Candy_Desert': 1, + 'items.food.Candy_Golden': 1, + 'items.food.Candy_Red': 1, + 'items.food.Candy_Shade': 1, + 'items.food.Candy_Skeleton': 1, + 'items.food.Candy_White': 1, + 'items.food.Candy_Zombie': 1, + }; + } + + dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2016/20161102_takeThis.js b/migrations/archive/2016/20161102_takeThis.js new file mode 100644 index 0000000000..137dc17dee --- /dev/null +++ b/migrations/archive/2016/20161102_takeThis.js @@ -0,0 +1,82 @@ +let migrationName = '20161102_takeThis.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Take This ladder items to participants in this month's challenge + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + challenges: {$in: ['d1be0965-e909-4d30-82fa-9a0011f885b2']}, +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.gear.owned': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + + if (typeof user.items.gear.owned.head_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.body_special_takeThis': false}; + } else if (typeof user.items.gear.owned.armor_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_takeThis': false}; + } else if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.armor_special_takeThis': false}; + } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.weapon_special_takeThis': false}; + } else { + set = {migration: migrationName, 'items.gear.owned.shield_special_takeThis': false}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/archive/2016/20161122_turkey_ladder.js b/migrations/archive/2016/20161122_turkey_ladder.js new file mode 100644 index 0000000000..9853af9212 --- /dev/null +++ b/migrations/archive/2016/20161122_turkey_ladder.js @@ -0,0 +1,81 @@ +let migrationName = '20161122_turkey_ladder.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Yearly Turkey Day award. Turkey pet, Turkey mount, Gilded Turkey pet, Gilded Turkey mount + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2016-10-31')}, // Extend timeframe each run of migration +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + migration: 1, + 'items.mounts': 1, + 'items.pets': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + + if (user.items.pets['Turkey-Gilded']) { + set = {migration: migrationName, 'items.mounts.Turkey-Gilded': true}; + } else if (user.items.mounts['Turkey-Base']) { + set = {migration: migrationName, 'items.pets.Turkey-Gilded': 5}; + } else if (user.items.pets['Turkey-Base']) { + set = {migration: migrationName, 'items.mounts.Turkey-Base': true}; + } else { + set = {migration: migrationName, 'items.pets.Turkey-Base': 5}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} diff --git a/migrations/archive/2016/20161230_nye_hats.js b/migrations/archive/2016/20161230_nye_hats.js new file mode 100644 index 0000000000..a4c9b491a6 --- /dev/null +++ b/migrations/archive/2016/20161230_nye_hats.js @@ -0,0 +1,80 @@ +let migrationName = '20161230_nye_hats.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Yearly New Year's party hat award + */ + +let mongo = require('mongoskin'); + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let dbUsers = mongo.db(connectionString).collection('users'); + +// specify a query to limit the affected users (empty for all users): +let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2016-11-30')}, // Remove after first run +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +let fields = { + 'items.gear.owned': 1, +}; + +console.warn('Updating users...'); +let progressCount = 1000; +let count = 0; +dbUsers.findEach(query, fields, {batchSize: 250}, function (err, user) { + if (err) { + return exiting(1, `ERROR! ${ err}`); + } + if (!user) { + console.warn('All appropriate users found and modified.'); + setTimeout(displayData, 300000); + return; + } + count++; + + // specify user data to change: + let set = {}; + + if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2016': false}; + } else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2015': false}; + } else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2014': false}; + } else { + set = {migration: migrationName, 'items.gear.owned.head_special_nye': false}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +}); + + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + diff --git a/migrations/20170111_announce_collection_quest_change_in_parties.js b/migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js similarity index 78% rename from migrations/20170111_announce_collection_quest_change_in_parties.js rename to migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js index aabd6703f8..35361d4094 100644 --- a/migrations/20170111_announce_collection_quest_change_in_parties.js +++ b/migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js @@ -1,6 +1,6 @@ 'use strict'; -/**************************************** +/** ************************************** * Author: @Alys * * Reason: Collection quests are being changed @@ -43,13 +43,13 @@ connectToDb(DB_URI).then((db) => { return Promise.resolve(); }) -.then(findPartiesWithCollectionQuest) + .then(findPartiesWithCollectionQuest) // .then(displayGroups) // for testing only -.then(addMessageToGroups) -.then(() => { - timer.stop(); - closeDb(); -}).catch(reportError); + .then(addMessageToGroups) + .then(() => { + timer.stop(); + closeDb(); + }).catch(reportError); function reportError (err) { logger.error('Uh oh, an error occurred'); @@ -61,11 +61,11 @@ function reportError (err) { function findPartiesWithCollectionQuest () { logger.info('Looking up groups on collection quests...'); - return Groups.find({'quest.key': {$in: COLLECTION_QUESTS}}, ['name','quest']).toArray().then((groups) => { + return Groups.find({'quest.key': {$in: COLLECTION_QUESTS}}, ['name', 'quest']).toArray().then((groups) => { logger.success('Found', groups.length, 'parties on collection quests'); return Promise.resolve(groups); - }) + }); } function displayGroups (groups) { // for testing only @@ -75,16 +75,16 @@ function displayGroups (groups) { // for testing only } function updateGroupById (group) { - var newMessage = { - 'id' : uuid.v4(), - 'text' : message, - 'timestamp': Date.now(), - 'likes': {}, - 'flags': {}, - 'flagCount': 0, - 'uuid': 'system' + let newMessage = { + id: uuid.v4(), + text: message, + timestamp: Date.now(), + likes: {}, + flags: {}, + flagCount: 0, + uuid: 'system', }; - return Groups.findOneAndUpdate({_id: group._id}, {$push:{"chat" :{$each: [newMessage], $position:0}}}, {returnOriginal: false}); + return Groups.findOneAndUpdate({_id: group._id}, {$push: {chat: {$each: [newMessage], $position: 0}}}, {returnOriginal: false}); // Does not set the newMessage flag for all party members because I don't think it's essential and // I don't want to run the extra code (extra database load, extra opportunity for bugs). } @@ -95,8 +95,8 @@ function addMessageToGroups (groups) { logger.info('About to update', groups.length, 'parties...'); return Promise.map(groups, queue.wrap(updateGroupById)).then((result) => { - let updates = result.filter(res => res.lastErrorObject && res.lastErrorObject.updatedExisting) - let failures = result.filter(res => !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); + let updates = result.filter(res => res && res.lastErrorObject && res.lastErrorObject.updatedExisting); + let failures = result.filter(res => res && !(res.lastErrorObject && res.lastErrorObject.updatedExisting)); logger.success(updates.length, 'parties have been notified'); diff --git a/migrations/archive/2017/20170120_missing_incentive.js b/migrations/archive/2017/20170120_missing_incentive.js new file mode 100644 index 0000000000..626fd900eb --- /dev/null +++ b/migrations/archive/2017/20170120_missing_incentive.js @@ -0,0 +1,118 @@ +let migrationName = '20170120_missing_incentive.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award missing Royal Purple Hatching Potion to users with 55+ check-ins + * Reduce users with impossible check-in counts to a reasonable number + */ + +import monk from 'monk'; +import common from '../website/common'; + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + loginIncentives: {$gt: 54}, + migration: {$ne: migrationName}, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let language = user.preferences.language || 'en'; + let set = {migration: migrationName}; + let inc = {'items.hatchingPotions.RoyalPurple': 1}; + if (user.loginIncentives > 58) { + set = {migration: migrationName, loginIncentives: 58}; + } + let push = { + notifications: { + type: 'LOGIN_INCENTIVE', + data: { + nextRewardAt: 60, + rewardKey: [ + 'Pet_HatchingPotion_Purple', + ], + rewardText: common.i18n.t('potion', {potionType: common.i18n.t('hatchingPotionRoyalPurple', language)}, language), + reward: [ + { + premium: true, + key: 'RoyalPurple', + limited: true, + value: 2, + }, + ], + message: common.i18n.t('unlockedCheckInReward', language), + }, + id: common.uuid(), + }, + }; + + dbUsers.update({_id: user._id}, {$set: set, $push: push, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/archive/2017/20170131_habit_birthday.js b/migrations/archive/2017/20170131_habit_birthday.js new file mode 100644 index 0000000000..01efd5ce6a --- /dev/null +++ b/migrations/archive/2017/20170131_habit_birthday.js @@ -0,0 +1,114 @@ +let migrationName = '20170131_habit_birthday.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award 2017 party robes if user has 2016 robes, 2016 robes if they have the 2015 robes, + * 2015 robes if they have the 2014 robes, and 2014 robes otherwise. Also cake! + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2017-01-24')}, // remove after first run to cover remaining users + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data) + 'items.gear.owned', + ], + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let set = {migration: migrationName}; + if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2016')) { + set['items.gear.owned.armor_special_birthday2017'] = false; + } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2015')) { + set['items.gear.owned.armor_special_birthday2016'] = false; + } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday')) { + set['items.gear.owned.armor_special_birthday2015'] = false; + } else { + set['items.gear.owned.armor_special_birthday'] = false; + } + + let inc = { + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, + 'achievements.habitBirthdays': 1, + }; + + dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/archive/2017/20170418_subscriber_jackalopes.js b/migrations/archive/2017/20170418_subscriber_jackalopes.js new file mode 100644 index 0000000000..856f35bd13 --- /dev/null +++ b/migrations/archive/2017/20170418_subscriber_jackalopes.js @@ -0,0 +1,93 @@ +let migrationName = '20170418_subscriber_jackalopes.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Royal Purple Jackalope pet to all current subscribers + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); +let now = new Date(); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + 'purchased.plan.customerId': {$type: 2}, + $or: [ + {'purchased.plan.dateTerminated': null}, + {'purchased.plan.dateTerminated': {$exists: false}}, + {'purchased.plan.dateTerminated': {$gt: now}}, + ], + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let set = {'items.pets.Jackalope-RoyalPurple': 5}; + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/20170425_missing_incentives.js b/migrations/archive/2017/20170425_missing_incentives.js similarity index 70% rename from migrations/20170425_missing_incentives.js rename to migrations/archive/2017/20170425_missing_incentives.js index be8c224719..9c431b5661 100644 --- a/migrations/20170425_missing_incentives.js +++ b/migrations/archive/2017/20170425_missing_incentives.js @@ -1,6 +1,6 @@ -var migrationName = '20170425_missing_incentives'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = '20170425_missing_incentives'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Award missing Royal Purple Hatching Potion to users with 55+ check-ins @@ -10,36 +10,36 @@ var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done import monk from 'monk'; import common from '../website/common'; -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'loginIncentives': {$gt:99}, - 'migration': {$ne: migrationName}, + let query = { + loginIncentives: {$gt: 99}, + migration: {$ne: migrationName}, }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, - fields: [] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -48,20 +48,20 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(function () { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var language = user.preferences.language || 'en'; - var set = {'migration': migrationName}; - var inc = { + let language = user.preferences.language || 'en'; + let set = {migration: migrationName}; + let inc = { 'items.eggs.BearCub': 0, 'items.eggs.Cactus': 0, 'items.eggs.Dragon': 0, @@ -93,7 +93,7 @@ function updateUser (user) { 'items.hatchingPotions.White': 0, 'items.hatchingPotions.Zombie': 0, }; - var nextReward; + let nextReward; if (user.loginIncentives >= 105) { inc['items.hatchingPotions.RoyalPurple'] += 1; @@ -167,39 +167,44 @@ function updateUser (user) { nextReward = 160; } - var push = { - 'notifications': { - 'type': 'LOGIN_INCENTIVE', - 'data': { - 'nextRewardAt': nextReward, - 'rewardKey': [ + let push = { + notifications: { + type: 'LOGIN_INCENTIVE', + data: { + nextRewardAt: nextReward, + rewardKey: [ 'shop_armoire', ], - 'rewardText': common.i18n.t('checkInRewards', language), - 'reward': [], - 'message': common.i18n.t('backloggedCheckInRewards', language), + rewardText: common.i18n.t('checkInRewards', language), + reward: [], + message: common.i18n.t('backloggedCheckInRewards', language), }, - 'id': common.uuid(), - } + id: common.uuid(), + }, }; - dbUsers.update({_id: user._id}, {$set:set, $push:push, $inc:inc}); + dbUsers.update({_id: user._id}, {$set: set, $push: push, $inc: inc}); - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/20170616_achievements.js b/migrations/archive/2017/20170616_achievements.js similarity index 56% rename from migrations/20170616_achievements.js rename to migrations/archive/2017/20170616_achievements.js index a780c33f3d..53b8be3b73 100644 --- a/migrations/20170616_achievements.js +++ b/migrations/archive/2017/20170616_achievements.js @@ -1,6 +1,6 @@ -var migrationName = '20170616_achievements'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = '20170616_achievements'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Updates to achievements for June 16, 2017 biweekly merge @@ -10,27 +10,27 @@ var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done import monk from 'monk'; -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { + let query = { $or: [ - {'achievements.quests.dilatoryDistress1': {$gt:0}}, - {'achievements.quests.egg': {$gt:0}}, - {'achievements.quests.goldenknight1': {$gt:0}}, - {'achievements.quests.moonstone1': {$gt:0}}, - {'achievements.quests.vice2': {$gt:0}}, + {'achievements.quests.dilatoryDistress1': {$gt: 0}}, + {'achievements.quests.egg': {$gt: 0}}, + {'achievements.quests.goldenknight1': {$gt: 0}}, + {'achievements.quests.moonstone1': {$gt: 0}}, + {'achievements.quests.vice2': {$gt: 0}}, {'achievements.challenges': {$exists: true, $ne: []}}, - {'challenges': {$exists: true, $ne: []}}, + {challenges: {$exists: true, $ne: []}}, ], }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { @@ -41,15 +41,15 @@ function processUsers(lastId) { 'challenges', ], }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -58,18 +58,18 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(function () { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {'migration': migrationName}; + let set = {migration: migrationName}; if (user.challenges.length > 0 || user.achievements.challenges.length > 0) { set['achievements.joinedChallenge'] = true; @@ -90,23 +90,28 @@ function updateUser (user) { set['achievements.quests.vice2'] = Math.ceil(user.achievements.quests.vice2 * 1.5); } - dbUsers.update({_id: user._id}, {$set:set}); + dbUsers.update({_id: user._id}, {$set: set}); - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/archive/2017/20170711_orcas.js b/migrations/archive/2017/20170711_orcas.js new file mode 100644 index 0000000000..8c9793fe43 --- /dev/null +++ b/migrations/archive/2017/20170711_orcas.js @@ -0,0 +1,95 @@ +let migrationName = '20170711_orcas.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Orca pets to owners of Orca mount, and Orca mount to everyone else + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + 'items.mounts', + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let set = {}; + + if (user.items.mounts['Orca-Base']) { + set = {migration: migrationName, 'items.pets.Orca-Base': 5}; + } else { + set = {migration: migrationName, 'items.mounts.Orca-Base': true}; + } + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/archive/2017/20170731_naming_day.js b/migrations/archive/2017/20170731_naming_day.js new file mode 100644 index 0000000000..0aac178dba --- /dev/null +++ b/migrations/archive/2017/20170731_naming_day.js @@ -0,0 +1,114 @@ +let migrationName = '20170731_naming_day.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award Royal Purple Gryphon Helm to Royal Purple Gryphon pet owners, + * award Royal Purple Gryphon pet to Royal Purple Gryphon mount owners, + * award Royal Purple Gryphon mount to everyone else + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2017-01-01')}, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + 'items.mounts', + 'items.pets', + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let set = {}; + let inc = { + 'achievements.habiticaDays': 1, + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, + }; + + if (user.items.pets['Gryphon-RoyalPurple']) { + set = {migration: migrationName, 'items.gear.owned.head_special_namingDay2017': false}; + } else if (user.items.mounts['Gryphon-RoyalPurple']) { + set = {migration: migrationName, 'items.pets.Gryphon-RoyalPurple': 5}; + } else { + set = {migration: migrationName, 'items.mounts.Gryphon-RoyalPurple': true}; + } + + dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/archive/2017/20170928_redesign_guilds.js b/migrations/archive/2017/20170928_redesign_guilds.js new file mode 100644 index 0000000000..89bd8f5261 --- /dev/null +++ b/migrations/archive/2017/20170928_redesign_guilds.js @@ -0,0 +1,102 @@ +let migrationName = '20170928_redesign_guilds.js'; + +/* + * Copy Guild Leader messages to end of Guild descriptions + * Copy Guild logos to beginning of Guild descriptions + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbGroups = monk(connectionString).get('groups', { castIds: false }); + +function processGroups (lastId) { + // specify a query to limit the affected groups (empty for all groups): + let query = { + }; + + let fields = { + description: 1, + logo: 1, + leaderMessage: 1, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + return dbGroups.find(query, { + fields, + sort: {_id: 1}, + limit: 250, + }) + .then(updateGroups) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateGroups (groups) { + if (!groups || groups.length === 0) { + console.warn('All appropriate groups found and modified.'); + displayData(); + return; + } + + let groupPromises = groups.map(updateGroup); + let lastGroup = groups[groups.length - 1]; + + return Promise.all(groupPromises) + .then(function () { + processGroups(lastGroup._id); + }); +} + +function updateGroup (group) { + count++; + + let description = group.description; + + if (group.logo) { + description = `![Guild Logo](${ group.logo })\n\n \n\n${ description}`; + } + + if (group.leaderMessage) { + description = `${description }\n\n \n\n${ group.leaderMessage}`; + } + + let set = { + description, + }; + + if (count % progressCount === 0) console.warn(`${count } ${ group._id}`); + + return dbGroups.update({_id: group._id}, {$set: set}); +} + +function displayData () { + console.warn(`\n${ count } groups processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processGroups; diff --git a/migrations/20170928_redesign_launch.js b/migrations/archive/2017/20170928_redesign_launch.js similarity index 50% rename from migrations/20170928_redesign_launch.js rename to migrations/archive/2017/20170928_redesign_launch.js index 1139652050..e83d838413 100644 --- a/migrations/20170928_redesign_launch.js +++ b/migrations/archive/2017/20170928_redesign_launch.js @@ -1,53 +1,53 @@ import { selectGearToPin } from '../website/common/script/ops/pinnedGearUtils'; -var getItemInfo = require('../website/common/script/libs/getItemInfo'); +let getItemInfo = require('../website/common/script/libs/getItemInfo'); -var migrationName = '20170928_redesign_launch.js'; -var authorName = 'paglias'; // in case script author needs to know when their ... -var authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; //... own data is done +let migrationName = '20170928_redesign_launch.js'; +let authorName = 'paglias'; // in case script author needs to know when their ... +let authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is done /* * Migrate existing in app rewards lists to pinned items * Award Veteran Pets */ -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'migration': {$ne:migrationName}, + let query = { + migration: {$ne: migrationName}, 'auth.timestamps.loggedin': {$gt: new Date('2017-09-21')}, }; - var fields = { + let fields = { 'items.pets': 1, 'items.gear': 1, 'stats.class': 1, - } + }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } return dbUsers.find(query, { - fields: fields, + fields, sort: {_id: 1}, limit: 250, }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -56,22 +56,22 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(function () { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {'migration': migrationName}; + let set = {migration: migrationName}; - var oldRewardsList = selectGearToPin(user); - var newPinnedItems = [ + let oldRewardsList = selectGearToPin(user); + let newPinnedItems = [ { type: 'armoire', path: 'armoire', @@ -83,13 +83,13 @@ function updateUser (user) { ]; oldRewardsList.forEach(item => { - var type = 'marketGear'; + let type = 'marketGear'; - var itemInfo = getItemInfo(user, 'marketGear', item); + let itemInfo = getItemInfo(user, 'marketGear', item); newPinnedItems.push({ type, path: itemInfo.path, - }) + }); }); set.pinnedItems = newPinnedItems; @@ -104,23 +104,28 @@ function updateUser (user) { set['items.pets.Wolf-Veteran'] = 5; } - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); - return dbUsers.update({_id: user._id}, {$set:set}); + return dbUsers.update({_id: user._id}, {$set: set}); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/archive/2017/20171030_jackolanterns.js b/migrations/archive/2017/20171030_jackolanterns.js new file mode 100644 index 0000000000..1b07ed1fb2 --- /dev/null +++ b/migrations/archive/2017/20171030_jackolanterns.js @@ -0,0 +1,116 @@ +let migrationName = '20171030_jackolanterns.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award the Jack-O'-Lantern ladder: + * Ghost Jack-O-Lantern Mount to owners of Ghost Jack-O-Lantern Pet + * Ghost Jack-O-Lantern Pet to owners of Jack-O-Lantern Mount + * Jack-O-Lantern Mount to owners of Jack-O-Lantern Pet + * Jack-O-Lantern Pet to everyone else + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + 'items.pets', + 'items.mounts', + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let set = {}; + let inc = { + 'items.food.Candy_Skeleton': 1, + 'items.food.Candy_Base': 1, + 'items.food.Candy_CottonCandyBlue': 1, + 'items.food.Candy_CottonCandyPink': 1, + 'items.food.Candy_Shade': 1, + 'items.food.Candy_White': 1, + 'items.food.Candy_Golden': 1, + 'items.food.Candy_Zombie': 1, + 'items.food.Candy_Desert': 1, + 'items.food.Candy_Red': 1, + }; + + if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Ghost']) { + set = {migration: migrationName, 'items.mounts.JackOLantern-Ghost': true}; + } else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Base']) { + set = {migration: migrationName, 'items.pets.JackOLantern-Ghost': 5}; + } else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Base']) { + set = {migration: migrationName, 'items.mounts.JackOLantern-Base': true}; + } else { + set = {migration: migrationName, 'items.pets.JackOLantern-Base': 5}; + } + + dbUsers.update({_id: user._id}, {$set: set, $inc: inc}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/20171117_turkey_ladder.js b/migrations/archive/2017/20171117_turkey_ladder.js similarity index 57% rename from migrations/20171117_turkey_ladder.js rename to migrations/archive/2017/20171117_turkey_ladder.js index 814109af5f..f4414f58ac 100644 --- a/migrations/20171117_turkey_ladder.js +++ b/migrations/archive/2017/20171117_turkey_ladder.js @@ -1,6 +1,6 @@ -var migrationName = '20171117_turkey_ladder.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = '20171117_turkey_ladder.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Award the Turkey Day ladder: @@ -11,21 +11,21 @@ var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done * Grant Base Turkey pet to those who have none of the above yet */ -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2017-11-01')}, + let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2017-11-01')}, }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { @@ -34,17 +34,17 @@ function processUsers(lastId) { fields: [ 'items.pets', 'items.mounts', - ] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -53,19 +53,19 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(function () { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {}; + let set = {}; if (user && user.items && user.items.mounts && user.items.mounts['Turkey-Gilded']) { set = { @@ -92,13 +92,13 @@ function updateUser (user) { }, ]; } else if (user && user.items && user.items.pets && user.items.pets['Turkey-Gilded']) { - set = {'migration':migrationName, 'items.mounts.Turkey-Gilded':true}; + set = {migration: migrationName, 'items.mounts.Turkey-Gilded': true}; } else if (user && user.items && user.items.mounts && user.items.mounts['Turkey-Base']) { - set = {'migration':migrationName, 'items.pets.Turkey-Gilded':5}; + set = {migration: migrationName, 'items.pets.Turkey-Gilded': 5}; } else if (user && user.items && user.items.pets && user.items.pets['Turkey-Base']) { - set = {'migration':migrationName, 'items.mounts.Turkey-Base':true}; + set = {migration: migrationName, 'items.mounts.Turkey-Base': true}; } else { - set = {'migration':migrationName, 'items.pets.Turkey-Base':5}; + set = {migration: migrationName, 'items.pets.Turkey-Base': 5}; } dbUsers.update({_id: user._id}, {$set: set}); @@ -106,21 +106,26 @@ function updateUser (user) { dbUsers.update({_id: user._id}, {$push: {pinnedItems: {$each: push}}}); } - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/archive/2017/20171230_nye_hats.js b/migrations/archive/2017/20171230_nye_hats.js new file mode 100644 index 0000000000..12c4287dc5 --- /dev/null +++ b/migrations/archive/2017/20171230_nye_hats.js @@ -0,0 +1,108 @@ +let migrationName = '20171230_nye_hats.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award New Year's Eve party hats to users in sequence + */ + +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2017-11-30')}, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + 'items.gear.owned', + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + let set = {}; + let push = {}; + + if (typeof user.items.gear.owned.head_special_nye2016 !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2017': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2017', _id: monk.id()}}; + } else if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2016': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2016', _id: monk.id()}}; + } else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2015': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2015', _id: monk.id()}}; + } else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') { + set = {migration: migrationName, 'items.gear.owned.head_special_nye2014': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye2014', _id: monk.id()}}; + } else { + set = {migration: migrationName, 'items.gear.owned.head_special_nye': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_nye', _id: monk.id()}}; + } + + dbUsers.update({_id: user._id}, {$set: set, $push: push}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/20180110_nextPaymentProcessing.js b/migrations/archive/2018/20180110_nextPaymentProcessing.js similarity index 50% rename from migrations/20180110_nextPaymentProcessing.js rename to migrations/archive/2018/20180110_nextPaymentProcessing.js index 293dcb354c..c56cca690f 100644 --- a/migrations/20180110_nextPaymentProcessing.js +++ b/migrations/archive/2018/20180110_nextPaymentProcessing.js @@ -2,36 +2,36 @@ * Convert purchased.plan.nextPaymentProcessing from a double to a date field for Apple subscribers */ -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'purchased.plan.paymentMethod': "Apple", + let query = { + 'purchased.plan.paymentMethod': 'Apple', 'purchased.plan.nextPaymentProcessing': {$type: 'double'}, }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 100; -var count = 0; +let progressCount = 100; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -40,38 +40,43 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(function () { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = { + let set = { 'purchased.plan.nextPaymentProcessing': new Date(user.purchased.plan.nextPaymentProcessing), }; dbUsers.update({_id: user._id}, {$set: set}); - if (count % progressCount == 0) console.warn(count + ' ' + user._id); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/20180125_clean_new_notifications.js b/migrations/archive/2018/20180125_clean_new_notifications.js similarity index 100% rename from migrations/20180125_clean_new_notifications.js rename to migrations/archive/2018/20180125_clean_new_notifications.js diff --git a/migrations/20180125_notifications.js b/migrations/archive/2018/20180125_notifications.js similarity index 100% rename from migrations/20180125_notifications.js rename to migrations/archive/2018/20180125_notifications.js diff --git a/migrations/20180130_habit_birthday.js b/migrations/archive/2018/20180130_habit_birthday.js similarity index 51% rename from migrations/20180130_habit_birthday.js rename to migrations/archive/2018/20180130_habit_birthday.js index 05a3dc1c02..f28a42eaa8 100644 --- a/migrations/20180130_habit_birthday.js +++ b/migrations/archive/2018/20180130_habit_birthday.js @@ -1,44 +1,44 @@ -var migrationName = '20180130_habit_birthday.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = '20180130_habit_birthday.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Award party robes: most recent user doesn't have of 2014-2018. Also cake! */ -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - 'auth.timestamps.loggedin':{$gt:new Date('2018-01-01')}, // remove after first run to cover remaining users + let query = { + migration: {$ne: migrationName}, + 'auth.timestamps.loggedin': {$gt: new Date('2018-01-01')}, // remove after first run to cover remaining users }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data) - 'items.gear.owned' + 'items.gear.owned', ], }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -47,69 +47,74 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(function () { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var push; - var set = {'migration':migrationName}; + let push; + let set = {migration: migrationName}; if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2017')) { set['items.gear.owned.armor_special_birthday2018'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2018', '_id': monk.id()}}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2018', _id: monk.id()}}; } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2016')) { set['items.gear.owned.armor_special_birthday2017'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2017', '_id': monk.id()}}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2017', _id: monk.id()}}; } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday2015')) { set['items.gear.owned.armor_special_birthday2016'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2016', '_id': monk.id()}}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2016', _id: monk.id()}}; } else if (user.items && user.items.gear && user.items.gear.owned && user.items.gear.owned.hasOwnProperty('armor_special_birthday')) { set['items.gear.owned.armor_special_birthday2015'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2015', '_id': monk.id()}}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2015', _id: monk.id()}}; } else { set['items.gear.owned.armor_special_birthday'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday', '_id': monk.id()}}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday', _id: monk.id()}}; } - var inc = { - 'items.food.Cake_Skeleton':1, - 'items.food.Cake_Base':1, - 'items.food.Cake_CottonCandyBlue':1, - 'items.food.Cake_CottonCandyPink':1, - 'items.food.Cake_Shade':1, - 'items.food.Cake_White':1, - 'items.food.Cake_Golden':1, - 'items.food.Cake_Zombie':1, - 'items.food.Cake_Desert':1, - 'items.food.Cake_Red':1, - 'achievements.habitBirthdays':1 + let inc = { + 'items.food.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, + 'achievements.habitBirthdays': 1, }; dbUsers.update({_id: user._id}, {$set: set, $inc: inc, $push: push}); - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/archive/README.md b/migrations/archive/README.md new file mode 100644 index 0000000000..9330a6dbf8 --- /dev/null +++ b/migrations/archive/README.md @@ -0,0 +1,4 @@ +If you need to use a migration from this folder, move it to /migrations. + +Note that /migrations files (excluding /archive) are linted, so to pass test you'll have to make sure +that the file is written correctly. \ No newline at end of file diff --git a/migrations/archive/api_v3/challenges.js b/migrations/archive/api_v3/challenges.js new file mode 100644 index 0000000000..80315db9f1 --- /dev/null +++ b/migrations/archive/api_v3/challenges.js @@ -0,0 +1,218 @@ +// Migrate challenges collection to new schema (except for members) + +// The console-stamp module must be installed (not included in package.json) + +// It requires two environment variables: MONGODB_OLD and MONGODB_NEW + +// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). +// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 +console.log('Starting migrations/api_v3/challenges.js.'); + +require('babel-register'); +require('babel-polyfill'); + +let Bluebird = require('bluebird'); +let MongoDB = require('mongodb'); +let nconf = require('nconf'); +let mongoose = require('mongoose'); +let _ = require('lodash'); +let uuid = require('uuid'); +let consoleStamp = require('console-stamp'); +let fs = require('fs'); + +// Add timestamps to console messages +consoleStamp(console); + +// Initialize configuration +require('../../website/server/libs/api-v3/setupNconf')(); + +let MONGODB_OLD = nconf.get('MONGODB_OLD'); +let MONGODB_NEW = nconf.get('MONGODB_NEW'); + +let MongoClient = MongoDB.MongoClient; + +mongoose.Promise = Bluebird; // otherwise mongoose models won't work + +// Load new models +let NewChallenge = require('../../website/server/models/challenge').model; +let Tasks = require('../../website/server/models/task'); + +// To be defined later when MongoClient connects +let mongoDbOldInstance; +let oldChallengeCollection; + +let mongoDbNewInstance; +let newChallengeCollection; +let newTaskCollection; + +let BATCH_SIZE = 1000; + +let processedChallenges = 0; +let totoalProcessedTasks = 0; + +let newTasksIds = {}; // a map of old id -> [new id, challengeId] + +// Only process challenges that fall in a interval ie -> up to 0000-4000-0000-0000 +let AFTER_CHALLENGE_ID = nconf.get('AFTER_CHALLENGE_ID'); +let BEFORE_CHALLENGE_ID = nconf.get('BEFORE_CHALLENGE_ID'); + +function processChallenges (afterId) { + let processedTasks = 0; + let lastChallenge = null; + let oldChallenges; + + let query = {}; + + if (BEFORE_CHALLENGE_ID) { + query._id = {$lte: BEFORE_CHALLENGE_ID}; + } + + if ((afterId || AFTER_CHALLENGE_ID) && !query._id) { + query._id = {}; + } + + if (afterId) { + query._id.$gt = afterId; + } else if (AFTER_CHALLENGE_ID) { + query._id.$gt = AFTER_CHALLENGE_ID; + } + + let batchInsertTasks = newTaskCollection.initializeUnorderedBulkOp(); + let batchInsertChallenges = newChallengeCollection.initializeUnorderedBulkOp(); + + console.log(`Executing challenges query.\nMatching challenges after ${afterId ? afterId : AFTER_CHALLENGE_ID} and before ${BEFORE_CHALLENGE_ID} (included).`); + + return oldChallengeCollection + .find(query) + .sort({_id: 1}) + .limit(BATCH_SIZE) + .toArray() + .then(function (oldChallengesR) { + oldChallenges = oldChallengesR; + + console.log(`Processing ${oldChallenges.length} challenges. Already processed ${processedChallenges} challenges and ${totoalProcessedTasks} tasks.`); + + if (oldChallenges.length === BATCH_SIZE) { + lastChallenge = oldChallenges[oldChallenges.length - 1]._id; + } + + oldChallenges.forEach(function (oldChallenge) { + let oldTasks = oldChallenge.habits.concat(oldChallenge.dailys).concat(oldChallenge.rewards).concat(oldChallenge.todos); + delete oldChallenge.habits; + delete oldChallenge.dailys; + delete oldChallenge.rewards; + delete oldChallenge.todos; + + let createdAt = oldChallenge.timestamp; + + oldChallenge.memberCount = oldChallenge.members.length; + if (oldChallenge.prize <= 0) oldChallenge.prize = 0; + if (!oldChallenge.name) oldChallenge.name = 'challenge name'; + if (!oldChallenge.shortName) oldChallenge.name = 'challenge-name'; + + if (!oldChallenge.group) throw new Error('challenge.group is required'); + if (!oldChallenge.leader) throw new Error('challenge.leader is required'); + + + if (oldChallenge.leader === '9') { + oldChallenge.leader = '00000000-0000-4000-9000-000000000000'; + } + + if (oldChallenge.group === 'habitrpg') { + oldChallenge.group = '00000000-0000-4000-A000-000000000000'; + } + + delete oldChallenge.id; + + let newChallenge = new NewChallenge(oldChallenge); + + newChallenge.createdAt = createdAt; + + oldTasks.forEach(function (oldTask) { + oldTask._id = uuid.v4(); + oldTask._legacyId = oldTask.id; // store the old task id + delete oldTask.id; + + oldTask.challenge = oldTask.challenge || {}; + oldTask.challenge.id = newChallenge._id; + + if (newTasksIds[`${oldTask._legacyId }-${ newChallenge._id}`]) { + throw new Error('duplicate :('); + } else { + newTasksIds[`${oldTask._legacyId }-${ newChallenge._id}`] = oldTask._id; + } + + oldTask.tags = _.map(oldTask.tags || {}, function (tagPresent, tagId) { + return tagPresent && tagId; + }).filter(function (tag) { + return tag !== false; + }); + + if (!oldTask.text) oldTask.text = 'task text'; // required + + oldTask.createdAt = oldTask.dateCreated; + + newChallenge.tasksOrder[`${oldTask.type}s`].push(oldTask._id); + if (oldTask.completed) oldTask.completed = false; + + let newTask = new Tasks[oldTask.type](oldTask); + + batchInsertTasks.insert(newTask.toObject()); + processedTasks++; + }); + + batchInsertChallenges.insert(newChallenge.toObject()); + }); + + console.log(`Saving ${oldChallenges.length} challenges and ${processedTasks} tasks.`); + + return Bluebird.all([ + batchInsertChallenges.execute(), + batchInsertTasks.execute(), + ]); + }) + .then(function () { + totoalProcessedTasks += processedTasks; + processedChallenges += oldChallenges.length; + + console.log(`Saved ${oldChallenges.length} challenges and their tasks.`); + + if (lastChallenge) { + return processChallenges(lastChallenge); + } else { + console.log('Writing newTasksIds.json...'); + fs.writeFileSync('newTasksIds.json', JSON.stringify(newTasksIds, null, 4), 'utf8'); + return console.log('Done!'); + } + }); +} + +// Connect to the databases +Bluebird.all([ + MongoClient.connect(MONGODB_OLD), + MongoClient.connect(MONGODB_NEW), +]) + .then(function (result) { + let oldInstance = result[0]; + let newInstance = result[1]; + + mongoDbOldInstance = oldInstance; + oldChallengeCollection = mongoDbOldInstance.collection('challenges'); + + mongoDbNewInstance = newInstance; + newChallengeCollection = mongoDbNewInstance.collection('challenges'); + newTaskCollection = mongoDbNewInstance.collection('tasks'); + + console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + + return processChallenges(); + }) + .catch(function (err) { + console.error(err.stack || err); + }); diff --git a/migrations/archive/api_v3/challengesMembers.js b/migrations/archive/api_v3/challengesMembers.js new file mode 100644 index 0000000000..2691896b18 --- /dev/null +++ b/migrations/archive/api_v3/challengesMembers.js @@ -0,0 +1,149 @@ +// Migrate challenges members +// Run AFTER users migration + +// The console-stamp module must be installed (not included in package.json) + +// It requires two environment variables: MONGODB_OLD and MONGODB_NEW + +// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). +// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM +console.log('Starting migrations/api_v3/challengesMembers.js.'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +require('babel-register'); +require('babel-polyfill'); + +let Bluebird = require('bluebird'); +let MongoDB = require('mongodb'); +let nconf = require('nconf'); +let mongoose = require('mongoose'); +let _ = require('lodash'); +let uuid = require('uuid'); +let consoleStamp = require('console-stamp'); + +// Add timestamps to console messages +consoleStamp(console); + +// Initialize configuration +require('../../website/server/libs/api-v3/setupNconf')(); + +let MONGODB_OLD = nconf.get('MONGODB_OLD'); +let MONGODB_NEW = nconf.get('MONGODB_NEW'); + +let MongoClient = MongoDB.MongoClient; + +mongoose.Promise = Bluebird; // otherwise mongoose models won't work + +// To be defined later when MongoClient connects +let mongoDbOldInstance; +let oldChallengeCollection; + +let mongoDbNewInstance; +let newUserCollection; + +let BATCH_SIZE = 1000; + +let processedChallenges = 0; + +// Only process challenges that fall in a interval ie -> up to 0000-4000-0000-0000 +let AFTER_CHALLENGE_ID = nconf.get('AFTER_CHALLENGE_ID'); +let BEFORE_CHALLENGE_ID = nconf.get('BEFORE_CHALLENGE_ID'); + +function processChallenges (afterId) { + let processedTasks = 0; + let lastChallenge = null; + let oldChallenges; + + let query = {}; + + if (BEFORE_CHALLENGE_ID) { + query._id = {$lte: BEFORE_CHALLENGE_ID}; + } + + if ((afterId || AFTER_CHALLENGE_ID) && !query._id) { + query._id = {}; + } + + if (afterId) { + query._id.$gt = afterId; + } else if (AFTER_CHALLENGE_ID) { + query._id.$gt = AFTER_CHALLENGE_ID; + } + + console.log(`Executing challenges query.\nMatching challenges after ${afterId ? afterId : AFTER_CHALLENGE_ID} and before ${BEFORE_CHALLENGE_ID} (included).`); + + return oldChallengeCollection + .find(query) + .sort({_id: 1}) + .limit(BATCH_SIZE) + .toArray() + .then(function (oldChallengesR) { + oldChallenges = oldChallengesR; + + let promises = []; + + console.log(`Processing ${oldChallenges.length} challenges. Already processed ${processedChallenges} challenges.`); + + if (oldChallenges.length === BATCH_SIZE) { + lastChallenge = oldChallenges[oldChallenges.length - 1]._id; + } + + oldChallenges.forEach(function (oldChallenge) { + // Tyler Renelle + oldChallenge.members.forEach(function (id, index) { + if (id === '9') { + oldChallenge.members[index] = '00000000-0000-4000-9000-000000000000'; + } + }); + + promises.push(newUserCollection.updateMany({ + _id: {$in: oldChallenge.members || []}, + }, { + $push: {challenges: oldChallenge._id}, + }, {multi: true})); + }); + + console.log(`Migrating members of ${oldChallenges.length} challenges.`); + + return Bluebird.all(promises); + }) + .then(function () { + processedChallenges += oldChallenges.length; + + console.log(`Migrated members of ${oldChallenges.length} challenges.`); + + if (lastChallenge) { + return processChallenges(lastChallenge); + } else { + return console.log('Done!'); + } + }); +} + +// Connect to the databases +Bluebird.all([ + MongoClient.connect(MONGODB_OLD), + MongoClient.connect(MONGODB_NEW), +]) + .then(function (result) { + let oldInstance = result[0]; + let newInstance = result[1]; + + mongoDbOldInstance = oldInstance; + oldChallengeCollection = mongoDbOldInstance.collection('challenges'); + + mongoDbNewInstance = newInstance; + newUserCollection = mongoDbNewInstance.collection('users'); + + console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + + return processChallenges(); + }) + .catch(function (err) { + console.error(err.stack || err); + }); diff --git a/migrations/archive/api_v3/coupons.js b/migrations/archive/api_v3/coupons.js new file mode 100644 index 0000000000..22da730515 --- /dev/null +++ b/migrations/archive/api_v3/coupons.js @@ -0,0 +1,142 @@ +// Migrate coupons collection to new schema + +// The console-stamp module must be installed (not included in package.json) + +// It requires two environment variables: MONGODB_OLD and MONGODB_NEW + +// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). +// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM +console.log('Starting migrations/api_v3/coupons.js.'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +require('babel-register'); +require('babel-polyfill'); + +let Bluebird = require('bluebird'); +let MongoDB = require('mongodb'); +let nconf = require('nconf'); +let mongoose = require('mongoose'); +let _ = require('lodash'); +let uuid = require('uuid'); +let consoleStamp = require('console-stamp'); + +// Add timestamps to console messages +consoleStamp(console); + +// Initialize configuration +require('../../website/server/libs/api-v3/setupNconf')(); + +let MONGODB_OLD = nconf.get('MONGODB_OLD'); +let MONGODB_NEW = nconf.get('MONGODB_NEW'); + +let MongoClient = MongoDB.MongoClient; + +mongoose.Promise = Bluebird; // otherwise mongoose models won't work + +// Load new models +let Coupon = require('../../website/server/models/coupon').model; + +// To be defined later when MongoClient connects +let mongoDbOldInstance; +let oldCouponCollection; + +let mongoDbNewInstance; +let newCouponCollection; + +let BATCH_SIZE = 1000; + +let processedCoupons = 0; + +// Only process coupons that fall in a interval ie -> up to 0000-4000-0000-0000 +let AFTER_COUPON_ID = nconf.get('AFTER_COUPON_ID'); +let BEFORE_COUPON_ID = nconf.get('BEFORE_COUPON_ID'); + +function processCoupons (afterId) { + let processedTasks = 0; + let lastCoupon = null; + let oldCoupons; + + let query = {}; + + if (BEFORE_COUPON_ID) { + query._id = {$lte: BEFORE_COUPON_ID}; + } + + if ((afterId || AFTER_COUPON_ID) && !query._id) { + query._id = {}; + } + + if (afterId) { + query._id.$gt = afterId; + } else if (AFTER_COUPON_ID) { + query._id.$gt = AFTER_COUPON_ID; + } + + let batchInsertCoupons = newCouponCollection.initializeUnorderedBulkOp(); + + console.log(`Executing coupons query.\nMatching coupons after ${afterId ? afterId : AFTER_COUPON_ID} and before ${BEFORE_COUPON_ID} (included).`); + + return oldCouponCollection + .find(query) + .sort({_id: 1}) + .limit(BATCH_SIZE) + .toArray() + .then(function (oldCouponsR) { + oldCoupons = oldCouponsR; + + console.log(`Processing ${oldCoupons.length} coupons. Already processed ${processedCoupons} coupons.`); + + if (oldCoupons.length === BATCH_SIZE) { + lastCoupon = oldCoupons[oldCoupons.length - 1]._id; + } + + oldCoupons.forEach(function (oldCoupon) { + let newCoupon = new Coupon(oldCoupon); + + batchInsertCoupons.insert(newCoupon.toObject()); + }); + + console.log(`Saving ${oldCoupons.length} coupons.`); + + return batchInsertCoupons.execute(); + }) + .then(function () { + processedCoupons += oldCoupons.length; + + console.log(`Saved ${oldCoupons.length} coupons.`); + + if (lastCoupon) { + return processCoupons(lastCoupon); + } else { + return console.log('Done!'); + } + }); +} + +// Connect to the databases +Bluebird.all([ + MongoClient.connect(MONGODB_OLD), + MongoClient.connect(MONGODB_NEW), +]) + .then(function (result) { + let oldInstance = result[0]; + let newInstance = result[1]; + + mongoDbOldInstance = oldInstance; + oldCouponCollection = mongoDbOldInstance.collection('coupons'); + + mongoDbNewInstance = newInstance; + newCouponCollection = mongoDbNewInstance.collection('coupons'); + + console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + + return processCoupons(); + }) + .catch(function (err) { + console.error(err.stack || err); + }); diff --git a/migrations/archive/api_v3/emailUnsubscriptions.js b/migrations/archive/api_v3/emailUnsubscriptions.js new file mode 100644 index 0000000000..21eae2a13c --- /dev/null +++ b/migrations/archive/api_v3/emailUnsubscriptions.js @@ -0,0 +1,143 @@ +// Migrate unsubscriptions collection to new schema + +// The console-stamp module must be installed (not included in package.json) + +// It requires two environment variables: MONGODB_OLD and MONGODB_NEW + +// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). +// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM +console.log('Starting migrations/api_v3/unsubscriptions.js.'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +require('babel-register'); +require('babel-polyfill'); + +let Bluebird = require('bluebird'); +let MongoDB = require('mongodb'); +let nconf = require('nconf'); +let mongoose = require('mongoose'); +let _ = require('lodash'); +let uuid = require('uuid'); +let consoleStamp = require('console-stamp'); + +// Add timestamps to console messages +consoleStamp(console); + +// Initialize configuration +require('../../website/server/libs/api-v3/setupNconf')(); + +let MONGODB_OLD = nconf.get('MONGODB_OLD'); +let MONGODB_NEW = nconf.get('MONGODB_NEW'); + +let MongoClient = MongoDB.MongoClient; + +mongoose.Promise = Bluebird; // otherwise mongoose models won't work + +// Load new models +let EmailUnsubscription = require('../../website/server/models/emailUnsubscription').model; + +// To be defined later when MongoClient connects +let mongoDbOldInstance; +let oldUnsubscriptionCollection; + +let mongoDbNewInstance; +let newUnsubscriptionCollection; + +let BATCH_SIZE = 1000; + +let processedUnsubscriptions = 0; + +// Only process unsubscriptions that fall in a interval ie -> up to 0000-4000-0000-0000 +let AFTER_UNSUBSCRIPTION_ID = nconf.get('AFTER_UNSUBSCRIPTION_ID'); +let BEFORE_UNSUBSCRIPTION_ID = nconf.get('BEFORE_UNSUBSCRIPTION_ID'); + +function processUnsubscriptions (afterId) { + let processedTasks = 0; + let lastUnsubscription = null; + let oldUnsubscriptions; + + let query = {}; + + if (BEFORE_UNSUBSCRIPTION_ID) { + query._id = {$lte: BEFORE_UNSUBSCRIPTION_ID}; + } + + if ((afterId || AFTER_UNSUBSCRIPTION_ID) && !query._id) { + query._id = {}; + } + + if (afterId) { + query._id.$gt = afterId; + } else if (AFTER_UNSUBSCRIPTION_ID) { + query._id.$gt = AFTER_UNSUBSCRIPTION_ID; + } + + let batchInsertUnsubscriptions = newUnsubscriptionCollection.initializeUnorderedBulkOp(); + + console.log(`Executing unsubscriptions query.\nMatching unsubscriptions after ${afterId ? afterId : AFTER_UNSUBSCRIPTION_ID} and before ${BEFORE_UNSUBSCRIPTION_ID} (included).`); + + return oldUnsubscriptionCollection + .find(query) + .sort({_id: 1}) + .limit(BATCH_SIZE) + .toArray() + .then(function (oldUnsubscriptionsR) { + oldUnsubscriptions = oldUnsubscriptionsR; + + console.log(`Processing ${oldUnsubscriptions.length} unsubscriptions. Already processed ${processedUnsubscriptions} unsubscriptions.`); + + if (oldUnsubscriptions.length === BATCH_SIZE) { + lastUnsubscription = oldUnsubscriptions[oldUnsubscriptions.length - 1]._id; + } + + oldUnsubscriptions.forEach(function (oldUnsubscription) { + oldUnsubscription.email = oldUnsubscription.email.toLowerCase(); + let newUnsubscription = new EmailUnsubscription(oldUnsubscription); + + batchInsertUnsubscriptions.insert(newUnsubscription.toObject()); + }); + + console.log(`Saving ${oldUnsubscriptions.length} unsubscriptions.`); + + return batchInsertUnsubscriptions.execute(); + }) + .then(function () { + processedUnsubscriptions += oldUnsubscriptions.length; + + console.log(`Saved ${oldUnsubscriptions.length} unsubscriptions.`); + + if (lastUnsubscription) { + return processUnsubscriptions(lastUnsubscription); + } else { + return console.log('Done!'); + } + }); +} + +// Connect to the databases +Bluebird.all([ + MongoClient.connect(MONGODB_OLD), + MongoClient.connect(MONGODB_NEW), +]) + .then(function (result) { + let oldInstance = result[0]; + let newInstance = result[1]; + + mongoDbOldInstance = oldInstance; + oldUnsubscriptionCollection = mongoDbOldInstance.collection('emailunsubscriptions'); + + mongoDbNewInstance = newInstance; + newUnsubscriptionCollection = mongoDbNewInstance.collection('emailunsubscriptions'); + + console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + + return processUnsubscriptions(); + }) + .catch(function (err) { + console.error(err.stack || err); + }); diff --git a/migrations/archive/api_v3/groups.js b/migrations/archive/api_v3/groups.js new file mode 100644 index 0000000000..1d1d7e3b0c --- /dev/null +++ b/migrations/archive/api_v3/groups.js @@ -0,0 +1,217 @@ +/* + members are not stored anymore + invites are not stored anymore + + tavern id and leader must be updated +*/ + +// Migrate groups collection to new schema +// Run AFTER users migration + +// The console-stamp module must be installed (not included in package.json) + +// It requires two environment variables: MONGODB_OLD and MONGODB_NEW + +// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). +// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM +console.log('Starting migrations/api_v3/groups.js.'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +require('babel-register'); +require('babel-polyfill'); + +let Bluebird = require('bluebird'); +let MongoDB = require('mongodb'); +let nconf = require('nconf'); +let mongoose = require('mongoose'); +let _ = require('lodash'); +let uuid = require('uuid'); +let consoleStamp = require('console-stamp'); + +// Add timestamps to console messages +consoleStamp(console); + +// Initialize configuration +require('../../website/server/libs/api-v3/setupNconf')(); + +let MONGODB_OLD = nconf.get('MONGODB_OLD'); +let MONGODB_NEW = nconf.get('MONGODB_NEW'); + +let MongoClient = MongoDB.MongoClient; + +mongoose.Promise = Bluebird; // otherwise mongoose models won't work + +// Load new models +let NewGroup = require('../../website/server/models/group').model; + +let TAVERN_ID = require('../../website/server/models/group').TAVERN_ID; + +// To be defined later when MongoClient connects +let mongoDbOldInstance; +let oldGroupCollection; + +let mongoDbNewInstance; +let newGroupCollection; +let newUserCollection; + +let BATCH_SIZE = 1000; + +let processedGroups = 0; + +// Only process groups that fall in a interval ie -> up to 0000-4000-0000-0000 +let AFTER_GROUP_ID = nconf.get('AFTER_GROUP_ID'); +let BEFORE_GROUP_ID = nconf.get('BEFORE_GROUP_ID'); + +function processGroups (afterId) { + let processedTasks = 0; + let lastGroup = null; + let oldGroups; + + let query = {}; + + if (BEFORE_GROUP_ID) { + query._id = {$lte: BEFORE_GROUP_ID}; + } + + if ((afterId || AFTER_GROUP_ID) && !query._id) { + query._id = {}; + } + + if (afterId) { + query._id.$gt = afterId; + } else if (AFTER_GROUP_ID) { + query._id.$gt = AFTER_GROUP_ID; + } + + let batchInsertGroups = newGroupCollection.initializeUnorderedBulkOp(); + + console.log(`Executing groups query.\nMatching groups after ${afterId ? afterId : AFTER_GROUP_ID} and before ${BEFORE_GROUP_ID} (included).`); + + return oldGroupCollection + .find(query) + .sort({_id: 1}) + .limit(BATCH_SIZE) + .toArray() + .then(function (oldGroupsR) { + oldGroups = oldGroupsR; + + let promises = []; + + console.log(`Processing ${oldGroups.length} groups. Already processed ${processedGroups} groups.`); + + if (oldGroups.length === BATCH_SIZE) { + lastGroup = oldGroups[oldGroups.length - 1]._id; + } + + oldGroups.forEach(function (oldGroup) { + if ((!oldGroup.privacy || oldGroup.privacy === 'private') && (!oldGroup.members || oldGroup.members.length === 0)) return; // delete empty private groups TODO must also delete challenges or this won't work + + oldGroup.members = oldGroup.members || []; + oldGroup.memberCount = oldGroup.members ? oldGroup.members.length : 0; + oldGroup.challengeCount = oldGroup.challenges ? oldGroup.challenges.length : 0; + + if (oldGroup.balance <= 0) oldGroup.balance = 0; + if (!oldGroup.name) oldGroup.name = 'group name'; + if (!oldGroup.leaderOnly) oldGroup.leaderOnly = {}; + if (!oldGroup.leaderOnly.challenges) oldGroup.leaderOnly.challenges = false; + + // Tavern + if (oldGroup._id === 'habitrpg') { + oldGroup._id = TAVERN_ID; + oldGroup.leader = '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0'; // Siena Leslie + } + + if (!oldGroup.type) { + // throw new Error('group.type is required'); + oldGroup.type = 'guild'; + } + + if (!oldGroup.leader) { + if (oldGroup.members && oldGroup.members.length > 0) { + oldGroup.leader = oldGroup.members[0]; + } else { + throw new Error('group.leader is required and no member available!'); + } + } + + if (!oldGroup.privacy) { + // throw new Error('group.privacy is required'); + oldGroup.privacy = 'private'; + } + + let updateMembers = {}; + + if (oldGroup.type === 'guild') { + updateMembers.$push = {guilds: oldGroup._id}; + } else if (oldGroup.type === 'party') { + updateMembers.$set = {'party._id': oldGroup._id}; + } + + if (oldGroup.members) { + // Tyler Renelle + oldGroup.members.forEach(function (id, index) { + if (id === '9') { + oldGroup.members[index] = '00000000-0000-4000-9000-000000000000'; + } + }); + + promises.push(newUserCollection.updateMany({ + _id: {$in: oldGroup.members}, + }, updateMembers, {multi: true})); + } + + let newGroup = new NewGroup(oldGroup); + + batchInsertGroups.insert(newGroup.toObject()); + }); + + console.log(`Saving ${oldGroups.length} groups and migrating members to users collection.`); + + promises.push(batchInsertGroups.execute()); + return Bluebird.all(promises); + }) + .then(function () { + processedGroups += oldGroups.length; + + console.log(`Saved ${oldGroups.length} groups and migrated their members to the user collection.`); + + if (lastGroup) { + return processGroups(lastGroup); + } else { + return console.log('Done!'); + } + }); +} + +// Connect to the databases +Bluebird.all([ + MongoClient.connect(MONGODB_OLD), + MongoClient.connect(MONGODB_NEW), +]) + .then(function (result) { + let oldInstance = result[0]; + let newInstance = result[1]; + + mongoDbOldInstance = oldInstance; + oldGroupCollection = mongoDbOldInstance.collection('groups'); + + mongoDbNewInstance = newInstance; + newGroupCollection = mongoDbNewInstance.collection('groups'); + newUserCollection = mongoDbNewInstance.collection('users'); + + console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + + // First delete the tavern group created by having required the group model + return newGroupCollection.deleteOne({_id: TAVERN_ID}); + }) + .then(function () { + return processGroups(); + }) + .catch(function (err) { + console.error(err.stack || err); + }); diff --git a/migrations/api_v3/indexes.js b/migrations/archive/api_v3/indexes.js similarity index 100% rename from migrations/api_v3/indexes.js rename to migrations/archive/api_v3/indexes.js diff --git a/migrations/archive/api_v3/users.js b/migrations/archive/api_v3/users.js new file mode 100644 index 0000000000..1560c9d3dd --- /dev/null +++ b/migrations/archive/api_v3/users.js @@ -0,0 +1,268 @@ +// Migrate users collection to new schema +// This should run AFTER challenges migration + +// The console-stamp module must be installed (not included in package.json) + +// It requires two environment variables: MONGODB_OLD and MONGODB_NEW + +// Due to some big user profiles it needs more RAM than is allowed by default by v8 (arounf 1.7GB). +// Run the script with --max-old-space-size=4096 to allow up to 4GB of RAM +console.log('Starting migrations/api_v3/users.js.'); + +// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash. +// We've now upgraded to lodash v4 but the code used in this migration has not been +// adapted to work with it. Before this migration is used again any lodash method should +// be checked for compatibility against the v4 changelog and changed if necessary. +// https://github.com/lodash/lodash/wiki/Changelog#v400 + +require('babel-register'); +require('babel-polyfill'); + +let Bluebird = require('bluebird'); +let MongoDB = require('mongodb'); +let nconf = require('nconf'); +let mongoose = require('mongoose'); +let _ = require('lodash'); +let uuid = require('uuid'); +let consoleStamp = require('console-stamp'); +let common = require('../../common'); +let moment = require('moment'); + +// Add timestamps to console messages +consoleStamp(console); + +// Initialize configuration +require('../../website/server/libs/api-v3/setupNconf')(); + +let MONGODB_OLD = nconf.get('MONGODB_OLD'); +let MONGODB_NEW = nconf.get('MONGODB_NEW'); + +let taskDefaults = common.taskDefaults; +let MongoClient = MongoDB.MongoClient; + +mongoose.Promise = Bluebird; // otherwise mongoose models won't work + +// Load new models +let NewUser = require('../../website/server/models/user').model; +let NewTasks = require('../../website/server/models/task'); + +// To be defined later when MongoClient connects +let mongoDbOldInstance; +let oldUserCollection; + +let mongoDbNewInstance; +let newUserCollection; +let newTaskCollection; + +let BATCH_SIZE = 1000; + +let processedUsers = 0; +let totoalProcessedTasks = 0; + +let challengeTaskWithMatchingId = 0; +let challengeTaskNoMatchingId = 0; + +// Load the new tasks ids for challenges tasks +let newTasksIds = require('./newTasksIds.json'); + +// Only process users that fall in a interval ie up to -> 0000-4000-0000-0000 +let AFTER_USER_ID = nconf.get('AFTER_USER_ID'); +let BEFORE_USER_ID = nconf.get('BEFORE_USER_ID'); + +function processUsers (afterId) { + let processedTasks = 0; + let lastUser = null; + let oldUsers; + + let now = new Date(); + + let query = {}; + + if (BEFORE_USER_ID) { + query._id = {$lte: BEFORE_USER_ID}; + } + + if ((afterId || AFTER_USER_ID) && !query._id) { + query._id = {}; + } + + if (afterId) { + query._id.$gt = afterId; + } else if (AFTER_USER_ID) { + query._id.$gt = AFTER_USER_ID; + } + + let batchInsertTasks = newTaskCollection.initializeUnorderedBulkOp(); + let batchInsertUsers = newUserCollection.initializeUnorderedBulkOp(); + + console.log(`Executing users query.\nMatching users after ${afterId ? afterId : AFTER_USER_ID} and before ${BEFORE_USER_ID} (included).`); + + return oldUserCollection + .find(query) + .sort({_id: 1}) + .limit(BATCH_SIZE) + .toArray() + .then(function (oldUsersR) { + oldUsers = oldUsersR; + + console.log(`Processing ${oldUsers.length} users. Already processed ${processedUsers} users and ${totoalProcessedTasks} tasks.`); + + if (oldUsers.length === BATCH_SIZE) { + lastUser = oldUsers[oldUsers.length - 1]._id; + } + + oldUsers.forEach(function (oldUser) { + let oldTasks = oldUser.habits.concat(oldUser.dailys).concat(oldUser.rewards).concat(oldUser.todos); + delete oldUser.habits; + delete oldUser.dailys; + delete oldUser.rewards; + delete oldUser.todos; + + delete oldUser.id; + + // spookDust -> spookySparkles + + if (oldUser.achievements && oldUser.achievements.spookDust) { + oldUser.achievements.spookySparkles = oldUser.achievements.spookDust; + delete oldUser.achievements.spookDust; + } + + if (oldUser.items && oldUser.items.special && oldUser.items.special.spookDust) { + oldUser.items.special.spookySparkles = oldUser.items.special.spookDust; + delete oldUser.items.special.spookDust; + } + + if (oldUser.stats && oldUser.stats.buffs && oldUser.stats.buffs.spookySparkles) { + oldUser.stats.buffs.spookySparkles = oldUser.stats.buffs.spookDust; + delete oldUser.stats.buffs.spookDust; + } + + // end spookDust -> spookySparkles + + oldUser.tags = oldUser.tags.map(function (tag) { + return { + id: tag.id, + name: tag.name || 'tag name', + challenge: tag.challenge, + }; + }); + + if (oldUser._id === '9') { // Tyler Renelle + oldUser._id = '00000000-0000-4000-9000-000000000000'; + } + + let newUser = new NewUser(oldUser); + let isSubscribed = newUser.isSubscribed(); + + oldTasks.forEach(function (oldTask) { + oldTask._id = uuid.v4(); // create a new unique uuid + oldTask.userId = newUser._id; + oldTask._legacyId = oldTask.id; // store the old task id + delete oldTask.id; + + oldTask.challenge = oldTask.challenge || {}; + if (oldTask.challenge.id) { + if (oldTask.challenge.broken) { + oldTask.challenge.taskId = oldTask._legacyId; + } else { + let newId = newTasksIds[`${oldTask._legacyId }-${ oldTask.challenge.id}`]; + + // Challenges' tasks ids changed + if (!newId && !oldTask.challenge.broken) { + challengeTaskNoMatchingId++; + oldTask.challenge.taskId = oldTask._legacyId; + oldTask.challenge.broken = 'CHALLENGE_TASK_NOT_FOUND'; + } else { + challengeTaskWithMatchingId++; + oldTask.challenge.taskId = newId; + } + } + } + + // Delete old completed todos + if (oldTask.type === 'todo' && oldTask.completed && (!oldTask.challenge.id || oldTask.challenge.broken)) { + if (moment(now).subtract(isSubscribed ? 90 : 30, 'days').toDate() > moment(oldTask.dateCompleted).toDate()) { + return; + } + } + + oldTask.createdAt = oldTask.dateCreated; + + if (!oldTask.text) oldTask.text = 'task text'; // required + oldTask.tags = _.map(oldTask.tags, function (tagPresent, tagId) { + return tagPresent && tagId; + }).filter(function (tag) { + return tag !== false; + }); + + if (oldTask.type !== 'todo' || oldTask.type === 'todo' && !oldTask.completed) { + newUser.tasksOrder[`${oldTask.type}s`].push(oldTask._id); + } + + let allTasksFields = ['_id', 'type', 'text', 'notes', 'tags', 'value', 'priority', 'attribute', 'challenge', 'reminders', 'userId', '_legacyId', 'createdAt']; + // using mongoose models is too slow + if (oldTask.type === 'habit') { + oldTask = _.pick(oldTask, allTasksFields.concat(['history', 'up', 'down'])); + } else if (oldTask.type === 'daily') { + oldTask = _.pick(oldTask, allTasksFields.concat(['completed', 'collapseChecklist', 'checklist', 'history', 'frequency', 'everyX', 'startDate', 'repeat', 'streak'])); + } else if (oldTask.type === 'todo') { + oldTask = _.pick(oldTask, allTasksFields.concat(['completed', 'collapseChecklist', 'checklist', 'date', 'dateCompleted'])); + } else if (oldTask.type === 'reward') { + oldTask = _.pick(oldTask, allTasksFields); + } else { + throw new Error('Task with no or invalid type!'); + } + + batchInsertTasks.insert(taskDefaults(oldTask)); + processedTasks++; + }); + + batchInsertUsers.insert(newUser.toObject()); + }); + + console.log(`Saving ${oldUsers.length} users and ${processedTasks} tasks.`); + + return Bluebird.all([ + batchInsertUsers.execute(), + batchInsertTasks.execute(), + ]); + }) + .then(function () { + totoalProcessedTasks += processedTasks; + processedUsers += oldUsers.length; + + console.log(`Saved ${oldUsers.length} users and their tasks.`); + console.log('Challenges\' tasks no matching id: ', challengeTaskNoMatchingId); + console.log('Challenges\' tasks with matching id: ', challengeTaskWithMatchingId); + + if (lastUser) { + return processUsers(lastUser); + } else { + return console.log('Done!'); + } + }); +} + +// Connect to the databases +Bluebird.all([ + MongoClient.connect(MONGODB_OLD), + MongoClient.connect(MONGODB_NEW), +]) + .then(function (result) { + let oldInstance = result[0]; + let newInstance = result[1]; + + mongoDbOldInstance = oldInstance; + oldUserCollection = mongoDbOldInstance.collection('users'); + + mongoDbNewInstance = newInstance; + newUserCollection = mongoDbNewInstance.collection('users'); + newTaskCollection = mongoDbNewInstance.collection('tasks'); + + console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + + return processUsers(); + }) + .catch(function (err) { + console.error(err.stack || err); + }); diff --git a/migrations/manual_password_reset.js b/migrations/archive/manual_password_reset.js similarity index 54% rename from migrations/manual_password_reset.js rename to migrations/archive/manual_password_reset.js index 6e84673eaa..94262a17ec 100644 --- a/migrations/manual_password_reset.js +++ b/migrations/archive/manual_password_reset.js @@ -4,11 +4,11 @@ // IMPORTANT: this script isn't updated to use the new password encryption that uses bcrypt // using it will break accounts and should not be used until upgraded -var nconf = require('nconf'), +let nconf = require('nconf'), path = require('path'); nconf.argv().env().file('user', path.join(path.resolve(__dirname, '../config.json'))); -var Users = require('mongoskin').db(nconf.get("PRODUCTION_DB:URL"), nconf.get("PRODUCTION_DB").CREDS).collection('users'), +let Users = require('mongoskin').db(nconf.get('PRODUCTION_DB:URL'), nconf.get('PRODUCTION_DB').CREDS).collection('users'), async = require('async'), utils = require('../website/server/utils'), salt = utils.makeSalt(), @@ -16,23 +16,23 @@ var Users = require('mongoskin').db(nconf.get("PRODUCTION_DB:URL"), nconf.get("P hashed_password = utils.encryptPassword(newPassword, salt); async.waterfall([ - function(cb){ - Users.findItems({'auth.local.email':nconf.get("EMAIL")}, {auth:1}, cb); + function (cb) { + Users.findItems({'auth.local.email': nconf.get('EMAIL')}, {auth: 1}, cb); }, - function(users, cb){ - if (users.length<1) return cb("User not found for that email"); - if (users.length>1) return cb("Multiple users for that email"); - var user = users[0]; - console.dir({username:user.auth.local.username, password: newPassword}); - Users.update({_id:user._id}, { - $set:{ + function (users, cb) { + if (users.length < 1) return cb('User not found for that email'); + if (users.length > 1) return cb('Multiple users for that email'); + let user = users[0]; + console.dir({username: user.auth.local.username, password: newPassword}); + Users.update({_id: user._id}, { + $set: { 'auth.local.salt': salt, 'auth.local.hashed_password': hashed_password, - 'preferences.sleep': true - } - }, cb) - } -], function(err){ + 'preferences.sleep': true, + }, + }, cb); + }, +], function (err) { if (err) console.log(err); - process.exit() + process.exit(); }); \ No newline at end of file diff --git a/migrations/archive/metrics.js b/migrations/archive/metrics.js new file mode 100644 index 0000000000..866c0bfc3a --- /dev/null +++ b/migrations/archive/metrics.js @@ -0,0 +1,85 @@ +// node habitrpg ./migrations/metrics.js + +let EXPORT_EMAILS = true; +let mongo = require('mongoskin'); +let csv = require('csv'); +let _ = require('lodash'); +let moment = require('moment'); +let db = mongo.db('localhost:27017/habitrpg?auto_reconnect'); +let twoWeeksAgo = moment().subtract(14, 'days'); +let angularRewrite = moment('07/09/2013'); + +let query = {auth: {$exists: 1}}; +let fields = {lastCron: 1, 'history.exp': 1, 'auth.timestamps': 1, 'auth.local.email': 1}; +db.collection('users').find(query, fields).toArray(function (err, items) { + if (err) return console.error({err}); + let stats = {total: _.size(items), lostToDerby: 0, isActive: 0}; + let emails = []; + _.each(items, function (item) { + // if (!item.history || !item.history.exp) console.log(item._id) + + // var hasBeenActive = item.history && item.history.exp && item.history.exp.length > 7; + let hasBeenActive = item.auth.timestamps && item.auth.timestamps.created && + Math.abs(moment(item.lastCron).diff(item.auth.timestamps.created, 'd')) > 14; + + if (/* hasBeenActive && */moment(item.lastCron).isBefore(angularRewrite)) { + stats.lostToDerby++; + if (item.auth.local) + emails.push([item.auth.local.email]); + // Facebook emails. Kinda dirty, and there's only ~30 available fb emails anyway. + // } else if (item.auth.facebook && item.auth.facebook.email) { + // emails.push([item.auth.facebook.email]) + // } else if (item.auth.facebook && item.auth.facebook.emails && item.auth.facebook.emails[0] && !!item.auth.facebook.emails[0].value) { + // emails.push([item.auth.facebook.emails[0].value]) + } + if (hasBeenActive && moment(item.lastCron).isAfter(twoWeeksAgo)) { + stats.isActive++; + } + }); + stats.emails = _.size(emails); + console.log(stats); + + if (EXPORT_EMAILS) + csv().from.array(emails).to.path(`${__dirname}/emails.csv`); +}); + +/* +load('./node_modules/moment/moment.js'); +var today = +new Date, + twoWeeksAgo = +moment().subtract(14, 'days'); + + corrupt = { + $or: [ + {lastCron: {$exists:false}}, + {lastCron: 'new'} + ] + } + + un_registered = { + "auth.local": {$exists: false}, + "auth.facebook": {$exists: false} + }, + + registered = { + $or: [ + { 'auth.local': { $exists: true }}, + { 'auth.facebook': { $exists: true }} + ] + }, + + active = { + $or: [ + { 'auth.local': { $exists: true }}, + { 'auth.facebook': { $exists: true }} + ], + $where: function(){ + return this.history && this.history.exp && this.history.exp.length > 7; + }, + 'lastCron': {$gt: twoWeeksAgo} + }; + +print('corrupt: ' + db.users.count(corrupt)); +print('unregistered: ' + db.users.count(un_registered)); +print('registered: ' + db.users.count(registered)); +print('active: ' + db.users.count(active)); +*/ \ No newline at end of file diff --git a/migrations/challenges/sync-all-challenges.js b/migrations/challenges/sync-all-challenges.js index 4cb9d00088..3be7a74bb0 100644 --- a/migrations/challenges/sync-all-challenges.js +++ b/migrations/challenges/sync-all-challenges.js @@ -4,14 +4,14 @@ import { model as Challenges } from '../../website/server/models/challenge'; import { model as User } from '../../website/server/models/user'; async function syncChallengeToMembers (challenges) { - let challengSyncPromises = challenges.map(async function (challenge) { + let challengSyncPromises = challenges.map(async (challenge) => { let users = await User.find({ // _id: '', challenges: challenge._id, }).exec(); let promises = []; - users.forEach(function (user) { + users.forEach((user) => { promises.push(challenge.syncToUser(user)); promises.push(challenge.save()); promises.push(user.save()); @@ -42,6 +42,6 @@ async function syncChallenges (lastChallengeDate) { let lastChallenge = challengesFound[challengesFound.length - 1]; if (lastChallenge) syncChallenges(lastChallenge.createdAt); return syncedChallenges; -}; +} module.exports = syncChallenges; diff --git a/migrations/command-line/.eslintrc b/migrations/command-line/.eslintrc new file mode 100644 index 0000000000..49551e8040 --- /dev/null +++ b/migrations/command-line/.eslintrc @@ -0,0 +1,10 @@ +{ + "root": false, + "globals": { + "db": true, + "moment": true, + "print": true, + "printjson": true, + "_": true, + }, +} diff --git a/migrations/command-line/apology_gems.js b/migrations/command-line/apology_gems.js new file mode 100644 index 0000000000..347a63d141 --- /dev/null +++ b/migrations/command-line/apology_gems.js @@ -0,0 +1 @@ +db.users.update({_id: {$in: ['']}}, {$inc: {balance: 0.5}}, {multi: true}); \ No newline at end of file diff --git a/migrations/cancelSubscription.js b/migrations/command-line/cancelSubscription.js similarity index 77% rename from migrations/cancelSubscription.js rename to migrations/command-line/cancelSubscription.js index 38a5fe318d..f823bed40f 100644 --- a/migrations/cancelSubscription.js +++ b/migrations/command-line/cancelSubscription.js @@ -4,8 +4,8 @@ // the FAQ (http://goo.gl/1uoPGQ) they insist... db.users.update( - {_id:''}, + {_id: ''}, {$set: { - 'purchased.plan.dateTerminated': moment().add('month',1).toDate() + 'purchased.plan.dateTerminated': moment().add('month', 1).toDate(), }} ); \ No newline at end of file diff --git a/migrations/command-line/contribs_plan.js b/migrations/command-line/contribs_plan.js new file mode 100644 index 0000000000..548ff6f18f --- /dev/null +++ b/migrations/command-line/contribs_plan.js @@ -0,0 +1,23 @@ +// Give contrib.level 7+ free subscription for life +db.users.update( + + { + 'contributor.level': {$gte: 7}, + 'purchased.plan.customerId': null, + }, + + { + $set: { + 'purchased.plan': { + planId: 'basic', + customerId: 'habitrpg', + dateCreated: new Date(), + dateUpdated: new Date(), + gemsBought: 0, + }, + }, + }, + + {multi: true} + +); \ No newline at end of file diff --git a/migrations/current_period_end.js b/migrations/command-line/current_period_end.js similarity index 52% rename from migrations/current_period_end.js rename to migrations/command-line/current_period_end.js index 31e33e4a79..56c9e8b45d 100644 --- a/migrations/current_period_end.js +++ b/migrations/command-line/current_period_end.js @@ -1,5 +1,5 @@ // mongo habitrpg ./node_modules/moment/moment.js ./migrations/current_period_end.js db.users.update( - {_id:''}, - {$set:{'purchased.plan.dateTerminated':moment().add({days:7}).toDate()}} -) \ No newline at end of file + {_id: ''}, + {$set: {'purchased.plan.dateTerminated': moment().add({days: 7}).toDate()}} +); \ No newline at end of file diff --git a/migrations/duplicatedTasksFindAndRemove.js b/migrations/command-line/duplicatedTasksFindAndRemove.js similarity index 75% rename from migrations/duplicatedTasksFindAndRemove.js rename to migrations/command-line/duplicatedTasksFindAndRemove.js index a6288efc4a..2dcdb10e5c 100644 --- a/migrations/duplicatedTasksFindAndRemove.js +++ b/migrations/command-line/duplicatedTasksFindAndRemove.js @@ -39,51 +39,49 @@ // needed. Do not miss any of them! -var uuid='30fb2640-7121-4968-ace5-f385e60ea6c5'; +let uuid = '30fb2640-7121-4968-ace5-f385e60ea6c5'; db.users.aggregate([ {$match: { - '_id': uuid + _id: uuid, }}, {$project: { - '_id':0, 'todos':1 + _id: 0, todos: 1, }}, {$unwind: '$todos'}, {$group: { _id: { taskid: '$todos.id' }, - count: { $sum: 1 } + count: { $sum: 1 }, }}, {$match: { - count: { $gt: 1 } + count: { $gt: 1 }, }}, {$project: { - '_id.taskid':1, + '_id.taskid': 1, }}, {$group: { _id: { taskid: '$todos.id' }, - troublesomeIds: { $addToSet: "$_id.taskid" }, + troublesomeIds: { $addToSet: '$_id.taskid' }, }}, {$project: { - '_id':0, - troublesomeIds:1, + _id: 0, + troublesomeIds: 1, }}, -]).forEach( - function(data) { - // print( "\n" ); printjson(data); - data.troublesomeIds.forEach( function(taskid) { - print('non-unique task: ' + taskid); - db.users.update({ - '_id': uuid, - 'todos': { $elemMatch: { id: taskid } } - },{ - $set: { "todos.$.id" : 'de666' } - }); +]).forEach((data) => { + // print( "\n" ); printjson(data); + data.troublesomeIds.forEach((taskid) => { + print(`non-unique task: ${ taskid}`); + db.users.update({ + _id: uuid, + todos: { $elemMatch: { id: taskid } }, + }, { + $set: { 'todos.$.id': 'de666' }, }); - } -); + }); +}); db.users.update( - {'_id': uuid}, + {_id: uuid}, {$pull: { todos: { id: 'de666' } } }, {multi: false } ); diff --git a/migrations/facebook_to_local.js b/migrations/command-line/facebook_to_local.js similarity index 51% rename from migrations/facebook_to_local.js rename to migrations/command-line/facebook_to_local.js index 0aca5573b1..de707c4f05 100644 --- a/migrations/facebook_to_local.js +++ b/migrations/command-line/facebook_to_local.js @@ -1,10 +1,10 @@ -var oldId = "", - newId = "", - newUser = db.users.findOne({_id: newId}) +let oldId = ''; +let newId = ''; +let newUser = db.users.findOne({_id: newId}); -db.users.update({_id: oldId}, {$set:{auth: newUser.auth}}); +db.users.update({_id: oldId}, {$set: {auth: newUser.auth}}); // remove the auth on the new user (which is a template account). The account will be preened automatically later, // this allows us to keep the account around a few days in case there was a mistake -db.users.update({_id: newId}, {$unset:{auth:1}}); +db.users.update({_id: newId}, {$unset: {auth: 1}}); diff --git a/migrations/find_unique_user.js b/migrations/command-line/find_unique_user.js similarity index 74% rename from migrations/find_unique_user.js rename to migrations/command-line/find_unique_user.js index 014933ac1f..378c6c8708 100644 --- a/migrations/find_unique_user.js +++ b/migrations/command-line/find_unique_user.js @@ -5,8 +5,8 @@ * Past in the text of a unique habit here to find the user, then you can restore their UUID */ -db.users.find().forEach(function(user){ +db.users.find().forEach((user) => { user.tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards); - var found = _.some(user.tasks, {text: ""}) - if (found) printjson({id:user._id, auth:user.auth}); -}) \ No newline at end of file + let found = _.some(user.tasks, {text: ''}); + if (found) printjson({id: user._id, auth: user.auth}); +}); \ No newline at end of file diff --git a/migrations/freeMonth.js b/migrations/command-line/freeMonth.js similarity index 65% rename from migrations/freeMonth.js rename to migrations/command-line/freeMonth.js index cd2c501149..2b9b19cccd 100644 --- a/migrations/freeMonth.js +++ b/migrations/command-line/freeMonth.js @@ -1,16 +1,16 @@ // mongo habitrpg ./node_modules/moment/moment.js ./migrations/freeMonth.js db.users.update( - {_id:''}, - {$set:{ - 'purchased.plan.customerId':'temporary', - 'purchased.plan.paymentMethod':'Stripe', - 'purchased.plan.planId':'basic_earned', - 'purchased.plan.dateTerminated': moment().add('month',1).toDate() + {_id: ''}, + {$set: { + 'purchased.plan.customerId': 'temporary', + 'purchased.plan.paymentMethod': 'Stripe', + 'purchased.plan.planId': 'basic_earned', + 'purchased.plan.dateTerminated': moment().add('month', 1).toDate(), }} -) -//var m = 12; -//db.users.update( +); +// var m = 12; +// db.users.update( // {_id:''}, // {$set:{'purchased.plan':{ // planId: 'basic_'+m+'mo', @@ -29,4 +29,4 @@ db.users.update( // trinkets: m/3 // } // }}} -//) \ No newline at end of file +// ) \ No newline at end of file diff --git a/migrations/command-line/habitica_day.js b/migrations/command-line/habitica_day.js new file mode 100644 index 0000000000..9e4fd3af5b --- /dev/null +++ b/migrations/command-line/habitica_day.js @@ -0,0 +1,5 @@ +db.users.update( + {}, + {$inc: {'achievements.habiticaDays': 1}}, + {multi: 1} +); diff --git a/migrations/command-line/missing_gems.js b/migrations/command-line/missing_gems.js new file mode 100644 index 0000000000..080bfbd687 --- /dev/null +++ b/migrations/command-line/missing_gems.js @@ -0,0 +1 @@ +db.users.update({_id: ''}, {$inc: {balance: 5}}); \ No newline at end of file diff --git a/migrations/contribs_plan.js b/migrations/contribs_plan.js deleted file mode 100644 index a08bd93f76..0000000000 --- a/migrations/contribs_plan.js +++ /dev/null @@ -1,23 +0,0 @@ -// Give contrib.level 7+ free subscription for life -db.users.update( - - { - 'contributor.level':{$gte:7}, - 'purchased.plan.customerId':null - }, - - { - $set: { - 'purchased.plan':{ - planId: 'basic', - customerId: 'habitrpg', - dateCreated: new Date, - dateUpdated: new Date, - gemsBought: 0 - } - } - }, - - {multi:true} - -) \ No newline at end of file diff --git a/migrations/groups/add-unlimited-subscription.js b/migrations/groups/add-unlimited-subscription.js index 4a7eb27a02..43fbe55b5d 100644 --- a/migrations/groups/add-unlimited-subscription.js +++ b/migrations/groups/add-unlimited-subscription.js @@ -1,6 +1,8 @@ -var migrationName = 'AddUnlimitedSubscription'; -var authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -var authorUuid = ''; //... own data is done +/* +let migrationName = 'AddUnlimitedSubscription'; +let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +let authorUuid = ''; // ... own data is done +*/ /* * This migrations will add a free subscription to a specified group @@ -11,30 +13,30 @@ import { model as Group } from '../../website/server/models/group'; // @TODO: this should probably be a GroupManager library method async function addUnlimitedSubscription (groupId, dateTerminated) { - let group = await Group.findById(groupId); + let group = await Group.findOne({_id: groupId}); - group.purchased.plan.customerId = "group-unlimited"; - group.purchased.plan.dateCreated = new Date(); - group.purchased.plan.dateUpdated = new Date(); - group.purchased.plan.paymentMethod = "Group Unlimited"; - group.purchased.plan.planId = "group_monthly"; - group.purchased.plan.dateTerminated = null; - if (dateTerminated) { - let dateToEnd = moment(dateTerminated).toDate(); - group.purchased.plan.dateTerminated = dateToEnd; - } - // group.purchased.plan.owner = ObjectId(); - group.purchased.plan.subscriptionId = ""; + group.purchased.plan.customerId = 'group-unlimited'; + group.purchased.plan.dateCreated = new Date(); + group.purchased.plan.dateUpdated = new Date(); + group.purchased.plan.paymentMethod = 'Group Unlimited'; + group.purchased.plan.planId = 'group_monthly'; + group.purchased.plan.dateTerminated = null; + if (dateTerminated) { + let dateToEnd = moment(dateTerminated).toDate(); + group.purchased.plan.dateTerminated = dateToEnd; + } + // group.purchased.plan.owner = ObjectId(); + group.purchased.plan.subscriptionId = ''; - return group.save(); -}; + return group.save(); +} module.exports = async function addUnlimitedSubscriptionCreator () { - let groupId = process.argv[2]; + let groupId = process.argv[2]; - if (!groupId) throw Error('Group ID is required'); + if (!groupId) throw Error('Group ID is required'); - let dateTerminated = process.argv[3]; + let dateTerminated = process.argv[3]; - let result = await addUnlimitedSubscription(groupId, dateTerminated); + await addUnlimitedSubscription(groupId, dateTerminated); }; diff --git a/migrations/groups/create-group.js b/migrations/groups/create-group.js index 79a4c03e63..d1cedcc4fc 100644 --- a/migrations/groups/create-group.js +++ b/migrations/groups/create-group.js @@ -5,28 +5,27 @@ import { model as User } from '../../website/server/models/user'; // @TODO: this should probably be a GroupManager library method async function createGroup (name, privacy, type, leaderId) { - let user = await User.findById(leaderId); - - let group = new Group({ - name, - privacy, - type, - }); + let user = await User.findOne({_id: leaderId}); - group.leader = user._id; - user.guilds.push(group._id); + let group = new Group({ + name, + privacy, + type, + }); - return Bluebird.all([group.save(), user.save()]); -}; + group.leader = user._id; + user.guilds.push(group._id); + + return Bluebird.all([group.save(), user.save()]); +} module.exports = async function groupCreator () { - let name = process.argv[2]; - let privacy = process.argv[3]; - let type = process.argv[4]; - let leaderId = process.argv[5]; + let name = process.argv[2]; + let privacy = process.argv[3]; + let type = process.argv[4]; + let leaderId = process.argv[5]; - let result = await createGroup(name, privacy, type, leaderId) + await createGroup(name, privacy, type, leaderId); }; - diff --git a/migrations/groups/habitrpg-jackalopes.js b/migrations/groups/habitrpg-jackalopes.js index de7df3eb49..50c6da4673 100644 --- a/migrations/groups/habitrpg-jackalopes.js +++ b/migrations/groups/habitrpg-jackalopes.js @@ -1,4 +1,4 @@ -var migrationName = 'Jackalopes for Unlimited Subscribers'; +/* let migrationName = 'Jackalopes for Unlimited Subscribers'; */ /* * This migration will find users with unlimited subscriptions who are also eligible for Jackalope mounts, and award them @@ -7,16 +7,15 @@ import Bluebird from 'bluebird'; import { model as Group } from '../../website/server/models/group'; import { model as User } from '../../website/server/models/user'; -import * as payments from '../../website/server/libs/payments'; async function handOutJackalopes () { let promises = []; let cursor = User.find({ - 'purchased.plan.customerId':'habitrpg', + 'purchased.plan.customerId': 'habitrpg', }).cursor(); - cursor.on('data', async function(user) { - console.log('User: ' + user._id); + cursor.on('data', async (user) => { + console.log(`User: ${ user._id}`); let groupList = []; if (user.party._id) groupList.push(user.party._id); @@ -24,23 +23,23 @@ async function handOutJackalopes () { let subscribedGroup = await Group.findOne({ - '_id': {$in: groupList}, + _id: {$in: groupList}, 'purchased.plan.planId': 'group_monthly', 'purchased.plan.dateTerminated': null, }, - {'_id':1} - ); + {_id: 1} + ); if (subscribedGroup) { - User.update({'_id':user._id},{$set:{'items.mounts.Jackalope-RoyalPurple':true}}).exec(); + User.update({_id: user._id}, {$set: {'items.mounts.Jackalope-RoyalPurple': true}}).exec(); promises.push(user.save()); } }); - cursor.on('close', async function() { + cursor.on('close', async () => { console.log('done'); return await Bluebird.all(promises); }); -}; +} module.exports = handOutJackalopes; diff --git a/migrations/groups/update-groups-with-group-plans.js b/migrations/groups/update-groups-with-group-plans.js index f217d54031..921c9bbb99 100644 --- a/migrations/groups/update-groups-with-group-plans.js +++ b/migrations/groups/update-groups-with-group-plans.js @@ -1,6 +1,8 @@ -var migrationName = 'ResyncGroupPlanMembers'; -var authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -var authorUuid = ''; //... own data is done +/* +let migrationName = 'ResyncGroupPlanMembers'; +let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +let authorUuid = ''; // ... own data is done +*/ /* * This migrations will iterate through all groups with a group plan a subscription and resync the free @@ -20,14 +22,14 @@ async function updateGroupsWithGroupPlans () { let promises = []; - cursor.on('data', function(group) { + cursor.on('data', (group) => { promises.push(payments.addSubscriptionToGroupUsers(group)); - promises.push(group.save()) + promises.push(group.save()); }); - cursor.on('close', async function() { + cursor.on('close', async () => { return await Bluebird.all(promises); }); -}; +} module.exports = updateGroupsWithGroupPlans; diff --git a/migrations/habitica_day.js b/migrations/habitica_day.js deleted file mode 100644 index 6e352f6f06..0000000000 --- a/migrations/habitica_day.js +++ /dev/null @@ -1,5 +0,0 @@ -db.users.update( - {}, - {$inc:{'achievements.habiticaDays':1}}, - {multi:1} -); diff --git a/migrations/metrics.js b/migrations/metrics.js deleted file mode 100644 index 523aab9113..0000000000 --- a/migrations/metrics.js +++ /dev/null @@ -1,86 +0,0 @@ -// node habitrpg ./migrations/metrics.js - -var EXPORT_EMAILS = true; -var mongo = require('mongoskin'); -var csv = require('csv'); -var _ = require('lodash'); -var moment = require('moment'); -var db = mongo.db('localhost:27017/habitrpg?auto_reconnect'); -var twoWeeksAgo = moment().subtract(14, 'days'); -var angularRewrite = moment('07/09/2013'); - -var query = {auth: {'$exists':1}}; -var fields = {lastCron:1, 'history.exp':1, 'auth.timestamps':1, 'auth.local.email':1}; -db.collection('users').find(query, fields).toArray(function(err, items) { - if (err) return console.error({err:err}); - var stats = {total: _.size(items), lostToDerby: 0, isActive: 0}; - var emails = []; - _.each(items, function(item) { - //if (!item.history || !item.history.exp) console.log(item._id) - - //var hasBeenActive = item.history && item.history.exp && item.history.exp.length > 7; - var hasBeenActive = item.auth.timestamps && item.auth.timestamps.created && - (Math.abs(moment(item.lastCron).diff(item.auth.timestamps.created, 'd')) > 14); - - if (/*hasBeenActive && */moment(item.lastCron).isBefore(angularRewrite)) { - stats.lostToDerby++; - if (item.auth.local) - emails.push([item.auth.local.email]); - // Facebook emails. Kinda dirty, and there's only ~30 available fb emails anyway. -// } else if (item.auth.facebook && item.auth.facebook.email) { -// emails.push([item.auth.facebook.email]) -// } else if (item.auth.facebook && item.auth.facebook.emails && item.auth.facebook.emails[0] && !!item.auth.facebook.emails[0].value) { -// emails.push([item.auth.facebook.emails[0].value]) - } - if (hasBeenActive && moment(item.lastCron).isAfter(twoWeeksAgo)) { - stats.isActive++; - } - - }) - stats.emails = _.size(emails); - console.log(stats); - - if (EXPORT_EMAILS) - csv().from.array(emails).to.path(__dirname+'/emails.csv') -}); - -/* -load('./node_modules/moment/moment.js'); -var today = +new Date, - twoWeeksAgo = +moment().subtract(14, 'days'); - - corrupt = { - $or: [ - {lastCron: {$exists:false}}, - {lastCron: 'new'} - ] - } - - un_registered = { - "auth.local": {$exists: false}, - "auth.facebook": {$exists: false} - }, - - registered = { - $or: [ - { 'auth.local': { $exists: true }}, - { 'auth.facebook': { $exists: true }} - ] - }, - - active = { - $or: [ - { 'auth.local': { $exists: true }}, - { 'auth.facebook': { $exists: true }} - ], - $where: function(){ - return this.history && this.history.exp && this.history.exp.length > 7; - }, - 'lastCron': {$gt: twoWeeksAgo} - }; - -print('corrupt: ' + db.users.count(corrupt)); -print('unregistered: ' + db.users.count(un_registered)); -print('registered: ' + db.users.count(registered)); -print('active: ' + db.users.count(active)); -*/ \ No newline at end of file diff --git a/migrations/migration-runner.js b/migrations/migration-runner.js index 2b030b88e6..59a2a32a27 100644 --- a/migrations/migration-runner.js +++ b/migrations/migration-runner.js @@ -1,13 +1,13 @@ -require("babel-register"); -require("babel-polyfill"); +require('babel-register'); +require('babel-polyfill'); // This file must use ES5, everything required can be in ES6 function setUpServer () { - var nconf = require('nconf'); - var mongoose = require('mongoose'); - var Bluebird = require('bluebird'); - var setupNconf = require('../website/server/libs/setupNconf'); + const nconf = require('nconf'); // eslint-disable-line global-require, no-unused-vars + const mongoose = require('mongoose'); // eslint-disable-line global-require, no-unused-vars + const Bluebird = require('bluebird'); // eslint-disable-line global-require, no-unused-vars + const setupNconf = require('../website/server/libs/setupNconf'); // eslint-disable-line global-require setupNconf(); // We require src/server and npt src/index because // 1. nconf is already setup diff --git a/migrations/missing_gems.js b/migrations/missing_gems.js deleted file mode 100644 index 78ff37ed1d..0000000000 --- a/migrations/missing_gems.js +++ /dev/null @@ -1 +0,0 @@ -db.users.update({_id:''},{$inc:{balance:5}}); \ No newline at end of file diff --git a/migrations/mystery_items.js b/migrations/mystery_items.js deleted file mode 100644 index 28da1c7ed6..0000000000 --- a/migrations/mystery_items.js +++ /dev/null @@ -1,51 +0,0 @@ -var UserNotification = require('../website/server/models/userNotification').model - -var _id = ''; - -var items = ['back_mystery_201801','headAccessory_mystery_201801'] - -var update = { - $addToSet: { - 'purchased.plan.mysteryItems':{ - $each: items, - } - }, - $push: { - notifications: (new UserNotification({ - type: 'NEW_MYSTERY_ITEMS', - data: { - items: items, - }, - })).toJSON(), - }, -}; - -/*var update = { - $set:{ - 'purchased.plan':{ - customerId: "", - dateCreated: new Date(), - dateTerminated: null, - dateUpdated:new Date(), - gemsBought: 0, - mysteryItems: [], - paymentMethod: "Paypal", - planId : "basic_earned" - } - } -};*/ - -if (_id) { - // singular (missing items) - db.users.update({_id: _id}, update); -} else { - // multiple (once @ start of event) - db.users.update({ - 'purchased.plan.customerId': { $ne: null }, - $or: [ - { 'purchased.plan.dateTerminated': { $gte: new Date() } }, - { 'purchased.plan.dateTerminated': { $exists: false } }, - { 'purchased.plan.dateTerminated': { $eq: null } } - ] - }, update, { multi: true }); -} diff --git a/migrations/new_stuff.js b/migrations/new_stuff.js index 9abcbc32a1..3ee124ab6b 100644 --- a/migrations/new_stuff.js +++ b/migrations/new_stuff.js @@ -1,41 +1,41 @@ -var migrationName = 'new_stuff.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +/* let migrationName = 'new_stuff.js'; */ +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * set the newStuff flag in all user accounts so they see a Bailey message */ -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'flags.newStuff': {$ne:true}, + let query = { + 'flags.newStuff': {$ne: true}, }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, - fields: [] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -44,37 +44,42 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(() => { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {'flags.newStuff': true}; + let set = {'flags.newStuff': true}; - dbUsers.update({_id: user._id}, {$set:set}); + dbUsers.update({_id: user._id}, {$set: set}); - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/restock_armoire.js b/migrations/restock_armoire.js index a26e45b693..5046998a3b 100644 --- a/migrations/restock_armoire.js +++ b/migrations/restock_armoire.js @@ -1,41 +1,41 @@ -var migrationName = 'restock_armoire.js'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = 'restock_armoire.js'; +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Remove flag stating that the Enchanted Armoire is empty, for when new equipment is added */ -var monk = require('monk'); -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { + let query = { 'flags.armoireEmpty': true, }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, - fields: [] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -44,37 +44,42 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(() => { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {'migration': migrationName, 'flags.armoireEmpty': false}; + let set = {migration: migrationName, 'flags.armoireEmpty': false}; - dbUsers.update({_id: user._id}, {$set:set}); + dbUsers.update({_id: user._id}, {$set: set}); - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/restock_armoire_for_users_that_need_it.js b/migrations/restock_armoire_for_users_that_need_it.js index 1c335ffe78..5bf0422d04 100644 --- a/migrations/restock_armoire_for_users_that_need_it.js +++ b/migrations/restock_armoire_for_users_that_need_it.js @@ -1,65 +1,65 @@ -var migrationName = 'restock_armoire_for_users_that_need_it.js'; -var authorName = 'Alys (ALittleYellowSpider)'; // in case script author needs to know when their ... -var authorUuid = '3e595299-3d8a-4a10-bfe0-88f555e4aa0c'; //... own data is done +let migrationName = 'restock_armoire_for_users_that_need_it.js'; +let authorName = 'Alys (ALittleYellowSpider)'; // in case script author needs to know when their ... +let authorUuid = '3e595299-3d8a-4a10-bfe0-88f555e4aa0c'; // ... own data is done /* * Remove flag stating that the Enchanted Armoire is empty, - * for when new equipment has been added + * for when new equipment has been added * AND the normal restock_armoire.js script has failed. * This script finds all users that logged in recently, checks if they * do NOT own all Armoire items, and only then does it mark the Armoire * as not empty. - * + * ********************************************************************* * IMPORTANT: * You must update the list of Armoire items that this list checks for. * Scroll down. You'll see it. ********************************************************************* - * + * */ -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var monk = require('monk'); -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'auth.timestamps.loggedin':{$gt:new Date('2016-01-04')} + let query = { + 'auth.timestamps.loggedin': {$gt: new Date('2016-01-04')}, // '_id': authorUuid // FOR TESTING }; // specify a query to limit the affected users (empty for all users): - var fields = { - 'flags.armoireEmpty':1, - 'items.gear.owned':1 - }; + /* let fields = { + 'flags.armoireEmpty': 1, + 'items.gear.owned': 1, + };*/ if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, fields: { - 'flags.armoireEmpty':1, - 'items.gear.owned':1 - } // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + 'flags.armoireEmpty': 1, + 'items.gear.owned': 1, + }, // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -68,19 +68,19 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(() => { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {'migration':migrationName, 'flags.armoireEmpty':false}; + let set = {migration: migrationName, 'flags.armoireEmpty': false}; if (user.flags.armoireEmpty) { @@ -98,21 +98,26 @@ function updateUser (user) { // console.log("DON'T CHANGE: " + user._id); // FOR TESTING } - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/restore-profile-data.js b/migrations/restore-profile-data.js index 78884738e1..750a991efb 100644 --- a/migrations/restore-profile-data.js +++ b/migrations/restore-profile-data.js @@ -1,23 +1,22 @@ -var migrationName = 'restore_profile_data.js'; -var authorName = 'ThehollidayInn'; // in case script author needs to know when their ... -var authorUuid = ''; //... own data is done +/* let migrationName = 'restore_profile_data.js'; */ +let authorName = 'ThehollidayInn'; // in case script author needs to know when their ... +let authorUuid = ''; // ... own data is done /* * Check if users have empty profile data in new database and update it with old database info */ -var monk = require('monk'); -var connectionString = ''; // FOR TEST DATABASE -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = ''; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -var monk2 = require('monk'); -var oldDbConnectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var olDbUsers = monk2(oldDbConnectionString).get('users', { castIds: false }); +let monk2 = require('monk'); +let oldDbConnectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let olDbUsers = monk2(oldDbConnectionString).get('users', { castIds: false }); -function processUsers(lastId) -{ +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { + let query = { // 'profile.name': 'profile name not found', 'profile.blurb': null, // 'auth.timestamps.loggedin': {$gt: new Date('11/30/2016')}, @@ -25,24 +24,24 @@ function processUsers(lastId) if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { sort: {_id: 1}, limit: 250, - fields: ['_id', 'profile', 'auth.timestamps.loggedin'] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + fields: ['_id', 'profile', 'auth.timestamps.loggedin'], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -51,13 +50,13 @@ function updateUsers (users) { return; } - var userPaymentPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPaymentPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPaymentPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(() => { + return processUsers(lastUser._id); + }); } function updateUser (user) { @@ -68,11 +67,11 @@ function updateUser (user) { .then((oldUserData) => { if (!oldUserData) return; // specify user data to change: - var set = {}; + let set = {}; if (oldUserData.profile.name === 'profile name not found') return; - var userNeedsProfileName = !user.profile.name || user.profile.name === 'profile name not found'; + let userNeedsProfileName = !user.profile.name || user.profile.name === 'profile name not found'; if (userNeedsProfileName && oldUserData.profile.name) { set['profile.name'] = oldUserData.profile.name; } @@ -86,30 +85,35 @@ function updateUser (user) { } if (Object.keys(set).length !== 0 && set.constructor === Object) { - console.log(set) - return dbUsers.update({_id: user._id}, {$set:set}); + console.log(set); + return dbUsers.update({_id: user._id}, {$set: set}); } }); } - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } -processUsers() +processUsers(); diff --git a/migrations/s3-upload.js b/migrations/s3-upload.js index dfb07f1eca..7538e83f6d 100644 --- a/migrations/s3-upload.js +++ b/migrations/s3-upload.js @@ -4,7 +4,7 @@ let last = require('lodash/last'); let AWS = require('aws-sdk'); let config = require('../config'); -const S3_DIRECTORY = 'mobileApp/images'; //config.S3.SPRITES_DIRECTORY; +const S3_DIRECTORY = 'mobileApp/images'; // config.S3.SPRITES_DIRECTORY; AWS.config.update({ accessKeyId: config.S3.accessKeyId, @@ -53,26 +53,26 @@ function getFileFromUrl (url) { let commit = '78f94e365c72cc58f66857d5941105638db7d35c'; commit = 'df0dbaba636c9ce424cc7040f7bd7fc1aa311015'; -let gihuburl = `https://api.github.com/repos/HabitRPG/habitica/commits/${commit}` +let gihuburl = `https://api.github.com/repos/HabitRPG/habitica/commits/${commit}`; let currentIndex = 0; -function uploadToS3(start, end, filesUrls) { +function uploadToS3 (start, end, filesUrls) { let urls = filesUrls.slice(start, end); if (urls.length === 0) { - console.log("done"); + console.log('done'); return; } let promises = urls.map(fullUrl => { return getFileFromUrl(fullUrl) - .then((buffer) => { - return uploadFile(buffer, getFileName(fullUrl)); - }); + .then((buffer) => { + return uploadFile(buffer, getFileName(fullUrl)); + }); }); - console.log(promises.length) + console.log(promises.length); return Bluebird.all(promises) .then(() => { @@ -92,7 +92,7 @@ request.get(gihuburl) let filesUrls = ['']; filesUrls = files.map(file => { return file.raw_url; - }) + }); uploadToS3(currentIndex, currentIndex + 50, filesUrls); }); diff --git a/migrations/takeThis.js b/migrations/takeThis.js index 17336e394d..d276727a70 100644 --- a/migrations/takeThis.js +++ b/migrations/takeThis.js @@ -1,26 +1,26 @@ -var migrationName = '20180102_takeThis.js'; // Update per month -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +let migrationName = '20180102_takeThis.js'; // Update per month +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Award Take This ladder items to participants in this month's challenge */ -var monk = require('monk'); -var connectionString = 'mongodb://sabrecat:z8e8jyRA8CTofMQ@ds013393-a0.mlab.com:13393/habitica?auto_reconnect=true'; -var dbUsers = monk(connectionString).get('users', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbUsers = monk(connectionString).get('users', { castIds: false }); -function processUsers(lastId) { +function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - var query = { - 'migration':{$ne:migrationName}, - 'challenges':{$in:['5f70ce5b-2d82-4114-8e44-ca65615aae62']} // Update per month + let query = { + migration: {$ne: migrationName}, + challenges: {$in: ['5f70ce5b-2d82-4114-8e44-ca65615aae62']}, // Update per month }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbUsers.find(query, { @@ -28,17 +28,17 @@ function processUsers(lastId) { limit: 250, fields: [ 'items.gear.owned', - ] // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) - .then(updateUsers) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateUsers (users) { if (!users || users.length === 0) { @@ -47,40 +47,41 @@ function updateUsers (users) { return; } - var userPromises = users.map(updateUser); - var lastUser = users[users.length - 1]; + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; return Promise.all(userPromises) - .then(function () { - processUsers(lastUser._id); - }); + .then(() => { + processUsers(lastUser._id); + }); } function updateUser (user) { count++; - var set = {}; + let set = {}; + let push; if (typeof user.items.gear.owned.back_special_takeThis !== 'undefined') { - set = {'migration':migrationName}; + set = {migration: migrationName}; } else if (typeof user.items.gear.owned.body_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.back_special_takeThis':false}; - var push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.back_special_takeThis', '_id': monk.id()}}; + set = {migration: migrationName, 'items.gear.owned.back_special_takeThis': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.back_special_takeThis', _id: monk.id()}}; } else if (typeof user.items.gear.owned.head_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.body_special_takeThis':false}; - var push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.body_special_takeThis', '_id': monk.id()}}; + set = {migration: migrationName, 'items.gear.owned.body_special_takeThis': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.body_special_takeThis', _id: monk.id()}}; } else if (typeof user.items.gear.owned.armor_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.head_special_takeThis':false}; - var push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_takeThis', '_id': monk.id()}}; + set = {migration: migrationName, 'items.gear.owned.head_special_takeThis': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_takeThis', _id: monk.id()}}; } else if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.armor_special_takeThis':false}; - var push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_takeThis', '_id': monk.id()}}; + set = {migration: migrationName, 'items.gear.owned.armor_special_takeThis': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_takeThis', _id: monk.id()}}; } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { - set = {'migration':migrationName, 'items.gear.owned.weapon_special_takeThis':false}; - var push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.weapon_special_takeThis', '_id': monk.id()}}; + set = {migration: migrationName, 'items.gear.owned.weapon_special_takeThis': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.weapon_special_takeThis', _id: monk.id()}}; } else { - set = {'migration':migrationName, 'items.gear.owned.shield_special_takeThis':false}; - var push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.shield_special_takeThis', '_id': monk.id()}}; + set = {migration: migrationName, 'items.gear.owned.shield_special_takeThis': false}; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.shield_special_takeThis', _id: monk.id()}}; } if (push) { @@ -89,21 +90,26 @@ function updateUser (user) { dbUsers.update({_id: user._id}, {$set: set}); } - if (count % progressCount == 0) console.warn(count + ' ' + user._id); - if (user._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' users processed\n'); +function displayData () { + console.warn(`\n${ count } users processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/tasks/tasks-set-everyX.js b/migrations/tasks/tasks-set-everyX.js index c0a4acc7fb..f3bd5408d6 100644 --- a/migrations/tasks/tasks-set-everyX.js +++ b/migrations/tasks/tasks-set-everyX.js @@ -1,32 +1,32 @@ -var migrationName = 'tasks-set-everyX'; -var authorName = 'Sabe'; // in case script author needs to know when their ... -var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done +/* let migrationName = 'tasks-set-everyX'; */ +let authorName = 'Sabe'; // in case script author needs to know when their ... +let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Iterates over all tasks and sets invalid everyX values (less than 0 or more than 9999 or not an int) field to 0 */ -var monk = require('monk'); -var connectionString = 'mongodb://sabrecat:z8e8jyRA8CTofMQ@ds013393-a0.mlab.com:13393/habitica?auto_reconnect=true'; -var dbTasks = monk(connectionString).get('tasks', { castIds: false }); +let monk = require('monk'); +let connectionString = 'mongodb://sabrecat:z8e8jyRA8CTofMQ@ds013393-a0.mlab.com:13393/habitica?auto_reconnect=true'; +let dbTasks = monk(connectionString).get('tasks', { castIds: false }); -function processTasks(lastId) { +function processTasks (lastId) { // specify a query to limit the affected tasks (empty for all tasks): - var query = { - type: "daily", + let query = { + type: 'daily', everyX: { $not: { $gte: 0, $lte: 9999, - $type: "int", - } + $type: 'int', + }, }, }; if (lastId) { query._id = { - $gt: lastId - } + $gt: lastId, + }; } dbTasks.find(query, { @@ -34,15 +34,15 @@ function processTasks(lastId) { limit: 250, fields: [], }) - .then(updateTasks) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); + .then(updateTasks) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); } -var progressCount = 1000; -var count = 0; +let progressCount = 1000; +let count = 0; function updateTasks (tasks) { if (!tasks || tasks.length === 0) { @@ -51,36 +51,41 @@ function updateTasks (tasks) { return; } - var taskPromises = tasks.map(updatetask); - var lasttask = tasks[tasks.length - 1]; + let taskPromises = tasks.map(updatetask); + let lasttask = tasks[tasks.length - 1]; return Promise.all(taskPromises) - .then(function () { - processTasks(lasttask._id); - }); + .then(() => { + return processTasks(lasttask._id); + }); } function updatetask (task) { count++; - var set = {'everyX': 0}; + let set = {everyX: 0}; - dbTasks.update({_id: task._id}, {$set:set}); + dbTasks.update({_id: task._id}, {$set: set}); - if (count % progressCount == 0) console.warn(count + ' ' + task._id); - if (task._id == authorUuid) console.warn(authorName + ' processed'); + if (count % progressCount === 0) console.warn(`${count } ${ task._id}`); + if (task._id === authorUuid) console.warn(`${authorName } processed`); } -function displayData() { - console.warn('\n' + count + ' tasks processed\n'); +function displayData () { + console.warn(`\n${ count } tasks processed\n`); return exiting(0); } -function exiting(code, msg) { +function exiting (code, msg) { code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } + if (code && !msg) { + msg = 'ERROR!'; + } if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } + if (code) { + console.error(msg); + } else { + console.log(msg); + } } process.exit(code); } diff --git a/migrations/tasks/tasks-set-yesterdailies.js b/migrations/tasks/tasks-set-yesterdailies.js index 8ce87b1046..253d871612 100644 --- a/migrations/tasks/tasks-set-yesterdailies.js +++ b/migrations/tasks/tasks-set-yesterdailies.js @@ -1,83 +1,88 @@ -var migrationName = 'tasks-set-yesterdaily'; -var authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -var authorUuid = ''; //... own data is done - -/* - * Iterates over all tasks and sets the yseterDaily field to True - */ - -import monk from 'monk'; - -var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -var dbTasks = monk(connectionString).get('tasks', { castIds: false }); - -function processTasks(lastId) { - // specify a query to limit the affected tasks (empty for all tasks): - var query = { - yesterDaily: false, - }; - - if (lastId) { - query._id = { - $gt: lastId - } - } - - dbTasks.find(query, { - sort: {_id: 1}, - limit: 250, - fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data): - ], - }) - .then(updateTasks) - .catch(function (err) { - console.log(err); - return exiting(1, 'ERROR! ' + err); - }); -} - -var progressCount = 1000; -var count = 0; - -function updateTasks (tasks) { - if (!tasks || tasks.length === 0) { - console.warn('All appropriate tasks found and modified.'); - displayData(); - return; - } - - var taskPromises = tasks.map(updatetask); - var lasttask = tasks[tasks.length - 1]; - - return Promise.all(taskPromises) - .then(function () { - processtasks(lasttask._id); - }); -} - -function updatetask (task) { - count++; - var set = {'yesterDaily': true}; - - dbTasks.update({_id: task._id}, {$set:set}); - - if (count % progressCount == 0) console.warn(count + ' ' + task._id); - if (task._id == authorUuid) console.warn(authorName + ' processed'); -} - -function displayData() { - console.warn('\n' + count + ' tasks processed\n'); - return exiting(0); -} - -function exiting(code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { msg = 'ERROR!'; } - if (msg) { - if (code) { console.error(msg); } - else { console.log( msg); } - } - process.exit(code); -} - -module.exports = processtasks; +/* let migrationName = 'tasks-set-yesterdaily'; */ +let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +let authorUuid = ''; // ... own data is done + +/* + * Iterates over all tasks and sets the yseterDaily field to True + */ + +import monk from 'monk'; + +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +let dbTasks = monk(connectionString).get('tasks', { castIds: false }); + +let progressCount = 1000; +let count = 0; + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +function displayData () { + console.warn(`\n${ count } tasks processed\n`); + return exiting(0); +} + +function updatetask (task) { + count++; + let set = {yesterDaily: true}; + + dbTasks.update({_id: task._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ task._id}`); + if (task._id === authorUuid) console.warn(`${authorName } processed`); +} + +function updateTasks (tasks) { + if (!tasks || tasks.length === 0) { + console.warn('All appropriate tasks found and modified.'); + displayData(); + return; + } + + let taskPromises = tasks.map(updatetask); + let lasttask = tasks[tasks.length - 1]; + + return Promise.all(taskPromises) + .then(() => { + return processTasks(lasttask._id); // eslint-disable-line no-use-before-define + }); +} + +function processTasks (lastId) { + // specify a query to limit the affected tasks (empty for all tasks): + let query = { + yesterDaily: false, + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbTasks.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + ], + }) + .then(updateTasks) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +module.exports = processTasks; diff --git a/migrations/users/account-transfer.js b/migrations/users/account-transfer.js index 7d57dac08b..42a9602aa1 100644 --- a/migrations/users/account-transfer.js +++ b/migrations/users/account-transfer.js @@ -1,6 +1,8 @@ -var migrationName = 'AccountTransfer'; -var authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -var authorUuid = ''; //... own data is done +/* +let migrationName = 'AccountTransfer'; +let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +let authorUuid = ''; // ... own data is done +*/ /* * This migraition will copy user data from prod to test @@ -10,10 +12,6 @@ const monk = require('monk'); const connectionString = ''; const Users = monk(connectionString).get('users', { castIds: false }); -import uniq from 'lodash/uniq'; -import Bluebird from 'bluebird'; - - module.exports = async function accountTransfer () { const fromAccountId = ''; const toAccountId = ''; @@ -32,7 +30,7 @@ module.exports = async function accountTransfer () { 'purchased.background': newBackgrounds, }, }) - .then((result) => { - console.log(result); - }); + .then((result) => { + console.log(result); + }); }; diff --git a/migrations/users/achievement-restore.js b/migrations/users/achievement-restore.js index bd7e91a327..45e7866398 100644 --- a/migrations/users/achievement-restore.js +++ b/migrations/users/achievement-restore.js @@ -1,17 +1,17 @@ +/* const migrationName = 'AchievementRestore'; const authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -const authorUuid = ''; //... own data is done +const authorUuid = ''; // ... own data is done +*/ /* * This migraition will copy user data from prod to test */ -import Bluebird from 'bluebird'; const monk = require('monk'); const connectionString = 'mongodb://localhost/new-habit'; const Users = monk(connectionString).get('users', { castIds: false }); -const monkOld = require('monk'); const oldConnectionSting = 'mongodb://localhost/old-habit'; const UsersOld = monk(oldConnectionSting).get('users', { castIds: false }); @@ -52,21 +52,19 @@ function getAchievementUpdate (newUser, oldUser) { achievementsUpdate.rebirthLevel = oldAchievements.rebirthLevel; } - //All others + // All others const indexsToIgnore = ['ultimateGearSets', 'challenges', 'quests', 'rebirthLevel']; for (let index in oldAchievements) { - if (indexsToIgnore.indexOf(index) !== -1) continue; + if (indexsToIgnore.indexOf(index) !== -1) continue; // eslint-disable-line no-continue if (!achievementsUpdate[index]) { achievementsUpdate[index] = oldAchievements[index]; - continue; + continue; // eslint-disable-line no-continue } if (Number.isInteger(oldAchievements[index])) { achievementsUpdate[index] += oldAchievements[index]; - } else { - if (oldAchievements[index] === true) achievementsUpdate[index] = true; - } + } else if (oldAchievements[index] === true) achievementsUpdate[index] = true; } return achievementsUpdate; @@ -76,6 +74,7 @@ module.exports = async function achievementRestore () { const userIds = [ ]; + /* eslint-disable no-await-in-loop */ for (let index in userIds) { const userId = userIds[index]; const oldUser = await UsersOld.findOne({_id: userId}, 'achievements'); @@ -85,9 +84,10 @@ module.exports = async function achievementRestore () { {_id: userId}, { $set: { - 'achievements': achievementUpdate, + achievements: achievementUpdate, }, }); console.log(`Updated ${userId}`); + /* eslint-enable no-await-in-loop */ } }; diff --git a/migrations/users/mystery-items.js b/migrations/users/mystery-items.js new file mode 100644 index 0000000000..955eee3b6a --- /dev/null +++ b/migrations/users/mystery-items.js @@ -0,0 +1,108 @@ +const migrationName = 'mystery-items-201802.js'; // Update per month +const authorName = 'Sabe'; // in case script author needs to know when their ... +const authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award this month's mystery items to subscribers + */ +const MYSTERY_ITEMS = ['armor_mystery_201802', 'head_mystery_201802', 'shield_mystery_201802']; +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let monk = require('monk'); +let dbUsers = monk(connectionString).get('users', { castIds: false }); +let UserNotification = require('../../website/server/models/userNotification').model; + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + 'purchased.plan.customerId': { $ne: null }, + $or: [ + { 'purchased.plan.dateTerminated': { $gte: new Date() } }, + { 'purchased.plan.dateTerminated': { $exists: false } }, + { 'purchased.plan.dateTerminated': { $eq: null } }, + ], + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(() => { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + const addToSet = { + 'purchased.plan.mysteryItems': { + $each: MYSTERY_ITEMS, + }, + }; + const push = { + notifications: (new UserNotification({ + type: 'NEW_MYSTERY_ITEMS', + data: { + MYSTERY_ITEMS, + }, + })).toJSON(), + }; + + dbUsers.update({_id: user._id}, {$addToSet: addToSet, $push: push}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/migrations/users/users-to-test.js b/migrations/users/users-to-test.js index 64b6c38e07..cf9f4cc92f 100644 --- a/migrations/users/users-to-test.js +++ b/migrations/users/users-to-test.js @@ -1,32 +1,35 @@ -var migrationName = 'UserFromProdToTest'; -var authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -var authorUuid = ''; //... own data is done +/* +let migrationName = 'UserFromProdToTest'; +let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +let authorUuid = ''; // ... own data is done +*/ /* * This migraition will copy user data from prod to test */ -var monk = require('monk'); -var testConnectionSting = ''; // FOR TEST DATABASE -var usersTest = monk(testConnectionSting).get('users', { castIds: false }); -var groupsTest = monk(testConnectionSting).get('groups', { castIds: false }); -var challengesTest = monk(testConnectionSting).get('challenges', { castIds: false }); -var tasksTest = monk(testConnectionSting).get('tasks', { castIds: false }); +let monk = require('monk'); +let testConnectionSting = ''; // FOR TEST DATABASE +let usersTest = monk(testConnectionSting).get('users', { castIds: false }); +let groupsTest = monk(testConnectionSting).get('groups', { castIds: false }); +let challengesTest = monk(testConnectionSting).get('challenges', { castIds: false }); +let tasksTest = monk(testConnectionSting).get('tasks', { castIds: false }); -var monk2 = require('monk'); -var liveConnectString = ''; // FOR TEST DATABASE -var userLive = monk2(liveConnectString).get('users', { castIds: false }); -var groupsLive = monk2(liveConnectString).get('groups', { castIds: false }); -var challengesLive = monk2(liveConnectString).get('challenges', { castIds: false }); -var tasksLive = monk2(liveConnectString).get('tasks', { castIds: false }); +let monk2 = require('monk'); +let liveConnectString = ''; // FOR TEST DATABASE +let userLive = monk2(liveConnectString).get('users', { castIds: false }); +let groupsLive = monk2(liveConnectString).get('groups', { castIds: false }); +let challengesLive = monk2(liveConnectString).get('challenges', { castIds: false }); +let tasksLive = monk2(liveConnectString).get('tasks', { castIds: false }); import uniq from 'lodash/uniq'; -import Bluebird from 'bluebird'; // Variabls for updating +/* let userIds = [ '206039c6-24e4-4b9f-8a31-61cbb9aa3f66', ]; +*/ let groupIds = []; let challengeIds = []; @@ -34,10 +37,10 @@ let tasksIds = []; async function processUsers () { let userPromises = []; - //{_id: {$in: userIds}} + // {_id: {$in: userIds}} return userLive.find({guilds: 'b0764d64-8276-45a1-afa5-5ca9a5c64ca0'}) - .each((user, {close, pause, resume}) => { + .each((user) => { if (user.guilds.length > 0) groupIds = groupIds.concat(user.guilds); if (user.party._id) groupIds.push(user.party._id); if (user.challenges.length > 0) challengeIds = challengeIds.concat(user.challenges); @@ -46,13 +49,13 @@ async function processUsers () { if (user.tasksOrder.dailys.length > 0) tasksIds = tasksIds.concat(user.tasksOrder.dailys); if (user.tasksOrder.habits.length > 0) tasksIds = tasksIds.concat(user.tasksOrder.habits); - let userPromise = usersTest.update({'_id': user._id}, user, {upsert:true}); + let userPromise = usersTest.update({_id: user._id}, user, {upsert: true}); userPromises.push(userPromise); }).then(() => { - return Bluebird.all(userPromises); + return Promise.all(userPromises); }) .then(() => { - console.log("Done User"); + console.log('Done User'); }); } @@ -60,14 +63,14 @@ function processGroups () { let promises = []; let groupsToQuery = uniq(groupIds); return groupsLive.find({_id: {$in: groupsToQuery}}) - .each((group, {close, pause, resume}) => { - let promise = groupsTest.update({_id: group._id}, group, {upsert:true}); + .each((group) => { + let promise = groupsTest.update({_id: group._id}, group, {upsert: true}); promises.push(promise); }).then(() => { - return Bluebird.all(promises); + return Promise.all(promises); }) .then(() => { - console.log("Done Group"); + console.log('Done Group'); }); } @@ -75,14 +78,14 @@ function processChallenges () { let promises = []; let challengesToQuery = uniq(challengeIds); return challengesLive.find({_id: {$in: challengesToQuery}}) - .each((challenge, {close, pause, resume}) => { - let promise = challengesTest.update({_id: challenge._id}, challenge, {upsert:true}); + .each((challenge) => { + let promise = challengesTest.update({_id: challenge._id}, challenge, {upsert: true}); promises.push(promise); }).then(() => { - return Bluebird.all(promises); + return Promise.all(promises); }) .then(() => { - console.log("Done Challenge"); + console.log('Done Challenge'); }); } @@ -90,14 +93,14 @@ function processTasks () { let promises = []; let tasksToQuery = uniq(tasksIds); return tasksLive.find({_id: {$in: tasksToQuery}}) - .each((task, {close, pause, resume}) => { - let promise = tasksTest.update({_id: task._id}, task, {upsert:true}); + .each((task) => { + let promise = tasksTest.update({_id: task._id}, task, {upsert: true}); promises.push(promise); }).then(() => { - return Bluebird.all(promises); + return Promise.all(promises); }) .then(() => { - console.log("Done Tasks"); + console.log('Done Tasks'); }); } diff --git a/migrations/utils/connect.js b/migrations/utils/connect.js index 492b473708..1b20d523ca 100644 --- a/migrations/utils/connect.js +++ b/migrations/utils/connect.js @@ -3,7 +3,7 @@ const MongoClient = require('mongodb').MongoClient; const logger = require('./logger'); -let db; +let dbConnection; function connectToDb (dbUri) { return new Promise((resolve, reject) => { @@ -13,7 +13,7 @@ function connectToDb (dbUri) { return reject(err); } - db = database; + dbConnection = database; logger.success(`Connected to ${dbUri}`); @@ -23,7 +23,7 @@ function connectToDb (dbUri) { } function closeDb () { - if (db) db.close(); + if (dbConnection) dbConnection.close(); logger.success('Closed connection to the database'); return Promise.resolve(); @@ -32,4 +32,4 @@ function closeDb () { module.exports = { connectToDb, closeDb, -} +}; diff --git a/migrations/utils/logger.js b/migrations/utils/logger.js index a2ddc96fe2..cf6d643e76 100644 --- a/migrations/utils/logger.js +++ b/migrations/utils/logger.js @@ -2,6 +2,13 @@ const chalk = require('chalk'); +function loggerGenerator (type, color) { + return function logger () { + let args = Array.from(arguments).map(arg => chalk[color](arg)); + console[type].apply(null, args); + }; +} + const logger = { info: loggerGenerator('info', 'cyan'), success: loggerGenerator('info', 'green'), @@ -10,11 +17,4 @@ const logger = { warn: loggerGenerator('warn', 'yellow'), }; -function loggerGenerator (type, color) { - return function () { - let args = Array.from(arguments).map(arg => chalk[color](arg)); - console[type].apply(null, args); - } -} - module.exports = logger; diff --git a/migrations/utils/timer.js b/migrations/utils/timer.js index 37a75830b1..cacdfc1b8b 100644 --- a/migrations/utils/timer.js +++ b/migrations/utils/timer.js @@ -13,7 +13,7 @@ class Timer { if (!options.disableAutoStart) this.start(); } start () { - this._internalTimer = setInterval(() =>{ + this._internalTimer = setInterval(() => { this.count++; let shouldWarn = this._minutesWarningThreshold < this.count; diff --git a/package-lock.json b/package-lock.json index f953f8092e..569840dc8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,157 @@ { "name": "habitica", - "version": "4.27.2", + "version": "4.28.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz", + "integrity": "sha512-eVXQSbu/RimU6OKcK2/gDJVTFcxXJI4sHbIqw2mhwMZeQ2as/8AhS9DGkEDoHMBBNJZ5B0US63lF56x+KDcxiA==", + "requires": { + "@babel/highlight": "7.0.0-beta.40" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.40.tgz", + "integrity": "sha512-c91BQcXyTq/5aFV4afgOionxZS1dxWt8OghEx5Q52SKssdGRFSiMKnk9tGkev1pYULPJBqjSDZU2Pcuc58ffZw==", + "requires": { + "@babel/types": "7.0.0-beta.40", + "jsesc": "2.5.1", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz", + "integrity": "sha512-cK9BVLtOfisSISTTHXKGvBc2OBh65tjEk4PgXhsSnnH0i8RP2v+5RCxoSlh2y/i+l2fxQqKqv++Qo5RMiwmRCA==", + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.40", + "@babel/template": "7.0.0-beta.40", + "@babel/types": "7.0.0-beta.40" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz", + "integrity": "sha512-MwquaPznI4cUoZEgHC/XGkddOXtqKqD4DvZDOyJK2LR9Qi6TbMbAhc6IaFoRX7CRTFCmtGeu8gdXW2dBotBBTA==", + "requires": { + "@babel/types": "7.0.0-beta.40" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.40.tgz", + "integrity": "sha512-mOhhTrzieV6VO7odgzFGFapiwRK0ei8RZRhfzHhb6cpX3QM8XXuCLXWjN8qBB7JReDdUR80V3LFfFrGUYevhNg==", + "requires": { + "chalk": "2.3.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/template": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.40.tgz", + "integrity": "sha512-RlQiVB7eL7fxsKN6JvnCCwEwEL28CBYalXSgWWULuFlEHjtMoXBqQanSie3bNyhrANJx67sb+Sd/vuGivoMwLQ==", + "requires": { + "@babel/code-frame": "7.0.0-beta.40", + "@babel/types": "7.0.0-beta.40", + "babylon": "7.0.0-beta.40", + "lodash": "4.17.5" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", + "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==" + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.40.tgz", + "integrity": "sha512-h96SQorjvdSuxQ6hHFIuAa3oxnad1TA5bU1Zz88+XqzwmM5QM0/k2D+heXGGy/76gT5ajl7xYLKGiPA/KTyVhQ==", + "requires": { + "@babel/code-frame": "7.0.0-beta.40", + "@babel/generator": "7.0.0-beta.40", + "@babel/helper-function-name": "7.0.0-beta.40", + "@babel/types": "7.0.0-beta.40", + "babylon": "7.0.0-beta.40", + "debug": "3.1.0", + "globals": "11.3.0", + "invariant": "2.2.2", + "lodash": "4.17.5" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", + "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==" + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.40.tgz", + "integrity": "sha512-uXCGCzTgMZxcSUzutCPtZmXbVC+cvENgS2e0tRuhn+Y1hZnMb8IHP0Trq7Q2MB/eFmG5pKrAeTIUfQIe5kA4Tg==", + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + } + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + }, + "dependencies": { + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + } + } + }, "@slack/client": { "version": "3.16.0", "resolved": "https://registry.npmjs.org/@slack/client/-/client-3.16.0.tgz", @@ -136,7 +284,9 @@ "addressparser": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true, + "optional": true }, "after": { "version": "0.8.2", @@ -165,9 +315,9 @@ } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=" }, "align-text": { "version": "0.1.4", @@ -365,11 +515,6 @@ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" }, - "any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=" - }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -782,22 +927,84 @@ "integrity": "sha512-hIp37ojJRRW8ExWSxxLpkDHUufk/DFfsb7/cUC1cVbBg7JV4gJTkCTRa44dlL9e5jx1P3VNrjL7QOQfi4MyltA==" }, "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.0.0.tgz", + "integrity": "sha512-XBEqAoESCyGu3daYmWcTC37Dwmjvs0y40UtUO3MMX+Pd/w7jwNFfUKNtxoMFu0u0wcotP+arDpU3JVH54UV79Q==", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000803", + "browserslist": "3.1.0", + "caniuse-lite": "1.0.30000808", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "5.2.18", + "postcss": "6.0.18", "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "browserslist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.1.0.tgz", + "integrity": "sha512-pyoJs5teqQWTdwOTG7F5IDKi7hMvifd9ri3EYLG2ElXlA2AwvqB1SZ6RIPMRHpmYb0RYN8N7GSERey5WgxSCUQ==", + "requires": { + "caniuse-lite": "1.0.30000808", + "electron-to-chromium": "1.3.33" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "electron-to-chromium": { + "version": "1.3.33", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.33.tgz", + "integrity": "sha1-vwBwPWKnxlI4E2V4w1LWxcBCpUU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.18.tgz", + "integrity": "sha512-X8MyLi3OYI1o71u0SsefWLpGBo5xnGiK1Pn+nrZFplc671Ts7L8aPwEbPIO8AWpulK5wuaVzyM9Rw6R8o7hYBw==", + "requires": { + "chalk": "2.3.1", + "source-map": "0.6.1", + "supports-color": "5.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "3.0.0" + } + } } }, "aws-sdk": { - "version": "2.189.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.189.0.tgz", - "integrity": "sha1-TfZJuM+iAI/uCfNX/jqYNUZcTaQ=", + "version": "2.200.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.200.0.tgz", + "integrity": "sha1-9GDJZAhyWw64xlj93qbgv+DvWkQ=", "requires": { "buffer": "4.9.1", "events": "1.1.1", @@ -850,21 +1057,18 @@ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "axios": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz", - "integrity": "sha1-uk+S8XFn37q0CYN4VFS5rBScPG0=", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { "follow-redirects": "1.4.1", "is-buffer": "1.1.6" } }, "axios-progress-bar": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/axios-progress-bar/-/axios-progress-bar-0.1.7.tgz", - "integrity": "sha512-xStxJUtcQUH0ulLni5qc8YwvNMTUjO7rmUTsvnxS1bD2GJKEemozP6sJ5OeoC6jjd6MS5FZyx5BlkU/lD8JLUw==", - "requires": { - "nprogress": "0.2.0" - } + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/axios-progress-bar/-/axios-progress-bar-1.1.8.tgz", + "integrity": "sha512-CDjRu+qCj1EmuIXkZbluZE0qz0mOugBrAlDwnhn2VRP6Bvg7ddkfXqyFlEM+Rtgxzn1rWQiFTuCC46azyRQOpA==" }, "babel-code-frame": { "version": "6.26.0", @@ -917,14 +1121,23 @@ } }, "babel-eslint": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz", + "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0" + "@babel/code-frame": "7.0.0-beta.40", + "@babel/traverse": "7.0.0-beta.40", + "@babel/types": "7.0.0-beta.40", + "babylon": "7.0.0-beta.40", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", + "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==" + } } }, "babel-generator": { @@ -1048,14 +1261,51 @@ } }, "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "1.0.1", + "make-dir": "1.1.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "2.1.0" + } + } } }, "babel-messages": { @@ -1780,10 +2030,11 @@ "integrity": "sha512-gulJE5dGFo6Q61V/whS6VM4WIyrlydXfCgkE+Gxe5hjrJ8rXLLZlALq7zq2RPhOc45PSwQpJkrTnc2KgD6cvmA==" }, "bootstrap-vue": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-1.5.1.tgz", - "integrity": "sha512-bkob7vTHA5VZN6U0Wj34Yj+6jNtqAtc6MwcsLdBz78fcy8Ju5tlYUYMDUefQ0rQH7hhdtFDn9GuDiqhUPmE1sA==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.1.tgz", + "integrity": "sha512-X9dr6gKi3pF3K2yMJah7nYhlo/HB3JLJQ+grr8442s/HJsfnW9P1iALJtmiAxH8/RXLCSes00gs4lYlP0zg21w==", "requires": { + "bootstrap": "4.0.0", "lodash.startcase": "4.4.0", "opencollective": "1.0.3", "popper.js": "1.13.0", @@ -2240,6 +2491,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", + "dev": true, + "optional": true, "requires": { "addressparser": "1.0.1", "libbase64": "0.1.0", @@ -2286,6 +2539,55 @@ "unset-value": "1.0.0" } }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "2.0.0", + "query-string": "5.1.0", + "sort-keys": "2.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "query-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", + "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "1.1.0" + } + } + } + }, "cached-constructors-x": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cached-constructors-x/-/cached-constructors-x-1.0.0.tgz", @@ -2364,6 +2666,11 @@ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000803.tgz", "integrity": "sha1-Po0rr1bC/VpZyC4ieSig3CwmcC0=" }, + "caniuse-lite": { + "version": "1.0.30000808", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000808.tgz", + "integrity": "sha512-vT0JLmHdvq1UVbYXioxCXHYdNw55tyvi+IUWyX0Zeh1OFQi2IllYtm38IJnSgHWCv/zUnX1hdhy3vMJvuTNSqw==" + }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", @@ -2414,21 +2721,38 @@ } }, "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + }, + "dependencies": { + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "chai-as-promised": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-5.3.0.tgz", - "integrity": "sha1-CdekApCKpw39vq1T5YU/x50+8hw=", - "dev": true + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "1.0.2" + } }, "chai-dom": { "version": "1.7.0", @@ -2467,38 +2791,34 @@ "dev": true }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, "requires": { "color-convert": "1.9.1" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -2516,6 +2836,12 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "check-types": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz", @@ -2834,6 +3160,14 @@ } } }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "1.0.0" + } + }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -2862,6 +3196,12 @@ "q": "1.5.1" } }, + "coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3008,21 +3348,28 @@ "dev": true }, "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": "1.30.0" + "mime-db": "1.33.0" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + } } }, "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { "accepts": "1.3.4", "bytes": "3.0.0", - "compressible": "2.0.12", + "compressible": "2.0.13", "debug": "2.6.9", "on-headers": "1.0.1", "safe-buffer": "5.1.1", @@ -3462,7 +3809,6 @@ "version": "1.3.0-rc0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=", - "optional": true, "requires": { "boolbase": "1.0.0", "css-what": "2.1.0", @@ -3473,8 +3819,7 @@ "css-select-base-adapter": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", - "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=", - "optional": true + "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=" }, "css-selector-tokenizer": { "version": "0.7.0", @@ -3502,7 +3847,6 @@ "version": "1.0.0-alpha25", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", "integrity": "sha512-XC6xLW/JqIGirnZuUWHXCHRaAjje2b3OIB0Vj5RIJo6mIi/AdJo30quQl5LxUl0gkXDIrTrFGbMlcZjyFplz1A==", - "optional": true, "requires": { "mdn-data": "1.1.0", "source-map": "0.5.7" @@ -3511,8 +3855,7 @@ "css-url-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "optional": true + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=" }, "css-what": { "version": "2.1.0", @@ -3561,6 +3904,21 @@ "postcss-unique-selectors": "2.0.2", "postcss-value-parser": "3.3.0", "postcss-zindex": "2.2.0" + }, + "dependencies": { + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000803", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + } } }, "csso": { @@ -3573,9 +3931,9 @@ } }, "csv-stringify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-2.0.1.tgz", - "integrity": "sha512-qoWgXJHmANfwIZFogezZjfN7KeaALrSe2zA5velb2tVEx0r7tgVuMfideB5gq12x5Z7LkvgOayXplOwlKcXnKQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-2.0.4.tgz", + "integrity": "sha512-rm8JxNYXglaDKExA2KqCKY+jx8qVBSkXm8/bgw2BIyzLq1/qni/QMSPBchAkd8RGsJhMJDQ+ZxikG/Qgvck+gQ==", "requires": { "lodash.get": "4.4.2" } @@ -3932,6 +4290,14 @@ } } }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, "decompress-tar": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", @@ -5120,7 +5486,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, "requires": { "d": "1.0.0", "es5-ext": "0.10.38", @@ -5135,11 +5500,27 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + } + } + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, "requires": { "d": "1.0.0", "es5-ext": "0.10.38", @@ -5214,7 +5595,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, "requires": { "es6-map": "0.1.5", "es6-weak-map": "2.0.2", @@ -5225,170 +5605,130 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" } } }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.1.tgz", + "integrity": "sha512-gPSfpSRCHre1GLxGmO68tZNxOlL2y7xBd95VcLD+Eo4S2js31YoMum3CAQIOaxY24hqYOMksMvW38xuuWKQTgw==", "dev": true, "requires": { + "ajv": "5.5.2", "babel-code-frame": "6.26.0", - "chalk": "1.1.3", + "chalk": "2.3.1", "concat-stream": "1.6.0", - "debug": "2.6.9", + "cross-spawn": "5.1.0", + "debug": "3.1.0", "doctrine": "2.1.0", - "escope": "3.6.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", "espree": "3.5.3", "esquery": "1.0.0", - "estraverse": "4.2.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "9.18.0", + "globals": "11.3.0", "ignore": "3.3.7", "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.1", + "inquirer": "3.0.6", "is-resolvable": "1.1.0", - "js-yaml": "3.7.0", - "json-stable-stringify": "1.0.1", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.5", + "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", + "pluralize": "7.0.0", + "progress": "2.0.0", "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", + "semver": "5.5.0", + "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "table": "4.0.2", + "text-table": "0.2.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.5", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - }, - "strip-bom": { + "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "globals": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" } } } }, "eslint-config-habitrpg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-habitrpg/-/eslint-config-habitrpg-3.0.0.tgz", - "integrity": "sha1-fPq7yR9b084PAMCpo1Ccorl3O+0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-habitrpg/-/eslint-config-habitrpg-4.0.0.tgz", + "integrity": "sha512-vZc/KjnNVL2BkDBQaQBF9JV16cnZyKa6djCCqH6iKhp8Uuye8Bym3eeLNEcnGkOtZfzJE61hDqiPZXQk7BiXJQ==", "dev": true, "requires": { "eslint-plugin-lodash": "2.6.1", @@ -5396,12 +5736,13 @@ } }, "eslint-friendly-formatter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-2.0.7.tgz", - "integrity": "sha1-ZX+VoZr0mJY2r+uxzJ3mzrvQiO4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz", + "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=", "dev": true, "requires": { "chalk": "1.1.3", + "coalescy": "1.0.0", "extend": "3.0.1", "minimist": "1.2.0", "text-table": "0.2.0" @@ -5455,9 +5796,9 @@ } }, "eslint-plugin-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-2.0.3.tgz", - "integrity": "sha1-fImIOrDIX6XSi2ZqFKTpBqqQuJc=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.2.tgz", + "integrity": "sha512-CrQd0F8GWdNWnu4PFrYZl+LjUCXNVy2h0uhDMtnf/7VKc9HRcnkXSrlg0BSGfptZPSzmwnnwCaREAa9+fnQhYw==", "dev": true, "requires": { "htmlparser2": "3.9.2" @@ -5507,6 +5848,27 @@ "ramda": "0.24.1" } }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + } + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + }, "espree": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", @@ -5543,7 +5905,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, "requires": { "estraverse": "4.2.0", "object-assign": "4.1.1" @@ -5552,8 +5913,7 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" } } }, @@ -5576,7 +5936,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, "requires": { "d": "1.0.0", "es5-ext": "0.10.38" @@ -5687,12 +6046,6 @@ "meow": "3.7.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-braces": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", @@ -5944,38 +6297,20 @@ } }, "express-basic-auth": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.1.3.tgz", - "integrity": "sha512-+tYtERHfl46Y1sPexskNcnIgYCmEnvj4Hp8/19dfByMUQAAWKEQ/Ik1taQ+Kj9LLJP1ItuXa95Ta8e8LtyltVQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.1.4.tgz", + "integrity": "sha512-stNYRMPULJu/Tk3aFSdkyFMHDPDukens2L5FrTHJab+k/gvBdjB885W3gAZtHNrUaSmbAO8dQ9Omcot9qtbAag==", "requires": { "basic-auth": "1.1.0" } }, "express-validator": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-2.21.0.tgz", - "integrity": "sha1-9fwvn6npqFeGNPEOhrpaQ0a5b08=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-5.0.1.tgz", + "integrity": "sha512-M5SgmiyzAzdqnaCAgqvQpiC7KpCBeIqcwYxivTv32ALWk+ZQG/E2DlxH5FoIOsO5m/V9xO8SGyghtz5Waxz35A==", "requires": { - "bluebird": "3.4.7", - "lodash": "4.16.6", - "validator": "5.7.0" - }, - "dependencies": { - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - }, - "lodash": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz", - "integrity": "sha1-0iyaxmAojzhD4Wun0rXQbMon13c=" - }, - "validator": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-5.7.0.tgz", - "integrity": "sha1-eoelgUa2laxIYHEUHAxJ1n2gXlw=" - } + "lodash": "4.17.5", + "validator": "9.4.1" } }, "extend": { @@ -6017,9 +6352,9 @@ } }, "extract-text-webpack-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", - "integrity": "sha1-dW7076gVXDaBgz+8NNpTuUF0bWw=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { "async": "2.6.0", "loader-utils": "1.1.0", @@ -6279,6 +6614,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, "requires": { "commondir": "1.0.1", "mkdirp": "0.5.1", @@ -6499,6 +6835,24 @@ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", @@ -6546,12 +6900,14 @@ "dependencies": { "abbrev": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", "optional": true }, "ajv": { "version": "4.11.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "optional": true, "requires": { "co": "4.6.0", @@ -6560,16 +6916,19 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { "delegates": "1.0.0", @@ -6578,36 +6937,43 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "optional": true }, "assert-plus": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "optional": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, "aws-sign2": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "optional": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "optional": true }, "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -6615,21 +6981,24 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { "inherits": "2.0.3" } }, "boom": { "version": "2.10.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.16.3" } }, "brace-expansion": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -6637,51 +7006,61 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.10.1" } }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "requires": { "assert-plus": "1.0.0" @@ -6689,14 +7068,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "debug": { "version": "2.6.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "optional": true, "requires": { "ms": "2.0.0" @@ -6704,26 +7085,31 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "optional": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { "jsbn": "0.1.1" @@ -6731,21 +7117,25 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "optional": true }, "extsprintf": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "optional": true }, "form-data": { "version": "2.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "optional": true, "requires": { "asynckit": "0.4.0", @@ -6755,11 +7145,13 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -6769,7 +7161,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "optional": true, "requires": { "fstream": "1.0.11", @@ -6779,7 +7172,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "1.1.1", @@ -6794,7 +7188,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "requires": { "assert-plus": "1.0.0" @@ -6802,14 +7197,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -6821,16 +7218,19 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "har-schema": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "optional": true }, "har-validator": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "optional": true, "requires": { "ajv": "4.11.8", @@ -6839,12 +7239,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -6854,11 +7256,13 @@ }, "hoek": { "version": "2.16.3", - "bundled": true + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "optional": true, "requires": { "assert-plus": "0.2.0", @@ -6868,7 +7272,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -6876,37 +7281,44 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "1.0.1" } }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, "isarray": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, "jodid25519": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { "jsbn": "0.1.1" @@ -6914,17 +7326,20 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "optional": true }, "json-stable-stringify": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "optional": true, "requires": { "jsonify": "0.0.0" @@ -6932,17 +7347,20 @@ }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, "jsonify": { "version": "0.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "optional": true }, "jsprim": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "optional": true, "requires": { "assert-plus": "1.0.0", @@ -6953,48 +7371,56 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "mime-db": { "version": "1.27.0", - "bundled": true + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" }, "mime-types": { "version": "2.1.15", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { "mime-db": "1.27.0" } }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "optional": true }, "node-pre-gyp": { "version": "0.6.39", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", "optional": true, "requires": { "detect-libc": "1.0.2", @@ -7012,7 +7438,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1.1.0", @@ -7021,7 +7448,8 @@ }, "npmlog": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -7032,38 +7460,45 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "optional": true, "requires": { "os-homedir": "1.0.2", @@ -7072,30 +7507,36 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "optional": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "optional": true }, "qs": { "version": "6.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "optional": true }, "rc": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "optional": true, "requires": { "deep-extend": "0.4.2", @@ -7106,14 +7547,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.2.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -7126,7 +7569,8 @@ }, "request": { "version": "2.81.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "optional": true, "requires": { "aws-sign2": "0.6.0", @@ -7155,40 +7599,47 @@ }, "rimraf": { "version": "2.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "7.1.2" } }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "semver": { "version": "5.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.16.3" } }, "sshpk": { "version": "1.13.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", "optional": true, "requires": { "asn1": "0.2.3", @@ -7204,14 +7655,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -7220,31 +7673,36 @@ }, "string_decoder": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "requires": { "safe-buffer": "5.0.1" } }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "optional": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -7253,7 +7711,8 @@ }, "tar-pack": { "version": "3.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", "optional": true, "requires": { "debug": "2.6.8", @@ -7268,7 +7727,8 @@ }, "tough-cookie": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "optional": true, "requires": { "punycode": "1.4.1" @@ -7276,7 +7736,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "requires": { "safe-buffer": "5.0.1" @@ -7284,26 +7745,31 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "optional": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", "optional": true }, "verror": { "version": "1.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "optional": true, "requires": { "extsprintf": "1.0.2" @@ -7311,7 +7777,8 @@ }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { "string-width": "1.0.2" @@ -7319,7 +7786,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } } }, @@ -7385,6 +7853,12 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -7426,6 +7900,12 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, "get-pixels": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/get-pixels/-/get-pixels-3.3.0.tgz", @@ -7555,12 +8035,6 @@ "logalot": "2.1.0" } }, - "gitbook-plugin-github": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gitbook-plugin-github/-/gitbook-plugin-github-2.0.0.tgz", - "integrity": "sha1-UWbnY8/MQC1DKIC3pshcHFS1ao0=", - "dev": true - }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -7768,21 +8242,47 @@ } }, "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/got/-/got-8.2.0.tgz", + "integrity": "sha512-giadqJpXIwjY+ZsuWys8p2yjZGhOHiU4hiJHjS/oeCxw1u8vANQz3zPlrxW2Zw/siCXsSMI3hvzWGcnFyujyAg==", "requires": { - "create-error-class": "3.0.2", + "@sindresorhus/is": "0.7.0", + "cacheable-request": "2.1.4", + "decompress-response": "3.3.0", "duplexer3": "0.1.4", "get-stream": "3.0.0", - "is-redirect": "1.0.0", + "into-stream": "3.1.0", "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", + "isurl": "1.0.0", "lowercase-keys": "1.0.0", + "mimic-response": "1.0.0", + "p-cancelable": "0.3.0", + "p-timeout": "2.0.1", + "pify": "3.0.0", "safe-buffer": "5.1.1", "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "url-parse-lax": "3.0.0", + "url-to-options": "1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "2.0.0" + } + } } }, "graceful-fs": { @@ -7839,12 +8339,10 @@ } }, "gulp-babel": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz", - "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-7.0.1.tgz", + "integrity": "sha512-UqHS3AdxZyJCRxqnAX603Dj3k/Wx6hzcgmav3QcxvsIFq3Y8ZkU7iXd0O+JwD5ivqCc6o0r1S7tCB/xxLnuSNw==", "requires": { - "babel-core": "6.26.0", - "object-assign": "4.1.1", "plugin-error": "1.0.1", "replace-ext": "0.0.1", "through2": "2.0.3", @@ -8753,6 +9251,11 @@ } } }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, "http-errors": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", @@ -8928,6 +9431,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, "requires": { "httpreq": "0.4.24", "underscore": "1.7.0" @@ -8936,14 +9440,16 @@ "underscore": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true } } }, "httpreq": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=" + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true }, "https-browserify": { "version": "1.0.0", @@ -9435,6 +9941,15 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "2.3.0", + "p-is-promise": "1.1.0" + } + }, "intro.js": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/intro.js/-/intro.js-2.7.0.tgz", @@ -9461,7 +9976,8 @@ "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true }, "ip-regex": { "version": "1.0.3", @@ -9776,6 +10292,11 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, "is-object-like-x": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/is-object-like-x/-/is-object-like-x-1.6.0.tgz", @@ -10142,6 +10663,15 @@ "handlebars": "4.0.11" } }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", @@ -10193,9 +10723,12 @@ } }, "js2xmlparser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-1.0.0.tgz", - "integrity": "sha1-WhcPLo1kds5FQF4EgjJCUTeC/jA=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "requires": { + "xmlcreate": "1.0.2" + } }, "jsbn": { "version": "0.1.1", @@ -10208,6 +10741,11 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, "json-content-demux": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/json-content-demux/-/json-content-demux-0.1.3.tgz", @@ -10236,6 +10774,12 @@ "jsonify": "0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -10520,6 +11064,31 @@ "sinon-chai": "2.14.0" }, "dependencies": { + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + }, + "dependencies": { + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + } + } + }, + "chai-as-promised": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-5.3.0.tgz", + "integrity": "sha1-CdekApCKpw39vq1T5YU/x50+8hw=", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -10565,6 +11134,16 @@ } } }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } + }, "karma-coverage": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.1.tgz", @@ -10778,16 +11357,6 @@ } } }, - "karma-phantomjs-launcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", - "dev": true, - "requires": { - "lodash": "4.17.5", - "phantomjs-prebuilt": "2.1.16" - } - }, "karma-sinon-chai": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/karma-sinon-chai/-/karma-sinon-chai-1.3.3.tgz", @@ -10853,6 +11422,25 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + } } } }, @@ -10866,6 +11454,14 @@ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.2.tgz", "integrity": "sha1-rTKXxVcGneqLz+ek+kkbdcXd65E=" }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -11239,12 +11835,14 @@ "libbase64": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", - "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=" + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", + "dev": true }, "libmime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", + "dev": true, "requires": { "iconv-lite": "0.4.15", "libbase64": "0.1.0", @@ -11254,14 +11852,16 @@ "iconv-lite": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true } } }, "libqp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", + "dev": true }, "liftoff": { "version": "2.5.0", @@ -11328,7 +11928,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -11337,8 +11936,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, @@ -11738,6 +12336,22 @@ } } }, + "nodemailer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", + "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", + "dev": true, + "optional": true, + "requires": { + "libmime": "3.0.0", + "mailcomposer": "4.0.1", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -11870,6 +12484,12 @@ } } }, + "loglevelnext": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.3.tgz", + "integrity": "sha512-OCxd/b78TijTB4b6zVqLbMrxhebyvdZKwqpL0VHUZ0pYhavXaPD4l6Xrr4n5xqTYWiqtb0i7ikSoJY/myQ/Org==", + "dev": true + }, "lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", @@ -11938,6 +12558,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", + "dev": true, + "optional": true, "requires": { "buildmail": "4.0.1", "libmime": "3.0.0" @@ -12255,6 +12877,11 @@ "brorand": "1.1.0" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", @@ -12273,6 +12900,11 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -12346,9 +12978,9 @@ "dev": true }, "mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.1.tgz", + "integrity": "sha512-SpwyojlnE/WRBNGtvJSNfllfm5PqEDFxcWluSIgLeSBJtXG4DmoX2NNAeEA7rP5kK+79VgtVq8nG6HskaL1ykg==", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -12550,7 +13182,12 @@ "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, "moment-recur": { - "version": "git://github.com/habitrpg/moment-recur.git#f147ef27bbc26ca67638385f3db4a44084c76626" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/moment-recur/-/moment-recur-1.0.7.tgz", + "integrity": "sha1-TVCSr2SK7e1q/lwT7zjFKQHJlBk=", + "requires": { + "moment": "2.20.1" + } }, "mongodb": { "version": "2.2.34", @@ -12588,9 +13225,9 @@ } }, "mongoose": { - "version": "4.13.10", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.10.tgz", - "integrity": "sha512-ERmAyJf/ECyApfmkcjlbnmY0CoNzanOHA8vCIFuZwY55tW4b4gTVtklFXWLmSye8XjZjM0xHioXr5eN3Z8jtZg==", + "version": "4.13.11", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.11.tgz", + "integrity": "sha512-OgXmFc3vzXwq4zWp41XfSBDnKZLqnBc4Kh7mwwGjBE5iWH5tfkixaPK0uFtpEuzDzUvAIg33bgniyTsmc00olA==", "requires": { "async": "2.1.4", "bson": "1.0.4", @@ -12618,16 +13255,58 @@ } }, "monk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/monk/-/monk-4.1.0.tgz", - "integrity": "sha1-x+VA6GquaQ1xLD4KtwYa2LpaOio=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/monk/-/monk-6.0.5.tgz", + "integrity": "sha512-NEygZ2fhRkPE9zxyOT/GhEYKIGClMCQ+StsTruZSlAWf1aRsgvdu8suVvOj3KWfdiOtsIMs9gg8eyyVHPNWRwg==", "dev": true, "requires": { "debug": "2.6.9", - "gitbook-plugin-github": "2.0.0", - "mongodb": "2.2.34" + "mongodb": "2.2.34", + "monk-middleware-cast-ids": "0.2.1", + "monk-middleware-fields": "0.2.0", + "monk-middleware-handle-callback": "0.2.2", + "monk-middleware-options": "0.2.1", + "monk-middleware-query": "0.2.0", + "monk-middleware-wait-for-connection": "0.2.0", + "object-assign": "4.1.1" } }, + "monk-middleware-cast-ids": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz", + "integrity": "sha1-QMQOWmyzPM7cKJIglDJ17ohhxSk=", + "dev": true + }, + "monk-middleware-fields": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz", + "integrity": "sha1-/2N6819ZSIecyyvhWpE2CRG+psE=", + "dev": true + }, + "monk-middleware-handle-callback": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz", + "integrity": "sha512-5hBynb7asZ2uw9XVze7C3XH0zXT51yFDvYydk/5HnWWzh2NLglDSiKDcX0yLKPHzFgiq+5Z4Laq5fFVnFsmm8w==", + "dev": true + }, + "monk-middleware-options": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz", + "integrity": "sha1-WNrhxRjUZjbr3/UG+t/Hc7tEKIY=", + "dev": true + }, + "monk-middleware-query": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz", + "integrity": "sha1-qSbGd9SlYgxiFRsKVtDAwVFnWHQ=", + "dev": true + }, + "monk-middleware-wait-for-connection": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz", + "integrity": "sha1-MSlY0w5Yi1fQl1TdfJe0hDMWg1o=", + "dev": true + }, "morgan": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", @@ -12931,27 +13610,18 @@ } }, "nise": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.2.tgz", - "integrity": "sha512-rvxf+PSZeCKtP0DgmwMmNf1G3I6X1r4WHiP2H88PlIkOkt7mGqufdokjS8caoHBgZzVx0ee/5ytGcGHbZaUw8w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.5.tgz", + "integrity": "sha512-Es4hGuq3lpip5PckrB+Qpuma282M0UJANJ+jxAgI+0wWTL9X6MtNv+M385JgqsAE8hv6NvD3lv8CQtXgEnvlpQ==", "dev": true, "requires": { - "formatio": "1.2.0", + "@sinonjs/formatio": "2.0.0", "just-extend": "1.1.27", - "lolex": "1.6.0", + "lolex": "2.3.2", "path-to-regexp": "1.7.0", "text-encoding": "0.6.4" }, "dependencies": { - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.1.2" - } - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -12959,9 +13629,9 @@ "dev": true }, "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", + "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==", "dev": true }, "path-to-regexp": { @@ -13318,23 +13988,16 @@ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" }, "nodemailer": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", - "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", - "requires": { - "libmime": "3.0.0", - "mailcomposer": "4.0.1", - "nodemailer-direct-transport": "3.3.2", - "nodemailer-shared": "1.1.0", - "nodemailer-smtp-pool": "2.8.2", - "nodemailer-smtp-transport": "2.7.2", - "socks": "1.1.9" - } + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.5.0.tgz", + "integrity": "sha512-bznbREPZoRt3g400RdmVYXs2mbZft9Y1DfEqE2GS0VcBwU8DiEMDQ2q4gauSltbsnXtIVHtKH+VmE80I35TxhA==" }, "nodemailer-direct-transport": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "dev": true, + "optional": true, "requires": { "nodemailer-shared": "1.1.0", "smtp-connection": "2.12.0" @@ -13343,12 +14006,14 @@ "nodemailer-fetch": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", + "dev": true }, "nodemailer-shared": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "dev": true, "requires": { "nodemailer-fetch": "1.6.0" } @@ -13357,6 +14022,8 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "dev": true, + "optional": true, "requires": { "nodemailer-shared": "1.1.0", "nodemailer-wellknown": "0.1.10", @@ -13367,6 +14034,8 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "dev": true, + "optional": true, "requires": { "nodemailer-shared": "1.1.0", "nodemailer-wellknown": "0.1.10", @@ -13376,7 +14045,8 @@ "nodemailer-wellknown": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=" + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", + "dev": true }, "nodemon": { "version": "1.14.12", @@ -13521,11 +14191,6 @@ "set-blocking": "2.0.0" } }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" - }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", @@ -13534,6 +14199,12 @@ "boolbase": "1.0.0" } }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -13699,7 +14370,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "optional": true, "requires": { "define-properties": "1.1.2", "es-abstract": "1.10.0" @@ -13754,7 +14424,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "optional": true, "requires": { "define-properties": "1.1.2", "es-abstract": "1.10.0", @@ -13906,45 +14575,29 @@ } }, "ora": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", - "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-2.0.0.tgz", + "integrity": "sha512-g+IR0nMUXq1k4nE3gkENbN4wkF0XsVZFyxznTF6CdmwQ9qeTGONGpSR9LM5//1l0TVvJoJF3MkMtJp6slUsWFg==", "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "cli-cursor": "2.1.0", "cli-spinners": "1.1.0", - "log-symbols": "2.2.0" + "log-symbols": "2.2.0", + "strip-ansi": "4.0.0", + "wcwidth": "1.0.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.1" - } + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" + "ansi-regex": "3.0.0" } } } @@ -14023,16 +14676,25 @@ "os-tmpdir": "1.0.2" } }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -14041,7 +14703,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.2.0" } @@ -14056,11 +14717,18 @@ "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=" }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "1.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pac-proxy-agent": { "version": "1.1.0", @@ -14117,6 +14785,24 @@ "semver": "5.5.0" }, "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -14475,6 +15161,12 @@ "pinkie-promise": "2.0.1" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "pause": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", @@ -14651,6 +15343,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, "requires": { "find-up": "1.1.2" } @@ -14699,9 +15392,9 @@ } }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "pngjs": { @@ -14835,26 +15528,69 @@ } }, "postcss-easy-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-easy-import/-/postcss-easy-import-2.1.0.tgz", - "integrity": "sha512-LfHi1rFGZ//1idOauAzhK45vjruQJGuofmR0fjUx+2gToT9L1kYlOQN0Ke6rwvuEE/IY/CHK5XgbGfRhbx0Hbw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz", + "integrity": "sha512-cfNsear/v8xlkl9v5Wm8y4Do/puiDQTFF+WX2Fo++h7oKt1fKWVVW/5Ca8hslYDQWnjndrg813cA23Pt1jsYdg==", "requires": { "globby": "6.1.0", - "is-glob": "3.1.0", + "is-glob": "4.0.0", "lodash": "4.17.5", "object-assign": "4.1.1", - "pify": "2.3.0", - "postcss": "5.2.18", - "postcss-import": "9.1.0", + "pify": "3.0.0", + "postcss": "6.0.18", + "postcss-import": "10.0.0", "resolve": "1.5.0" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "requires": { - "is-extglob": "2.1.1" + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "postcss": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.18.tgz", + "integrity": "sha512-X8MyLi3OYI1o71u0SsefWLpGBo5xnGiK1Pn+nrZFplc671Ts7L8aPwEbPIO8AWpulK5wuaVzyM9Rw6R8o7hYBw==", + "requires": { + "chalk": "2.3.1", + "source-map": "0.6.1", + "supports-color": "5.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "3.0.0" } } } @@ -14869,16 +15605,63 @@ } }, "postcss-import": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-9.1.0.tgz", - "integrity": "sha1-lf6YdqHnmvSfvcNYnwH+WqfMHoA=", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-10.0.0.tgz", + "integrity": "sha1-TIXJewmRNsxeoCQNwd/b/eTi674=", "requires": { "object-assign": "4.1.1", - "postcss": "5.2.18", + "postcss": "6.0.18", "postcss-value-parser": "3.3.0", - "promise-each": "2.2.0", "read-cache": "1.0.0", "resolve": "1.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.18.tgz", + "integrity": "sha512-X8MyLi3OYI1o71u0SsefWLpGBo5xnGiK1Pn+nrZFplc671Ts7L8aPwEbPIO8AWpulK5wuaVzyM9Rw6R8o7hYBw==", + "requires": { + "chalk": "2.3.1", + "source-map": "0.6.1", + "supports-color": "5.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "3.0.0" + } + } } }, "postcss-load-config": { @@ -15327,6 +16110,32 @@ "postcss": "5.2.18", "postcss-value-parser": "3.3.0", "svgo": "0.7.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + } + } } }, "postcss-unique-selectors": { @@ -15422,14 +16231,6 @@ "asap": "2.0.6" } }, - "promise-each": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", - "integrity": "sha1-M1MXTv8mlEgQN+BOAfd6oPttG2A=", - "requires": { - "any-promise": "0.1.0" - } - }, "property-is-enumerable-x": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/property-is-enumerable-x/-/property-is-enumerable-x-1.1.0.tgz", @@ -15482,6 +16283,12 @@ } } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -15701,6 +16508,77 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "puppeteer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.1.0.tgz", + "integrity": "sha512-Up+EiDVtc+EueFUzEFi4JqTlkXdC4pjMng0W9s/uqg2HP7+EHJiIe8OtwP7I+Jk7rI1kS5WIVpqx46aihnLuJQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "extract-zip": "1.6.6", + "https-proxy-agent": "2.1.1", + "mime": "1.6.0", + "progress": "2.0.0", + "proxy-from-env": "1.0.0", + "rimraf": "2.6.2", + "ws": "3.3.3" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", + "dev": true, + "requires": { + "es6-promisify": "5.0.0" + } + }, + "https-proxy-agent": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz", + "integrity": "sha512-LK6tQUR/VOkTI6ygAfWUKKP95I+e6M1h7N3PncGu1CATHCnex+CAv9ttR0lbHu1Uk2PXm/WoAHFo6JCGwMjVMw==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + } + } + }, "push-notify": { "version": "git://github.com/habitrpg/push-notify.git#6bc2b5fdb1bdc9649b9ec1964d79ca50187fc8a9", "requires": { @@ -16041,25 +16919,6 @@ "set-immediate-shim": "1.0.1" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - } - } - }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -16596,6 +17455,14 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -16648,12 +17515,6 @@ "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -16802,9 +17663,9 @@ } }, "selenium-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/selenium-server/-/selenium-server-3.9.0.tgz", - "integrity": "sha512-xbcL9yt/a1U0pvwAkneTWxrq7zF/X5oCAY5CMfwYbY3BglmvlXjrPhM5rnzVveDlVOtbXkZpcDnG3Ny9YUpddA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/selenium-server/-/selenium-server-3.9.1.tgz", + "integrity": "sha512-p+GORe/uLnUUjMkEX3zqQmZKDxJ+WG7od92RKAh0Oz+H4e9Kjgxzgwb3E8IB4nGf2ifsZkJVo/uEvqRP30y9+Q==", "dev": true }, "semver": { @@ -17050,33 +17911,24 @@ "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" }, "sinon": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.2.2.tgz", - "integrity": "sha512-BEa593xl+IkIc94nKo0O0LauQC/gQy8Gyv4DkzPwF/9DweC5phr1y+42zibCpn9abfkdHxt9r8AhD0R6u9DE/Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.3.0.tgz", + "integrity": "sha512-pmf05hFgEZUS52AGJcsVjOjqAyJW2yo14cOwVYvzCyw7+inv06YXkLyW75WG6X6p951lzkoKh51L2sNbR9CDvw==", "dev": true, "requires": { + "@sinonjs/formatio": "2.0.0", "diff": "3.2.0", - "formatio": "1.2.0", "lodash.get": "4.4.2", "lolex": "2.3.2", - "nise": "1.2.2", - "supports-color": "5.1.0", + "nise": "1.2.5", + "supports-color": "5.2.0", "type-detect": "4.0.8" }, "dependencies": { - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.1.2" - } - }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "lolex": { @@ -17086,19 +17938,13 @@ "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true } } }, @@ -17130,10 +17976,21 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } }, "sliced": { "version": "1.0.1", @@ -17143,12 +18000,14 @@ "smart-buffer": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true }, "smtp-connection": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "dev": true, "requires": { "httpntlm": "1.6.1", "nodemailer-shared": "1.1.0" @@ -17330,6 +18189,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "dev": true, "requires": { "ip": "1.1.5", "smart-buffer": "1.1.15" @@ -17569,8 +18429,7 @@ "stable": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", - "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=", - "optional": true + "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=" }, "stack-trace": { "version": "0.0.10", @@ -17995,9 +18854,9 @@ "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" }, "stripe": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-5.4.0.tgz", - "integrity": "sha512-VCDFp4oQu1uOcOLHIwRIznH8ikLJcpDsHahWN48V/QuV6y2Bm281cq5wnkjqv+LPdUpqXVp9pjlb+SfN6dnyZg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-5.5.0.tgz", + "integrity": "sha512-oy8xNoxv5/4eFsn+W/0KQvG9St7x/xM8TbOIW2prBLd2+zo+2y2V9iyqcNt6B14efcOE2YeCR1s5yw+1cqa2VQ==", "requires": { "bluebird": "3.5.1", "lodash.isplainobject": "4.0.6", @@ -18113,9 +18972,9 @@ } }, "svg-inline-loader": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.7.1.tgz", - "integrity": "sha1-bQ4nKLfsNBTCGAs/eAvD9xVO8iY=", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.0.tgz", + "integrity": "sha512-rynplY2eXFrdNomL1FvyTFQlP+dx0WqbzHglmNtA9M4IHRC3no2aPAl3ny9lUpJzFzFMZfWRK5YIclNU+FRePA==", "requires": { "loader-utils": "0.2.17", "object-assign": "4.1.1", @@ -18144,24 +19003,72 @@ } }, "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.0.4.tgz", + "integrity": "sha512-DR9ieoaBoeySY4pnIJMM3Hez6kcVj+Uzj8AUJkr3435qstozP9i+mZ9yzcbq64A44i9YKh3I1Laex+mAyc69Rg==", "requires": { - "coa": "1.0.4", + "coa": "2.0.1", "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", + "css-select": "1.3.0-rc0", + "css-select-base-adapter": "0.1.0", + "css-tree": "1.0.0-alpha25", + "css-url-regex": "1.1.0", + "csso": "3.5.0", + "js-yaml": "3.10.0", "mkdirp": "0.5.1", + "object.values": "1.0.4", "sax": "1.2.4", - "whet.extend": "0.9.9" + "stable": "0.1.6", + "unquote": "1.1.1", + "util.promisify": "1.0.0" }, "dependencies": { + "coa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", + "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==", + "requires": { + "q": "1.5.1" + } + }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, + "csso": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.0.tgz", + "integrity": "sha512-WtJjFP3ZsSdWhiZr4/k1B9uHPgYjFYnDxfbaJxk1hz5PDLIJ5BCRWkJqaztZ0DbP8d2ZIVwUPIJb2YmCwkPaMw==", + "requires": { + "css-tree": "1.0.0-alpha.27" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.27", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.27.tgz", + "integrity": "sha512-BAYp9FyN4jLXjfvRpTDchBllDptqlK9I7OsagXCG9Am5C+5jc8eRZHgqb9x500W2OKS14MMlpQc/nmh/aA7TEQ==", + "requires": { + "mdn-data": "1.1.0", + "source-map": "0.5.7" + } + } + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -18170,9 +19077,9 @@ } }, "svgo-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-1.2.1.tgz", - "integrity": "sha1-4lXN6/VnU/+DvSjR16IHYsDfUTA=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.1.0.tgz", + "integrity": "sha512-G9KGgXaSn+F05HtIViNmy3hT2TZsnqtq10QnmYlaoc+ITd5SGQckaH7v066Noq9cOjMqA6s2AXHDiNAUItfHuw==", "requires": { "loader-utils": "1.1.0" }, @@ -18207,28 +19114,24 @@ } }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.3.1", "lodash": "4.17.5", - "slice-ansi": "0.0.4", + "slice-ansi": "1.0.0", "string-width": "2.1.1" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true }, "ansi-regex": { "version": "3.0.0", @@ -18236,36 +19139,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -18923,9 +19796,9 @@ } }, "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-is": { @@ -18996,6 +19869,16 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + } + }, "uid-number": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", @@ -19142,8 +20025,7 @@ "unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "optional": true + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" }, "unset-value": { "version": "1.0.0", @@ -19283,12 +20165,13 @@ "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=" }, "url-loader": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "requires": { "loader-utils": "1.1.0", - "mime": "1.3.6" + "mime": "1.6.0", + "schema-utils": "0.3.0" }, "dependencies": { "loader-utils": { @@ -19300,11 +20183,6 @@ "emojis-list": "2.1.0", "json5": "0.5.1" } - }, - "mime": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" } } }, @@ -19325,6 +20203,11 @@ "ip-regex": "1.0.3" } }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, "url2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/url2/-/url2-1.0.4.tgz", @@ -19457,7 +20340,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "optional": true, "requires": { "define-properties": "1.1.2", "object.getownpropertydescriptors": "2.0.3" @@ -19513,19 +20395,9 @@ "integrity": "sha1-fif8uzFbhB54JDQxiXZxkp4gt/Q=" }, "validator": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-4.9.0.tgz", - "integrity": "sha1-CC/84qdhSP8HqOienCukOq8S7Ew=", - "requires": { - "depd": "1.1.0" - }, - "dependencies": { - "depd": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" - } - } + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", + "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==" }, "value-or-function": { "version": "3.0.0", @@ -19710,22 +20582,22 @@ "integrity": "sha512-e+ThJMYmZg4D9UnrLcr6LQxGu6YlcxkrmZGPCyIN4malcNhdeGGKxmFuM5y6ICMJJxQywLfT8MM1rYZr4LpeLw==" }, "vue-loader": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.1.tgz", - "integrity": "sha512-v6PbKMGl/hWHGPxB2uGHsA66vusrXF66J/h1QiFXtU6z5zVSK8jq5xl95M1p3QNXmuEJKNP3nxoXfbgQNs7hJg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-14.1.1.tgz", + "integrity": "sha512-ZLu0yWohbWPayFhSPy80xnObCrPDLGrf/v9R5kJyUbVlcI46srnQlaG+HnTN5HAt5nV9iJiF4oJIjX0+jK+f0w==", "requires": { "consolidate": "0.14.5", "hash-sum": "1.0.2", "loader-utils": "1.1.0", "lru-cache": "4.1.1", - "postcss": "6.0.17", + "postcss": "6.0.18", "postcss-load-config": "1.2.0", "postcss-selector-parser": "2.2.3", "prettier": "1.10.2", "resolve": "1.5.0", "source-map": "0.6.1", "vue-hot-reload-api": "2.2.4", - "vue-style-loader": "3.1.2", + "vue-style-loader": "4.0.2", "vue-template-es2015-compiler": "1.6.0" }, "dependencies": { @@ -19738,29 +20610,19 @@ } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "loader-utils": { "version": "1.1.0", @@ -19773,13 +20635,13 @@ } }, "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.18.tgz", + "integrity": "sha512-X8MyLi3OYI1o71u0SsefWLpGBo5xnGiK1Pn+nrZFplc671Ts7L8aPwEbPIO8AWpulK5wuaVzyM9Rw6R8o7hYBw==", "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { @@ -19788,11 +20650,20 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" + } + }, + "vue-style-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.0.2.tgz", + "integrity": "sha512-Bwf1Gf331Z5OTzMRAYQYiFpFbaCpaXQjQcSvWYsmEwSgOIVa+moXWoD8fQCNetcekbP3OSE5pyvomNKbvIUQtQ==", + "requires": { + "hash-sum": "1.0.2", + "loader-utils": "1.1.0" } } } @@ -19811,9 +20682,9 @@ "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==" }, "vue-style-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.2.tgz", - "integrity": "sha512-ICtVdK/p+qXWpdSs2alWtsXt9YnDoYjQe0w5616j9+/EhjoxZkbun34uWgsMFnC1MhrMMwaWiImz3K2jK1Yp2Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.0.2.tgz", + "integrity": "sha512-Bwf1Gf331Z5OTzMRAYQYiFpFbaCpaXQjQcSvWYsmEwSgOIVa+moXWoD8fQCNetcekbP3OSE5pyvomNKbvIUQtQ==", "requires": { "hash-sum": "1.0.2", "loader-utils": "1.1.0" @@ -19864,6 +20735,26 @@ "cheerio": "0.19.0", "got": "6.7.1", "meow": "3.7.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + } } }, "ware": { @@ -20007,43 +20898,58 @@ } } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "1.0.3" + } + }, "webpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", - "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "requires": { "acorn": "5.4.1", "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", + "ajv": "6.1.1", + "ajv-keywords": "3.1.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", + "escope": "3.6.0", "interpret": "1.1.0", "json-loader": "0.5.7", "json5": "0.5.1", "loader-runner": "2.3.0", - "loader-utils": "0.2.17", + "loader-utils": "1.1.0", "memory-fs": "0.4.1", "mkdirp": "0.5.1", "node-libs-browser": "2.1.0", "source-map": "0.5.7", - "supports-color": "3.2.3", + "supports-color": "4.5.0", "tapable": "0.2.8", - "uglify-js": "2.8.29", + "uglifyjs-webpack-plugin": "0.4.6", "watchpack": "1.4.0", "webpack-sources": "1.1.0", - "yargs": "6.6.0" + "yargs": "8.0.2" }, "dependencies": { "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz", + "integrity": "sha1-l41Zf7wrfQ5aXD3esUmmgvKr+g4=", "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -20052,40 +20958,148 @@ "lodash": "4.17.5" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "has-flag": "1.0.0" + "locate-path": "2.0.0" } }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "camelcase": "3.0.0", + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "requires": { + "camelcase": "4.1.0", "cliui": "3.2.0", "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", "y18n": "3.2.1", - "yargs-parser": "4.2.1" + "yargs-parser": "7.0.0" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "3.0.0" + "camelcase": "4.1.0" } } } @@ -20309,28 +21323,30 @@ } }, "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.5.tgz", + "integrity": "sha512-EPXudTrpQLksLt9klR0spnb7mt4dHtk3amGnohZNeQ+Y2QSqBbnWA7uNZ9+rqyfhEcYw18pUwcGIXuPFvIIELQ==", "dev": true, "requires": { + "loud-rejection": "1.6.0", "memory-fs": "0.4.1", - "mime": "1.6.0", + "mime": "2.2.0", "path-is-absolute": "1.0.1", "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "url-join": "2.0.5", + "webpack-log": "1.1.2" }, "dependencies": { "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", + "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", "dev": true }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", "dev": true } } @@ -20347,6 +21363,18 @@ "strip-ansi": "3.0.1" } }, + "webpack-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.1.2.tgz", + "integrity": "sha512-B53SD4N4BHpZdUwZcj4st2QT7gVfqZtqHDruC1N+K2sciq0Rt/3F1Dx6RlylVkcrToMLTaiaeT48k9Lq4iDVDA==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "log-symbols": "2.2.0", + "loglevelnext": "1.0.3", + "uuid": "3.2.1" + } + }, "webpack-merge": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", @@ -20596,6 +21624,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=" }, + "xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=" + }, "xmldom": { "version": "0.1.19", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.19.tgz", diff --git a/package.json b/package.json index 1666a4f8d4..4301dc8962 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,26 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.27.2", + "version": "4.28.0", "main": "./website/server/index.js", + "greenkeeper": { + "ignore": [ + "mongoose" + ] + }, "dependencies": { "@slack/client": "^3.8.1", "accepts": "^1.3.2", "amazon-payments": "^0.2.6", "amplitude": "^3.5.0", "apidoc": "^0.17.5", - "apn": "^1.7.6", - "autoprefixer": "^6.4.0", - "aws-sdk": "^2.0.25", - "axios": "^0.16.0", - "axios-progress-bar": "^0.1.7", + "autoprefixer": "^8.0.0", + "aws-sdk": "^2.200.0", + "axios": "^0.18.0", + "axios-progress-bar": "^1.1.8", "babel-core": "^6.0.0", - "babel-eslint": "^7.2.3", - "babel-loader": "^6.0.0", + "babel-eslint": "^8.2.2", + "babel-loader": "^7.1.2", "babel-plugin-syntax-async-functions": "^6.13.0", "babel-plugin-syntax-dynamic-import": "^6.18.0", "babel-plugin-transform-async-to-module-method": "^6.8.0", @@ -30,23 +34,23 @@ "bluebird": "^3.3.5", "body-parser": "^1.15.0", "bootstrap": "^4.0.0", - "bootstrap-vue": "^1.5.0", - "compression": "^1.6.1", + "bootstrap-vue": "^2.0.0-rc.1", + "compression": "^1.7.2", "cookie-session": "^1.2.0", "coupon-code": "^0.4.5", "cross-env": "^5.1.3", "css-loader": "^0.28.0", + "csv-stringify": "^2.0.4", "cwait": "^1.1.1", - "csv-stringify": "^2.0.1", "domain-middleware": "~0.1.0", "express": "^4.16.2", - "express-basic-auth": "^1.0.1", - "express-validator": "^2.18.0", - "extract-text-webpack-plugin": "^2.0.0-rc.3", + "express-basic-auth": "^1.1.4", + "express-validator": "^5.0.1", + "extract-text-webpack-plugin": "^3.0.2", "glob": "^7.1.2", - "got": "^6.1.1", + "got": "^8.2.0", "gulp": "^4.0.0", - "gulp-babel": "^6.1.2", + "gulp-babel": "^7.0.1", "gulp-imagemin": "^4.1.0", "gulp-nodemon": "^2.2.1", "gulp.spritesmith": "^6.9.0", @@ -57,19 +61,19 @@ "in-app-purchase": "^1.1.6", "intro.js": "^2.6.0", "jquery": ">=3.0.0", - "js2xmlparser": "~1.0.0", + "js2xmlparser": "^3.0.0", "lodash": "^4.17.4", "merge-stream": "^1.0.0", "method-override": "^2.3.5", "moment": "^2.13.0", - "moment-recur": "git://github.com/habitrpg/moment-recur.git#f147ef27bbc26ca67638385f3db4a44084c76626", - "mongoose": "^4.13.10", + "moment-recur": "^1.0.7", + "mongoose": "^4.13.11", "morgan": "^1.7.0", "nconf": "^0.10.0", "node-gcm": "^0.14.4", "node-sass": "^4.5.0", - "nodemailer": "^2.3.2", - "ora": "^1.1.0", + "nodemailer": "^4.5.0", + "ora": "^2.0.0", "pageres": "^4.1.1", "passport": "^0.4.0", "passport-facebook": "^2.0.0", @@ -77,35 +81,35 @@ "paypal-ipn": "3.0.0", "paypal-rest-sdk": "^1.8.1", "popper.js": "^1.13.0", - "postcss-easy-import": "^2.0.0", + "postcss-easy-import": "^3.0.0", "ps-tree": "^1.0.0", "pug": "^2.0.0-rc.4", "push-notify": "git://github.com/habitrpg/push-notify.git#6bc2b5fdb1bdc9649b9ec1964d79ca50187fc8a9", "pusher": "^1.3.0", - "request": "^2.83.0", "rimraf": "^2.4.3", "sass-loader": "^6.0.2", - "stripe": "^5.4.0", "shelljs": "^0.8.1", + "stripe": "^5.5.0", "superagent": "^3.4.3", - "svg-inline-loader": "^0.7.1", + "svg-inline-loader": "^0.8.0", "svg-url-loader": "^2.0.2", - "svgo-loader": "^1.2.1", + "svgo": "^1.0.4", + "svgo-loader": "^2.1.0", "universal-analytics": "^0.4.16", - "url-loader": "^0.5.7", + "url-loader": "^0.6.2", "useragent": "^2.1.9", "uuid": "^3.0.1", - "validator": "^4.9.0", + "validator": "^9.4.1", "vinyl-buffer": "^1.0.1", "vue": "^2.5.2", - "vue-loader": "^13.3.0", + "vue-loader": "^14.1.1", "vue-mugen-scroll": "^0.2.1", "vue-router": "^3.0.0", - "vue-style-loader": "^3.0.0", + "vue-style-loader": "^4.0.2", "vue-template-compiler": "^2.5.2", "vuedraggable": "^2.15.0", "vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec", - "webpack": "^2.2.1", + "webpack": "^3.11.0", "webpack-merge": "^4.0.0", "winston": "^2.1.0", "winston-loggly-bulk": "^2.0.2", @@ -142,18 +146,18 @@ }, "devDependencies": { "babel-plugin-istanbul": "^4.0.0", - "chai": "^3.4.0", - "chai-as-promised": "^5.1.0", - "chalk": "^2.3.0", + "chai": "^4.1.2", + "chai-as-promised": "^7.1.1", + "chalk": "^2.3.1", "chromedriver": "^2.27.2", "connect-history-api-fallback": "^1.1.0", "coveralls": "^3.0.0", "cross-spawn": "^6.0.4", - "eslint": "^3.0.0", - "eslint-config-habitrpg": "^3.0.0", - "eslint-friendly-formatter": "^2.0.5", + "eslint": "^4.18.1", + "eslint-config-habitrpg": "^4.0.0", + "eslint-friendly-formatter": "^3.0.0", "eslint-loader": "^1.3.0", - "eslint-plugin-html": "^2.0.0", + "eslint-plugin-html": "^4.0.2", "eslint-plugin-mocha": "^4.7.0", "eventsource-polyfill": "^0.9.6", "expect.js": "^0.3.1", @@ -162,27 +166,27 @@ "karma": "^2.0.0", "karma-babel-preprocessor": "^7.0.0", "karma-chai-plugins": "^0.9.0", + "karma-chrome-launcher": "^2.2.0", "karma-coverage": "^1.1.1", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", - "karma-phantomjs-launcher": "^1.0.0", "karma-sinon-chai": "^1.3.3", "karma-sinon-stub-promise": "^1.0.0", "karma-sourcemap-loader": "^0.3.7", "karma-spec-reporter": "0.0.32", "karma-webpack": "^2.0.2", "lcov-result-merger": "^2.0.0", - "mocha": "^5.0.0", - "monk": "^4.0.0", + "mocha": "^5.0.1", + "monk": "^6.0.5", "nightwatch": "^0.9.12", - "phantomjs-prebuilt": "^2.1.12", + "puppeteer": "^1.1.0", "require-again": "^2.0.0", - "selenium-server": "^3.0.1", - "sinon": "^4.2.2", + "selenium-server": "^3.9.1", + "sinon": "^4.3.0", "sinon-chai": "^2.8.0", "sinon-stub-promise": "^4.0.0", "webpack-bundle-analyzer": "^2.2.1", - "webpack-dev-middleware": "^1.10.0", + "webpack-dev-middleware": "^2.0.5", "webpack-hot-middleware": "^2.6.1" } } diff --git a/scripts/paypalBillingSetup.js b/scripts/paypalBillingSetup.js index 78fcedce2e..b941254420 100644 --- a/scripts/paypalBillingSetup.js +++ b/scripts/paypalBillingSetup.js @@ -1,111 +1,120 @@ -require("babel-register"); -require("babel-polyfill"); +require('babel-register'); +require('babel-polyfill'); + // This file is used for creating paypal billing plans. PayPal doesn't have a web interface for setting up recurring // payment plan definitions, instead you have to create it via their REST SDK and keep it updated the same way. So this // file will be used once for initing your billing plan (then you get the resultant plan.id to store in config.json), // and once for any time you need to edit the plan thereafter -var path = require('path'); -var nconf = require('nconf'); -var _ = require('lodash'); -var paypal = require('paypal-rest-sdk'); -var blocks = require('../website/common').content.subscriptionBlocks; -var live = nconf.get('PAYPAL:mode')=='live'; +/* eslint-disable no-console, camelcase, no-case-declarations */ + +const path = require('path'); +const nconf = require('nconf'); +const _ = require('lodash'); +const paypal = require('paypal-rest-sdk'); +const blocks = require('../website/common').content.subscriptionBlocks; +const live = nconf.get('PAYPAL:mode') === 'live'; nconf.argv().env().file('user', path.join(path.resolve(__dirname, '../config.json'))); -var OP = 'create'; // list create update remove +let OP = 'create'; // list create update remove paypal.configure({ - 'mode': nconf.get("PAYPAL:mode"), //sandbox or live - 'client_id': nconf.get("PAYPAL:client_id"), - 'client_secret': nconf.get("PAYPAL:client_secret") + mode: nconf.get('PAYPAL:mode'), // sandbox or live + client_id: nconf.get('PAYPAL:client_id'), + client_secret: nconf.get('PAYPAL:client_secret'), }); // https://developer.paypal.com/docs/api/#billing-plans-and-agreements -var billingPlanTitle ="Habitica Subscription"; -var billingPlanAttributes = { - "name": billingPlanTitle, - "description": billingPlanTitle, - "type": "INFINITE", - "merchant_preferences": { - "auto_bill_amount": "yes", - "cancel_url": live ? 'https://habitica.com' : 'http://localhost:3000', - "return_url": (live ? 'https://habitica.com' : 'http://localhost:3000') + '/paypal/subscribe/success' +let billingPlanTitle = 'Habitica Subscription'; +let billingPlanAttributes = { + name: billingPlanTitle, + description: billingPlanTitle, + type: 'INFINITE', + merchant_preferences: { + auto_bill_amount: 'yes', + cancel_url: live ? 'https://habitica.com' : 'http://localhost:3000', + return_url: `${live ? 'https://habitica.com' : 'http://localhost:3000' }/paypal/subscribe/success`, }, payment_definitions: [{ - "type": "REGULAR", - "frequency": "MONTH", - "cycles": "0" - }] + type: 'REGULAR', + frequency: 'MONTH', + cycles: '0', + }], }; -_.each(blocks, function(block){ + +_.each(blocks, (block) => { block.definition = _.cloneDeep(billingPlanAttributes); _.merge(block.definition.payment_definitions[0], { - "name": billingPlanTitle + ' ($'+block.price+' every '+block.months+' months, recurring)', - "frequency_interval": ""+block.months, - "amount": { - "currency": "USD", - "value": ""+block.price - } + name: `${billingPlanTitle } ($${block.price} every ${block.months} months, recurring)`, + frequency_interval: `${block.months}`, + amount: { + currency: 'USD', + value: `${block.price}`, + }, }); -}) +}); // @TODO: Add cli library for this -switch(OP) { - case "list": - paypal.billingPlan.list({status: 'ACTIVE'}, function(err, plans){ - console.log({err:err, plans:plans}); +switch (OP) { + case 'list': + paypal.billingPlan.list({status: 'ACTIVE'}, (err, plans) => { + console.log({err, plans}); }); break; - case "get": - paypal.billingPlan.get(nconf.get("PAYPAL:billing_plans:12"), function (err, plan) { - console.log({err:err, plan:plan}); - }) + case 'get': + paypal.billingPlan.get(nconf.get('PAYPAL:billing_plans:12'), (err, plan) => { + console.log({err, plan}); + }); break; - case "update": - var update = { - "op": "replace", - "path": "/merchant_preferences", - "value": { - "cancel_url": "https://habitica.com" - } + case 'update': + let updatePayload = { + op: 'replace', + path: '/merchant_preferences', + value: { + cancel_url: 'https://habitica.com', + }, }; - paypal.billingPlan.update(nconf.get("PAYPAL:billing_plans:12"), update, function (err, res) { - console.log({err:err, plan:res}); + paypal.billingPlan.update(nconf.get('PAYPAL:billing_plans:12'), updatePayload, (err, res) => { + console.log({err, plan: res}); }); break; - case "create": - paypal.billingPlan.create(blocks["google_6mo"].definition, function(err,plan){ + case 'create': + paypal.billingPlan.create(blocks.google_6mo.definition, (err, plan) => { if (err) return console.log(err); - if (plan.state == "ACTIVE") - return console.log({err:err, plan:plan}); - var billingPlanUpdateAttributes = [{ - "op": "replace", - "path": "/", - "value": { - "state": "ACTIVE" - } + + if (plan.state === 'ACTIVE') { + return console.log({err, plan}); + } + + let billingPlanUpdateAttributes = [{ + op: 'replace', + path: '/', + value: { + state: 'ACTIVE', + }, }]; + // Activate the plan by changing status to Active - paypal.billingPlan.update(plan.id, billingPlanUpdateAttributes, function(err, response){ - console.log({err:err, response:response, id:plan.id}); + paypal.billingPlan.update(plan.id, billingPlanUpdateAttributes, (err2, response) => { + console.log({err: err2, response, id: plan.id}); }); }); break; - case "remove": break; + + case 'remove': break; case 'create-webprofile': let webexpinfo = { - "name": "HabiticaProfile", - "input_fields": { - "no_shipping": 1, + name: 'HabiticaProfile', + input_fields: { + no_shipping: 1, }, }; paypal.webProfile.create(webexpinfo, (error, result) => { - console.log(error, result) - }) + console.log(error, result); + }); break; -} +} \ No newline at end of file diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js index e0dc561c66..19e8deaf12 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js @@ -99,7 +99,7 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { await sleep(0.5); - await expect(winningUser.sync()).to.eventually.have.deep.property('achievements.challenges').to.include(challenge.name); + await expect(winningUser.sync()).to.eventually.have.nested.property('achievements.challenges').to.include(challenge.name); expect(winningUser.notifications.length).to.equal(2); // 2 because winningUser just joined the challenge, which now awards an achievement expect(winningUser.notifications[1].type).to.equal('WON_CHALLENGE'); }); diff --git a/test/api/v3/integration/chat/POST-chat.test.js b/test/api/v3/integration/chat/POST-chat.test.js index 395c6b88e1..c9b2d97384 100644 --- a/test/api/v3/integration/chat/POST-chat.test.js +++ b/test/api/v3/integration/chat/POST-chat.test.js @@ -119,21 +119,21 @@ describe('POST /chat', () => { it('errors when word is part of a phrase', async () => { let wordInPhrase = `phrase ${testBannedWordMessage} end`; await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase})) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: bannedWordErrorMessage, - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: bannedWordErrorMessage, + }); }); it('errors when word is surrounded by non alphabet characters', async () => { let wordInPhrase = `_!${testBannedWordMessage}@_`; await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase})) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: bannedWordErrorMessage, - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: bannedWordErrorMessage, + }); }); it('checks error message has the banned words used', async () => { diff --git a/test/api/v3/integration/content/GET-content.test.js b/test/api/v3/integration/content/GET-content.test.js index fad68edae2..1489738577 100644 --- a/test/api/v3/integration/content/GET-content.test.js +++ b/test/api/v3/integration/content/GET-content.test.js @@ -7,19 +7,19 @@ import i18n from '../../../../../website/common/script/i18n'; describe('GET /content', () => { it('returns content (and does not require authentication)', async () => { let res = await requester().get('/content'); - expect(res).to.have.deep.property('backgrounds.backgrounds062014.beach'); + expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText')); }); it('returns content not in English', async () => { let res = await requester().get('/content?language=de'); - expect(res).to.have.deep.property('backgrounds.backgrounds062014.beach'); + expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'de')); }); it('falls back to English if the desired language is not found', async () => { let res = await requester().get('/content?language=wrong'); - expect(res).to.have.deep.property('backgrounds.backgrounds062014.beach'); + expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText')); }); }); diff --git a/test/api/v3/integration/debug/POST-debug_addTenGems.test.js b/test/api/v3/integration/debug/POST-debug_addTenGems.test.js index fd01aea5d3..d1a3b39eb2 100644 --- a/test/api/v3/integration/debug/POST-debug_addTenGems.test.js +++ b/test/api/v3/integration/debug/POST-debug_addTenGems.test.js @@ -26,10 +26,10 @@ describe('POST /debug/add-ten-gems', () => { nconf.set('IS_PROD', true); await expect(userToGainTenGems.post('/debug/add-ten-gems')) - .eventually.be.rejected.and.to.deep.equal({ - code: 404, - error: 'NotFound', - message: 'Not found.', - }); + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); }); }); diff --git a/test/api/v3/integration/debug/POST-debug_make-admin.test.js b/test/api/v3/integration/debug/POST-debug_make-admin.test.js index 98818fb07e..0696b6469f 100644 --- a/test/api/v3/integration/debug/POST-debug_make-admin.test.js +++ b/test/api/v3/integration/debug/POST-debug_make-admin.test.js @@ -26,10 +26,10 @@ describe('POST /debug/make-admin (pended for v3 prod testing)', () => { nconf.set('IS_PROD', true); await expect(user.post('/debug/make-admin')) - .eventually.be.rejected.and.to.deep.equal({ - code: 404, - error: 'NotFound', - message: 'Not found.', - }); + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); }); }); diff --git a/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js b/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js index 93f9081492..7047150477 100644 --- a/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js +++ b/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js @@ -151,10 +151,10 @@ describe('POST /debug/modify-inventory', () => { nconf.set('IS_PROD', true); await expect(user.post('/debug/modify-inventory')) - .eventually.be.rejected.and.to.deep.equal({ - code: 404, - error: 'NotFound', - message: 'Not found.', - }); + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); }); }); diff --git a/test/api/v3/integration/debug/POST-debug_quest-progress.test.js b/test/api/v3/integration/debug/POST-debug_quest-progress.test.js index 6f10b78ba4..90c14c4470 100644 --- a/test/api/v3/integration/debug/POST-debug_quest-progress.test.js +++ b/test/api/v3/integration/debug/POST-debug_quest-progress.test.js @@ -16,11 +16,11 @@ describe('POST /debug/quest-progress', () => { it('errors if user is not on a quest', async () => { await expect(user.post('/debug/quest-progress')) - .to.eventually.be.rejected.and.to.deep.equal({ - code: 400, - error: 'BadRequest', - message: 'User is not on a valid quest.', - }); + .to.eventually.be.rejected.and.to.deep.equal({ + code: 400, + error: 'BadRequest', + message: 'User is not on a valid quest.', + }); }); it('increases boss quest progress by 1000', async () => { @@ -51,10 +51,10 @@ describe('POST /debug/quest-progress', () => { nconf.set('IS_PROD', true); await expect(user.post('/debug/quest-progress')) - .eventually.be.rejected.and.to.deep.equal({ - code: 404, - error: 'NotFound', - message: 'Not found.', - }); + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); }); }); diff --git a/test/api/v3/integration/debug/POST-debug_set-cron.test.js b/test/api/v3/integration/debug/POST-debug_set-cron.test.js index c737831d95..10fe75fa14 100644 --- a/test/api/v3/integration/debug/POST-debug_set-cron.test.js +++ b/test/api/v3/integration/debug/POST-debug_set-cron.test.js @@ -30,10 +30,10 @@ describe('POST /debug/set-cron', () => { nconf.set('IS_PROD', true); await expect(user.post('/debug/set-cron')) - .eventually.be.rejected.and.to.deep.equal({ - code: 404, - error: 'NotFound', - message: 'Not found.', - }); + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); }); }); diff --git a/test/api/v3/integration/groups/GET-groups.test.js b/test/api/v3/integration/groups/GET-groups.test.js index b7c8fbd942..10821a7dcb 100644 --- a/test/api/v3/integration/groups/GET-groups.test.js +++ b/test/api/v3/integration/groups/GET-groups.test.js @@ -93,14 +93,14 @@ describe('GET /groups', () => { it('returns only the tavern when tavern passed in as query', async () => { await expect(user.get('/groups?type=tavern')) .to.eventually.have.a.lengthOf(1) - .and.to.have.deep.property('[0]') + .and.to.have.nested.property('[0]') .and.to.have.property('_id', TAVERN_ID); }); it('returns only the user\'s party when party passed in as query', async () => { await expect(user.get('/groups?type=party')) .to.eventually.have.a.lengthOf(1) - .and.to.have.deep.property('[0]'); + .and.to.have.nested.property('[0]'); }); it('returns all public guilds when publicGuilds passed in as query', async () => { diff --git a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js index 33b1b7f5a4..a06f40bc4e 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js @@ -58,7 +58,7 @@ describe('POST /group/:groupId/join', () => { await joiningUser.post(`/groups/${publicGuild._id}/join`); - await expect(joiningUser.get(`/groups/${publicGuild._id}`)).to.eventually.have.deep.property('leader._id', joiningUser._id); + await expect(joiningUser.get(`/groups/${publicGuild._id}`)).to.eventually.have.nested.property('leader._id', joiningUser._id); }); it('increments memberCount when joining guilds', async () => { @@ -72,7 +72,7 @@ describe('POST /group/:groupId/join', () => { it('awards Joined Guild achievement', async () => { await joiningUser.post(`/groups/${publicGuild._id}/join`); - await expect(joiningUser.get('/user')).to.eventually.have.deep.property('achievements.joinedGuild', true); + await expect(joiningUser.get('/user')).to.eventually.have.nested.property('achievements.joinedGuild', true); }); }); @@ -115,7 +115,7 @@ describe('POST /group/:groupId/join', () => { await invitedUser.post(`/groups/${guild._id}/join`); await expect(invitedUser.get('/user')) - .to.eventually.have.deep.property('invitations.guilds') + .to.eventually.have.nested.property('invitations.guilds') .to.not.include({id: guild._id}); }); @@ -130,7 +130,7 @@ describe('POST /group/:groupId/join', () => { it('does not give basilist quest to inviter when joining a guild', async () => { await invitedUser.post(`/groups/${guild._id}/join`); - await expect(user.get('/user')).to.eventually.not.have.deep.property('items.quests.basilist'); + await expect(user.get('/user')).to.eventually.not.have.nested.property('items.quests.basilist'); }); it('does not increment basilist quest count to inviter with basilist when joining a guild', async () => { @@ -138,7 +138,7 @@ describe('POST /group/:groupId/join', () => { await invitedUser.post(`/groups/${guild._id}/join`); - await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + await expect(user.get('/user')).to.eventually.have.nested.property('items.quests.basilist', 1); }); it('notifies inviting user that their invitation was accepted', async () => { @@ -160,7 +160,7 @@ describe('POST /group/:groupId/join', () => { it('awards Joined Guild achievement', async () => { await invitedUser.post(`/groups/${guild._id}/join`); - await expect(invitedUser.get('/user')).to.eventually.have.deep.property('achievements.joinedGuild', true); + await expect(invitedUser.get('/user')).to.eventually.have.nested.property('achievements.joinedGuild', true); }); }); }); @@ -197,7 +197,7 @@ describe('POST /group/:groupId/join', () => { it('allows invited user to join party', async () => { await invitedUser.post(`/groups/${party._id}/join`); - await expect(invitedUser.get('/user')).to.eventually.have.deep.property('party._id', party._id); + await expect(invitedUser.get('/user')).to.eventually.have.nested.property('party._id', party._id); }); it('notifies inviting user that their invitation was accepted', async () => { @@ -220,7 +220,7 @@ describe('POST /group/:groupId/join', () => { it('clears invitation from user when joining party', async () => { await invitedUser.post(`/groups/${party._id}/join`); - await expect(invitedUser.get('/user')).to.eventually.not.have.deep.property('invitations.parties[0].id'); + await expect(invitedUser.get('/user')).to.eventually.not.have.nested.property('invitations.parties[0].id'); }); it('increments memberCount when joining party', async () => { @@ -234,7 +234,7 @@ describe('POST /group/:groupId/join', () => { it('gives basilist quest item to the inviter when joining a party', async () => { await invitedUser.post(`/groups/${party._id}/join`); - await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + await expect(user.get('/user')).to.eventually.have.nested.property('items.quests.basilist', 1); }); it('increments basilist quest item count to inviter when joining a party', async () => { @@ -242,7 +242,7 @@ describe('POST /group/:groupId/join', () => { await invitedUser.post(`/groups/${party._id}/join`); - await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 2); + await expect(user.get('/user')).to.eventually.have.nested.property('items.quests.basilist', 2); }); it('deletes previous party where the user was the only member', async () => { @@ -258,7 +258,7 @@ describe('POST /group/:groupId/join', () => { }); await userToInvite.post(`/groups/${party._id}/join`); - await expect(user.get('/user')).to.eventually.have.deep.property('party._id', party._id); + await expect(user.get('/user')).to.eventually.have.nested.property('party._id', party._id); await expect(checkExistence('groups', oldParty._id)).to.eventually.equal(false); }); @@ -273,8 +273,8 @@ describe('POST /group/:groupId/join', () => { await invitedUser.sync(); await party.sync(); - expect(invitedUser).to.have.deep.property('party.quest.RSVPNeeded', true); - expect(invitedUser).to.have.deep.property('party.quest.key', party.quest.key); + expect(invitedUser).to.have.nested.property('party.quest.RSVPNeeded', true); + expect(invitedUser).to.have.nested.property('party.quest.key', party.quest.key); expect(party.quest.members[invitedUser._id]).to.be.null; }); }); @@ -300,16 +300,16 @@ describe('POST /group/:groupId/join', () => { await member.sync(); await leader.sync(); - expect(member).to.have.deep.property('achievements.partyUp', true); - expect(leader).to.have.deep.property('achievements.partyUp', true); + expect(member).to.have.nested.property('achievements.partyUp', true); + expect(leader).to.have.nested.property('achievements.partyUp', true); }); it('does not award Party On achievement to party of size 2', async () => { await member.sync(); await leader.sync(); - expect(member).to.not.have.deep.property('achievements.partyOn'); - expect(leader).to.not.have.deep.property('achievements.partyOn'); + expect(member).to.not.have.nested.property('achievements.partyOn'); + expect(leader).to.not.have.nested.property('achievements.partyOn'); }); it('awards Party On achievement to party of size 4', async () => { @@ -324,8 +324,8 @@ describe('POST /group/:groupId/join', () => { await member.sync(); await leader.sync(); - expect(member).to.have.deep.property('achievements.partyOn', true); - expect(leader).to.have.deep.property('achievements.partyOn', true); + expect(member).to.have.nested.property('achievements.partyOn', true); + expect(leader).to.have.nested.property('achievements.partyOn', true); }); }); }); diff --git a/test/api/v3/integration/groups/POST-groups_groupId_leave.js b/test/api/v3/integration/groups/POST-groups_groupId_leave.js index c9dd64e7a9..615b5e01e2 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_leave.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_leave.js @@ -85,7 +85,7 @@ describe('POST /groups/:groupId/leave', () => { expect(leader.notifications.find(n => { return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupToLeave._id; })).to.not.exist; - expect(leader.newMessages[groupToLeave._id]).to.be.empty; + expect(leader.newMessages[groupToLeave._id]).to.be.undefined; }); context('with challenges', () => { @@ -257,7 +257,7 @@ describe('POST /groups/:groupId/leave', () => { let userWithoutInvitation = await invitedUser.get('/user'); - expect(userWithoutInvitation.invitations.parties[0]).to.be.empty; + expect(userWithoutInvitation.invitations.parties[0]).to.be.undefined; }); }); diff --git a/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js b/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js index 626c6ff896..7f1e31df85 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js @@ -36,7 +36,7 @@ describe('POST /group/:groupId/reject-invite', () => { await invitedUser.post(`/groups/${publicGuild._id}/reject-invite`); await expect(invitedUser.get('/user')) - .to.eventually.have.deep.property('invitations.guilds') + .to.eventually.have.nested.property('invitations.guilds') .to.not.include({id: publicGuild._id}); }); }); @@ -72,7 +72,7 @@ describe('POST /group/:groupId/reject-invite', () => { await invitedUser.post(`/groups/${guild._id}/reject-invite`); await expect(invitedUser.get('/user')) - .to.eventually.have.deep.property('invitations.guilds') + .to.eventually.have.nested.property('invitations.guilds') .to.not.include({id: guild._id}); }); }); @@ -107,7 +107,7 @@ describe('POST /group/:groupId/reject-invite', () => { it('clears invitation from user', async () => { await invitedUser.post(`/groups/${party._id}/reject-invite`); - await expect(invitedUser.get('/user')).to.eventually.not.have.deep.property('invitations.parties[0].id'); + await expect(invitedUser.get('/user')).to.eventually.not.have.nested.property('invitations.parties[0].id'); }); }); }); diff --git a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js index 6fb2af0704..97819e7a41 100644 --- a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js +++ b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js @@ -184,7 +184,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { let invitedUserWithoutInvite = await partyInvitedUser.get('/user'); - expect(invitedUserWithoutInvite.invitations.parties[0]).to.be.empty; + expect(invitedUserWithoutInvite.invitations.parties[0]).to.be.undefined; }); it('removes new messages from a member who is removed', async () => { @@ -203,7 +203,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { expect(removedMember.notifications.find(n => { return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === party._id; })).to.not.exist; - expect(removedMember.newMessages[party._id]).to.be.empty; + expect(removedMember.newMessages[party._id]).to.be.undefined; }); it('removes user from quest when removing user from party after quest starts', async () => { diff --git a/test/api/v3/integration/groups/POST-groups_invite.test.js b/test/api/v3/integration/groups/POST-groups_invite.test.js index 3de01d0d40..712c9a8f3c 100644 --- a/test/api/v3/integration/groups/POST-groups_invite.test.js +++ b/test/api/v3/integration/groups/POST-groups_invite.test.js @@ -30,22 +30,22 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [fakeID], })) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('userWithIDNotFound', {userId: fakeID}), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('userWithIDNotFound', {userId: fakeID}), + }); }); it('returns an error when inviting yourself to a group', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [inviter._id], })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('cannotInviteSelfToGroup'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('cannotInviteSelfToGroup'), + }); }); it('returns an error when uuids is not an array', async () => { @@ -54,11 +54,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: {fakeID}, })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('uuidsMustBeAnArray'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('uuidsMustBeAnArray'), + }); }); it('returns an error when uuids and emails are empty', async () => { @@ -66,22 +66,22 @@ describe('Post /groups/:groupId/invite', () => { emails: [], uuids: [], })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('inviteMustNotBeEmpty'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('inviteMustNotBeEmpty'), + }); }); it('returns an error when uuids is empty and emails is not passed', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [], })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('inviteMissingUuid'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('inviteMissingUuid'), + }); }); it('returns an error when there are more than INVITES_LIMIT uuids', async () => { @@ -94,11 +94,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids, })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), + }); }); it('invites a user to a group by uuid', async () => { @@ -114,7 +114,7 @@ describe('Post /groups/:groupId/invite', () => { }]); await expect(userToInvite.get('/user')) - .to.eventually.have.deep.property('invitations.guilds[0].id', group._id); + .to.eventually.have.nested.property('invitations.guilds[0].id', group._id); }); it('invites multiple users to a group by uuid', async () => { @@ -138,8 +138,8 @@ describe('Post /groups/:groupId/invite', () => { }, ]); - await expect(userToInvite.get('/user')).to.eventually.have.deep.property('invitations.guilds[0].id', group._id); - await expect(userToInvite2.get('/user')).to.eventually.have.deep.property('invitations.guilds[0].id', group._id); + await expect(userToInvite.get('/user')).to.eventually.have.nested.property('invitations.guilds[0].id', group._id); + await expect(userToInvite2.get('/user')).to.eventually.have.nested.property('invitations.guilds[0].id', group._id); }); it('returns an error when inviting multiple users and a user is not found', async () => { @@ -149,11 +149,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id, fakeID], })) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('userWithIDNotFound', {userId: fakeID}), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('userWithIDNotFound', {userId: fakeID}), + }); }); }); @@ -164,33 +164,33 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { emails: [{name: 'test'}], })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('inviteMissingEmail'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('inviteMissingEmail'), + }); }); it('returns an error when emails is not an array', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { emails: {testInvite}, })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('emailsMustBeAnArray'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('emailsMustBeAnArray'), + }); }); it('returns an error when emails is empty and uuids is not passed', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { emails: [], })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('inviteMissingEmail'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('inviteMissingEmail'), + }); }); it('returns an error when there are more than INVITES_LIMIT emails', async () => { @@ -203,11 +203,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { emails, })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), + }); }); it('returns an error when a user has sent the max number of email invites', async () => { @@ -224,11 +224,11 @@ describe('Post /groups/:groupId/invite', () => { emails: [testInvite], inviter: 'inviter name', })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('inviteLimitReached', {techAssistanceEmail: nconf.get('EMAILS:TECH_ASSISTANCE_EMAIL')}), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('inviteLimitReached', {techAssistanceEmail: nconf.get('EMAILS:TECH_ASSISTANCE_EMAIL')}), + }); }); it('invites a user to a group by email', async () => { @@ -258,11 +258,11 @@ describe('Post /groups/:groupId/invite', () => { describe('user and email invites', () => { it('returns an error when emails and uuids are not provided', async () => { await expect(inviter.post(`/groups/${group._id}/invite`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('canOnlyInviteEmailUuid'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('canOnlyInviteEmailUuid'), + }); }); it('returns an error when there are more than INVITES_LIMIT uuids and emails', async () => { @@ -281,11 +281,11 @@ describe('Post /groups/:groupId/invite', () => { emails, uuids, })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), + }); }); it('invites users to a group by uuid and email', async () => { @@ -322,19 +322,19 @@ describe('Post /groups/:groupId/invite', () => { describe('guild invites', () => { it('returns an error when invited user is already invited to the group', async () => { - let userToInivite = await generateUser(); + let userToInvite = await generateUser(); await inviter.post(`/groups/${group._id}/invite`, { - uuids: [userToInivite._id], + uuids: [userToInvite._id], }); await expect(inviter.post(`/groups/${group._id}/invite`, { - uuids: [userToInivite._id], + uuids: [userToInvite._id], })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('userAlreadyInvitedToGroup'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('userAlreadyInvitedToGroup', { userId: userToInvite._id, username: userToInvite.profile.name}), + }); }); it('returns an error when invited user is already in the group', async () => { @@ -347,11 +347,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('userAlreadyInGroup'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('userAlreadyInGroup', { userId: userToInvite._id, username: userToInvite.profile.name}), + }); }); it('allows 30+ members in a guild', async () => { @@ -380,11 +380,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(nonGroupLeader.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('onlyGroupLeaderCanInviteToGroupPlan'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('onlyGroupLeaderCanInviteToGroupPlan'), + }); }); }); @@ -407,11 +407,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${party._id}/invite`, { uuids: [userToInvite._id], })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('userAlreadyPendingInvitation'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('userAlreadyPendingInvitation', { userId: userToInvite._id, username: userToInvite.profile.name}), + }); }); it('returns an error when invited user is already in a party of more than 1 member', async () => { @@ -426,11 +426,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${party._id}/invite`, { uuids: [userToInvite._id], })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('userAlreadyInAParty'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('userAlreadyInAParty', { userId: userToInvite._id, username: userToInvite.profile.name}), + }); }); it('allow inviting a user to a party if they are partying solo', async () => { @@ -512,11 +512,11 @@ describe('Post /groups/:groupId/invite', () => { await expect(inviter.post(`/groups/${party._id}/invite`, { uuids: generatedInvites.map(invite => invite._id), })) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('partyExceedsMembersLimit', {maxMembersParty: PARTY_LIMIT_MEMBERS}), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('partyExceedsMembersLimit', {maxMembersParty: PARTY_LIMIT_MEMBERS}), + }); }); }); }); diff --git a/test/api/v3/integration/news/POST-news_tell_me_later.test.js b/test/api/v3/integration/news/POST-news_tell_me_later.test.js index 47444574c4..491a33f210 100644 --- a/test/api/v3/integration/news/POST-news_tell_me_later.test.js +++ b/test/api/v3/integration/news/POST-news_tell_me_later.test.js @@ -24,7 +24,7 @@ describe('POST /news/tell-me-later', () => { const notification = user.notifications[user.notifications.length - 1]; expect(notification.type).to.equal('NEW_STUFF'); - // should be marked as seen by default so it's not counted in the number of notifications + // should be marked as seen by default so it's not counted in the number of notifications expect(notification.seen).to.equal(true); expect(notification.data.title).to.be.a.string; }); diff --git a/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js b/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js index a5d4c1e769..72ebf915f7 100644 --- a/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js +++ b/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js @@ -26,9 +26,9 @@ describe('payments : apple #verify', () => { }); await user.post(endpoint, { - transaction: { - receipt: 'receipt', - }}); + transaction: { + receipt: 'receipt', + }}); expect(verifyStub).to.be.calledOnce; expect(verifyStub.args[0][0]._id).to.eql(user._id); diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js index ecff25cfd3..9faa405054 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js @@ -33,20 +33,20 @@ describe('POST /groups/:groupId/quests/accept', () => { context('failure conditions', () => { it('does not accept quest without an invite', async () => { await expect(leader.post(`/groups/${questingGroup._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('questInviteNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('questInviteNotFound'), + }); }); it('does not accept quest for a group in which user is not a member', async () => { await expect(user.post(`/groups/${questingGroup._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('groupNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); }); it('does not accept quest for a guild', async () => { @@ -55,11 +55,11 @@ describe('POST /groups/:groupId/quests/accept', () => { }); await expect(guildLeader.post(`/groups/${guild._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('guildQuestsNotSupported'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('guildQuestsNotSupported'), + }); }); it('does not accept invite twice', async () => { @@ -67,11 +67,11 @@ describe('POST /groups/:groupId/quests/accept', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('questAlreadyAccepted'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('questAlreadyAccepted'), + }); }); it('clears the invalid invite from the user when the request fails', async () => { @@ -79,11 +79,11 @@ describe('POST /groups/:groupId/quests/accept', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('questAlreadyAccepted'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('questAlreadyAccepted'), + }); await partyMembers[0].sync(); expect(partyMembers[0].party.quest.RSVPNeeded).to.be.false; @@ -96,11 +96,11 @@ describe('POST /groups/:groupId/quests/accept', () => { await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('questAlreadyUnderway'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('questAlreadyUnderway'), + }); }); }); diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js index 76497f50e9..bcbf6a6cf1 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js @@ -32,11 +32,11 @@ describe('POST /groups/:groupId/quests/force-start', () => { let nonMember = await generateUser(); await expect(nonMember.post(`/groups/${questingGroup._id}/quests/force-start`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('groupNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); }); it('does not force start quest for a guild', async () => { @@ -45,20 +45,20 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); await expect(guildLeader.post(`/groups/${guild._id}/quests/force-start`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('guildQuestsNotSupported'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('guildQuestsNotSupported'), + }); }); it('does not force start for a party without a pending quest', async () => { await expect(leader.post(`/groups/${questingGroup._id}/quests/force-start`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('questNotPending'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('questNotPending'), + }); }); it('does not force start for a quest already underway', async () => { @@ -69,22 +69,22 @@ describe('POST /groups/:groupId/quests/force-start', () => { await partyMembers[2].post(`/groups/${questingGroup._id}/quests/accept`); await expect(leader.post(`/groups/${questingGroup._id}/quests/force-start`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('questAlreadyUnderway'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('questAlreadyUnderway'), + }); }); it('does not allow non-quest leader or non-group leader to force start a quest', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/force-start`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('questOrGroupLeaderOnlyStartQuest'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('questOrGroupLeaderOnlyStartQuest'), + }); }); }); diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js index 9b5503736b..aa90c5940d 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js @@ -42,11 +42,11 @@ describe('POST /groups/:groupId/quests/abort', () => { it('returns an error for a group in which user is not a member', async () => { await expect(user.post(`/groups/${questingGroup._id}/quests/abort`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('groupNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); }); it('returns an error when group is a guild', async () => { @@ -55,11 +55,11 @@ describe('POST /groups/:groupId/quests/abort', () => { }); await expect(guildLeader.post(`/groups/${guild._id}/quests/abort`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('guildQuestsNotSupported'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('guildQuestsNotSupported'), + }); }); it('returns an error when quest is not active', async () => { diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js index 96d78c9bb4..3a5afe4254 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js @@ -41,11 +41,11 @@ describe('POST /groups/:groupId/quests/cancel', () => { it('does not reject quest for a group in which user is not a member', async () => { await expect(user.post(`/groups/${questingGroup._id}/quests/cancel`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('groupNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); }); it('returns an error when group is a guild', async () => { @@ -54,11 +54,11 @@ describe('POST /groups/:groupId/quests/cancel', () => { }); await expect(guildLeader.post(`/groups/${guild._id}/quests/cancel`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('guildQuestsNotSupported'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('guildQuestsNotSupported'), + }); }); it('returns an error when group is not on a quest', async () => { @@ -74,11 +74,11 @@ describe('POST /groups/:groupId/quests/cancel', () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/cancel`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('onlyLeaderCancelQuest'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('onlyLeaderCancelQuest'), + }); }); it('does not cancel a quest already underway', async () => { @@ -88,11 +88,11 @@ describe('POST /groups/:groupId/quests/cancel', () => { await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); await expect(leader.post(`/groups/${questingGroup._id}/quests/cancel`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('cantCancelActiveQuest'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('cantCancelActiveQuest'), + }); }); }); diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js index 89c65d0c73..8a2870681d 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js @@ -41,11 +41,11 @@ describe('POST /groups/:groupId/quests/leave', () => { it('returns an error for a group in which user is not a member', async () => { await expect(user.post(`/groups/${questingGroup._id}/quests/leave`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('groupNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); }); it('returns an error when group is a guild', async () => { @@ -54,11 +54,11 @@ describe('POST /groups/:groupId/quests/leave', () => { }); await expect(guildLeader.post(`/groups/${guild._id}/quests/leave`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('guildQuestsNotSupported'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('guildQuestsNotSupported'), + }); }); it('returns an error when quest is not active', async () => { @@ -89,11 +89,11 @@ describe('POST /groups/:groupId/quests/leave', () => { await partyMembers[1].post(`/groups/${questingGroup._id}/quests/reject`); await expect(partyMembers[1].post(`/groups/${questingGroup._id}/quests/leave`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('notPartOfQuest'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('notPartOfQuest'), + }); }); }); diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js index 46dfb5a88d..aacec2598b 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js @@ -42,11 +42,11 @@ describe('POST /groups/:groupId/quests/reject', () => { it('does not accept quest for a group in which user is not a member', async () => { await expect(user.post(`/groups/${questingGroup._id}/quests/accept`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('groupNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); }); it('returns an error when group is a guild', async () => { @@ -55,11 +55,11 @@ describe('POST /groups/:groupId/quests/reject', () => { }); await expect(guildLeader.post(`/groups/${guild._id}/quests/reject`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('guildQuestsNotSupported'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('guildQuestsNotSupported'), + }); }); it('returns an error when group is not on a quest', async () => { @@ -76,11 +76,11 @@ describe('POST /groups/:groupId/quests/reject', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('questAlreadyRejected'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('questAlreadyRejected'), + }); }); it('clears the user rsvp needed if the request fails because the request is invalid', async () => { @@ -88,11 +88,11 @@ describe('POST /groups/:groupId/quests/reject', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('questAlreadyRejected'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('questAlreadyRejected'), + }); await partyMembers[0].sync(); expect(partyMembers[0].party.quest.RSVPNeeded).to.be.false; @@ -103,11 +103,11 @@ describe('POST /groups/:groupId/quests/reject', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('questAlreadyAccepted'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('questAlreadyAccepted'), + }); }); it('does not reject invite for a quest already underway', async () => { @@ -117,11 +117,11 @@ describe('POST /groups/:groupId/quests/reject', () => { await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('questAlreadyUnderway'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('questAlreadyUnderway'), + }); }); }); diff --git a/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js index fa435c5e31..458fed6f10 100644 --- a/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js @@ -141,11 +141,11 @@ describe('POST /tasks/:id/score/:direction', () => { it('doesn\'t let a todo be completed twice', async () => { await user.post(`/tasks/${todo._id}/score/up`); await expect(user.post(`/tasks/${todo._id}/score/up`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('sessionOutdated'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('sessionOutdated'), + }); }); it('doesn\'t let a todo be uncompleted twice', async () => { @@ -380,11 +380,11 @@ describe('POST /tasks/:id/score/:direction', () => { await expect(user.post(`/tasks/${habit._id}/score/up`, { scoreNotes: scoreNotesString, })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('taskScoreNotesTooLong'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('taskScoreNotesTooLong'), + }); }); }); diff --git a/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js b/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js index ee60541017..cd8bec5acc 100644 --- a/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js @@ -41,30 +41,30 @@ describe('POST /tasks/unlink-all/:challengeId', () => { it('fails if no keep query', async () => { await expect(user.post(`/tasks/unlink-all/${challenge._id}`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('invalidReqParams'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('invalidReqParams'), + }); }); it('fails if invalid challenge id', async () => { await expect(user.post('/tasks/unlink-all/123?keep=remove-all')) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('invalidReqParams'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('invalidReqParams'), + }); }); it('fails on an unbroken challenge', async () => { await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily); await expect(user.post(`/tasks/unlink-all/${challenge._id}?keep=remove-all`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('cantOnlyUnlinkChalTask'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('cantOnlyUnlinkChalTask'), + }); }); it('unlinks all tasks from a challenge and deletes them on keep=remove-all', async () => { @@ -87,7 +87,7 @@ describe('POST /tasks/unlink-all/:challengeId', () => { const daily = await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily); const anotherUser = await generateUser(); await user.post(`/groups/${guild._id}/invite`, { - uuids: [anotherUser._id], + uuids: [anotherUser._id], }); // Have the second user join the group and challenge await anotherUser.post(`/groups/${guild._id}/join`); diff --git a/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js b/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js index 570f46c92e..fb67ec1451 100644 --- a/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js @@ -43,50 +43,50 @@ describe('POST /tasks/unlink-one/:taskId', () => { it('fails if no keep query', async () => { const daily = await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily); await expect(user.post(`/tasks/unlink-one/${daily._id}`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('invalidReqParams'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('invalidReqParams'), + }); }); it('fails if invalid task id', async () => { await expect(user.post('/tasks/unlink-one/123?keep=remove')) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('invalidReqParams'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('invalidReqParams'), + }); }); it('fails on task not found', async () => { await expect(user.post(`/tasks/unlink-one/${generateUUID()}?keep=keep`)) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('taskNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('taskNotFound'), + }); }); it('fails on task unlinked to challenge', async () => { let daily = await user.post('/tasks/user', tasksToTest.daily); await expect(user.post(`/tasks/unlink-one/${daily._id}?keep=keep`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('cantOnlyUnlinkChalTask'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('cantOnlyUnlinkChalTask'), + }); }); it('fails on unbroken challenge', async () => { await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily); let [daily] = await user.get('/tasks/user'); await expect(user.post(`/tasks/unlink-one/${daily._id}?keep=keep`)) - .to.eventually.be.rejected.and.eql({ - code: 400, - error: 'BadRequest', - message: t('cantOnlyUnlinkChalTask'), - }); + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('cantOnlyUnlinkChalTask'), + }); }); it('unlinks a task from a challenge and saves it on keep=keep', async () => { diff --git a/test/api/v3/integration/tasks/PUT-tasks_id.test.js b/test/api/v3/integration/tasks/PUT-tasks_id.test.js index b2b802f837..aba6c254cf 100644 --- a/test/api/v3/integration/tasks/PUT-tasks_id.test.js +++ b/test/api/v3/integration/tasks/PUT-tasks_id.test.js @@ -46,7 +46,7 @@ describe('PUT /tasks/:id', () => { expect(savedTask.userId).to.equal(task.userId); expect(savedTask.history).to.eql(task.history); expect(savedTask.createdAt).to.equal(task.createdAt); - expect(savedTask.updatedAt).to.be.greaterThan(task.updatedAt); + expect(new Date(savedTask.updatedAt)).to.be.greaterThan(new Date(task.updatedAt)); expect(savedTask.challenge).to.eql(task.challenge); expect(savedTask.completed).to.eql(task.completed); expect(savedTask.streak).to.equal(savedTask.streak); // it's an habit, dailies can change it @@ -54,7 +54,7 @@ describe('PUT /tasks/:id', () => { }); it('ignores invalid fields', async () => { - let savedTask = await user.put(`/tasks/${task._id}`, { + let savedTask = await user.put(`/tasks/${task._id}`, { notValid: true, }); @@ -133,7 +133,7 @@ describe('PUT /tasks/:id', () => { expect(savedChallengeUserTask.text).to.equal(challengeUserTask.text); expect(savedChallengeUserTask.history).to.eql(challengeUserTask.history); expect(savedChallengeUserTask.createdAt).to.equal(challengeUserTask.createdAt); - expect(savedChallengeUserTask.updatedAt).to.be.greaterThan(challengeUserTask.updatedAt); + expect(new Date(savedChallengeUserTask.updatedAt)).to.be.greaterThan(new Date(challengeUserTask.updatedAt)); expect(savedChallengeUserTask.challenge).to.eql(challengeUserTask.challenge); expect(savedChallengeUserTask.completed).to.equal(challengeUserTask.completed); expect(savedChallengeUserTask.dateCompleted).to.equal(challengeUserTask.dateCompleted); diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js index 06bc7b68b2..ec4d09f7b3 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js @@ -40,11 +40,11 @@ describe('POST /tasks/:taskId/checklist/', () => { ignored: false, _id: 123, })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('onlyChalLeaderEditTasks'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('onlyChalLeaderEditTasks'), + }); }); it('adds a checklist item to a daily', async () => { diff --git a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js index bd3be00508..94d96367b8 100644 --- a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js @@ -98,7 +98,7 @@ describe('PUT /tasks/:id', () => { expect(savedTask.userId).to.equal(task.userId); expect(savedTask.history).to.eql(task.history); expect(savedTask.createdAt).to.equal(task.createdAt); - expect(savedTask.updatedAt).to.be.greaterThan(task.updatedAt); + expect(new Date(savedTask.updatedAt)).to.be.greaterThan(new Date(task.updatedAt)); expect(savedTask.challenge._id).to.equal(task.challenge._id); expect(savedTask.completed).to.equal(task.completed); expect(savedTask.streak).to.equal(task.streak); diff --git a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js index 4dc2ceaa3e..cce7ce79f3 100644 --- a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js @@ -28,11 +28,11 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { completed: true, _id: 123, // ignored })) - .to.eventually.be.rejected.and.eql({ - code: 404, - error: 'NotFound', - message: t('checklistItemNotFound'), - }); + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('checklistItemNotFound'), + }); }); it('returns error when user is not a member of the challenge', async () => { @@ -53,11 +53,11 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { completed: true, _id: 123, // ignored })) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('onlyChalLeaderEditTasks'), - }); + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('onlyChalLeaderEditTasks'), + }); }); it('updates a checklist item on dailies', async () => { diff --git a/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js b/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js index bfa5f31840..ead583d122 100644 --- a/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js +++ b/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js @@ -3,6 +3,7 @@ import { translate as t, } from '../../../../../../helpers/api-integration/v3'; import { v4 as generateUUID } from 'uuid'; + // Currently we do not support adding tags to group original tasks, but if we do in the future, these tests will check xdescribe('POST group /tasks/:taskId/tags/:tagId', () => { let user, guild, task; diff --git a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js index 9453757530..d8cd074bc7 100644 --- a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js +++ b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js @@ -187,6 +187,22 @@ describe('POST /user/class/cast/:spellId', () => { expect(group.chat[0].uuid).to.equal('system'); }); + it('cast bulk', async () => { + let { group, groupLeader } = await createAndPopulateGroup({ + groupDetails: { type: 'party', privacy: 'private' }, + members: 1, + }); + + await groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13}); + await groupLeader.post('/user/class/cast/earth', {quantity: 2}); + + await sleep(1); + await group.sync(); + + expect(group.chat[0]).to.exist; + expect(group.chat[0].uuid).to.equal('system'); + }); + it('searing brightness does not affect challenge or group tasks', async () => { let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); diff --git a/test/api/v3/integration/user/POST-user_release_both.test.js b/test/api/v3/integration/user/POST-user_release_both.test.js index 047ea5a2c9..ce8e5246dd 100644 --- a/test/api/v3/integration/user/POST-user_release_both.test.js +++ b/test/api/v3/integration/user/POST-user_release_both.test.js @@ -54,9 +54,9 @@ describe('POST /user/release-both', () => { expect(response.message).to.equal(t('mountsAndPetsReleased')); expect(user.balance).to.equal(0); - expect(user.items.currentMount).to.be.empty; - expect(user.items.currentPet).to.be.empty; - expect(user.items.pets[animal]).to.be.empty; + expect(user.items.currentMount).to.equal(''); + expect(user.items.currentPet).to.equal(''); + expect(user.items.pets[animal]).to.equal(0); expect(user.items.mounts[animal]).to.equal(null); expect(user.achievements.beastMasterCount).to.equal(1); expect(user.achievements.mountMasterCount).to.equal(1); diff --git a/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js b/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js index ae4fde82a9..55c5522322 100644 --- a/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js +++ b/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js @@ -41,7 +41,7 @@ describe('DELETE social registration', () => { let response = await user.del('/user/auth/social/facebook'); expect(response).to.eql({}); await user.sync(); - expect(user.auth.facebook).to.be.empty; + expect(user.auth.facebook).to.be.undefined; }); it('succeeds if user has a google registration', async () => { @@ -54,7 +54,7 @@ describe('DELETE social registration', () => { let response = await user.del('/user/auth/social/facebook'); expect(response).to.eql({}); await user.sync(); - expect(user.auth.facebook).to.be.empty; + expect(user.auth.facebook).to.be.undefined; }); }); @@ -79,7 +79,7 @@ describe('DELETE social registration', () => { let response = await user.del('/user/auth/social/google'); expect(response).to.eql({}); await user.sync(); - expect(user.auth.google).to.be.empty; + expect(user.auth.google).to.be.undefined; }); it('succeeds if user has a facebook registration', async () => { @@ -92,7 +92,7 @@ describe('DELETE social registration', () => { let response = await user.del('/user/auth/social/google'); expect(response).to.eql({}); await user.sync(); - expect(user.auth.google).to.be.empty; + expect(user.auth.goodl).to.be.undefined; }); }); }); diff --git a/test/api/v3/integration/user/auth/POST-register_local.test.js b/test/api/v3/integration/user/auth/POST-register_local.test.js index 259d848c05..1ad091a79e 100644 --- a/test/api/v3/integration/user/auth/POST-register_local.test.js +++ b/test/api/v3/integration/user/auth/POST-register_local.test.js @@ -579,7 +579,7 @@ describe('POST /user/auth/local/register', () => { it('adds a user to a guild on an invite of type other than party', async () => { let { group, groupLeader } = await createAndPopulateGroup({ - groupDetails: { type: 'guild', privacy: 'private' }, + groupDetails: { type: 'guild', privacy: 'private' }, }); let invite = encrypt(JSON.stringify({ diff --git a/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js b/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js index 2e02562b5f..994eff6750 100644 --- a/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js +++ b/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js @@ -34,7 +34,7 @@ describe('PUT /user/webhook/:id', () => { }); it('returns an error if validation fails', async () => { - await expect(user.put(`/user/webhook/${webhookToUpdate.id}`, { url: 'foo', enabled: true })).to.eventually.be.rejected.and.eql({ + await expect(user.put(`/user/webhook/${webhookToUpdate.id}`, { url: 'foo_invalid', enabled: true })).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: 'User validation failed', diff --git a/test/api/v3/integration/world-state/GET-world-state.test.js b/test/api/v3/integration/world-state/GET-world-state.test.js index fac08ad639..5c91062769 100644 --- a/test/api/v3/integration/world-state/GET-world-state.test.js +++ b/test/api/v3/integration/world-state/GET-world-state.test.js @@ -19,7 +19,7 @@ describe('GET /world-state', () => { await updateDocument('groups', {_id: TAVERN_ID}, {quest: {active: true, key: 'dysheartener', progress: {hp: 50000, rage: 9999}}}); const res = await requester().get('/world-state'); - expect(res).to.have.deep.property('worldBoss'); + expect(res).to.have.nested.property('worldBoss'); expect(res.worldBoss).to.eql({ active: true, diff --git a/test/api/v3/unit/libs/apiMessages.js b/test/api/v3/unit/libs/apiMessages.js index 09ff86f5ba..3d2ac2fad1 100644 --- a/test/api/v3/unit/libs/apiMessages.js +++ b/test/api/v3/unit/libs/apiMessages.js @@ -14,7 +14,7 @@ describe('API Messages', () => { let vars = {a: 1}; sandbox.stub(_, 'clone').returns({}); apiMessages('guildsOnlyPaginate', vars); - expect(_.clone).to.have.been.called.once; + expect(_.clone).to.have.been.calledOnce; expect(_.clone).to.have.been.calledWith(vars); }); @@ -23,9 +23,9 @@ describe('API Messages', () => { let stub = sinon.stub().returns('string'); sandbox.stub(_, 'template').returns(stub); apiMessages('guildsOnlyPaginate', vars); - expect(_.template).to.have.been.called.once; + expect(_.template).to.have.been.calledOnce; expect(_.template).to.have.been.calledWith(message); - expect(stub).to.have.been.called.once; + expect(stub).to.have.been.calledOnce; expect(stub).to.have.been.calledWith(vars); }); }); diff --git a/test/api/v3/unit/libs/collectionManipulators.test.js b/test/api/v3/unit/libs/collectionManipulators.test.js index a2bc6e71c4..2736b37502 100644 --- a/test/api/v3/unit/libs/collectionManipulators.test.js +++ b/test/api/v3/unit/libs/collectionManipulators.test.js @@ -1,6 +1,6 @@ import mongoose from 'mongoose'; import { - removeFromArray, + removeFromArray, } from '../../../../../website/server/libs/collectionManipulators'; describe('Collection Manipulators', () => { diff --git a/test/api/v3/unit/libs/cron.test.js b/test/api/v3/unit/libs/cron.test.js index 2fefcbf483..76990aa20a 100644 --- a/test/api/v3/unit/libs/cron.test.js +++ b/test/api/v3/unit/libs/cron.test.js @@ -181,9 +181,9 @@ describe('cron', () => { cron({user, tasksByType, daysMissed, analytics}); expect(user.purchased.plan.customerId).to.not.exist; - expect(user.purchased.plan.consecutive.gemCapExtra).to.be.empty; - expect(user.purchased.plan.consecutive.count).to.be.empty; - expect(user.purchased.plan.consecutive.offset).to.be.empty; + expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(0); + expect(user.purchased.plan.consecutive.count).to.equal(0); + expect(user.purchased.plan.consecutive.offset).to.equal(0); }); }); @@ -1027,7 +1027,7 @@ describe('cron', () => { cron({user, tasksByType, daysMissed, analytics}); expect(user.party.quest.progress.up).to.equal(0); expect(user.party.quest.progress.down).to.equal(0); - expect(user.party.quest.progress.collectedItems).to.be.empty; + expect(user.party.quest.progress.collectedItems).to.equal(0); }); it('applies the user progress', () => { diff --git a/test/api/v3/unit/libs/email.test.js b/test/api/v3/unit/libs/email.test.js index 1597ccee73..ebfa2ac6ea 100644 --- a/test/api/v3/unit/libs/email.test.js +++ b/test/api/v3/unit/libs/email.test.js @@ -1,27 +1,11 @@ /* eslint-disable global-require */ -import request from 'request'; +import got from 'got'; import nconf from 'nconf'; import nodemailer from 'nodemailer'; -import Bluebird from 'bluebird'; import requireAgain from 'require-again'; import logger from '../../../../../website/server/libs/logger'; import { TAVERN_ID } from '../../../../../website/server/models/group'; - -function defer () { - let resolve; - let reject; - - let promise = new Bluebird((resolveParam, rejectParam) => { - resolve = resolveParam; - reject = rejectParam; - }); - - return { - resolve, - reject, - promise, - }; -} +import { defer } from '../../../../helpers/api-unit.helper'; function getUser () { return { @@ -158,7 +142,7 @@ describe('emails', () => { describe('sendTxnEmail', () => { beforeEach(() => { - sandbox.stub(request, 'post'); + sandbox.stub(got, 'post').returns(defer().promise); }); afterEach(() => { @@ -176,8 +160,9 @@ describe('emails', () => { }; sendTxnEmail(mailingInfo, emailType); - expect(request.post).to.be.calledWith(sinon.match({ - json: { + expect(got.post).to.be.calledWith('undefined/job', sinon.match({ + json: true, + body: { data: { emailType: sinon.match.same(emailType), to: sinon.match((value) => { @@ -199,7 +184,7 @@ describe('emails', () => { }; sendTxnEmail(mailingInfo, emailType); - expect(request.post).not.to.be.called; + expect(got.post).not.to.be.called; }); it('uses getUserInfo in case of user data', () => { @@ -210,8 +195,9 @@ describe('emails', () => { let mailingInfo = getUser(); sendTxnEmail(mailingInfo, emailType); - expect(request.post).to.be.calledWith(sinon.match({ - json: { + expect(got.post).to.be.calledWith('undefined/job', sinon.match({ + json: true, + body: { data: { emailType: sinon.match.same(emailType), to: sinon.match(val => val[0]._id === mailingInfo._id), @@ -232,8 +218,9 @@ describe('emails', () => { let variables = [1, 2, 3]; sendTxnEmail(mailingInfo, emailType, variables); - expect(request.post).to.be.calledWith(sinon.match({ - json: { + expect(got.post).to.be.calledWith('undefined/job', sinon.match({ + json: true, + body: { data: { variables: sinon.match((value) => { return value[0].name === 'BASE_URL'; diff --git a/test/api/v3/unit/libs/payments/amazon/checkout.test.js b/test/api/v3/unit/libs/payments/amazon/checkout.test.js index 9e74cdb145..0581c76772 100644 --- a/test/api/v3/unit/libs/payments/amazon/checkout.test.js +++ b/test/api/v3/unit/libs/payments/amazon/checkout.test.js @@ -132,11 +132,11 @@ describe('Amazon Payments - Checkout', () => { }; await expect(amzLib.checkout({gift, user, orderReferenceId, headers})) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - message: 'Amount must be at least 1.', - name: 'BadRequest', - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + message: 'Amount must be at least 1.', + name: 'BadRequest', + }); }); it('should error if user cannot get gems gems', async () => { diff --git a/test/api/v3/unit/libs/payments/amazon/subscribe.test.js b/test/api/v3/unit/libs/payments/amazon/subscribe.test.js index 8095f90c63..930c64d06a 100644 --- a/test/api/v3/unit/libs/payments/amazon/subscribe.test.js +++ b/test/api/v3/unit/libs/payments/amazon/subscribe.test.js @@ -123,11 +123,11 @@ describe('Amazon Payments - Subscribe', () => { groupId, headers, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: i18n.t('missingSubscriptionCode'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: i18n.t('missingSubscriptionCode'), + }); }); it('should throw an error if we are missing a billingAgreementId', async () => { @@ -138,11 +138,11 @@ describe('Amazon Payments - Subscribe', () => { groupId, headers, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: 'Missing req.body.billingAgreementId', - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: 'Missing req.body.billingAgreementId', + }); }); it('should throw an error when coupon code is missing', async () => { @@ -156,11 +156,11 @@ describe('Amazon Payments - Subscribe', () => { groupId, headers, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: i18n.t('couponCodeRequired'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: i18n.t('couponCodeRequired'), + }); }); it('should throw an error when coupon code is invalid', async () => { @@ -182,11 +182,11 @@ describe('Amazon Payments - Subscribe', () => { groupId, headers, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 401, - name: 'NotAuthorized', - message: i18n.t('invalidCoupon'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 401, + name: 'NotAuthorized', + message: i18n.t('invalidCoupon'), + }); cc.validate.restore(); }); diff --git a/test/api/v3/unit/libs/payments/group-plans/group-payments-create.test.js b/test/api/v3/unit/libs/payments/group-plans/group-payments-create.test.js index 96bcde4134..72489aa4df 100644 --- a/test/api/v3/unit/libs/payments/group-plans/group-payments-create.test.js +++ b/test/api/v3/unit/libs/payments/group-plans/group-payments-create.test.js @@ -305,7 +305,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - expect(sender.sendTxn).to.be.calledFourTimes; + expect(sender.sendTxn).to.have.callCount(4); expect(sender.sendTxn.args[0][0]._id).to.equal(TECH_ASSISTANCE_EMAIL); expect(sender.sendTxn.args[0][1]).to.equal('admin-user-subscription-details'); expect(sender.sendTxn.args[1][0]._id).to.equal(recipient._id); @@ -338,7 +338,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - expect(sender.sendTxn).to.be.calledFourTimes; + expect(sender.sendTxn).to.have.callCount(4); expect(sender.sendTxn.args[0][0]._id).to.equal(TECH_ASSISTANCE_EMAIL); expect(sender.sendTxn.args[0][1]).to.equal('admin-user-subscription-details'); expect(sender.sendTxn.args[1][0]._id).to.equal(recipient._id); diff --git a/test/api/v3/unit/libs/payments/paypal/checkout.test.js b/test/api/v3/unit/libs/payments/paypal/checkout.test.js index 9ed40c1ad8..aaa83535ee 100644 --- a/test/api/v3/unit/libs/payments/paypal/checkout.test.js +++ b/test/api/v3/unit/libs/payments/paypal/checkout.test.js @@ -71,11 +71,11 @@ describe('checkout', () => { }; await expect(paypalPayments.checkout({gift})) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - message: 'Amount must be at least 1.', - name: 'BadRequest', - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + message: 'Amount must be at least 1.', + name: 'BadRequest', + }); }); it('should error if the user cannot get gems', async () => { diff --git a/test/api/v3/unit/libs/payments/stripe/cancel-subscription.test.js b/test/api/v3/unit/libs/payments/stripe/cancel-subscription.test.js index 2e09014a39..d062ad0b89 100644 --- a/test/api/v3/unit/libs/payments/stripe/cancel-subscription.test.js +++ b/test/api/v3/unit/libs/payments/stripe/cancel-subscription.test.js @@ -42,11 +42,11 @@ describe('cancel subscription', () => { user, groupId: undefined, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 401, - name: 'NotAuthorized', - message: i18n.t('missingSubscription'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 401, + name: 'NotAuthorized', + message: i18n.t('missingSubscription'), + }); }); it('throws an error if the group is not found', async () => { @@ -54,11 +54,11 @@ describe('cancel subscription', () => { user, groupId: 'fake-group', })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 404, - name: 'NotFound', - message: i18n.t('groupNotFound'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 404, + name: 'NotFound', + message: i18n.t('groupNotFound'), + }); }); it('throws an error if user is not the group leader', async () => { @@ -70,11 +70,11 @@ describe('cancel subscription', () => { user: nonLeader, groupId, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 401, - name: 'NotAuthorized', - message: i18n.t('onlyGroupLeaderCanManageSubscription'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 401, + name: 'NotAuthorized', + message: i18n.t('onlyGroupLeaderCanManageSubscription'), + }); }); describe('success', () => { diff --git a/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js b/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js index d1d908c7fa..7271b1dbd3 100644 --- a/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js +++ b/test/api/v3/unit/libs/payments/stripe/checkout-subscription.test.js @@ -88,11 +88,11 @@ describe('checkout with subscription', () => { headers, coupon, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: 'Missing req.body.id', - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: 'Missing req.body.id', + }); }); it('should throw an error when coupon code is missing', async () => { @@ -108,11 +108,11 @@ describe('checkout with subscription', () => { headers, coupon, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: i18n.t('couponCodeRequired'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: i18n.t('couponCodeRequired'), + }); }); it('should throw an error when coupon code is invalid', async () => { @@ -136,11 +136,11 @@ describe('checkout with subscription', () => { headers, coupon, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: i18n.t('invalidCoupon'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: i18n.t('invalidCoupon'), + }); cc.validate.restore(); }); diff --git a/test/api/v3/unit/libs/payments/stripe/checkout.test.js b/test/api/v3/unit/libs/payments/stripe/checkout.test.js index f784bca300..b8f398ef6e 100644 --- a/test/api/v3/unit/libs/payments/stripe/checkout.test.js +++ b/test/api/v3/unit/libs/payments/stripe/checkout.test.js @@ -57,11 +57,11 @@ describe('checkout', () => { headers, coupon, }, stripe)) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - message: 'Amount must be at least 1.', - name: 'BadRequest', - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + message: 'Amount must be at least 1.', + name: 'BadRequest', + }); }); diff --git a/test/api/v3/unit/libs/payments/stripe/edit-subscription.test.js b/test/api/v3/unit/libs/payments/stripe/edit-subscription.test.js index 9c58c4bae5..40153f8496 100644 --- a/test/api/v3/unit/libs/payments/stripe/edit-subscription.test.js +++ b/test/api/v3/unit/libs/payments/stripe/edit-subscription.test.js @@ -43,11 +43,11 @@ describe('edit subscription', () => { user, groupId: undefined, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 401, - name: 'NotAuthorized', - message: i18n.t('missingSubscription'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 401, + name: 'NotAuthorized', + message: i18n.t('missingSubscription'), + }); }); it('throws an error if a token is not provided', async () => { @@ -55,11 +55,11 @@ describe('edit subscription', () => { user, groupId: undefined, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 400, - name: 'BadRequest', - message: 'Missing req.body.id', - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 400, + name: 'BadRequest', + message: 'Missing req.body.id', + }); }); it('throws an error if the group is not found', async () => { @@ -68,11 +68,11 @@ describe('edit subscription', () => { user, groupId: 'fake-group', })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 404, - name: 'NotFound', - message: i18n.t('groupNotFound'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 404, + name: 'NotFound', + message: i18n.t('groupNotFound'), + }); }); it('throws an error if user is not the group leader', async () => { @@ -85,11 +85,11 @@ describe('edit subscription', () => { user: nonLeader, groupId, })) - .to.eventually.be.rejected.and.to.eql({ - httpCode: 401, - name: 'NotAuthorized', - message: i18n.t('onlyGroupLeaderCanManageSubscription'), - }); + .to.eventually.be.rejected.and.to.eql({ + httpCode: 401, + name: 'NotAuthorized', + message: i18n.t('onlyGroupLeaderCanManageSubscription'), + }); }); describe('success', () => { diff --git a/test/api/v3/unit/libs/payments/stripe/handle-webhook.test.js b/test/api/v3/unit/libs/payments/stripe/handle-webhook.test.js index 762e840c8a..f8786b2718 100644 --- a/test/api/v3/unit/libs/payments/stripe/handle-webhook.test.js +++ b/test/api/v3/unit/libs/payments/stripe/handle-webhook.test.js @@ -34,7 +34,7 @@ describe('Stripe - Webhooks', () => { it('logs an error if an unsupported webhook event is passed', async () => { const error = new Error(`Missing handler for Stripe webhook ${eventType}`); await stripePayments.handleWebhooks({requestBody: event}, stripe); - expect(logger.error).to.have.been.called.once; + expect(logger.error).to.have.been.calledOnce; const calledWith = logger.error.getCall(0).args; expect(calledWith[0].message).to.equal(error.message); @@ -43,7 +43,7 @@ describe('Stripe - Webhooks', () => { it('retrieves and validates the event from Stripe', async () => { await stripePayments.handleWebhooks({requestBody: event}, stripe); - expect(stripe.events.retrieve).to.have.been.called.once; + expect(stripe.events.retrieve).to.have.been.calledOnce; expect(stripe.events.retrieve).to.have.been.calledWith(event.id); }); }); @@ -70,7 +70,7 @@ describe('Stripe - Webhooks', () => { await stripePayments.handleWebhooks({requestBody: {}}, stripe); - expect(stripe.events.retrieve).to.have.been.called.once; + expect(stripe.events.retrieve).to.have.been.calledOnce; expect(stripe.customers.del).to.not.have.been.called; expect(payments.cancelSubscription).to.not.have.been.called; stripe.events.retrieve.restore(); diff --git a/test/api/v3/unit/libs/taskManager.js b/test/api/v3/unit/libs/taskManager.js index 546fcbe19f..14dc8feb49 100644 --- a/test/api/v3/unit/libs/taskManager.js +++ b/test/api/v3/unit/libs/taskManager.js @@ -54,7 +54,7 @@ describe('taskManager', () => { expect(newTask.type).to.equal(testHabit.type); expect(newTask.up).to.equal(testHabit.up); expect(newTask.down).to.equal(testHabit.down); - expect(newTask.createdAt).isNotEmtpy; + expect(newTask.createdAt).to.exist; }); it('gets user tasks', async () => { @@ -75,7 +75,7 @@ describe('taskManager', () => { expect(task.type).to.equal(testHabit.type); expect(task.up).to.equal(testHabit.up); expect(task.down).to.equal(testHabit.down); - expect(task.createdAt).isNotEmtpy; + expect(task.createdAt).to.exist; }); it('creates group tasks', async () => { @@ -89,7 +89,7 @@ describe('taskManager', () => { expect(newTask.type).to.equal(testHabit.type); expect(newTask.up).to.equal(testHabit.up); expect(newTask.down).to.equal(testHabit.down); - expect(newTask.createdAt).isNotEmtpy; + expect(newTask.createdAt).to.exist; expect(newTask.group.id).to.equal(group._id); }); @@ -111,7 +111,7 @@ describe('taskManager', () => { expect(task.type).to.equal(testHabit.type); expect(task.up).to.equal(testHabit.up); expect(task.down).to.equal(testHabit.down); - expect(task.createdAt).isNotEmtpy; + expect(task.createdAt).to.exist; expect(task.group.id).to.equal(group._id); }); @@ -126,7 +126,7 @@ describe('taskManager', () => { expect(newTask.type).to.equal(testHabit.type); expect(newTask.up).to.equal(testHabit.up); expect(newTask.down).to.equal(testHabit.down); - expect(newTask.createdAt).isNotEmtpy; + expect(newTask.createdAt).to.exist; expect(newTask.challenge.id).to.equal(challenge._id); }); @@ -148,7 +148,7 @@ describe('taskManager', () => { expect(task.type).to.equal(testHabit.type); expect(task.up).to.equal(testHabit.up); expect(task.down).to.equal(testHabit.down); - expect(task.createdAt).isNotEmtpy; + expect(task.createdAt).to.exist; expect(task.challenge.id).to.equal(challenge._id); }); @@ -171,7 +171,7 @@ describe('taskManager', () => { expect(syncableTask.updatedAt).to.not.exist; }); - it('moves tasks to a specified position', async() => { + it('moves tasks to a specified position', async () => { let order = ['task-id-1', 'task-id-2']; moveTask(order, 'task-id-2', 0); diff --git a/test/api/v3/unit/libs/webhooks.test.js b/test/api/v3/unit/libs/webhooks.test.js index 49c3d0e24f..467ce9bd8a 100644 --- a/test/api/v3/unit/libs/webhooks.test.js +++ b/test/api/v3/unit/libs/webhooks.test.js @@ -1,16 +1,17 @@ -import request from 'request'; +import got from 'got'; import { WebhookSender, taskScoredWebhook, groupChatReceivedWebhook, taskActivityWebhook, } from '../../../../../website/server/libs/webhook'; +import { defer } from '../../../../helpers/api-unit.helper'; describe('webhooks', () => { let webhooks; beforeEach(() => { - sandbox.stub(request, 'post'); + sandbox.stub(got, 'post').returns(defer().promise); webhooks = [{ id: 'taskActivity', @@ -59,8 +60,9 @@ describe('webhooks', () => { sendWebhook.send([{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}], body); expect(WebhookSender.defaultTransformData).to.be.calledOnce; - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch('http://custom-url.com', { + json: true, body, }); }); @@ -81,8 +83,9 @@ describe('webhooks', () => { sendWebhook.send([{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}], body); expect(WebhookSender.defaultTransformData).to.not.be.called; - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch('http://custom-url.com', { + json: true, body: { foo: 'bar', baz: 'biz', @@ -117,7 +120,7 @@ describe('webhooks', () => { sendWebhook.send([{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}], body); expect(WebhookSender.defaultWebhookFilter).to.not.be.called; - expect(request.post).to.not.be.called; + expect(got.post).to.not.be.called; }); it('can pass in a webhook filter function that filters on data', () => { @@ -136,10 +139,8 @@ describe('webhooks', () => { { id: 'other-custom-webhook', url: 'http://other-custom-url.com', enabled: true, type: 'custom', options: { foo: 'foo' }}, ], body); - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ - url: 'http://custom-url.com', - }); + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch('http://custom-url.com'); }); it('ignores disabled webhooks', () => { @@ -151,7 +152,7 @@ describe('webhooks', () => { sendWebhook.send([{id: 'custom-webhook', url: 'http://custom-url.com', enabled: false, type: 'custom'}], body); - expect(request.post).to.not.be.called; + expect(got.post).to.not.be.called; }); it('ignores webhooks with invalid urls', () => { @@ -163,7 +164,7 @@ describe('webhooks', () => { sendWebhook.send([{id: 'custom-webhook', url: 'httxp://custom-url!!', enabled: true, type: 'custom'}], body); - expect(request.post).to.not.be.called; + expect(got.post).to.not.be.called; }); it('ignores webhooks of other types', () => { @@ -178,9 +179,8 @@ describe('webhooks', () => { { id: 'other-webhook', url: 'http://other-url.com', enabled: true, type: 'other'}, ], body); - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ - url: 'http://custom-url.com', + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch('http://custom-url.com', { body, json: true, }); @@ -198,14 +198,12 @@ describe('webhooks', () => { { id: 'other-custom-webhook', url: 'http://other-url.com', enabled: true, type: 'custom'}, ], body); - expect(request.post).to.be.calledTwice; - expect(request.post).to.be.calledWithMatch({ - url: 'http://custom-url.com', + expect(got.post).to.be.calledTwice; + expect(got.post).to.be.calledWithMatch('http://custom-url.com', { body, json: true, }); - expect(request.post).to.be.calledWithMatch({ - url: 'http://other-url.com', + expect(got.post).to.be.calledWithMatch('http://other-url.com', { body, json: true, }); @@ -252,8 +250,9 @@ describe('webhooks', () => { it('sends task and stats data', () => { taskScoredWebhook.send(webhooks, data); - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch(webhooks[0].url, { + json: true, body: { type: 'scored', user: { @@ -283,7 +282,7 @@ describe('webhooks', () => { taskScoredWebhook.send(webhooks, data); - expect(request.post).to.not.be.called; + expect(got.post).to.not.be.called; }); }); @@ -304,8 +303,9 @@ describe('webhooks', () => { taskActivityWebhook.send(webhooks, data); - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch(webhooks[0].url, { + json: true, body: { type, task: data.task, @@ -319,7 +319,7 @@ describe('webhooks', () => { taskActivityWebhook.send(webhooks, data); - expect(request.post).to.not.be.called; + expect(got.post).to.not.be.called; }); }); }); @@ -340,8 +340,9 @@ describe('webhooks', () => { groupChatReceivedWebhook.send(webhooks, data); - expect(request.post).to.be.calledOnce; - expect(request.post).to.be.calledWithMatch({ + expect(got.post).to.be.calledOnce; + expect(got.post).to.be.calledWithMatch(webhooks[webhooks.length - 1].url, { + json: true, body: { group: { id: 'group-id', @@ -370,7 +371,7 @@ describe('webhooks', () => { groupChatReceivedWebhook.send(webhooks, data); - expect(request.post).to.not.be.called; + expect(got.post).to.not.be.called; }); }); }); diff --git a/test/api/v3/unit/middlewares/cors.test.js b/test/api/v3/unit/middlewares/cors.test.js index 8ece1e9ca2..8cf6dbc3ff 100644 --- a/test/api/v3/unit/middlewares/cors.test.js +++ b/test/api/v3/unit/middlewares/cors.test.js @@ -23,7 +23,7 @@ describe('cors middleware', () => { 'Access-Control-Allow-Headers': 'Content-Type,Accept,Content-Encoding,X-Requested-With,x-api-user,x-api-key,x-client', }); expect(res.sendStatus).to.not.have.been.called; - expect(next).to.have.been.called.once; + expect(next).to.have.been.calledOnce; }); it('responds immediately if method is OPTIONS', () => { diff --git a/test/api/v3/unit/middlewares/cronMiddleware.js b/test/api/v3/unit/middlewares/cronMiddleware.js index fd38079691..12209b1a87 100644 --- a/test/api/v3/unit/middlewares/cronMiddleware.js +++ b/test/api/v3/unit/middlewares/cronMiddleware.js @@ -36,12 +36,12 @@ describe('cron middleware', () => { }); user.save() - .then(savedUser => { - res.locals.user = savedUser; - res.analytics = analyticsService; - done(); - }) - .catch(done); + .then(savedUser => { + res.locals.user = savedUser; + res.analytics = analyticsService; + done(); + }) + .catch(done); }); afterEach(() => { diff --git a/test/api/v3/unit/middlewares/maintenanceMode.test.js b/test/api/v3/unit/middlewares/maintenanceMode.test.js index 857fb2c941..566d572206 100644 --- a/test/api/v3/unit/middlewares/maintenanceMode.test.js +++ b/test/api/v3/unit/middlewares/maintenanceMode.test.js @@ -22,7 +22,7 @@ describe('maintenance mode middleware', () => { attachMaintenanceMode(req, res, next); - expect(next).to.have.been.called.once; + expect(next).to.have.been.calledOnce; expect(res.status).to.not.have.been.called; }); diff --git a/test/api/v3/unit/middlewares/redirects.js b/test/api/v3/unit/middlewares/redirects.js index ed210c169a..184d60b706 100644 --- a/test/api/v3/unit/middlewares/redirects.js +++ b/test/api/v3/unit/middlewares/redirects.js @@ -43,7 +43,7 @@ describe('redirects middleware', () => { attachRedirects.forceSSL(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); it('does not redirect outside of production environments', () => { @@ -57,7 +57,7 @@ describe('redirects middleware', () => { attachRedirects.forceSSL(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); it('does not redirect if base URL is not https', () => { @@ -71,7 +71,7 @@ describe('redirects middleware', () => { attachRedirects.forceSSL(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); }); @@ -108,7 +108,7 @@ describe('redirects middleware', () => { attachRedirects.forceHabitica(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); it('does not redirect if env is set to ignore redirection', () => { @@ -125,7 +125,7 @@ describe('redirects middleware', () => { attachRedirects.forceHabitica(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); it('does not redirect if request hostname matches base URL host', () => { @@ -142,7 +142,7 @@ describe('redirects middleware', () => { attachRedirects.forceHabitica(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); it('does not redirect if request is an API URL', () => { @@ -159,7 +159,7 @@ describe('redirects middleware', () => { attachRedirects.forceHabitica(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); it('does not redirect if request method is not GET', () => { @@ -176,7 +176,7 @@ describe('redirects middleware', () => { attachRedirects.forceHabitica(req, res, next); - expect(res.redirect).to.be.notCalled; + expect(res.redirect).to.have.not.been.called; }); }); }); diff --git a/test/api/v3/unit/models/challenge.test.js b/test/api/v3/unit/models/challenge.test.js index 18e7de7bcf..a27d8b65a7 100644 --- a/test/api/v3/unit/models/challenge.test.js +++ b/test/api/v3/unit/models/challenge.test.js @@ -65,7 +65,7 @@ describe('Challenge Model', () => { each(tasksToTest, (taskValue, taskType) => { context(`${taskType}`, () => { - beforeEach(async() => { + beforeEach(async () => { task = new Tasks[`${taskType}`](Tasks.Task.sanitize(taskValue)); task.challenge.id = challenge._id; await task.save(); @@ -194,7 +194,7 @@ describe('Challenge Model', () => { }); expect(syncedTask).to.exist; - expect(syncedTask.challenge._id).to.be.empty; + expect(syncedTask.challenge._id).to.be.undefined; }); }); }); diff --git a/test/api/v3/unit/models/group_tasks.test.js b/test/api/v3/unit/models/group_tasks.test.js index 331b91ac1b..76e7666c96 100644 --- a/test/api/v3/unit/models/group_tasks.test.js +++ b/test/api/v3/unit/models/group_tasks.test.js @@ -64,7 +64,7 @@ describe('Group Task Methods', () => { each(tasksToTest, (taskValue, taskType) => { context(`${taskType}`, () => { - beforeEach(async() => { + beforeEach(async () => { task = new Tasks[`${taskType}`](Tasks.Task.sanitize(taskValue)); task.group.id = guild._id; await task.save(); @@ -127,7 +127,7 @@ describe('Group Task Methods', () => { expect(syncedTask.checklist[0].text).to.equal(task.checklist[0].text); }); - describe('syncs updated info', async() => { + describe('syncs updated info', async () => { let newMember; beforeEach(async () => { @@ -274,7 +274,7 @@ describe('Group Task Methods', () => { expect(task.group.assignedUsers).to.not.contain(leader._id); expect(updatedSyncedTask).to.exist; - expect(updatedSyncedTask.group._id).to.be.empty; + expect(updatedSyncedTask.group._id).to.be.undefined; }); }); }); diff --git a/test/api/v3/unit/models/task.test.js b/test/api/v3/unit/models/task.test.js index ddab40b26f..fc3ab9a513 100644 --- a/test/api/v3/unit/models/task.test.js +++ b/test/api/v3/unit/models/task.test.js @@ -54,7 +54,7 @@ describe('Task Model', () => { each(tasksToTest, (taskValue, taskType) => { context(`${taskType}`, () => { - beforeEach(async() => { + beforeEach(async () => { task = new Tasks[`${taskType}`](Tasks.Task.sanitize(taskValue)); task.challenge.id = challenge._id; task.history = generateHistory(396); diff --git a/test/api/v3/unit/models/user.test.js b/test/api/v3/unit/models/user.test.js index 7305401d5a..63d99193b6 100644 --- a/test/api/v3/unit/models/user.test.js +++ b/test/api/v3/unit/models/user.test.js @@ -120,7 +120,7 @@ describe('User Model', () => { expect(User.pushNotification({_id: user._id}, 'CRON', null, 'INVALID_SEEN')).to.eventually.be.rejected; }); - it('adds notifications without data for all given users via static method', async() => { + it('adds notifications without data for all given users via static method', async () => { let user = new User(); let otherUser = new User(); await Bluebird.all([user.save(), otherUser.save()]); diff --git a/test/client/e2e/specs/test.js b/test/client/e2e/specs/test.js index e3e19d4d96..da58561b29 100644 --- a/test/client/e2e/specs/test.js +++ b/test/client/e2e/specs/test.js @@ -9,7 +9,7 @@ module.exports = { const devServer = browser.globals.devServerURL; browser - .url(devServer) + .url(devServer) .waitForElementVisible('#app', 5000) .assert.elementPresent('.logo') .assert.containsText('h1', 'Hello Vue!') diff --git a/test/client/unit/karma.conf.js b/test/client/unit/karma.conf.js index 6007b6b450..7bc7b3800e 100644 --- a/test/client/unit/karma.conf.js +++ b/test/client/unit/karma.conf.js @@ -6,7 +6,7 @@ // Necessary for babel to respect the env version of .babelrc which is necessary // Because inject-loader does not work with ["es2015", { modules: false }] that we use // in order to let webpack2 handle the imports - +process.env.CHROME_BIN = require('puppeteer').executablePath(); // eslint-disable-line no-process-env process.env.BABEL_ENV = process.env.NODE_ENV; // eslint-disable-line no-process-env const webpackConfig = require('../../../webpack/webpack.test.conf'); @@ -16,7 +16,7 @@ module.exports = function (config) { // 1. install corresponding karma launcher // http://karma-runner.github.io/0.13/config/browsers.html // 2. add it to the `browsers` array below. - browsers: ['PhantomJS'], + browsers: ['ChromeHeadless'], frameworks: ['mocha', 'sinon-stub-promise', 'sinon-chai', 'chai-as-promised', 'chai'], reporters: ['spec', 'coverage'], files: ['./index.js'], diff --git a/test/client/unit/specs/components/groups/membersModal.js b/test/client/unit/specs/components/groups/membersModal.js index 79d57e70a3..43617bdc06 100644 --- a/test/client/unit/specs/components/groups/membersModal.js +++ b/test/client/unit/specs/components/groups/membersModal.js @@ -1,7 +1,7 @@ import Vue from 'vue'; import MembersModalComponent from 'client/components/groups/membersModal.vue'; - -describe('Members Modal Component', () => { +/* eslint-disable no-skipped-tests */ +describe.skip('Members Modal Component', () => { describe('Party Sort', () => { let CTor; let vm; @@ -29,3 +29,4 @@ describe('Members Modal Component', () => { }); }); }); +/* eslint-enable no-skipped-tests */ \ No newline at end of file diff --git a/test/client/unit/specs/libs/i18n.js b/test/client/unit/specs/libs/i18n.js index 0137fefe0d..8a23a89b63 100644 --- a/test/client/unit/specs/libs/i18n.js +++ b/test/client/unit/specs/libs/i18n.js @@ -14,7 +14,7 @@ describe('i18n plugin', () => { }); it('adds $t to Vue.prototype', () => { - expect(Vue.prototype.$t).to.be.a.function; + expect(Vue.prototype.$t).to.exist; }); it('$t is a proxy for common/i18n.t', () => { diff --git a/test/client/unit/specs/mixins/groupsUtilities.js b/test/client/unit/specs/mixins/groupsUtilities.js index 2f9f17d012..cdfe6e5ea4 100644 --- a/test/client/unit/specs/mixins/groupsUtilities.js +++ b/test/client/unit/specs/mixins/groupsUtilities.js @@ -23,7 +23,7 @@ describe('Groups Utilities Mixin', () => { describe('isMemberOfGroup', () => { it('registers as a method', () => { - expect(instance.isMemberOfGroup).to.be.a.function; + expect(instance.isMemberOfGroup).to.exist; }); it('returns true when the group is the Tavern', () => { diff --git a/test/client/unit/specs/store/actions/shops.js b/test/client/unit/specs/store/actions/shops.js index 2d49f880a9..516bdaacdc 100644 --- a/test/client/unit/specs/store/actions/shops.js +++ b/test/client/unit/specs/store/actions/shops.js @@ -49,7 +49,7 @@ describe('shops actions', () => { quantity: 1, }); - expect(store.state.user.data.item.equipped.armor_rogue_1).to.equal(true); + expect(store.state.user.data.items.gear.equipped.armor).to.equal('armor_rogue_1'); }); }); }); diff --git a/test/common/libs/taskClasses.test.js b/test/common/libs/taskClasses.test.js deleted file mode 100644 index dbfa6881a6..0000000000 --- a/test/common/libs/taskClasses.test.js +++ /dev/null @@ -1,82 +0,0 @@ -import taskClasses from '../../../website/common/script/libs/taskClasses'; - -describe('taskClasses', () => { - let task = {}; - let filters = {}; - let result; - - describe('a todo task', () => { - beforeEach(() => { - task = { type: 'todo', _editing: false, tags: [] }; - }); - - it('is hidden', () => { - filters = { a: true }; - result = taskClasses(task, filters, 0, Number(new Date()), false, true); - expect(result).to.eql('hidden'); - }); - it('is beingEdited', () => { - task._editing = true; - result = taskClasses(task, filters); - expect(result.split(' ').indexOf('beingEdited')).to.not.eql(-1); - }); - it('is completed', () => { - task.completed = true; - result = taskClasses(task, filters); - expect(result.split(' ').indexOf('completed')).to.not.eql(-1); - task.completed = false; - result = taskClasses(task, filters); - expect(result.split(' ').indexOf('completed')).to.eql(-1); - expect(result.split(' ').indexOf('uncompleted')).to.not.eql(-1); - }); - }); - - describe('a daily task', () => { - it('is completed', () => { - task = { type: 'daily' }; - result = taskClasses(task); - expect(result.split(' ').indexOf('completed')).to.not.eql(-1); - }); - - it('is uncompleted'); // this requires stubbing the internal dependency shouldDo in taskClasses - }); - - describe('a habit', () => { - it('that is wide', () => { - task = { type: 'habit', up: true, down: true }; - result = taskClasses(task); - expect(result.split(' ').indexOf('habit-wide')).to.not.eql(-1); - }); - it('that is narrow', () => { - task = { type: 'habit' }; - result = taskClasses(task); - expect(result.split(' ').indexOf('habit-narrow')).to.not.eql(-1); - }); - }); - - describe('varies based on priority', () => { - it('trivial', () => { - task.priority = 0.1; - result = taskClasses(task); - expect(result.split(' ').indexOf('difficulty-trivial')).to.not.eql(-1); - }); - it('hard', () => { - task.priority = 2; - result = taskClasses(task); - expect(result.split(' ').indexOf('difficulty-hard')).to.not.eql(-1); - }); - }); - - describe('varies based on value', () => { - it('color-worst', () => { - task.value = -30; - result = taskClasses(task); - expect(result.split(' ').indexOf('color-worst')).to.not.eql(-1); - }); - it('color-neutral', () => { - task.value = 0; - result = taskClasses(task); - expect(result.split(' ').indexOf('color-neutral')).to.not.eql(-1); - }); - }); -}); diff --git a/test/common/ops/releaseBoth.js b/test/common/ops/releaseBoth.js index 880f62a316..72411e419b 100644 --- a/test/common/ops/releaseBoth.js +++ b/test/common/ops/releaseBoth.js @@ -72,7 +72,7 @@ describe('shared.ops.releaseBoth', () => { let message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); - expect(user.items.pets[animal]).to.be.empty; + expect(user.items.pets[animal]).to.equal(0); expect(user.items.mounts[animal]).to.equal(null); }); diff --git a/test/helpers/api-unit.helper.js b/test/helpers/api-unit.helper.js index ebfea46dad..d32423dfb9 100644 --- a/test/helpers/api-unit.helper.js +++ b/test/helpers/api-unit.helper.js @@ -108,3 +108,19 @@ export function generateDaily (user) { return task; } + +export function defer () { + let resolve; + let reject; + + let promise = new Promise((resolveParam, rejectParam) => { + resolve = resolveParam; + reject = rejectParam; + }); + + return { + resolve, + reject, + promise, + }; +} diff --git a/test/mocha.opts b/test/mocha.opts index f7bf61a268..63c3988a56 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -2,7 +2,6 @@ --reporter spec --timeout 8000 --check-leaks ---growl --globals io -r babel-polyfill --require babel-register diff --git a/webpack/webpack.base.conf.js b/webpack/webpack.base.conf.js index 773d3bbd80..5da0df5a57 100644 --- a/webpack/webpack.base.conf.js +++ b/webpack/webpack.base.conf.js @@ -98,7 +98,14 @@ const baseConfig = { test: /\.svg$/, use: [ { loader: 'svg-inline-loader' }, - { loader: 'svgo-loader' }, + { + loader: 'svgo-loader', + options: { + plugins: [ + {removeViewBox: false}, + ], + }, + }, ], exclude: [path.resolve(projectRoot, 'website/client/assets/svg/for-css')], }, @@ -112,7 +119,14 @@ const baseConfig = { name: utils.assetsPath('svg/[name].[hash:7].[ext]'), }, }, - { loader: 'svgo-loader' }, + { + loader: 'svgo-loader', + options: { + plugins: [ + {removeViewBox: false}, + ], + }, + }, ], include: [path.resolve(projectRoot, 'website/client/assets/svg/for-css')], }, diff --git a/website/client/app.vue b/website/client/app.vue index 10778ef381..c1c877dfa0 100644 --- a/website/client/app.vue +++ b/website/client/app.vue @@ -229,9 +229,12 @@ export default { return Promise.resolve(error); } + const errorData = error.response.data; + const errorMessage = errorData.message || errorData; + this.$store.dispatch('snackbars:add', { title: 'Habitica', - text: error.response.data, + text: errorMessage, type: 'error', timeout: true, }); @@ -436,6 +439,7 @@ export default { + diff --git a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css index 4f617b4250..79fa55c7cc 100644 --- a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css +++ b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css @@ -1,12 +1,12 @@ .promo_armoire_backgrounds_201802 { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -142px -664px; + background-position: 0px -524px; width: 141px; height: 441px; } .promo_cupid_potions { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -425px -664px; + background-position: -142px -524px; width: 138px; height: 441px; } @@ -16,65 +16,35 @@ width: 730px; height: 170px; } -.promo_habit_birthday_2018 { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -441px -171px; - width: 432px; - height: 144px; -} -.promo_ios { +.promo_mystery_201802 { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: 0px -327px; - width: 325px; - height: 336px; -} -.promo_mystery_201801 { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -654px -327px; - width: 376px; + width: 372px; height: 196px; } -.promo_starry_potions { +.promo_seasonalshop_broken { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -664px; - width: 141px; - height: 441px; + background-position: -751px -171px; + width: 198px; + height: 147px; } .promo_take_this { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -874px -171px; + background-position: -950px -171px; width: 114px; height: 87px; } .promo_valentines { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -564px -860px; + background-position: -441px -171px; width: 309px; height: 147px; } -.promo_winter_customizations { +.scene_coding { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -284px -664px; - width: 140px; - height: 441px; -} -.scene_lady_glaciate { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -874px -860px; - width: 282px; - height: 147px; -} -.scene_setting_up_todos { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -564px -664px; - width: 240px; - height: 195px; -} -.scene_task_list { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -805px -664px; - width: 240px; - height: 195px; + background-position: -373px -327px; + width: 150px; + height: 150px; } .scene_tavern { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); @@ -82,9 +52,3 @@ width: 440px; height: 326px; } -.scene_yesterdailies_repeatables { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -326px -327px; - width: 327px; - height: 276px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-10.css b/website/client/assets/css/sprites/spritesmith-main-10.css index 0db0545651..b1b58b56c0 100644 --- a/website/client/assets/css/sprites/spritesmith-main-10.css +++ b/website/client/assets/css/sprites/spritesmith-main-10.css @@ -4,45 +4,57 @@ width: 221px; height: 39px; } +.quest_dilatoryDistress1 { + background-image: url('~assets/images/sprites/spritesmith-main-10.png'); + background-position: -1102px -1112px; + width: 210px; + height: 210px; +} +.quest_dilatoryDistress2 { + background-image: url('~assets/images/sprites/spritesmith-main-10.png'); + background-position: -1757px -1047px; + width: 150px; + height: 150px; +} .quest_dilatoryDistress3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -452px; + background-position: -1100px -660px; width: 219px; height: 219px; } .quest_dustbunnies { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px -1112px; + background-position: -440px 0px; width: 219px; height: 219px; } .quest_egg { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -362px; + background-position: -1757px -537px; width: 165px; height: 207px; } .quest_evilsanta { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1023px; + background-position: -1757px -1349px; width: 118px; height: 131px; } .quest_evilsanta2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -880px -672px; + background-position: -440px -232px; width: 219px; height: 219px; } .quest_falcon { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px 0px; + background-position: -660px 0px; width: 219px; height: 219px; } .quest_ferret { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -232px; + background-position: -660px -220px; width: 219px; height: 219px; } @@ -54,19 +66,19 @@ } .quest_ghost_stag { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px -232px; + background-position: -220px -452px; width: 219px; height: 219px; } .quest_goldenknight1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -660px 0px; + background-position: -440px -452px; width: 219px; height: 219px; } .quest_goldenknight2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1510px; + background-position: -251px -1510px; width: 250px; height: 150px; } @@ -84,121 +96,121 @@ } .quest_guineapig { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px -452px; + background-position: -880px -440px; width: 219px; height: 219px; } .quest_harpy { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -660px -452px; + background-position: 0px -672px; width: 219px; height: 219px; } .quest_hedgehog { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1102px -1112px; + background-position: -1313px -1112px; width: 219px; height: 186px; } .quest_hippo { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -880px -220px; + background-position: -440px -672px; width: 219px; height: 219px; } .quest_horse { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -880px -440px; + background-position: -660px -672px; width: 219px; height: 219px; } .quest_kraken { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1308px -1332px; + background-position: -874px -1332px; width: 216px; height: 177px; } .quest_lostMasterclasser1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -220px -672px; + background-position: -1100px 0px; width: 219px; height: 219px; } .quest_lostMasterclasser2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px -672px; + background-position: -1100px -220px; width: 219px; height: 219px; } .quest_lostMasterclasser3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -660px -672px; + background-position: -1100px -440px; width: 219px; height: 219px; } .quest_mayhemMistiflying1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -721px; + background-position: -1757px -745px; width: 150px; height: 150px; } .quest_mayhemMistiflying2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -220px 0px; + background-position: 0px -892px; width: 219px; height: 219px; } .quest_mayhemMistiflying3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1100px 0px; + background-position: -220px -892px; width: 219px; height: 219px; } .quest_monkey { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1100px -220px; + background-position: -440px -892px; width: 219px; height: 219px; } .quest_moon1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1540px -434px; + background-position: -1540px -651px; width: 216px; height: 216px; } .quest_moon2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1100px -440px; + background-position: -880px -892px; width: 219px; height: 219px; } .quest_moon3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1100px -660px; + background-position: -1100px -892px; width: 219px; height: 219px; } .quest_moonstone1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -892px; + background-position: -1320px 0px; width: 219px; height: 219px; } .quest_moonstone2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -220px -892px; + background-position: -1320px -220px; width: 219px; height: 219px; } .quest_moonstone3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px -892px; + background-position: -1320px -440px; width: 219px; height: 219px; } .quest_nudibranch { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1540px -1085px; + background-position: -1540px -434px; width: 216px; height: 216px; } @@ -210,7 +222,7 @@ } .quest_owl { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1100px -892px; + background-position: 0px -1112px; width: 219px; height: 219px; } @@ -222,55 +234,55 @@ } .quest_penguin { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -178px; + background-position: -1757px -353px; width: 190px; height: 183px; } .quest_pterodactyl { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1320px 0px; + background-position: -220px -1112px; width: 219px; height: 219px; } .quest_rat { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1320px -220px; + background-position: -1320px -880px; width: 219px; height: 219px; } .quest_rock { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1540px -868px; + background-position: -1540px -1085px; width: 216px; height: 216px; } .quest_rooster { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1525px -1332px; + background-position: -1757px 0px; width: 213px; height: 174px; } .quest_sabretooth { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1320px -660px; + background-position: -660px -892px; width: 219px; height: 219px; } .quest_sheep { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1320px -880px; + background-position: 0px -452px; width: 219px; height: 219px; } .quest_slime { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1112px; + background-position: 0px -232px; width: 219px; height: 219px; } .quest_sloth { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -220px -1112px; + background-position: -880px 0px; width: 219px; height: 219px; } @@ -282,37 +294,37 @@ } .quest_snake { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1091px -1332px; + background-position: -1308px -1332px; width: 216px; height: 177px; } .quest_spider { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -251px -1510px; + background-position: 0px -1510px; width: 250px; height: 150px; } .quest_stoikalmCalamity1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -570px; + background-position: -1757px -1198px; width: 150px; height: 150px; } .quest_stoikalmCalamity2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -220px -232px; + background-position: -1320px -660px; width: 219px; height: 219px; } .quest_stoikalmCalamity3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1320px -440px; + background-position: -440px -1112px; width: 219px; height: 219px; } .quest_taskwoodsTerror1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -872px; + background-position: -1757px -896px; width: 150px; height: 150px; } @@ -324,43 +336,43 @@ } .quest_taskwoodsTerror3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -880px -892px; + background-position: -220px 0px; width: 219px; height: 219px; } .quest_treeling { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -874px -1332px; + background-position: -440px -1332px; width: 216px; height: 177px; } .quest_trex { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px 0px; + background-position: -1757px -175px; width: 204px; height: 177px; } .quest_trex_undead { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1322px -1112px; + background-position: -1525px -1332px; width: 216px; height: 177px; } .quest_triceratops { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -672px; + background-position: -880px -672px; width: 219px; height: 219px; } .quest_turtle { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -880px 0px; + background-position: -220px -672px; width: 219px; height: 219px; } .quest_unicorn { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -220px -452px; + background-position: -880px -220px; width: 219px; height: 219px; } @@ -372,205 +384,115 @@ } .quest_vice2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -660px -220px; + background-position: -660px -452px; width: 219px; height: 219px; } .quest_vice3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -440px -1332px; + background-position: -1091px -1332px; width: 216px; height: 177px; } .quest_whale { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -660px -892px; + background-position: -220px -232px; width: 219px; height: 219px; } .quest_yarn { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1540px -651px; + background-position: -1540px -868px; width: 216px; height: 216px; } .quest_atom1_soapBars { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1500px; + background-position: -1908px -1099px; width: 48px; height: 51px; } .quest_dilatoryDistress1_blueFins { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -622px; + background-position: -1908px -806px; width: 51px; height: 48px; } .quest_dilatoryDistress1_fireCoral { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1895px -1155px; + background-position: -1908px -896px; width: 48px; height: 51px; } .quest_egg_plainEgg { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1875px -1431px; + background-position: -1908px -948px; width: 48px; height: 51px; } .quest_evilsanta2_branches { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1826px -1431px; + background-position: -1908px -1047px; width: 48px; height: 51px; } .quest_evilsanta2_tracks { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1876px -1092px; + background-position: -1908px -745px; width: 54px; height: 60px; } .quest_goldenknight1_testimony { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1895px -1293px; + background-position: -1908px -1198px; width: 48px; height: 51px; } .quest_lostMasterclasser1_ancientTome { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1923px -405px; + background-position: -1923px -666px; width: 33px; height: 42px; } .quest_lostMasterclasser1_forbiddenTome { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1923px -448px; + background-position: -1923px -623px; width: 33px; height: 42px; } .quest_lostMasterclasser1_hiddenTome { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1923px -362px; + background-position: -1923px -580px; width: 33px; height: 42px; } .quest_mayhemMistiflying2_mistifly1 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1895px -1362px; + background-position: -1876px -1401px; width: 48px; height: 51px; } .quest_mayhemMistiflying2_mistifly2 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -570px; + background-position: -1876px -1349px; width: 48px; height: 51px; } .quest_mayhemMistiflying2_mistifly3 { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1895px -1224px; + background-position: -1908px -1250px; width: 48px; height: 51px; } .quest_moon1_shard { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -671px; + background-position: -1923px -537px; width: 42px; height: 42px; } .quest_moonstone1_moonstone { background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1923px -491px; + background-position: -1923px -709px; width: 30px; height: 30px; } -.quest_stoikalmCalamity2_icicleCoin { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -721px; - width: 48px; - height: 51px; -} -.quest_taskwoodsTerror2_brownie { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -773px; - width: 48px; - height: 51px; -} -.quest_taskwoodsTerror2_dryad { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -872px; - width: 48px; - height: 51px; -} -.quest_taskwoodsTerror2_pixie { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -924px; - width: 48px; - height: 51px; -} -.quest_vice2_lightCrystal { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1908px -825px; - width: 40px; - height: 40px; -} -.inventory_quest_scroll_armadillo { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1826px -1362px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom1 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1826px -1293px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1362px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom2 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1826px -1224px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1293px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom3 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1826px -1155px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1224px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_axolotl { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1155px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_badger { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1876px -1023px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_basilist { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1757px -1431px; - width: 68px; - height: 68px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-11.css b/website/client/assets/css/sprites/spritesmith-main-11.css index f685245aae..fca783e8a2 100644 --- a/website/client/assets/css/sprites/spritesmith-main-11.css +++ b/website/client/assets/css/sprites/spritesmith-main-11.css @@ -1,1764 +1,1854 @@ +.quest_stoikalmCalamity2_icicleCoin { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1684px -121px; + width: 48px; + height: 51px; +} +.quest_taskwoodsTerror2_brownie { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1684px -69px; + width: 48px; + height: 51px; +} +.quest_taskwoodsTerror2_dryad { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1684px -173px; + width: 48px; + height: 51px; +} +.quest_taskwoodsTerror2_pixie { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1684px -225px; + width: 48px; + height: 51px; +} +.quest_vice2_lightCrystal { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1684px -862px; + width: 40px; + height: 40px; +} +.inventory_quest_scroll_armadillo { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1035px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_atom1 { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1173px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_atom1_locked { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1104px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_atom2 { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1311px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_atom2_locked { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1242px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_atom3 { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1449px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_atom3_locked { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1380px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_axolotl { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1518px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_badger { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1587px -1571px; + width: 68px; + height: 68px; +} +.inventory_quest_scroll_basilist { + background-image: url('~assets/images/sprites/spritesmith-main-11.png'); + background-position: -1684px 0px; + width: 68px; + height: 68px; +} .inventory_quest_scroll_beetle { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -690px; + background-position: 0px -1226px; width: 68px; height: 68px; } .inventory_quest_scroll_bunny { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -276px; + background-position: -69px -1226px; width: 68px; height: 68px; } .inventory_quest_scroll_butterfly { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -759px; + background-position: -138px -1226px; width: 68px; height: 68px; } .inventory_quest_scroll_cheetah { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -828px; + background-position: -207px -1226px; width: 68px; height: 68px; } .inventory_quest_scroll_cow { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -897px; + background-position: -276px -1226px; width: 68px; height: 68px; } .inventory_quest_scroll_dilatoryDistress1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1035px; + background-position: -1408px -414px; width: 68px; height: 68px; } .inventory_quest_scroll_dilatoryDistress2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1173px; + background-position: -1477px -897px; width: 68px; height: 68px; } .inventory_quest_scroll_dilatoryDistress2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1104px; + background-position: -1477px -828px; width: 68px; height: 68px; } .inventory_quest_scroll_dilatoryDistress3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1311px; + background-position: -1477px -1035px; width: 68px; height: 68px; } .inventory_quest_scroll_dilatoryDistress3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1242px; + background-position: -1477px -966px; width: 68px; height: 68px; } .inventory_quest_scroll_dilatory_derby { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -966px; + background-position: -345px -1226px; width: 68px; height: 68px; } .inventory_quest_scroll_dustbunnies { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1380px; + background-position: -1477px -1104px; width: 68px; height: 68px; } .inventory_quest_scroll_egg { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1449px; + background-position: -1477px -1173px; width: 68px; height: 68px; } .inventory_quest_scroll_evilsanta { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -1518px; + background-position: -1477px -1242px; width: 68px; height: 68px; } .inventory_quest_scroll_evilsanta2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1608px; + background-position: -1477px -1311px; width: 68px; height: 68px; } .inventory_quest_scroll_falcon { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1608px; + background-position: 0px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_ferret { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1608px; + background-position: -69px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_frog { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1608px; + background-position: -138px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_ghost_stag { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1401px; + background-position: -207px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_goldenknight1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -69px; + background-position: -345px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_goldenknight1_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px 0px; + background-position: -276px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_goldenknight2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -207px; + background-position: -483px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_goldenknight2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -138px; + background-position: -414px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_goldenknight3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -345px; + background-position: -621px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_goldenknight3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -276px; + background-position: -552px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_gryphon { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -414px; + background-position: -690px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_guineapig { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -483px; + background-position: -759px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_harpy { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -552px; + background-position: -828px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_hedgehog { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -621px; + background-position: -897px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_hippo { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -1166px; + background-position: -1684px -277px; width: 48px; height: 51px; } .inventory_quest_scroll_horse { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -759px; + background-position: -1035px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_kraken { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -828px; + background-position: -1104px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -966px; + background-position: -1242px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser1_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -897px; + background-position: -1173px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -1104px; + background-position: -1380px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -1035px; + background-position: -1311px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -1242px; + background-position: -1546px 0px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -1173px; + background-position: -1449px -1433px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser4 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -1380px; + background-position: -1546px -138px; width: 68px; height: 68px; } .inventory_quest_scroll_lostMasterclasser4_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1477px -1311px; + background-position: -1546px -69px; width: 68px; height: 68px; } .inventory_quest_scroll_mayhemMistiflying1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1470px; + background-position: -1546px -207px; width: 68px; height: 68px; } .inventory_quest_scroll_mayhemMistiflying2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1470px; + background-position: -1546px -345px; width: 68px; height: 68px; } .inventory_quest_scroll_mayhemMistiflying2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1470px; + background-position: -1546px -276px; width: 68px; height: 68px; } .inventory_quest_scroll_mayhemMistiflying3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1470px; + background-position: -1546px -483px; width: 68px; height: 68px; } .inventory_quest_scroll_mayhemMistiflying3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1470px; + background-position: -1546px -414px; width: 68px; height: 68px; } .inventory_quest_scroll_monkey { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1470px; + background-position: -1546px -552px; width: 68px; height: 68px; } .inventory_quest_scroll_moon1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1470px; + background-position: -1546px -690px; width: 68px; height: 68px; } .inventory_quest_scroll_moon1_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1470px; + background-position: -1546px -621px; width: 68px; height: 68px; } .inventory_quest_scroll_moon2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1470px; + background-position: -1546px -828px; width: 68px; height: 68px; } .inventory_quest_scroll_moon2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1470px; + background-position: -1546px -759px; width: 68px; height: 68px; } .inventory_quest_scroll_moon3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1470px; + background-position: -1546px -966px; width: 68px; height: 68px; } .inventory_quest_scroll_moon3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1470px; + background-position: -1546px -897px; width: 68px; height: 68px; } .inventory_quest_scroll_moonstone1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1470px; + background-position: -1546px -1104px; width: 68px; height: 68px; } .inventory_quest_scroll_moonstone1_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1470px; + background-position: -1546px -1035px; width: 68px; height: 68px; } .inventory_quest_scroll_moonstone2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1470px; + background-position: -1546px -1242px; width: 68px; height: 68px; } .inventory_quest_scroll_moonstone2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1470px; + background-position: -1546px -1173px; width: 68px; height: 68px; } .inventory_quest_scroll_moonstone3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1470px; + background-position: -1546px -1380px; width: 68px; height: 68px; } .inventory_quest_scroll_moonstone3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1470px; + background-position: -1546px -1311px; width: 68px; height: 68px; } .inventory_quest_scroll_nudibranch { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1470px; + background-position: 0px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_octopus { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1470px; + background-position: -69px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_owl { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1470px; + background-position: -138px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_peacock { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1449px -1470px; + background-position: -207px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_penguin { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px 0px; + background-position: -276px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_pterodactyl { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -69px; + background-position: -345px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_rat { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -138px; + background-position: -414px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_rock { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -207px; + background-position: -483px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_rooster { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -276px; + background-position: -552px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_sabretooth { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -345px; + background-position: -621px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_sheep { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -414px; + background-position: -690px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_slime { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -483px; + background-position: -759px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_sloth { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -552px; + background-position: -828px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_snail { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -621px; + background-position: -897px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_snake { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -690px; + background-position: -966px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_spider { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -759px; + background-position: -1035px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_stoikalmCalamity1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -828px; + background-position: -1104px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_stoikalmCalamity2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -966px; + background-position: -1242px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_stoikalmCalamity2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -897px; + background-position: -1173px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_stoikalmCalamity3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1104px; + background-position: -1380px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_stoikalmCalamity3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1035px; + background-position: -1311px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_taskwoodsTerror1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1173px; + background-position: -1449px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_taskwoodsTerror2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1311px; + background-position: -1615px 0px; width: 68px; height: 68px; } .inventory_quest_scroll_taskwoodsTerror2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1242px; + background-position: -1518px -1502px; width: 68px; height: 68px; } .inventory_quest_scroll_taskwoodsTerror3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1449px; + background-position: -1615px -138px; width: 68px; height: 68px; } .inventory_quest_scroll_taskwoodsTerror3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1546px -1380px; + background-position: -1615px -69px; width: 68px; height: 68px; } .inventory_quest_scroll_treeling { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1539px; + background-position: -1615px -207px; width: 68px; height: 68px; } .inventory_quest_scroll_trex { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1539px; + background-position: -1615px -345px; width: 68px; height: 68px; } .inventory_quest_scroll_trex_undead { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1539px; + background-position: -1615px -276px; width: 68px; height: 68px; } .inventory_quest_scroll_triceratops { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1539px; + background-position: -1615px -414px; width: 68px; height: 68px; } .inventory_quest_scroll_turtle { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1539px; + background-position: -1615px -483px; width: 68px; height: 68px; } .inventory_quest_scroll_unicorn { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1539px; + background-position: -1615px -552px; width: 68px; height: 68px; } .inventory_quest_scroll_vice1 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1539px; + background-position: -1615px -690px; width: 68px; height: 68px; } .inventory_quest_scroll_vice1_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1539px; + background-position: -1615px -621px; width: 68px; height: 68px; } .inventory_quest_scroll_vice2 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1539px; + background-position: -1615px -828px; width: 68px; height: 68px; } .inventory_quest_scroll_vice2_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1539px; + background-position: -1615px -759px; width: 68px; height: 68px; } .inventory_quest_scroll_vice3 { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1539px; + background-position: -1615px -966px; width: 68px; height: 68px; } .inventory_quest_scroll_vice3_locked { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1539px; + background-position: -1615px -897px; width: 68px; height: 68px; } .inventory_quest_scroll_whale { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1539px; + background-position: -1615px -1035px; width: 68px; height: 68px; } .inventory_quest_scroll_yarn { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1539px; + background-position: -1615px -1104px; width: 68px; height: 68px; } .quest_bundle_farmFriends { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1539px; + background-position: -1615px -1173px; width: 68px; height: 68px; } .quest_bundle_featheredFriends { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1539px; + background-position: -1615px -1242px; width: 68px; height: 68px; } .quest_bundle_splashyPals { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1539px; + background-position: -1615px -1311px; width: 68px; height: 68px; } .quest_bundle_winterQuests { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1539px; + background-position: -1615px -1380px; width: 68px; height: 68px; } .quest_bundle_witchyFamiliars { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1539px; + background-position: -1615px -1449px; width: 68px; height: 68px; } .shop_gem { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1539px; + background-position: 0px -1571px; width: 68px; height: 68px; } .shop_opaquePotion { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1539px; + background-position: -69px -1571px; width: 68px; height: 68px; } .shop_potion { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1449px -1539px; + background-position: -138px -1571px; width: 68px; height: 68px; } .shop_seafoam { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1518px -1539px; + background-position: -207px -1571px; width: 68px; height: 68px; } .shop_shinySeed { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px 0px; + background-position: -276px -1571px; width: 68px; height: 68px; } .shop_snowball { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -69px; + background-position: -345px -1571px; width: 68px; height: 68px; } .shop_spookySparkles { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -138px; + background-position: -414px -1571px; width: 68px; height: 68px; } .shop_mounts_MagicalBee-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -207px; + background-position: -483px -1571px; width: 68px; height: 68px; } .shop_mounts_Mammoth-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -276px; + background-position: -552px -1571px; width: 68px; height: 68px; } .shop_mounts_MantisShrimp-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -345px; + background-position: -621px -1571px; width: 68px; height: 68px; } .shop_mounts_Phoenix-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -414px; + background-position: -690px -1571px; width: 68px; height: 68px; } .shop_pets_MagicalBee-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -483px; + background-position: -759px -1571px; width: 68px; height: 68px; } .shop_pets_Mammoth-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -552px; + background-position: -828px -1571px; width: 68px; height: 68px; } .shop_pets_MantisShrimp-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -621px; + background-position: -897px -1571px; width: 68px; height: 68px; } .shop_pets_Phoenix-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1615px -690px; + background-position: -966px -1571px; width: 68px; height: 68px; } .shop_backStab { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -560px -442px; + background-position: -1684px -780px; width: 40px; height: 40px; } .shop_brightness { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -707px -530px; + background-position: -1684px -739px; width: 40px; height: 40px; } .shop_defensiveStance { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -666px -530px; + background-position: -1684px -698px; width: 40px; height: 40px; } .shop_earth { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -813px -636px; + background-position: -1684px -329px; width: 40px; height: 40px; } .shop_fireball { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px -636px; + background-position: -1684px -616px; width: 40px; height: 40px; } .shop_frost { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -919px -742px; + background-position: -1684px -985px; width: 40px; height: 40px; } .shop_heal { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1608px; + background-position: -1684px -534px; width: 40px; height: 40px; } .shop_healAll { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1025px -848px; + background-position: -1684px -493px; width: 40px; height: 40px; } .shop_intimidate { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -848px; + background-position: -1684px -452px; width: 40px; height: 40px; } .shop_mpheal { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1131px -954px; + background-position: -1684px -411px; width: 40px; height: 40px; } .shop_pickPocket { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -954px; + background-position: -1684px -657px; width: 40px; height: 40px; } .shop_protectAura { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1237px -1060px; + background-position: -1684px -370px; width: 40px; height: 40px; } .shop_smash { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -1060px; + background-position: -1684px -821px; width: 40px; height: 40px; } .shop_stealth { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1351px -1166px; + background-position: -1684px -903px; width: 40px; height: 40px; } .shop_toolsOfTrade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -742px; + background-position: -1684px -944px; width: 40px; height: 40px; } .shop_valorousPresence { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -601px -442px; + background-position: -1684px -575px; width: 40px; height: 40px; } .Pet_Egg_Armadillo { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1608px; + background-position: -414px -1226px; width: 68px; height: 68px; } .Pet_Egg_Axolotl { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1608px; + background-position: -483px -1226px; width: 68px; height: 68px; } .Pet_Egg_Badger { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1608px; + background-position: -552px -1226px; width: 68px; height: 68px; } .Pet_Egg_BearCub { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1608px; + background-position: -621px -1226px; width: 68px; height: 68px; } .Pet_Egg_Beetle { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1608px; + background-position: -690px -1226px; width: 68px; height: 68px; } .Pet_Egg_Bunny { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1608px; + background-position: -759px -1226px; width: 68px; height: 68px; } .Pet_Egg_Butterfly { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1608px; + background-position: -828px -1226px; width: 68px; height: 68px; } .Pet_Egg_Cactus { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1608px; + background-position: -897px -1226px; width: 68px; height: 68px; } .Pet_Egg_Cheetah { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1608px; + background-position: -966px -1226px; width: 68px; height: 68px; } .Pet_Egg_Cow { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1608px; + background-position: -1035px -1226px; width: 68px; height: 68px; } .Pet_Egg_Cuttlefish { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1608px; + background-position: -1104px -1226px; width: 68px; height: 68px; } .Pet_Egg_Deer { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1608px; + background-position: -1173px -1226px; width: 68px; height: 68px; } .Pet_Egg_Dragon { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1608px; + background-position: -1242px -1226px; width: 68px; height: 68px; } .Pet_Egg_Egg { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1608px; + background-position: -1311px -1226px; width: 68px; height: 68px; } .Pet_Egg_Falcon { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1608px; + background-position: 0px -1295px; width: 68px; height: 68px; } .Pet_Egg_Ferret { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -1226px; + background-position: -69px -1295px; width: 68px; height: 68px; } .Pet_Egg_FlyingPig { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -705px -1226px; + background-position: -138px -1295px; width: 68px; height: 68px; } .Pet_Egg_Fox { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -774px -1226px; + background-position: -207px -1295px; width: 68px; height: 68px; } .Pet_Egg_Frog { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -843px -1226px; + background-position: -276px -1295px; width: 68px; height: 68px; } .Pet_Egg_Gryphon { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -912px -1226px; + background-position: -345px -1295px; width: 68px; height: 68px; } .Pet_Egg_GuineaPig { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -981px -1226px; + background-position: -414px -1295px; width: 68px; height: 68px; } .Pet_Egg_Hedgehog { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1050px -1226px; + background-position: -483px -1295px; width: 68px; height: 68px; } .Pet_Egg_Hippo { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1119px -1226px; + background-position: -552px -1295px; width: 68px; height: 68px; } .Pet_Egg_Horse { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1188px -1226px; + background-position: -621px -1295px; width: 68px; height: 68px; } .Pet_Egg_LionCub { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1257px -1226px; + background-position: -690px -1295px; width: 68px; height: 68px; } .Pet_Egg_Monkey { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1326px -1226px; + background-position: -759px -1295px; width: 68px; height: 68px; } .Pet_Egg_Nudibranch { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1332px; + background-position: -828px -1295px; width: 68px; height: 68px; } .Pet_Egg_Octopus { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1332px; + background-position: -897px -1295px; width: 68px; height: 68px; } .Pet_Egg_Owl { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1332px; + background-position: -966px -1295px; width: 68px; height: 68px; } .Pet_Egg_PandaCub { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1332px; + background-position: -1035px -1295px; width: 68px; height: 68px; } .Pet_Egg_Parrot { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1332px; + background-position: -1104px -1295px; width: 68px; height: 68px; } .Pet_Egg_Peacock { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1332px; + background-position: -1173px -1295px; width: 68px; height: 68px; } .Pet_Egg_Penguin { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1332px; + background-position: -1242px -1295px; width: 68px; height: 68px; } .Pet_Egg_PolarBear { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1332px; + background-position: -1311px -1295px; width: 68px; height: 68px; } .Pet_Egg_Pterodactyl { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1332px; + background-position: -1408px 0px; width: 68px; height: 68px; } .Pet_Egg_Rat { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1332px; + background-position: -1408px -69px; width: 68px; height: 68px; } .Pet_Egg_Rock { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1332px; + background-position: -1408px -138px; width: 68px; height: 68px; } .Pet_Egg_Rooster { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1332px; + background-position: -1408px -207px; width: 68px; height: 68px; } .Pet_Egg_Sabretooth { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1332px; + background-position: -1408px -276px; width: 68px; height: 68px; } .Pet_Egg_Seahorse { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1332px; + background-position: -1408px -345px; width: 68px; height: 68px; } .Pet_Egg_Sheep { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1332px; + background-position: -966px -1433px; width: 68px; height: 68px; } .Pet_Egg_Slime { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1332px; + background-position: -1408px -483px; width: 68px; height: 68px; } .Pet_Egg_Sloth { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1332px; + background-position: -1408px -552px; width: 68px; height: 68px; } .Pet_Egg_Snail { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1332px; + background-position: -1408px -621px; width: 68px; height: 68px; } .Pet_Egg_Snake { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1332px; + background-position: -1408px -690px; width: 68px; height: 68px; } .Pet_Egg_Spider { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1332px; + background-position: -1408px -759px; width: 68px; height: 68px; } .Pet_Egg_TRex { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -138px; + background-position: -1408px -966px; width: 68px; height: 68px; } .Pet_Egg_TigerCub { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px 0px; + background-position: -1408px -828px; width: 68px; height: 68px; } .Pet_Egg_Treeling { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -69px; + background-position: -1408px -897px; width: 68px; height: 68px; } .Pet_Egg_Triceratops { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -207px; + background-position: -1408px -1035px; width: 68px; height: 68px; } .Pet_Egg_Turtle { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1608px; + background-position: -1408px -1104px; width: 68px; height: 68px; } .Pet_Egg_Unicorn { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -345px; + background-position: -1408px -1173px; width: 68px; height: 68px; } .Pet_Egg_Whale { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -414px; + background-position: -1408px -1242px; width: 68px; height: 68px; } .Pet_Egg_Wolf { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -483px; + background-position: 0px -1364px; width: 68px; height: 68px; } .Pet_Egg_Yarn { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -552px; + background-position: -69px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -621px; + background-position: -138px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -690px; + background-position: -207px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -759px; + background-position: -276px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -828px; + background-position: -345px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -897px; + background-position: -414px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -966px; + background-position: -483px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -1035px; + background-position: -552px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -1104px; + background-position: -621px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -1173px; + background-position: -690px -1364px; width: 68px; height: 68px; } .Pet_Food_Cake_Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -1242px; + background-position: -759px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1408px -1311px; + background-position: -828px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1401px; + background-position: -897px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1401px; + background-position: -966px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1401px; + background-position: -1035px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1401px; + background-position: -1104px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1401px; + background-position: -1173px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1401px; + background-position: -1242px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1401px; + background-position: -1311px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1401px; + background-position: -1380px -1364px; width: 68px; height: 68px; } .Pet_Food_Candy_Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1401px; + background-position: -1477px 0px; width: 68px; height: 68px; } .Pet_Food_Chocolate { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1401px; + background-position: -1477px -69px; width: 68px; height: 68px; } .Pet_Food_CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1401px; + background-position: -1477px -138px; width: 68px; height: 68px; } .Pet_Food_CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1401px; + background-position: -1477px -207px; width: 68px; height: 68px; } .Pet_Food_Fish { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1401px; + background-position: -1477px -276px; width: 68px; height: 68px; } .Pet_Food_Honey { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1401px; + background-position: -1477px -345px; width: 68px; height: 68px; } .Pet_Food_Meat { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1401px; + background-position: -1477px -414px; width: 68px; height: 68px; } .Pet_Food_Milk { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1401px; + background-position: -1477px -483px; width: 68px; height: 68px; } .Pet_Food_Potatoe { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1401px; + background-position: -1477px -552px; width: 68px; height: 68px; } .Pet_Food_RottenMeat { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1401px; + background-position: -1477px -621px; width: 68px; height: 68px; } .Pet_Food_Saddle { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1401px; + background-position: -1477px -690px; width: 68px; height: 68px; } .Pet_Food_Strawberry { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1401px; + background-position: -1477px -759px; width: 68px; height: 68px; } .Mount_Body_Armadillo-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -1120px; + background-position: -530px -1120px; width: 105px; height: 105px; } .Mount_Body_Armadillo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -1226px; + background-position: -560px -336px; width: 105px; height: 105px; } .Mount_Body_Armadillo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -1226px; + background-position: 0px -484px; width: 105px; height: 105px; } .Mount_Body_Armadillo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -1226px; + background-position: -106px -484px; width: 105px; height: 105px; } .Mount_Body_Armadillo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -560px -230px; + background-position: -212px -484px; width: 105px; height: 105px; } .Mount_Body_Armadillo-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -560px -336px; + background-position: -318px -484px; width: 105px; height: 105px; } .Mount_Body_Armadillo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -484px; + background-position: -424px -484px; width: 105px; height: 105px; } .Mount_Body_Armadillo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -484px; + background-position: -530px -484px; width: 105px; height: 105px; } .Mount_Body_Armadillo-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -484px; + background-position: -666px 0px; width: 105px; height: 105px; } .Mount_Body_Armadillo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -484px; + background-position: -666px -106px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -484px; + background-position: -666px -212px; width: 105px; height: 105px; } .Mount_Body_Axolotl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -484px; + background-position: -666px -318px; width: 105px; height: 105px; } .Mount_Body_Axolotl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -666px 0px; + background-position: -666px -424px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -666px -106px; + background-position: 0px -590px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -666px -212px; + background-position: -106px -590px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -666px -318px; + background-position: -212px -590px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -666px -424px; + background-position: -318px -590px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -590px; + background-position: -424px -590px; width: 105px; height: 105px; } .Mount_Body_Axolotl-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -590px; + background-position: -530px -590px; width: 105px; height: 105px; } .Mount_Body_Axolotl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -590px; + background-position: -636px -590px; width: 105px; height: 105px; } .Mount_Body_Badger-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -590px; + background-position: -772px 0px; width: 105px; height: 105px; } .Mount_Body_Badger-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -590px; + background-position: -772px -106px; width: 105px; height: 105px; } .Mount_Body_Badger-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -590px; + background-position: -772px -212px; width: 105px; height: 105px; } .Mount_Body_Badger-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -590px; + background-position: -772px -318px; width: 105px; height: 105px; } .Mount_Body_Badger-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px 0px; + background-position: -772px -424px; width: 105px; height: 105px; } .Mount_Body_Badger-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px -106px; + background-position: -772px -530px; width: 105px; height: 105px; } .Mount_Body_Badger-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px -212px; + background-position: 0px -696px; width: 105px; height: 105px; } .Mount_Body_Badger-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px -318px; + background-position: -106px -696px; width: 105px; height: 105px; } .Mount_Body_Badger-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px -424px; + background-position: -212px -696px; width: 105px; height: 105px; } .Mount_Body_Badger-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -772px -530px; + background-position: -318px -696px; width: 105px; height: 105px; } .Mount_Body_BearCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -696px; + background-position: -424px -696px; width: 105px; height: 105px; } .Mount_Body_BearCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -696px; + background-position: -530px -696px; width: 105px; height: 105px; } .Mount_Body_BearCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -696px; + background-position: -636px -696px; width: 105px; height: 105px; } .Mount_Body_BearCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -696px; + background-position: -742px -696px; width: 105px; height: 105px; } .Mount_Body_BearCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -696px; + background-position: -878px 0px; width: 105px; height: 105px; } .Mount_Body_BearCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -696px; + background-position: -878px -106px; width: 105px; height: 105px; } .Mount_Body_BearCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -696px; + background-position: -878px -212px; width: 105px; height: 105px; } .Mount_Body_BearCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -742px -696px; + background-position: -878px -318px; width: 105px; height: 105px; } .Mount_Body_BearCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px 0px; + background-position: -878px -424px; width: 105px; height: 105px; } .Mount_Body_BearCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -106px; + background-position: -878px -530px; width: 105px; height: 105px; } .Mount_Body_BearCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -212px; + background-position: -878px -636px; width: 105px; height: 105px; } .Mount_Body_BearCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -318px; + background-position: 0px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -424px; + background-position: -106px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Polar { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -530px; + background-position: -212px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -878px -636px; + background-position: -318px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -802px; + background-position: -424px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -802px; + background-position: -530px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -802px; + background-position: -636px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -802px; + background-position: -742px -802px; width: 105px; height: 105px; } .Mount_Body_BearCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -802px; + background-position: -560px -230px; width: 105px; height: 105px; } .Mount_Body_BearCub-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -121px 0px; + background-position: 0px 0px; width: 120px; height: 120px; } .Mount_Body_BearCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -802px; + background-position: -984px -106px; width: 105px; height: 105px; } .Mount_Body_BearCub-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -742px -802px; + background-position: -984px -212px; width: 105px; height: 105px; } .Mount_Body_BearCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -848px -802px; + background-position: -984px -318px; width: 105px; height: 105px; } .Mount_Body_Beetle-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px 0px; + background-position: -984px -424px; width: 105px; height: 105px; } .Mount_Body_Beetle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -106px; + background-position: -984px -530px; width: 105px; height: 105px; } .Mount_Body_Beetle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -1226px; + background-position: -984px -636px; width: 105px; height: 105px; } .Mount_Body_Beetle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -318px; + background-position: -984px -742px; width: 105px; height: 105px; } .Mount_Body_Beetle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -424px; + background-position: 0px -908px; width: 105px; height: 105px; } .Mount_Body_Beetle-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -530px; + background-position: -106px -908px; width: 105px; height: 105px; } .Mount_Body_Beetle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -636px; + background-position: -212px -908px; width: 105px; height: 105px; } .Mount_Body_Beetle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -742px; + background-position: -318px -908px; width: 105px; height: 105px; } .Mount_Body_Beetle-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -908px; + background-position: -424px -908px; width: 105px; height: 105px; } .Mount_Body_Beetle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -908px; + background-position: -530px -908px; width: 105px; height: 105px; } .Mount_Body_Bunny-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -908px; + background-position: -636px -908px; width: 105px; height: 105px; } .Mount_Body_Bunny-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -908px; + background-position: -742px -908px; width: 105px; height: 105px; } .Mount_Body_Bunny-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -908px; + background-position: -848px -908px; width: 105px; height: 105px; } .Mount_Body_Bunny-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -908px; + background-position: -954px -908px; width: 105px; height: 105px; } .Mount_Body_Bunny-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -908px; + background-position: -1090px 0px; width: 105px; height: 105px; } .Mount_Body_Bunny-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -742px -908px; + background-position: -1090px -106px; width: 105px; height: 105px; } .Mount_Body_Bunny-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -848px -908px; + background-position: -1090px -212px; width: 105px; height: 105px; } .Mount_Body_Bunny-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -954px -908px; + background-position: -1090px -318px; width: 105px; height: 105px; } .Mount_Body_Bunny-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px 0px; + background-position: -1090px -424px; width: 105px; height: 105px; } .Mount_Body_Bunny-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -106px; + background-position: -1090px -530px; width: 105px; height: 105px; } @@ -1782,433 +1872,397 @@ } .Mount_Body_Butterfly-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -245px; + background-position: -348px 0px; width: 105px; height: 123px; } .Mount_Body_Butterfly-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -348px 0px; + background-position: 0px -245px; width: 105px; height: 123px; } .Mount_Body_Butterfly-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -454px -124px; + background-position: -106px -245px; width: 105px; height: 123px; } .Mount_Body_Butterfly-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -245px; + background-position: -212px -245px; width: 105px; height: 123px; } .Mount_Body_Butterfly-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -245px; + background-position: -318px -245px; width: 105px; height: 123px; } .Mount_Body_Butterfly-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -245px; + background-position: -454px 0px; width: 105px; height: 123px; } .Mount_Body_Butterfly-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -454px 0px; + background-position: -454px -124px; width: 105px; height: 123px; } .Mount_Body_Cactus-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -1014px; + background-position: -742px -1014px; width: 105px; height: 105px; } .Mount_Body_Cactus-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -1014px; + background-position: -848px -1014px; width: 105px; height: 105px; } .Mount_Body_Cactus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -1014px; + background-position: -954px -1014px; width: 105px; height: 105px; } .Mount_Body_Cactus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -1014px; + background-position: -1060px -1014px; width: 105px; height: 105px; } .Mount_Body_Cactus-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -742px -1014px; + background-position: -1196px 0px; width: 105px; height: 105px; } .Mount_Body_Cactus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -848px -1014px; + background-position: -1196px -106px; width: 105px; height: 105px; } .Mount_Body_Cactus-Ember { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -954px -1014px; + background-position: -1196px -212px; width: 105px; height: 105px; } .Mount_Body_Cactus-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1060px -1014px; + background-position: -1196px -318px; width: 105px; height: 105px; } .Mount_Body_Cactus-Floral { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px 0px; + background-position: -1196px -424px; width: 105px; height: 105px; } .Mount_Body_Cactus-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -106px; + background-position: -1196px -530px; width: 105px; height: 105px; } .Mount_Body_Cactus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -212px; + background-position: -1196px -636px; width: 105px; height: 105px; } .Mount_Body_Cactus-Holly { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -318px; + background-position: -1196px -742px; width: 105px; height: 105px; } .Mount_Body_Cactus-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -424px; + background-position: -1196px -848px; width: 105px; height: 105px; } .Mount_Body_Cactus-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -530px; + background-position: -1196px -954px; width: 105px; height: 105px; } .Mount_Body_Cactus-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -636px; + background-position: 0px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -742px; + background-position: -106px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -848px; + background-position: -212px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1196px -954px; + background-position: -318px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1120px; + background-position: -424px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px 0px; + background-position: -121px 0px; width: 120px; height: 120px; } .Mount_Body_Cactus-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -1120px; + background-position: -636px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -1120px; + background-position: -742px -1120px; width: 105px; height: 105px; } .Mount_Body_Cactus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -1120px; + background-position: -848px -1120px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -1120px; + background-position: -954px -1120px; width: 105px; height: 105px; } .Mount_Body_Cheetah-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -636px -1120px; + background-position: -1060px -1120px; width: 105px; height: 105px; } .Mount_Body_Cheetah-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -742px -1120px; + background-position: -1166px -1120px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -848px -1120px; + background-position: -1302px 0px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -954px -1120px; + background-position: -1302px -106px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1060px -1120px; + background-position: -1302px -212px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1166px -1120px; + background-position: -1302px -318px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px 0px; + background-position: -1302px -424px; width: 105px; height: 105px; } .Mount_Body_Cheetah-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -106px; + background-position: -1302px -530px; width: 105px; height: 105px; } .Mount_Body_Cheetah-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -212px; + background-position: -1302px -636px; width: 105px; height: 105px; } .Mount_Body_Cow-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -318px; + background-position: -1302px -742px; width: 105px; height: 105px; } .Mount_Body_Cow-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -424px; + background-position: -1302px -848px; width: 105px; height: 105px; } .Mount_Body_Cow-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -530px; + background-position: -1302px -954px; width: 105px; height: 105px; } .Mount_Body_Cow-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -636px; + background-position: -1302px -1060px; width: 105px; height: 105px; } .Mount_Body_Cow-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -742px; + background-position: -636px -1014px; width: 105px; height: 105px; } .Mount_Body_Cow-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -848px; + background-position: -530px -1014px; width: 105px; height: 105px; } .Mount_Body_Cow-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -954px; + background-position: -424px -1014px; width: 105px; height: 105px; } .Mount_Body_Cow-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1302px -1060px; + background-position: -318px -1014px; width: 105px; height: 105px; } .Mount_Body_Cow-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1226px; + background-position: -212px -1014px; width: 105px; height: 105px; } .Mount_Body_Cow-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -1226px; + background-position: -106px -1014px; width: 105px; height: 105px; } .Mount_Body_Cuttlefish-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -424px -369px; + background-position: -560px 0px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -560px 0px; + background-position: -424px -369px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -560px -115px; + background-position: -318px -369px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -242px -124px; + background-position: -212px -369px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -348px -124px; + background-position: -106px -369px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -454px -248px; + background-position: 0px -369px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-Shade { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -369px; + background-position: -242px -124px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -369px; + background-position: -454px -248px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-White { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -369px; + background-position: -348px -124px; width: 105px; height: 114px; } .Mount_Body_Cuttlefish-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -318px -369px; + background-position: -560px -115px; width: 105px; height: 114px; } .Mount_Body_Deer-Base { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -530px; + background-position: 0px -1014px; width: 105px; height: 105px; } .Mount_Body_Deer-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -424px; + background-position: -1090px -848px; width: 105px; height: 105px; } .Mount_Body_Deer-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -318px; + background-position: -1090px -742px; width: 105px; height: 105px; } .Mount_Body_Deer-Desert { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -212px; + background-position: -1090px -636px; width: 105px; height: 105px; } .Mount_Body_Deer-Golden { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -530px -802px; + background-position: -848px -802px; width: 105px; height: 105px; } .Mount_Body_Deer-Red { background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -212px -1014px; - width: 105px; - height: 105px; -} -.Mount_Body_Deer-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -106px -1014px; - width: 105px; - height: 105px; -} -.Mount_Body_Deer-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1014px; - width: 105px; - height: 105px; -} -.Mount_Body_Deer-White { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Deer-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -984px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Base { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1090px -636px; + background-position: -984px 0px; width: 105px; height: 105px; } diff --git a/website/client/assets/css/sprites/spritesmith-main-12.css b/website/client/assets/css/sprites/spritesmith-main-12.css index bb1475a655..c37b689c33 100644 --- a/website/client/assets/css/sprites/spritesmith-main-12.css +++ b/website/client/assets/css/sprites/spritesmith-main-12.css @@ -1,102 +1,138 @@ -.Mount_Body_Dragon-CottonCandyBlue { +.Mount_Body_Deer-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -530px; + background-position: -560px -318px; width: 105px; height: 105px; } -.Mount_Body_Dragon-CottonCandyPink { +.Mount_Body_Deer-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: -212px -1108px; width: 105px; height: 105px; } -.Mount_Body_Dragon-Cupid { +.Mount_Body_Deer-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -790px; + background-position: -984px -424px; width: 105px; height: 105px; } -.Mount_Body_Dragon-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Floral { +.Mount_Body_Deer-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: 0px -1002px; width: 105px; height: 105px; } -.Mount_Body_Dragon-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -1002px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -1002px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -1002px; - width: 105px; - height: 105px; -} -.Mount_Body_Dragon-Peppermint { +.Mount_Body_Dragon-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: -424px -1002px; width: 105px; height: 105px; } -.Mount_Body_Dragon-Red { +.Mount_Body_Dragon-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: -530px -1002px; width: 105px; height: 105px; } -.Mount_Body_Dragon-RoyalPurple { +.Mount_Body_Dragon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: -636px -1002px; width: 105px; height: 105px; } -.Mount_Body_Dragon-Shade { +.Mount_Body_Dragon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: -742px -1002px; width: 105px; height: 105px; } +.Mount_Body_Dragon-Cupid { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -848px -1002px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -954px -1002px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Ember { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1060px -1002px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Fairy { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1196px 0px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Floral { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1196px -106px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Ghost { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1196px -212px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1514px -424px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Holly { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1514px -636px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1514px -1060px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Red { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1514px -1166px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -1514px -1272px; + width: 105px; + height: 105px; +} +.Mount_Body_Dragon-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-12.png'); + background-position: -433px -357px; + width: 105px; + height: 105px; +} .Mount_Body_Dragon-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1272px -1320px; + background-position: -560px 0px; width: 105px; height: 105px; } .Mount_Body_Dragon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px 0px; + background-position: -560px -106px; width: 105px; height: 105px; } .Mount_Body_Dragon-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -424px; + background-position: -560px -212px; width: 105px; height: 105px; } @@ -108,313 +144,313 @@ } .Mount_Body_Dragon-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -636px; + background-position: 0px -472px; width: 105px; height: 105px; } .Mount_Body_Dragon-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -433px -357px; + background-position: -106px -472px; width: 105px; height: 105px; } .Mount_Body_Dragon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -560px 0px; + background-position: -212px -472px; width: 105px; height: 105px; } .Mount_Body_Egg-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -560px -106px; + background-position: -318px -472px; width: 105px; height: 105px; } .Mount_Body_Egg-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -560px -212px; + background-position: -424px -472px; width: 105px; height: 105px; } .Mount_Body_Egg-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -560px -318px; + background-position: -530px -472px; width: 105px; height: 105px; } .Mount_Body_Egg-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -472px; + background-position: -666px 0px; width: 105px; height: 105px; } .Mount_Body_Egg-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -472px; + background-position: -666px -106px; width: 105px; height: 105px; } .Mount_Body_Egg-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -472px; + background-position: -666px -212px; width: 105px; height: 105px; } .Mount_Body_Egg-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -472px; + background-position: -666px -318px; width: 105px; height: 105px; } .Mount_Body_Egg-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -472px; + background-position: -666px -424px; width: 105px; height: 105px; } .Mount_Body_Egg-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -472px; + background-position: 0px -578px; width: 105px; height: 105px; } .Mount_Body_Egg-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -666px 0px; + background-position: -106px -578px; width: 105px; height: 105px; } .Mount_Body_Falcon-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -666px -106px; + background-position: -212px -578px; width: 105px; height: 105px; } .Mount_Body_Falcon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -666px -212px; + background-position: -318px -578px; width: 105px; height: 105px; } .Mount_Body_Falcon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -666px -318px; + background-position: -424px -578px; width: 105px; height: 105px; } .Mount_Body_Falcon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -666px -424px; + background-position: -530px -578px; width: 105px; height: 105px; } .Mount_Body_Falcon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -578px; + background-position: -636px -578px; width: 105px; height: 105px; } .Mount_Body_Falcon-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -578px; + background-position: -772px 0px; width: 105px; height: 105px; } .Mount_Body_Falcon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -578px; + background-position: -772px -106px; width: 105px; height: 105px; } .Mount_Body_Falcon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -578px; + background-position: -772px -212px; width: 105px; height: 105px; } .Mount_Body_Falcon-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -578px; + background-position: -772px -318px; width: 105px; height: 105px; } .Mount_Body_Falcon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -578px; + background-position: -772px -424px; width: 105px; height: 105px; } .Mount_Body_Ferret-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -578px; + background-position: -772px -530px; width: 105px; height: 105px; } .Mount_Body_Ferret-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -772px 0px; + background-position: 0px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -772px -106px; + background-position: -106px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -772px -212px; + background-position: -212px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -772px -318px; + background-position: -318px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -772px -424px; + background-position: -424px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -772px -530px; + background-position: -530px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -684px; + background-position: -636px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -684px; + background-position: -742px -684px; width: 105px; height: 105px; } .Mount_Body_Ferret-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -684px; + background-position: -878px 0px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -684px; + background-position: -878px -106px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -684px; + background-position: -878px -212px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -684px; + background-position: -878px -318px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -684px; + background-position: -878px -424px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -684px; + background-position: -878px -530px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px 0px; + background-position: -878px -636px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Ember { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px -106px; + background-position: 0px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px -212px; + background-position: -106px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Floral { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px -318px; + background-position: -212px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px -424px; + background-position: -318px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px -530px; + background-position: -424px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Holly { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -878px -636px; + background-position: -530px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -790px; + background-position: -636px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -790px; + background-position: -742px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -790px; + background-position: -848px -790px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -790px; + background-position: -984px 0px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -790px; + background-position: -984px -106px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -790px; + background-position: -984px -212px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -790px; + background-position: -984px -318px; width: 105px; height: 105px; } @@ -426,133 +462,133 @@ } .Mount_Body_FlyingPig-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -790px; + background-position: -984px -530px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px 0px; + background-position: -984px -636px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -106px; + background-position: -984px -742px; width: 105px; height: 105px; } .Mount_Body_Fox-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -212px; + background-position: 0px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -318px; + background-position: -106px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -424px; + background-position: -212px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -530px; + background-position: -318px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -636px; + background-position: -424px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -984px -742px; + background-position: -530px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Ember { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -896px; + background-position: -636px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -896px; + background-position: -742px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Floral { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -896px; + background-position: -848px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -896px; + background-position: -954px -896px; width: 105px; height: 105px; } .Mount_Body_Fox-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -896px; + background-position: -1090px 0px; width: 105px; height: 105px; } .Mount_Body_Fox-Holly { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -896px; + background-position: -1090px -106px; width: 105px; height: 105px; } .Mount_Body_Fox-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -896px; + background-position: -1090px -212px; width: 105px; height: 105px; } .Mount_Body_Fox-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -896px; + background-position: -1090px -318px; width: 105px; height: 105px; } .Mount_Body_Fox-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -896px; + background-position: -1090px -424px; width: 105px; height: 105px; } .Mount_Body_Fox-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -896px; + background-position: -1090px -530px; width: 105px; height: 105px; } .Mount_Body_Fox-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px 0px; + background-position: -1090px -636px; width: 105px; height: 105px; } .Mount_Body_Fox-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -106px; + background-position: -1090px -742px; width: 105px; height: 105px; } .Mount_Body_Fox-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -212px; + background-position: -1090px -848px; width: 105px; height: 105px; } @@ -564,19 +600,19 @@ } .Mount_Body_Fox-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -424px; + background-position: -106px -1002px; width: 105px; height: 105px; } .Mount_Body_Fox-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -530px; + background-position: -212px -1002px; width: 105px; height: 105px; } .Mount_Body_Fox-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1090px -636px; + background-position: -318px -1002px; width: 105px; height: 105px; } @@ -642,313 +678,313 @@ } .Mount_Body_Gryphon-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -1002px; + background-position: -1196px -318px; width: 105px; height: 105px; } .Mount_Body_Gryphon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -1002px; + background-position: -1196px -424px; width: 105px; height: 105px; } .Mount_Body_Gryphon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1060px -1002px; + background-position: -1196px -530px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px 0px; + background-position: -1196px -636px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -106px; + background-position: -1196px -742px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -212px; + background-position: -1196px -848px; width: 105px; height: 105px; } .Mount_Body_Gryphon-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -318px; + background-position: -1196px -954px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -424px; + background-position: 0px -1108px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -530px; + background-position: -106px -1108px; width: 105px; height: 105px; } .Mount_Body_Gryphon-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -636px; + background-position: -327px -357px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -742px; + background-position: -318px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -848px; + background-position: -424px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1196px -954px; + background-position: -530px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1108px; + background-position: -636px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -1108px; + background-position: -742px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -327px -357px; + background-position: -848px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -1108px; + background-position: -954px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -1108px; + background-position: -1060px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -1108px; + background-position: -1166px -1108px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -1108px; + background-position: -1302px 0px; width: 105px; height: 105px; } .Mount_Body_GuineaPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -1108px; + background-position: -1302px -106px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -1108px; + background-position: -1302px -212px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -1108px; + background-position: -1302px -318px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1060px -1108px; + background-position: -1302px -424px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1166px -1108px; + background-position: -1302px -530px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px 0px; + background-position: -1302px -636px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -106px; + background-position: -1302px -742px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -212px; + background-position: -1302px -848px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -318px; + background-position: -1302px -954px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -424px; + background-position: -1302px -1060px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -530px; + background-position: 0px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -636px; + background-position: -106px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -742px; + background-position: -212px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -848px; + background-position: -318px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -954px; + background-position: -424px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1302px -1060px; + background-position: -530px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1214px; + background-position: -636px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -1214px; + background-position: -742px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -1214px; + background-position: -848px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -1214px; + background-position: -954px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -1214px; + background-position: -1060px -1214px; width: 105px; height: 105px; } .Mount_Body_Hippogriff-Hopeful { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -1214px; + background-position: -1166px -1214px; width: 105px; height: 105px; } .Mount_Body_Horse-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -1214px; + background-position: -1272px -1214px; width: 105px; height: 105px; } .Mount_Body_Horse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -1214px; + background-position: -1408px 0px; width: 105px; height: 105px; } .Mount_Body_Horse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -1214px; + background-position: -1408px -106px; width: 105px; height: 105px; } .Mount_Body_Horse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -1214px; + background-position: -1408px -212px; width: 105px; height: 105px; } .Mount_Body_Horse-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1060px -1214px; + background-position: -1408px -318px; width: 105px; height: 105px; } .Mount_Body_Horse-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1166px -1214px; + background-position: -1408px -424px; width: 105px; height: 105px; } .Mount_Body_Horse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1272px -1214px; + background-position: -1408px -530px; width: 105px; height: 105px; } .Mount_Body_Horse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px 0px; + background-position: -1408px -636px; width: 105px; height: 105px; } .Mount_Body_Horse-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -106px; + background-position: -1408px -742px; width: 105px; height: 105px; } .Mount_Body_Horse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -212px; + background-position: -1408px -848px; width: 105px; height: 105px; } @@ -966,115 +1002,115 @@ } .Mount_Body_Jackalope-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -318px; + background-position: -1408px -954px; width: 105px; height: 105px; } .Mount_Body_LionCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -636px; + background-position: 0px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -742px; + background-position: -106px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -848px; + background-position: -212px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -954px; + background-position: -318px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -1060px; + background-position: -424px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -1166px; + background-position: -530px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1320px; + background-position: -636px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Ethereal { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -1320px; + background-position: -742px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -1320px; + background-position: -848px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -1320px; + background-position: -954px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -1320px; + background-position: -1060px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -1320px; + background-position: -1166px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -1320px; + background-position: -1272px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -1320px; + background-position: -1378px -1320px; width: 105px; height: 105px; } .Mount_Body_LionCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -1320px; + background-position: -1514px 0px; width: 105px; height: 105px; } .Mount_Body_LionCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -1320px; + background-position: -1514px -106px; width: 105px; height: 105px; } .Mount_Body_LionCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1060px -1320px; + background-position: -1514px -212px; width: 105px; height: 105px; } .Mount_Body_LionCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1166px -1320px; + background-position: -1514px -318px; width: 105px; height: 105px; } @@ -1086,7 +1122,7 @@ } .Mount_Body_LionCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1378px -1320px; + background-position: -1514px -530px; width: 105px; height: 105px; } @@ -1098,19 +1134,19 @@ } .Mount_Body_LionCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -106px; + background-position: -1514px -742px; width: 105px; height: 105px; } .Mount_Body_LionCub-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -212px; + background-position: -1514px -848px; width: 105px; height: 105px; } .Mount_Body_LionCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -318px; + background-position: -1514px -954px; width: 105px; height: 105px; } @@ -1134,335 +1170,299 @@ } .Mount_Body_Monkey-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -742px; + background-position: 0px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -848px; + background-position: -106px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -954px; + background-position: -212px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -1060px; + background-position: -318px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -1166px; + background-position: -424px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1514px -1272px; + background-position: -530px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1426px; + background-position: -636px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -1426px; + background-position: -742px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -1426px; + background-position: -848px -1426px; width: 105px; height: 105px; } .Mount_Body_Monkey-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -1426px; + background-position: -954px -1426px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -1426px; + background-position: -1060px -1426px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -1426px; + background-position: -1166px -1426px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -1426px; + background-position: -1272px -1426px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -1426px; + background-position: -1378px -1426px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -1426px; + background-position: -1484px -1426px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -1426px; + background-position: -1620px 0px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1060px -1426px; + background-position: -1620px -106px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1166px -1426px; + background-position: -1620px -212px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1272px -1426px; + background-position: -1620px -318px; width: 105px; height: 105px; } .Mount_Body_Nudibranch-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1378px -1426px; + background-position: -1620px -424px; width: 105px; height: 105px; } .Mount_Body_Octopus-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1484px -1426px; + background-position: -1620px -530px; width: 105px; height: 105px; } .Mount_Body_Octopus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px 0px; + background-position: -1620px -636px; width: 105px; height: 105px; } .Mount_Body_Octopus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -106px; + background-position: -1620px -742px; width: 105px; height: 105px; } .Mount_Body_Octopus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -212px; + background-position: -1620px -848px; width: 105px; height: 105px; } .Mount_Body_Octopus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -318px; + background-position: -1620px -954px; width: 105px; height: 105px; } .Mount_Body_Octopus-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -424px; + background-position: -1620px -1060px; width: 105px; height: 105px; } .Mount_Body_Octopus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -530px; + background-position: -1620px -1166px; width: 105px; height: 105px; } .Mount_Body_Octopus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -636px; + background-position: -1620px -1272px; width: 105px; height: 105px; } .Mount_Body_Octopus-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -742px; + background-position: -1620px -1378px; width: 105px; height: 105px; } .Mount_Body_Octopus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -848px; + background-position: 0px -1532px; width: 105px; height: 105px; } .Mount_Body_Orca-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -954px; + background-position: -106px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -1060px; + background-position: -212px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -1166px; + background-position: -318px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -1272px; + background-position: -424px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1620px -1378px; + background-position: -530px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1532px; + background-position: -636px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Red { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -106px -1532px; + background-position: -742px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -212px -1532px; + background-position: -848px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -318px -1532px; + background-position: -954px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-White { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -424px -1532px; + background-position: -1060px -1532px; width: 105px; height: 105px; } .Mount_Body_Owl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -530px -1532px; + background-position: -1166px -1532px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -636px -1532px; + background-position: -1272px -1532px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -742px -1532px; + background-position: -1378px -1532px; width: 105px; height: 105px; } .Mount_Body_PandaCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -848px -1532px; + background-position: -1484px -1532px; width: 105px; height: 105px; } .Mount_Body_PandaCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -954px -1532px; + background-position: -1590px -1532px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1060px -1532px; + background-position: -1726px 0px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1166px -1532px; + background-position: -1726px -106px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1272px -1532px; + background-position: -1408px -1166px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1378px -1532px; + background-position: -1408px -1060px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1484px -1532px; - width: 105px; - height: 105px; -} -.Mount_Body_PandaCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1590px -1532px; - width: 105px; - height: 105px; -} -.Mount_Body_PandaCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1726px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_PandaCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1726px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_PandaCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_PandaCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1408px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_PandaCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-12.png'); background-position: -1726px -212px; width: 105px; diff --git a/website/client/assets/css/sprites/spritesmith-main-13.css b/website/client/assets/css/sprites/spritesmith-main-13.css index 765894a2e5..dc403b7342 100644 --- a/website/client/assets/css/sprites/spritesmith-main-13.css +++ b/website/client/assets/css/sprites/spritesmith-main-13.css @@ -1,24 +1,60 @@ -.Mount_Body_PandaCub-Shade { +.Mount_Body_PandaCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -983px; + background-position: -1104px -318px; width: 105px; height: 105px; } -.Mount_Body_PandaCub-Shimmer { +.Mount_Body_PandaCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); background-position: -1210px -636px; width: 105px; height: 105px; } +.Mount_Body_PandaCub-Holly { + background-image: url('~assets/images/sprites/spritesmith-main-13.png'); + background-position: -530px -983px; + width: 105px; + height: 105px; +} +.Mount_Body_PandaCub-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-13.png'); + background-position: -636px -983px; + width: 105px; + height: 105px; +} +.Mount_Body_PandaCub-Red { + background-image: url('~assets/images/sprites/spritesmith-main-13.png'); + background-position: -742px -983px; + width: 105px; + height: 105px; +} +.Mount_Body_PandaCub-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-13.png'); + background-position: -848px -983px; + width: 105px; + height: 105px; +} +.Mount_Body_PandaCub-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-13.png'); + background-position: -954px -983px; + width: 105px; + height: 105px; +} +.Mount_Body_PandaCub-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-13.png'); + background-position: -1104px 0px; + width: 105px; + height: 105px; +} .Mount_Body_PandaCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -848px; + background-position: -1104px -106px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -983px; + background-position: -1104px -212px; width: 105px; height: 105px; } @@ -30,445 +66,445 @@ } .Mount_Body_PandaCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -983px; + background-position: -1104px -424px; width: 105px; height: 105px; } .Mount_Body_PandaCub-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -983px; + background-position: -1272px -1407px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -983px; + background-position: -1528px -1272px; width: 105px; height: 105px; } .Mount_Body_Parrot-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -983px; + background-position: -1528px -1378px; width: 105px; height: 105px; } .Mount_Body_Parrot-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -983px; + background-position: 0px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -983px; + background-position: -106px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -983px; + background-position: -212px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1407px; + background-position: -318px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -636px; + background-position: -424px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -742px; + background-position: -530px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -848px; + background-position: -636px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -954px; + background-position: -742px -1513px; width: 105px; height: 105px; } .Mount_Body_Parrot-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -1060px; + background-position: -348px -544px; width: 105px; height: 105px; } .Mount_Body_Peacock-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -1166px; + background-position: -454px -544px; width: 105px; height: 105px; } .Mount_Body_Peacock-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -1272px; + background-position: -560px -544px; width: 105px; height: 105px; } .Mount_Body_Peacock-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -1378px; + background-position: -680px 0px; width: 105px; height: 105px; } .Mount_Body_Peacock-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1513px; + background-position: -680px -106px; width: 105px; height: 105px; } .Mount_Body_Peacock-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1513px; + background-position: -680px -212px; width: 105px; height: 105px; } .Mount_Body_Peacock-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -348px -544px; + background-position: -680px -318px; width: 105px; height: 105px; } .Mount_Body_Peacock-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -454px -544px; + background-position: -680px -424px; width: 105px; height: 105px; } .Mount_Body_Peacock-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -560px -544px; + background-position: -680px -530px; width: 105px; height: 105px; } .Mount_Body_Peacock-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -680px 0px; + background-position: 0px -665px; width: 105px; height: 105px; } .Mount_Body_Peacock-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -680px -106px; + background-position: -106px -665px; width: 105px; height: 105px; } .Mount_Body_Penguin-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -680px -212px; + background-position: -212px -665px; width: 105px; height: 105px; } .Mount_Body_Penguin-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -680px -318px; + background-position: -318px -665px; width: 105px; height: 105px; } .Mount_Body_Penguin-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -680px -424px; + background-position: -424px -665px; width: 105px; height: 105px; } .Mount_Body_Penguin-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -680px -530px; + background-position: -530px -665px; width: 105px; height: 105px; } .Mount_Body_Penguin-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -665px; + background-position: -636px -665px; width: 105px; height: 105px; } .Mount_Body_Penguin-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -665px; + background-position: -786px 0px; width: 105px; height: 105px; } .Mount_Body_Penguin-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -665px; + background-position: -786px -106px; width: 105px; height: 105px; } .Mount_Body_Penguin-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -665px; + background-position: -786px -212px; width: 105px; height: 105px; } .Mount_Body_Penguin-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -665px; + background-position: -786px -318px; width: 105px; height: 105px; } .Mount_Body_Penguin-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -665px; + background-position: -786px -424px; width: 105px; height: 105px; } .Mount_Body_Phoenix-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -665px; + background-position: -786px -530px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px 0px; + background-position: -786px -636px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px -106px; + background-position: 0px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px -212px; + background-position: -106px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px -318px; + background-position: -212px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px -424px; + background-position: -318px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px -530px; + background-position: -424px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -786px -636px; + background-position: -530px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -771px; + background-position: -636px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -771px; + background-position: -742px -771px; width: 105px; height: 105px; } .Mount_Body_Pterodactyl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -771px; + background-position: -892px 0px; width: 105px; height: 105px; } .Mount_Body_Rat-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -771px; + background-position: -892px -106px; width: 105px; height: 105px; } .Mount_Body_Rat-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -771px; + background-position: -892px -212px; width: 105px; height: 105px; } .Mount_Body_Rat-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -771px; + background-position: -892px -318px; width: 105px; height: 105px; } .Mount_Body_Rat-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -771px; + background-position: -892px -424px; width: 105px; height: 105px; } .Mount_Body_Rat-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -771px; + background-position: -892px -530px; width: 105px; height: 105px; } .Mount_Body_Rat-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px 0px; + background-position: -892px -636px; width: 105px; height: 105px; } .Mount_Body_Rat-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -106px; + background-position: -892px -742px; width: 105px; height: 105px; } .Mount_Body_Rat-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -212px; + background-position: 0px -877px; width: 105px; height: 105px; } .Mount_Body_Rat-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -318px; + background-position: -106px -877px; width: 105px; height: 105px; } .Mount_Body_Rat-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -424px; + background-position: -212px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -530px; + background-position: -318px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -636px; + background-position: -424px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -892px -742px; + background-position: -530px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -877px; + background-position: -636px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -877px; + background-position: -742px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -877px; + background-position: -848px -877px; width: 105px; height: 105px; } .Mount_Body_Rock-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -877px; + background-position: -998px 0px; width: 105px; height: 105px; } .Mount_Body_Rock-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -877px; + background-position: -998px -106px; width: 105px; height: 105px; } .Mount_Body_Rock-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -877px; + background-position: -998px -212px; width: 105px; height: 105px; } .Mount_Body_Rock-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -877px; + background-position: -998px -318px; width: 105px; height: 105px; } .Mount_Body_Rooster-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -877px; + background-position: -998px -424px; width: 105px; height: 105px; } .Mount_Body_Rooster-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -877px; + background-position: -998px -530px; width: 105px; height: 105px; } .Mount_Body_Rooster-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px 0px; + background-position: -998px -636px; width: 105px; height: 105px; } .Mount_Body_Rooster-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -106px; + background-position: -998px -742px; width: 105px; height: 105px; } .Mount_Body_Rooster-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -212px; + background-position: -998px -848px; width: 105px; height: 105px; } .Mount_Body_Rooster-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -318px; + background-position: 0px -983px; width: 105px; height: 105px; } .Mount_Body_Rooster-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -424px; + background-position: -106px -983px; width: 105px; height: 105px; } .Mount_Body_Rooster-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -530px; + background-position: -212px -983px; width: 105px; height: 105px; } .Mount_Body_Rooster-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -636px; + background-position: -318px -983px; width: 105px; height: 105px; } .Mount_Body_Rooster-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -998px -742px; + background-position: -424px -983px; width: 105px; height: 105px; } @@ -534,421 +570,421 @@ } .Mount_Body_Seahorse-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -983px; + background-position: -1104px -530px; width: 105px; height: 105px; } .Mount_Body_Seahorse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px 0px; + background-position: -1104px -636px; width: 105px; height: 105px; } .Mount_Body_Seahorse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -106px; + background-position: -1104px -742px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -212px; + background-position: -1104px -848px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -318px; + background-position: -1104px -954px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -424px; + background-position: 0px -1089px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -530px; + background-position: -106px -1089px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -636px; + background-position: -212px -1089px; width: 105px; height: 105px; } .Mount_Body_Seahorse-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -742px; + background-position: -318px -1089px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -848px; + background-position: -424px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -954px; + background-position: -530px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1089px; + background-position: -636px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1089px; + background-position: -742px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1089px; + background-position: -848px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1089px; + background-position: -954px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1089px; + background-position: -1060px -1089px; width: 105px; height: 105px; } .Mount_Body_Sheep-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1089px; + background-position: -1210px 0px; width: 105px; height: 105px; } .Mount_Body_Sheep-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1089px; + background-position: -1210px -106px; width: 105px; height: 105px; } .Mount_Body_Sheep-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1089px; + background-position: -1210px -212px; width: 105px; height: 105px; } .Mount_Body_Sheep-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1089px; + background-position: -1210px -318px; width: 105px; height: 105px; } .Mount_Body_Slime-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1089px; + background-position: -1210px -424px; width: 105px; height: 105px; } .Mount_Body_Slime-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1089px; + background-position: -1210px -530px; width: 105px; height: 105px; } .Mount_Body_Slime-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px 0px; + background-position: -242px -544px; width: 105px; height: 105px; } .Mount_Body_Slime-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -106px; + background-position: -1210px -742px; width: 105px; height: 105px; } .Mount_Body_Slime-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -212px; + background-position: -1210px -848px; width: 105px; height: 105px; } .Mount_Body_Slime-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -318px; + background-position: -1210px -954px; width: 105px; height: 105px; } .Mount_Body_Slime-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -424px; + background-position: -1210px -1060px; width: 105px; height: 105px; } .Mount_Body_Slime-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -530px; + background-position: 0px -1195px; width: 105px; height: 105px; } .Mount_Body_Slime-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -242px -544px; + background-position: -106px -1195px; width: 105px; height: 105px; } .Mount_Body_Slime-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -742px; + background-position: -212px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -848px; + background-position: -318px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -954px; + background-position: -424px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1210px -1060px; + background-position: -530px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1195px; + background-position: -636px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1195px; + background-position: -742px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1195px; + background-position: -848px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1195px; + background-position: -954px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1195px; + background-position: -1060px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1195px; + background-position: -1166px -1195px; width: 105px; height: 105px; } .Mount_Body_Sloth-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1195px; + background-position: -1316px 0px; width: 105px; height: 105px; } .Mount_Body_Snail-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1195px; + background-position: -1316px -106px; width: 105px; height: 105px; } .Mount_Body_Snail-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1195px; + background-position: -1316px -212px; width: 105px; height: 105px; } .Mount_Body_Snail-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1195px; + background-position: -1316px -318px; width: 105px; height: 105px; } .Mount_Body_Snail-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1195px; + background-position: -1316px -424px; width: 105px; height: 105px; } .Mount_Body_Snail-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1166px -1195px; + background-position: -1316px -530px; width: 105px; height: 105px; } .Mount_Body_Snail-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px 0px; + background-position: -1316px -636px; width: 105px; height: 105px; } .Mount_Body_Snail-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -106px; + background-position: -1316px -742px; width: 105px; height: 105px; } .Mount_Body_Snail-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -212px; + background-position: -1316px -848px; width: 105px; height: 105px; } .Mount_Body_Snail-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -318px; + background-position: -1316px -954px; width: 105px; height: 105px; } .Mount_Body_Snail-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -424px; + background-position: -1316px -1060px; width: 105px; height: 105px; } .Mount_Body_Snake-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -530px; + background-position: -1316px -1166px; width: 105px; height: 105px; } .Mount_Body_Snake-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -636px; + background-position: 0px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -742px; + background-position: -106px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -848px; + background-position: -212px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -954px; + background-position: -318px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -1060px; + background-position: -424px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -1166px; + background-position: -530px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1301px; + background-position: -636px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1301px; + background-position: -742px -1301px; width: 105px; height: 105px; } .Mount_Body_Snake-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1301px; + background-position: -848px -1301px; width: 105px; height: 105px; } .Mount_Body_Spider-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1301px; + background-position: -954px -1301px; width: 105px; height: 105px; } .Mount_Body_Spider-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1301px; + background-position: -1060px -1301px; width: 105px; height: 105px; } .Mount_Body_Spider-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1301px; + background-position: -1166px -1301px; width: 105px; height: 105px; } .Mount_Body_Spider-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1301px; + background-position: -1272px -1301px; width: 105px; height: 105px; } .Mount_Body_Spider-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1301px; + background-position: -1422px 0px; width: 105px; height: 105px; } .Mount_Body_Spider-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1301px; + background-position: -1422px -106px; width: 105px; height: 105px; } .Mount_Body_Spider-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1301px; + background-position: -1422px -212px; width: 105px; height: 105px; } .Mount_Body_Spider-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1301px; + background-position: -1422px -318px; width: 105px; height: 105px; } .Mount_Body_Spider-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1166px -1301px; + background-position: -1422px -424px; width: 105px; height: 105px; } .Mount_Body_Spider-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1272px -1301px; + background-position: -1422px -530px; width: 105px; height: 105px; } @@ -1014,115 +1050,115 @@ } .Mount_Body_TigerCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px 0px; + background-position: -1422px -636px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -106px; + background-position: -1422px -742px; width: 105px; height: 105px; } .Mount_Body_TigerCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -212px; + background-position: -1422px -848px; width: 105px; height: 105px; } .Mount_Body_TigerCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -318px; + background-position: -1422px -954px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -424px; + background-position: -1422px -1060px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -530px; + background-position: -1422px -1166px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -636px; + background-position: -1422px -1272px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -742px; + background-position: 0px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -848px; + background-position: -106px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -954px; + background-position: -212px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -1060px; + background-position: -318px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -1166px; + background-position: -424px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1422px -1272px; + background-position: -530px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1407px; + background-position: -636px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1407px; + background-position: -742px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1407px; + background-position: -848px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1407px; + background-position: -954px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1407px; + background-position: -1060px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1407px; + background-position: -1166px -1407px; width: 105px; height: 105px; } @@ -1134,269 +1170,233 @@ } .Mount_Body_TigerCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1407px; + background-position: -1378px -1407px; width: 105px; height: 105px; } .Mount_Body_TigerCub-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1407px; + background-position: -1528px 0px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1407px; + background-position: -1528px -106px; width: 105px; height: 105px; } .Mount_Body_Treeling-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1407px; + background-position: -1528px -212px; width: 105px; height: 105px; } .Mount_Body_Treeling-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1166px -1407px; + background-position: -1528px -318px; width: 105px; height: 105px; } .Mount_Body_Treeling-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1272px -1407px; + background-position: -1528px -424px; width: 105px; height: 105px; } .Mount_Body_Treeling-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1378px -1407px; + background-position: -1528px -530px; width: 105px; height: 105px; } .Mount_Body_Treeling-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px 0px; + background-position: -1528px -636px; width: 105px; height: 105px; } .Mount_Body_Treeling-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -106px; + background-position: -1528px -742px; width: 105px; height: 105px; } .Mount_Body_Treeling-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -212px; + background-position: -1528px -848px; width: 105px; height: 105px; } .Mount_Body_Treeling-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -318px; + background-position: -1528px -954px; width: 105px; height: 105px; } .Mount_Body_Treeling-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -424px; + background-position: -1528px -1060px; width: 105px; height: 105px; } .Mount_Body_Treeling-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1528px -530px; + background-position: -1528px -1166px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1513px; + background-position: -848px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1513px; + background-position: -954px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1513px; + background-position: -1060px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1513px; + background-position: -1166px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1513px; + background-position: -1272px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1513px; + background-position: -1378px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1513px; + background-position: -1484px -1513px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1513px; + background-position: -1634px 0px; width: 105px; height: 105px; } .Mount_Body_Triceratops-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1513px; + background-position: -1634px -106px; width: 105px; height: 105px; } .Mount_Body_Triceratops-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1166px -1513px; + background-position: -1634px -212px; width: 105px; height: 105px; } .Mount_Body_Turkey-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1272px -1513px; + background-position: -1634px -318px; width: 105px; height: 105px; } .Mount_Body_Turkey-Gilded { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1378px -1513px; + background-position: -1634px -424px; width: 105px; height: 105px; } .Mount_Body_Turtle-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1484px -1513px; + background-position: -1634px -530px; width: 105px; height: 105px; } .Mount_Body_Turtle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px 0px; + background-position: -1634px -636px; width: 105px; height: 105px; } .Mount_Body_Turtle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -106px; + background-position: -1634px -742px; width: 105px; height: 105px; } .Mount_Body_Turtle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -212px; + background-position: -1634px -848px; width: 105px; height: 105px; } .Mount_Body_Turtle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -318px; + background-position: -1634px -954px; width: 105px; height: 105px; } .Mount_Body_Turtle-Red { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -424px; + background-position: -1634px -1060px; width: 105px; height: 105px; } .Mount_Body_Turtle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -530px; + background-position: -1634px -1166px; width: 105px; height: 105px; } .Mount_Body_Turtle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -636px; + background-position: -1634px -1272px; width: 105px; height: 105px; } .Mount_Body_Turtle-White { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -742px; + background-position: -1634px -1378px; width: 105px; height: 105px; } .Mount_Body_Turtle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -848px; + background-position: -1634px -1484px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Base { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -954px; + background-position: 0px -1619px; width: 105px; height: 105px; } .Mount_Body_Unicorn-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -1060px; + background-position: -106px -1619px; width: 105px; height: 105px; } .Mount_Body_Unicorn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -1166px; + background-position: -212px -1619px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -1272px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -1378px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1634px -1484px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1619px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1619px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1619px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-13.png'); background-position: -318px -1619px; width: 105px; diff --git a/website/client/assets/css/sprites/spritesmith-main-14.css b/website/client/assets/css/sprites/spritesmith-main-14.css index 11a8d9fc77..1fa5d0ad2c 100644 --- a/website/client/assets/css/sprites/spritesmith-main-14.css +++ b/website/client/assets/css/sprites/spritesmith-main-14.css @@ -1,24 +1,60 @@ -.Mount_Body_Whale-Base { +.Mount_Body_Unicorn-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -106px; + background-position: -1331px -1060px; width: 105px; height: 105px; } -.Mount_Body_Whale-CottonCandyBlue { +.Mount_Body_Unicorn-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); background-position: -848px -1122px; width: 105px; height: 105px; } +.Mount_Body_Unicorn-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-14.png'); + background-position: 0px -1228px; + width: 105px; + height: 105px; +} +.Mount_Body_Unicorn-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-14.png'); + background-position: -106px -1228px; + width: 105px; + height: 105px; +} +.Mount_Body_Unicorn-White { + background-image: url('~assets/images/sprites/spritesmith-main-14.png'); + background-position: -212px -1228px; + width: 105px; + height: 105px; +} +.Mount_Body_Unicorn-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-14.png'); + background-position: -1437px -954px; + width: 105px; + height: 105px; +} +.Mount_Body_Whale-Base { + background-image: url('~assets/images/sprites/spritesmith-main-14.png'); + background-position: -1543px -742px; + width: 105px; + height: 105px; +} +.Mount_Body_Whale-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-14.png'); + background-position: -1543px -848px; + width: 105px; + height: 105px; +} .Mount_Body_Whale-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -212px; + background-position: -1543px -954px; width: 105px; height: 105px; } .Mount_Body_Whale-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -318px; + background-position: -1225px -212px; width: 105px; height: 105px; } @@ -36,25 +72,25 @@ } .Mount_Body_Whale-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -1016px; + background-position: -1331px -636px; width: 105px; height: 105px; } .Mount_Body_Whale-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1060px -1122px; + background-position: -1331px -742px; width: 105px; height: 105px; } .Mount_Body_Whale-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1166px -1122px; + background-position: -1331px -848px; width: 105px; height: 105px; } .Mount_Body_Whale-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px 0px; + background-position: -1331px -954px; width: 105px; height: 105px; } @@ -198,361 +234,361 @@ } .Mount_Body_Yarn-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -636px; + background-position: -1543px -1060px; width: 105px; height: 105px; } .Mount_Body_Yarn-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -742px; + background-position: -1543px -1166px; width: 105px; height: 105px; } .Mount_Body_Yarn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -318px; + background-position: -1543px -1272px; width: 105px; height: 105px; } .Mount_Body_Yarn-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -106px; + background-position: 0px -1440px; width: 105px; height: 105px; } .Mount_Body_Yarn-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -212px; + background-position: -106px -1440px; width: 105px; height: 105px; } .Mount_Body_Yarn-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -318px; + background-position: -212px -1440px; width: 105px; height: 105px; } .Mount_Body_Yarn-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -424px; + background-position: -318px -1440px; width: 105px; height: 105px; } .Mount_Body_Yarn-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -530px; + background-position: -424px -1546px; width: 105px; height: 105px; } .Mount_Body_Yarn-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -636px; + background-position: -907px -451px; width: 105px; height: 105px; } .Mount_Body_Yarn-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -742px; + background-position: -907px -557px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -848px; + background-position: -907px -663px; width: 105px; height: 105px; } .Mount_Head_Armadillo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -954px; + background-position: 0px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -1060px; + background-position: -106px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -1272px; + background-position: -212px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -907px -451px; + background-position: -318px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -907px -557px; + background-position: -424px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -907px -663px; + background-position: -530px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -804px; + background-position: -636px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -804px; + background-position: -742px -804px; width: 105px; height: 105px; } .Mount_Head_Armadillo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -804px; + background-position: -848px -804px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -804px; + background-position: -1013px 0px; width: 105px; height: 105px; } .Mount_Head_Axolotl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -804px; + background-position: -1013px -106px; width: 105px; height: 105px; } .Mount_Head_Axolotl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -804px; + background-position: -1013px -212px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -804px; + background-position: -1013px -318px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -804px; + background-position: -1013px -424px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -804px; + background-position: -1013px -530px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px 0px; + background-position: -1013px -636px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -106px; + background-position: -1013px -742px; width: 105px; height: 105px; } .Mount_Head_Axolotl-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -212px; + background-position: 0px -910px; width: 105px; height: 105px; } .Mount_Head_Axolotl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -318px; + background-position: -106px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -424px; + background-position: -212px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -530px; + background-position: -318px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -636px; + background-position: -424px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1013px -742px; + background-position: -530px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -910px; + background-position: -636px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -910px; + background-position: -742px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -910px; + background-position: -848px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -910px; + background-position: -954px -910px; width: 105px; height: 105px; } .Mount_Head_Badger-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -910px; + background-position: -1119px 0px; width: 105px; height: 105px; } .Mount_Head_Badger-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -910px; + background-position: -1119px -106px; width: 105px; height: 105px; } .Mount_Head_BearCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -910px; + background-position: -1119px -212px; width: 105px; height: 105px; } .Mount_Head_BearCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -910px; + background-position: -1119px -318px; width: 105px; height: 105px; } .Mount_Head_BearCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -910px; + background-position: -1119px -424px; width: 105px; height: 105px; } .Mount_Head_BearCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -910px; + background-position: -1119px -530px; width: 105px; height: 105px; } .Mount_Head_BearCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px 0px; + background-position: -1119px -636px; width: 105px; height: 105px; } .Mount_Head_BearCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -106px; + background-position: -1119px -742px; width: 105px; height: 105px; } .Mount_Head_BearCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -212px; + background-position: -1119px -848px; width: 105px; height: 105px; } .Mount_Head_BearCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -318px; + background-position: 0px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -424px; + background-position: -106px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -530px; + background-position: -212px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -636px; + background-position: -318px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -742px; + background-position: -424px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1119px -848px; + background-position: -530px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Polar { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -1016px; + background-position: -636px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -1016px; + background-position: -742px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -1016px; + background-position: -848px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -1016px; + background-position: -954px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -1016px; + background-position: -1060px -1016px; width: 105px; height: 105px; } .Mount_Head_BearCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -1016px; + background-position: -1225px 0px; width: 105px; height: 105px; } .Mount_Head_BearCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -1016px; + background-position: -1225px -106px; width: 105px; height: 105px; } @@ -564,139 +600,139 @@ } .Mount_Head_BearCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -1016px; + background-position: -1225px -318px; width: 105px; height: 105px; } .Mount_Head_BearCub-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -1016px; + background-position: -1225px -424px; width: 105px; height: 105px; } .Mount_Head_BearCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1060px -1016px; + background-position: -1225px -530px; width: 105px; height: 105px; } .Mount_Head_Beetle-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px 0px; + background-position: -1225px -636px; width: 105px; height: 105px; } .Mount_Head_Beetle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -106px; + background-position: -1225px -742px; width: 105px; height: 105px; } .Mount_Head_Beetle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -212px; + background-position: -1225px -848px; width: 105px; height: 105px; } .Mount_Head_Beetle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -318px; + background-position: -1225px -954px; width: 105px; height: 105px; } .Mount_Head_Beetle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -424px; + background-position: 0px -1122px; width: 105px; height: 105px; } .Mount_Head_Beetle-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -530px; + background-position: -106px -1122px; width: 105px; height: 105px; } .Mount_Head_Beetle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -636px; + background-position: -212px -1122px; width: 105px; height: 105px; } .Mount_Head_Beetle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -742px; + background-position: -318px -1122px; width: 105px; height: 105px; } .Mount_Head_Beetle-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -848px; + background-position: -424px -1122px; width: 105px; height: 105px; } .Mount_Head_Beetle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1225px -954px; + background-position: -530px -1122px; width: 105px; height: 105px; } .Mount_Head_Bunny-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -1122px; + background-position: -636px -1122px; width: 105px; height: 105px; } .Mount_Head_Bunny-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -1122px; + background-position: -742px -1122px; width: 105px; height: 105px; } .Mount_Head_Bunny-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -1122px; + background-position: -907px -345px; width: 105px; height: 105px; } .Mount_Head_Bunny-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -1122px; + background-position: -954px -1122px; width: 105px; height: 105px; } .Mount_Head_Bunny-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -1122px; + background-position: -1060px -1122px; width: 105px; height: 105px; } .Mount_Head_Bunny-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -1122px; + background-position: -1166px -1122px; width: 105px; height: 105px; } .Mount_Head_Bunny-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -1122px; + background-position: -1331px 0px; width: 105px; height: 105px; } .Mount_Head_Bunny-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -1122px; + background-position: -1331px -106px; width: 105px; height: 105px; } .Mount_Head_Bunny-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -907px -345px; + background-position: -1331px -212px; width: 105px; height: 105px; } .Mount_Head_Bunny-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -1122px; + background-position: -1331px -318px; width: 105px; height: 105px; } @@ -762,115 +798,115 @@ } .Mount_Head_Cactus-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -848px; + background-position: -318px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -954px; + background-position: -424px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1331px -1060px; + background-position: -530px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -1228px; + background-position: -636px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -1228px; + background-position: -742px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -1228px; + background-position: -848px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Ember { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -1228px; + background-position: -954px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -1228px; + background-position: -1060px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Floral { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -1228px; + background-position: -1166px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -1228px; + background-position: -1272px -1228px; width: 105px; height: 105px; } .Mount_Head_Cactus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -1228px; + background-position: -1437px 0px; width: 105px; height: 105px; } .Mount_Head_Cactus-Holly { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -1228px; + background-position: -1437px -106px; width: 105px; height: 105px; } .Mount_Head_Cactus-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -1228px; + background-position: -1437px -212px; width: 105px; height: 105px; } .Mount_Head_Cactus-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1060px -1228px; + background-position: -1437px -318px; width: 105px; height: 105px; } .Mount_Head_Cactus-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1166px -1228px; + background-position: -1437px -424px; width: 105px; height: 105px; } .Mount_Head_Cactus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1272px -1228px; + background-position: -1437px -530px; width: 105px; height: 105px; } .Mount_Head_Cactus-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px 0px; + background-position: -1437px -636px; width: 105px; height: 105px; } .Mount_Head_Cactus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -106px; + background-position: -1437px -742px; width: 105px; height: 105px; } .Mount_Head_Cactus-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -212px; + background-position: -1437px -848px; width: 105px; height: 105px; } @@ -882,139 +918,139 @@ } .Mount_Head_Cactus-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -424px; + background-position: -1437px -1060px; width: 105px; height: 105px; } .Mount_Head_Cactus-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -530px; + background-position: -1437px -1166px; width: 105px; height: 105px; } .Mount_Head_Cactus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -636px; + background-position: 0px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -742px; + background-position: -106px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -848px; + background-position: -212px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -954px; + background-position: -318px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -1060px; + background-position: -424px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1437px -1166px; + background-position: -530px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -1334px; + background-position: -636px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -1334px; + background-position: -742px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -1334px; + background-position: -848px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -1334px; + background-position: -954px -1334px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -1334px; + background-position: -1060px -1334px; width: 105px; height: 105px; } .Mount_Head_Cow-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -1334px; + background-position: -1166px -1334px; width: 105px; height: 105px; } .Mount_Head_Cow-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -1334px; + background-position: -1272px -1334px; width: 105px; height: 105px; } .Mount_Head_Cow-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -1334px; + background-position: -1378px -1334px; width: 105px; height: 105px; } .Mount_Head_Cow-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -1334px; + background-position: -1543px 0px; width: 105px; height: 105px; } .Mount_Head_Cow-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -1334px; + background-position: -1543px -106px; width: 105px; height: 105px; } .Mount_Head_Cow-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1060px -1334px; + background-position: -1543px -212px; width: 105px; height: 105px; } .Mount_Head_Cow-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1166px -1334px; + background-position: -1543px -318px; width: 105px; height: 105px; } .Mount_Head_Cow-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1272px -1334px; + background-position: -1543px -424px; width: 105px; height: 105px; } .Mount_Head_Cow-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1378px -1334px; + background-position: -1543px -530px; width: 105px; height: 105px; } .Mount_Head_Cow-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px 0px; + background-position: -1543px -636px; width: 105px; height: 105px; } @@ -1080,175 +1116,175 @@ } .Mount_Head_Deer-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -1166px; + background-position: -424px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1543px -1272px; + background-position: -530px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -1440px; + background-position: -636px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -1440px; + background-position: -742px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -1440px; + background-position: -848px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -1440px; + background-position: -954px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -1440px; + background-position: -1060px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -1440px; + background-position: -1166px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -1440px; + background-position: -1272px -1440px; width: 105px; height: 105px; } .Mount_Head_Deer-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -1440px; + background-position: -1378px -1440px; width: 105px; height: 105px; } .Mount_Head_Dragon-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -1440px; + background-position: -1484px -1440px; width: 105px; height: 105px; } .Mount_Head_Dragon-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -1440px; + background-position: -1649px 0px; width: 105px; height: 105px; } .Mount_Head_Dragon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1060px -1440px; + background-position: -1649px -106px; width: 105px; height: 105px; } .Mount_Head_Dragon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1166px -1440px; + background-position: -1649px -212px; width: 105px; height: 105px; } .Mount_Head_Dragon-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1272px -1440px; + background-position: -1649px -318px; width: 105px; height: 105px; } .Mount_Head_Dragon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1378px -1440px; + background-position: -1649px -424px; width: 105px; height: 105px; } .Mount_Head_Dragon-Ember { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1484px -1440px; + background-position: -1649px -530px; width: 105px; height: 105px; } .Mount_Head_Dragon-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px 0px; + background-position: -1649px -636px; width: 105px; height: 105px; } .Mount_Head_Dragon-Floral { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -106px; + background-position: -1649px -742px; width: 105px; height: 105px; } .Mount_Head_Dragon-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -212px; + background-position: -1649px -848px; width: 105px; height: 105px; } .Mount_Head_Dragon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -318px; + background-position: -1649px -954px; width: 105px; height: 105px; } .Mount_Head_Dragon-Holly { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -424px; + background-position: -1649px -1060px; width: 105px; height: 105px; } .Mount_Head_Dragon-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -530px; + background-position: -1649px -1166px; width: 105px; height: 105px; } .Mount_Head_Dragon-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -636px; + background-position: -1649px -1272px; width: 105px; height: 105px; } .Mount_Head_Dragon-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -742px; + background-position: -1649px -1378px; width: 105px; height: 105px; } .Mount_Head_Dragon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -848px; + background-position: 0px -1546px; width: 105px; height: 105px; } .Mount_Head_Dragon-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -954px; + background-position: -106px -1546px; width: 105px; height: 105px; } .Mount_Head_Dragon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -1060px; + background-position: -212px -1546px; width: 105px; height: 105px; } .Mount_Head_Dragon-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -1166px; + background-position: -318px -1546px; width: 105px; height: 105px; } @@ -1260,119 +1296,83 @@ } .Mount_Head_Dragon-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1649px -1378px; + background-position: -530px -1546px; width: 105px; height: 105px; } .Mount_Head_Dragon-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: 0px -1546px; + background-position: -636px -1546px; width: 105px; height: 105px; } .Mount_Head_Dragon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -106px -1546px; + background-position: -742px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-Base { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -212px -1546px; + background-position: -848px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -318px -1546px; + background-position: -954px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -424px -1546px; + background-position: -1060px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-Desert { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -530px -1546px; + background-position: -1166px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-Golden { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -636px -1546px; + background-position: -1272px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-Red { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -742px -1546px; + background-position: -1378px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -848px -1546px; + background-position: -1484px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -954px -1546px; + background-position: -1590px -1546px; width: 105px; height: 105px; } .Mount_Head_Egg-White { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1060px -1546px; + background-position: -1755px 0px; width: 105px; height: 105px; } .Mount_Head_Egg-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1166px -1546px; + background-position: -1755px -106px; width: 105px; height: 105px; } .Mount_Head_Falcon-Base { - background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1272px -1546px; - width: 105px; - height: 105px; -} -.Mount_Head_Falcon-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1378px -1546px; - width: 105px; - height: 105px; -} -.Mount_Head_Falcon-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1484px -1546px; - width: 105px; - height: 105px; -} -.Mount_Head_Falcon-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1590px -1546px; - width: 105px; - height: 105px; -} -.Mount_Head_Falcon-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1755px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Falcon-Red { - background-image: url('~assets/images/sprites/spritesmith-main-14.png'); - background-position: -1755px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Falcon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-14.png'); background-position: -1755px -212px; width: 105px; diff --git a/website/client/assets/css/sprites/spritesmith-main-15.css b/website/client/assets/css/sprites/spritesmith-main-15.css index 1d50bd4e72..acf1264cf7 100644 --- a/website/client/assets/css/sprites/spritesmith-main-15.css +++ b/website/client/assets/css/sprites/spritesmith-main-15.css @@ -1,195 +1,231 @@ -.Mount_Head_Falcon-Skeleton { +.Mount_Head_Falcon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -321px -357px; + background-position: -318px -578px; width: 105px; height: 105px; } -.Mount_Head_Falcon-White { +.Mount_Head_Falcon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -212px -1108px; width: 105px; height: 105px; } -.Mount_Head_Falcon-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -684px; - width: 105px; - height: 105px; -} -.Mount_Head_Ferret-Base { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -878px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_Ferret-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -878px -424px; - width: 105px; - height: 105px; -} -.Mount_Head_Ferret-CottonCandyPink { +.Mount_Head_Falcon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -878px -530px; width: 105px; height: 105px; } -.Mount_Head_Ferret-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -878px -636px; - width: 105px; - height: 105px; -} -.Mount_Head_Ferret-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -790px; - width: 105px; - height: 105px; -} -.Mount_Head_Ferret-Red { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -790px; - width: 105px; - height: 105px; -} -.Mount_Head_Ferret-Shade { +.Mount_Head_Falcon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -212px -790px; width: 105px; height: 105px; } -.Mount_Head_Ferret-Skeleton { +.Mount_Head_Falcon-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -318px -790px; width: 105px; height: 105px; } -.Mount_Head_Ferret-White { +.Mount_Head_Falcon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -424px -790px; width: 105px; height: 105px; } -.Mount_Head_Ferret-Zombie { +.Mount_Head_Falcon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -530px -790px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Aquatic { +.Mount_Head_Falcon-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -1060px; + background-position: -636px -790px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Base { +.Mount_Head_Falcon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -1214px; + background-position: -742px -790px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-CottonCandyBlue { +.Mount_Head_Ferret-Base { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -848px -790px; + width: 105px; + height: 105px; +} +.Mount_Head_Ferret-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -984px 0px; + width: 105px; + height: 105px; +} +.Mount_Head_Ferret-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -984px -106px; + width: 105px; + height: 105px; +} +.Mount_Head_Ferret-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -984px -212px; + width: 105px; + height: 105px; +} +.Mount_Head_Ferret-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -530px -1214px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -1214px; - width: 105px; - height: 105px; -} -.Mount_Head_FlyingPig-Cupid { +.Mount_Head_Ferret-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -742px -1214px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Desert { +.Mount_Head_Ferret-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -106px; + background-position: -1166px -1214px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Ember { +.Mount_Head_Ferret-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -1272px -1214px; + width: 105px; + height: 105px; +} +.Mount_Head_Ferret-White { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -1408px 0px; + width: 105px; + height: 105px; +} +.Mount_Head_Ferret-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -1620px -742px; + width: 105px; + height: 105px; +} +.Mount_Head_FlyingPig-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -427px -357px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Fairy { +.Mount_Head_FlyingPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -560px 0px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Floral { +.Mount_Head_FlyingPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -560px -106px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Ghost { +.Mount_Head_FlyingPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -560px -212px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Golden { +.Mount_Head_FlyingPig-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -560px -318px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Holly { +.Mount_Head_FlyingPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: 0px -472px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Peppermint { +.Mount_Head_FlyingPig-Ember { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -106px -472px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Red { +.Mount_Head_FlyingPig-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -212px -472px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-RoyalPurple { +.Mount_Head_FlyingPig-Floral { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -318px -472px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Shade { +.Mount_Head_FlyingPig-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -424px -472px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Shimmer { +.Mount_Head_FlyingPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -530px -472px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Skeleton { +.Mount_Head_FlyingPig-Holly { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -666px 0px; width: 105px; height: 105px; } -.Mount_Head_FlyingPig-Spooky { +.Mount_Head_FlyingPig-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -666px -106px; width: 105px; height: 105px; } +.Mount_Head_FlyingPig-Red { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -666px -212px; + width: 105px; + height: 105px; +} +.Mount_Head_FlyingPig-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -666px -318px; + width: 105px; + height: 105px; +} +.Mount_Head_FlyingPig-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -666px -424px; + width: 105px; + height: 105px; +} +.Mount_Head_FlyingPig-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: 0px -578px; + width: 105px; + height: 105px; +} +.Mount_Head_FlyingPig-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -106px -578px; + width: 105px; + height: 105px; +} +.Mount_Head_FlyingPig-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-15.png'); + background-position: -212px -578px; + width: 105px; + height: 105px; +} .Mount_Head_FlyingPig-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: 0px -121px; @@ -198,133 +234,133 @@ } .Mount_Head_FlyingPig-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -666px -318px; + background-position: -424px -578px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -666px -424px; + background-position: -530px -578px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -578px; + background-position: -636px -578px; width: 105px; height: 105px; } .Mount_Head_Fox-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -578px; + background-position: -772px 0px; width: 105px; height: 105px; } .Mount_Head_Fox-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -578px; + background-position: -772px -106px; width: 105px; height: 105px; } .Mount_Head_Fox-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -578px; + background-position: -772px -212px; width: 105px; height: 105px; } .Mount_Head_Fox-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -578px; + background-position: -772px -318px; width: 105px; height: 105px; } .Mount_Head_Fox-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -578px; + background-position: -772px -424px; width: 105px; height: 105px; } .Mount_Head_Fox-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -578px; + background-position: -772px -530px; width: 105px; height: 105px; } .Mount_Head_Fox-Ember { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -772px 0px; + background-position: 0px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -772px -106px; + background-position: -106px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Floral { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -772px -212px; + background-position: -212px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -772px -318px; + background-position: -318px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -772px -424px; + background-position: -424px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Holly { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -772px -530px; + background-position: -530px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -684px; + background-position: -636px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -684px; + background-position: -742px -684px; width: 105px; height: 105px; } .Mount_Head_Fox-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -684px; + background-position: -878px 0px; width: 105px; height: 105px; } .Mount_Head_Fox-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -684px; + background-position: -878px -106px; width: 105px; height: 105px; } .Mount_Head_Fox-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -684px; + background-position: -878px -212px; width: 105px; height: 105px; } .Mount_Head_Fox-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -684px; + background-position: -878px -318px; width: 105px; height: 105px; } .Mount_Head_Fox-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -684px; + background-position: -878px -424px; width: 105px; height: 105px; } @@ -336,19 +372,19 @@ } .Mount_Head_Fox-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -878px 0px; + background-position: -878px -636px; width: 105px; height: 105px; } .Mount_Head_Fox-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -878px -106px; + background-position: 0px -790px; width: 105px; height: 105px; } .Mount_Head_Fox-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -878px -212px; + background-position: -106px -790px; width: 105px; height: 105px; } @@ -414,313 +450,313 @@ } .Mount_Head_Gryphon-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -790px; + background-position: -984px -318px; width: 105px; height: 105px; } .Mount_Head_Gryphon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -790px; + background-position: -984px -424px; width: 105px; height: 105px; } .Mount_Head_Gryphon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -790px; + background-position: -984px -530px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px 0px; + background-position: -984px -636px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -106px; + background-position: -984px -742px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -212px; + background-position: 0px -896px; width: 105px; height: 105px; } .Mount_Head_Gryphon-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -318px; + background-position: -106px -896px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -424px; + background-position: -212px -896px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -530px; + background-position: -318px -896px; width: 105px; height: 105px; } .Mount_Head_Gryphon-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -636px; + background-position: -424px -896px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -984px -742px; + background-position: -530px -896px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -896px; + background-position: -636px -896px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -896px; + background-position: -742px -896px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -896px; + background-position: -848px -896px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -896px; + background-position: -954px -896px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -896px; + background-position: -1090px 0px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -896px; + background-position: -1090px -106px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -896px; + background-position: -1090px -212px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -896px; + background-position: -1090px -318px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -896px; + background-position: -1090px -424px; width: 105px; height: 105px; } .Mount_Head_GuineaPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -896px; + background-position: -1090px -530px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px 0px; + background-position: -1090px -636px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -106px; + background-position: -1090px -742px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -212px; + background-position: -1090px -848px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -318px; + background-position: 0px -1002px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -424px; + background-position: -106px -1002px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -530px; + background-position: -212px -1002px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -636px; + background-position: -318px -1002px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -742px; + background-position: -424px -1002px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1090px -848px; + background-position: -530px -1002px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -1002px; + background-position: -636px -1002px; width: 105px; height: 105px; } .Mount_Head_Hippo-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -1002px; + background-position: -742px -1002px; width: 105px; height: 105px; } .Mount_Head_Hippo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -1002px; + background-position: -848px -1002px; width: 105px; height: 105px; } .Mount_Head_Hippo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -1002px; + background-position: -954px -1002px; width: 105px; height: 105px; } .Mount_Head_Hippo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -1002px; + background-position: -1060px -1002px; width: 105px; height: 105px; } .Mount_Head_Hippo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -1002px; + background-position: -1196px 0px; width: 105px; height: 105px; } .Mount_Head_Hippo-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -1002px; + background-position: -1196px -106px; width: 105px; height: 105px; } .Mount_Head_Hippo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -1002px; + background-position: -1196px -212px; width: 105px; height: 105px; } .Mount_Head_Hippo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -1002px; + background-position: -1196px -318px; width: 105px; height: 105px; } .Mount_Head_Hippo-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -1002px; + background-position: -1196px -424px; width: 105px; height: 105px; } .Mount_Head_Hippo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1060px -1002px; + background-position: -1196px -530px; width: 105px; height: 105px; } .Mount_Head_Hippogriff-Hopeful { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px 0px; + background-position: -1196px -636px; width: 105px; height: 105px; } .Mount_Head_Horse-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -106px; + background-position: -1196px -742px; width: 105px; height: 105px; } .Mount_Head_Horse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -212px; + background-position: -1196px -848px; width: 105px; height: 105px; } .Mount_Head_Horse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -318px; + background-position: -1196px -954px; width: 105px; height: 105px; } .Mount_Head_Horse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -424px; + background-position: 0px -1108px; width: 105px; height: 105px; } .Mount_Head_Horse-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -530px; + background-position: -106px -1108px; width: 105px; height: 105px; } .Mount_Head_Horse-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -636px; + background-position: -321px -357px; width: 105px; height: 105px; } .Mount_Head_Horse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -742px; + background-position: -318px -1108px; width: 105px; height: 105px; } .Mount_Head_Horse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -848px; + background-position: -424px -1108px; width: 105px; height: 105px; } .Mount_Head_Horse-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1196px -954px; + background-position: -530px -1108px; width: 105px; height: 105px; } .Mount_Head_Horse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -1108px; + background-position: -636px -1108px; width: 105px; height: 105px; } @@ -738,115 +774,115 @@ } .Mount_Head_Jackalope-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -1108px; + background-position: -742px -1108px; width: 105px; height: 105px; } .Mount_Head_LionCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -1108px; + background-position: -1060px -1108px; width: 105px; height: 105px; } .Mount_Head_LionCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -1108px; + background-position: -1166px -1108px; width: 105px; height: 105px; } .Mount_Head_LionCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -1108px; + background-position: -1302px 0px; width: 105px; height: 105px; } .Mount_Head_LionCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -1108px; + background-position: -1302px -106px; width: 105px; height: 105px; } .Mount_Head_LionCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -1108px; + background-position: -1302px -212px; width: 105px; height: 105px; } .Mount_Head_LionCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -1108px; + background-position: -1302px -318px; width: 105px; height: 105px; } .Mount_Head_LionCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1060px -1108px; + background-position: -1302px -424px; width: 105px; height: 105px; } .Mount_Head_LionCub-Ethereal { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1166px -1108px; + background-position: -1302px -530px; width: 105px; height: 105px; } .Mount_Head_LionCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px 0px; + background-position: -1302px -636px; width: 105px; height: 105px; } .Mount_Head_LionCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -106px; + background-position: -1302px -742px; width: 105px; height: 105px; } .Mount_Head_LionCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -212px; + background-position: -1302px -848px; width: 105px; height: 105px; } .Mount_Head_LionCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -318px; + background-position: -1302px -954px; width: 105px; height: 105px; } .Mount_Head_LionCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -424px; + background-position: -1302px -1060px; width: 105px; height: 105px; } .Mount_Head_LionCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -530px; + background-position: 0px -1214px; width: 105px; height: 105px; } .Mount_Head_LionCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -636px; + background-position: -106px -1214px; width: 105px; height: 105px; } .Mount_Head_LionCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -742px; + background-position: -212px -1214px; width: 105px; height: 105px; } .Mount_Head_LionCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -848px; + background-position: -318px -1214px; width: 105px; height: 105px; } .Mount_Head_LionCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1302px -954px; + background-position: -424px -1214px; width: 105px; height: 105px; } @@ -858,7 +894,7 @@ } .Mount_Head_LionCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -1214px; + background-position: -636px -1214px; width: 105px; height: 105px; } @@ -870,19 +906,19 @@ } .Mount_Head_LionCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -1214px; + background-position: -848px -1214px; width: 105px; height: 105px; } .Mount_Head_LionCub-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -1214px; + background-position: -954px -1214px; width: 105px; height: 105px; } .Mount_Head_LionCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -1214px; + background-position: -1060px -1214px; width: 105px; height: 105px; } @@ -906,361 +942,361 @@ } .Mount_Head_Monkey-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -1214px; + background-position: -1408px -106px; width: 105px; height: 105px; } .Mount_Head_Monkey-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -1214px; + background-position: -1408px -212px; width: 105px; height: 105px; } .Mount_Head_Monkey-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1060px -1214px; + background-position: -1408px -318px; width: 105px; height: 105px; } .Mount_Head_Monkey-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1166px -1214px; + background-position: -1408px -424px; width: 105px; height: 105px; } .Mount_Head_Monkey-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1272px -1214px; + background-position: -1408px -530px; width: 105px; height: 105px; } .Mount_Head_Monkey-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px 0px; + background-position: -1408px -636px; width: 105px; height: 105px; } .Mount_Head_Monkey-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -106px; + background-position: -1408px -742px; width: 105px; height: 105px; } .Mount_Head_Monkey-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -212px; + background-position: -1408px -848px; width: 105px; height: 105px; } .Mount_Head_Monkey-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -318px; + background-position: -1408px -954px; width: 105px; height: 105px; } .Mount_Head_Monkey-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -424px; + background-position: -1408px -1060px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -530px; + background-position: -1408px -1166px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -636px; + background-position: 0px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -742px; + background-position: -106px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -848px; + background-position: -212px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -954px; + background-position: -318px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -1060px; + background-position: -424px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1408px -1166px; + background-position: -530px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -1320px; + background-position: -636px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -1320px; + background-position: -742px -1320px; width: 105px; height: 105px; } .Mount_Head_Nudibranch-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -1320px; + background-position: -848px -1320px; width: 105px; height: 105px; } .Mount_Head_Octopus-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -1320px; + background-position: -954px -1320px; width: 105px; height: 105px; } .Mount_Head_Octopus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -1320px; + background-position: -1060px -1320px; width: 105px; height: 105px; } .Mount_Head_Octopus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -1320px; + background-position: -1166px -1320px; width: 105px; height: 105px; } .Mount_Head_Octopus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -1320px; + background-position: -1272px -1320px; width: 105px; height: 105px; } .Mount_Head_Octopus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -1320px; + background-position: -1378px -1320px; width: 105px; height: 105px; } .Mount_Head_Octopus-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -1320px; + background-position: -1514px 0px; width: 105px; height: 105px; } .Mount_Head_Octopus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -1320px; + background-position: -1514px -106px; width: 105px; height: 105px; } .Mount_Head_Octopus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1060px -1320px; + background-position: -1514px -212px; width: 105px; height: 105px; } .Mount_Head_Octopus-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1166px -1320px; + background-position: -1514px -318px; width: 105px; height: 105px; } .Mount_Head_Octopus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1272px -1320px; + background-position: -1514px -424px; width: 105px; height: 105px; } .Mount_Head_Orca-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1378px -1320px; + background-position: -1514px -530px; width: 105px; height: 105px; } .Mount_Head_Owl-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px 0px; + background-position: -1514px -636px; width: 105px; height: 105px; } .Mount_Head_Owl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -106px; + background-position: -1514px -742px; width: 105px; height: 105px; } .Mount_Head_Owl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -212px; + background-position: -1514px -848px; width: 105px; height: 105px; } .Mount_Head_Owl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -318px; + background-position: -1514px -954px; width: 105px; height: 105px; } .Mount_Head_Owl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -424px; + background-position: -1514px -1060px; width: 105px; height: 105px; } .Mount_Head_Owl-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -530px; + background-position: -1514px -1166px; width: 105px; height: 105px; } .Mount_Head_Owl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -636px; + background-position: -1514px -1272px; width: 105px; height: 105px; } .Mount_Head_Owl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -742px; + background-position: 0px -1426px; width: 105px; height: 105px; } .Mount_Head_Owl-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -848px; + background-position: -106px -1426px; width: 105px; height: 105px; } .Mount_Head_Owl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -954px; + background-position: -212px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -1060px; + background-position: -318px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -1166px; + background-position: -424px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1514px -1272px; + background-position: -530px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -1426px; + background-position: -636px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -1426px; + background-position: -742px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -1426px; + background-position: -848px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -1426px; + background-position: -954px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -1426px; + background-position: -1060px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -1426px; + background-position: -1166px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -1426px; + background-position: -1272px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -1426px; + background-position: -1378px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -1426px; + background-position: -1484px -1426px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -1426px; + background-position: -1620px 0px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1060px -1426px; + background-position: -1620px -106px; width: 105px; height: 105px; } .Mount_Head_PandaCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1166px -1426px; + background-position: -1620px -212px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1272px -1426px; + background-position: -1620px -318px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1378px -1426px; + background-position: -1620px -424px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1484px -1426px; + background-position: -1620px -530px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px 0px; + background-position: -1620px -636px; width: 105px; height: 105px; } @@ -1272,199 +1308,163 @@ } .Mount_Head_PandaCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -212px; + background-position: -1620px -848px; width: 105px; height: 105px; } .Mount_Head_PandaCub-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -318px; + background-position: -1620px -954px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -424px; + background-position: -1620px -1060px; width: 105px; height: 105px; } .Mount_Head_Parrot-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -530px; + background-position: -1620px -1166px; width: 105px; height: 105px; } .Mount_Head_Parrot-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -636px; + background-position: -1620px -1272px; width: 105px; height: 105px; } .Mount_Head_Parrot-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -742px; + background-position: -1620px -1378px; width: 105px; height: 105px; } .Mount_Head_Parrot-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -848px; + background-position: 0px -1532px; width: 105px; height: 105px; } .Mount_Head_Parrot-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -954px; + background-position: -106px -1532px; width: 105px; height: 105px; } .Mount_Head_Parrot-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -1060px; + background-position: -212px -1532px; width: 105px; height: 105px; } .Mount_Head_Parrot-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -1166px; + background-position: -318px -1532px; width: 105px; height: 105px; } .Mount_Head_Parrot-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -1272px; + background-position: -424px -1532px; width: 105px; height: 105px; } .Mount_Head_Parrot-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1620px -1378px; + background-position: -530px -1532px; width: 105px; height: 105px; } .Mount_Head_Parrot-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: 0px -1532px; + background-position: -636px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -106px -1532px; + background-position: -742px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -212px -1532px; + background-position: -848px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -1532px; + background-position: -954px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Desert { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -424px -1532px; + background-position: -1060px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Golden { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -530px -1532px; + background-position: -1166px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Red { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -636px -1532px; + background-position: -1272px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Shade { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -742px -1532px; + background-position: -1378px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -848px -1532px; + background-position: -1484px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-White { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -954px -1532px; + background-position: -1590px -1532px; width: 105px; height: 105px; } .Mount_Head_Peacock-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1060px -1532px; + background-position: -1726px 0px; width: 105px; height: 105px; } .Mount_Head_Penguin-Base { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1166px -1532px; + background-position: -1726px -106px; width: 105px; height: 105px; } .Mount_Head_Penguin-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1272px -1532px; + background-position: -954px -1108px; width: 105px; height: 105px; } .Mount_Head_Penguin-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1378px -1532px; + background-position: -848px -1108px; width: 105px; height: 105px; } .Mount_Head_Penguin-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1484px -1532px; - width: 105px; - height: 105px; -} -.Mount_Head_Penguin-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1590px -1532px; - width: 105px; - height: 105px; -} -.Mount_Head_Penguin-Red { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1726px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Penguin-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -1726px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Penguin-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-15.png'); background-position: -1726px -212px; width: 105px; height: 105px; } -.Mount_Head_Penguin-White { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -318px -1108px; - width: 105px; - height: 105px; -} -.Mount_Head_Penguin-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-15.png'); - background-position: -666px -212px; - width: 105px; - height: 105px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-16.css b/website/client/assets/css/sprites/spritesmith-main-16.css index 767d06ab57..8c48941aa3 100644 --- a/website/client/assets/css/sprites/spritesmith-main-16.css +++ b/website/client/assets/css/sprites/spritesmith-main-16.css @@ -1,252 +1,288 @@ -.Mount_Head_Phoenix-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px -575px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px -681px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -816px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -816px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -816px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -816px; - width: 105px; - height: 105px; -} -.Mount_Head_Pterodactyl-Shade { +.Mount_Head_Penguin-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); background-position: -424px -816px; width: 105px; height: 105px; } -.Mount_Head_Pterodactyl-Skeleton { +.Mount_Head_Penguin-Red { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -1240px -530px; + width: 105px; + height: 105px; +} +.Mount_Head_Penguin-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); background-position: -530px -816px; width: 105px; height: 105px; } -.Mount_Head_Pterodactyl-White { +.Mount_Head_Penguin-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); background-position: -636px -816px; width: 105px; height: 105px; } -.Mount_Head_Pterodactyl-Zombie { +.Mount_Head_Penguin-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); background-position: -742px -816px; width: 105px; height: 105px; } +.Mount_Head_Penguin-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -922px 0px; + width: 105px; + height: 105px; +} +.Mount_Head_Phoenix-Base { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -922px -106px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Base { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -922px -212px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -922px -318px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -922px -424px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -922px -530px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -318px -1346px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Red { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -1452px -424px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -1452px -530px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -1452px -636px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-White { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -1452px -742px; + width: 105px; + height: 105px; +} +.Mount_Head_Pterodactyl-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-16.png'); + background-position: -1452px -848px; + width: 105px; + height: 105px; +} .Mount_Head_Rat-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -954px; + background-position: -1452px -954px; width: 105px; height: 105px; } .Mount_Head_Rat-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1346px; + background-position: -1452px -1060px; width: 105px; height: 105px; } .Mount_Head_Rat-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1272px -1346px; + background-position: -1452px -1166px; width: 105px; height: 105px; } .Mount_Head_Rat-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px 0px; + background-position: -1452px -1272px; width: 105px; height: 105px; } .Mount_Head_Rat-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -106px; + background-position: 0px -1452px; width: 105px; height: 105px; } .Mount_Head_Rat-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -212px; + background-position: -1664px 0px; width: 105px; height: 105px; } .Mount_Head_Rat-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -318px; + background-position: -1664px -106px; width: 105px; height: 105px; } .Mount_Head_Rat-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -424px; + background-position: -1664px -212px; width: 105px; height: 105px; } .Mount_Head_Rat-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -530px; + background-position: -1664px -318px; width: 105px; height: 105px; } .Mount_Head_Rat-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -636px; + background-position: -1664px -424px; width: 105px; height: 105px; } .Mount_Head_Rock-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -742px; + background-position: -1664px -530px; width: 105px; height: 105px; } .Mount_Head_Rock-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1558px; + background-position: -1664px -636px; width: 105px; height: 105px; } .Mount_Head_Rock-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1558px; + background-position: -1664px -742px; width: 105px; height: 105px; } .Mount_Head_Rock-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1558px; + background-position: -1664px -848px; width: 105px; height: 105px; } .Mount_Head_Rock-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1272px -1558px; + background-position: -1664px -954px; width: 105px; height: 105px; } .Mount_Head_Rock-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1378px -1558px; + background-position: -1664px -1060px; width: 105px; height: 105px; } .Mount_Head_Rock-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1484px -1558px; + background-position: -1664px -1166px; width: 105px; height: 105px; } .Mount_Head_Rock-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px 0px; + background-position: -1664px -1272px; width: 105px; height: 105px; } .Mount_Head_Rock-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -106px; + background-position: -665px -680px; width: 105px; height: 105px; } .Mount_Head_Rock-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -212px; + background-position: -816px 0px; width: 105px; height: 105px; } .Mount_Head_Rooster-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -318px; + background-position: -816px -106px; width: 105px; height: 105px; } .Mount_Head_Rooster-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -424px; + background-position: -816px -212px; width: 105px; height: 105px; } .Mount_Head_Rooster-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -530px; + background-position: -816px -318px; width: 105px; height: 105px; } .Mount_Head_Rooster-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -636px; + background-position: -816px -424px; width: 105px; height: 105px; } .Mount_Head_Rooster-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -742px; + background-position: -816px -530px; width: 105px; height: 105px; } .Mount_Head_Rooster-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -848px; + background-position: -816px -636px; width: 105px; height: 105px; } .Mount_Head_Rooster-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -954px; + background-position: 0px -816px; width: 105px; height: 105px; } .Mount_Head_Rooster-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px -257px; + background-position: -106px -816px; width: 105px; height: 105px; } .Mount_Head_Rooster-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px -363px; + background-position: -212px -816px; width: 105px; height: 105px; } .Mount_Head_Rooster-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px -469px; + background-position: -318px -816px; width: 105px; height: 105px; } .Mount_Head_Sabretooth-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px -408px; + background-position: -544px -136px; width: 135px; height: 135px; } @@ -306,421 +342,421 @@ } .Mount_Head_Seahorse-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px 0px; + background-position: -922px -636px; width: 105px; height: 105px; } .Mount_Head_Seahorse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -106px; + background-position: -922px -742px; width: 105px; height: 105px; } .Mount_Head_Seahorse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -212px; + background-position: 0px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -318px; + background-position: -106px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -424px; + background-position: -212px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -530px; + background-position: -318px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -636px; + background-position: -424px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -952px -742px; + background-position: -530px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -922px; + background-position: -636px -922px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -922px; + background-position: -742px -922px; width: 105px; height: 105px; } .Mount_Head_Sheep-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -922px; + background-position: -848px -922px; width: 105px; height: 105px; } .Mount_Head_Sheep-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -922px; + background-position: -1028px 0px; width: 105px; height: 105px; } .Mount_Head_Sheep-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -922px; + background-position: -1028px -106px; width: 105px; height: 105px; } .Mount_Head_Sheep-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -922px; + background-position: -1028px -212px; width: 105px; height: 105px; } .Mount_Head_Sheep-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -922px; + background-position: -1028px -318px; width: 105px; height: 105px; } .Mount_Head_Sheep-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -922px; + background-position: -1028px -424px; width: 105px; height: 105px; } .Mount_Head_Sheep-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -922px; + background-position: -1028px -530px; width: 105px; height: 105px; } .Mount_Head_Sheep-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px 0px; + background-position: -1028px -636px; width: 105px; height: 105px; } .Mount_Head_Sheep-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -106px; + background-position: -1028px -742px; width: 105px; height: 105px; } .Mount_Head_Sheep-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -212px; + background-position: -1028px -848px; width: 105px; height: 105px; } .Mount_Head_Slime-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -318px; + background-position: 0px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -424px; + background-position: -106px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -530px; + background-position: -212px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -636px; + background-position: -318px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -742px; + background-position: -424px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1058px -848px; + background-position: -530px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1028px; + background-position: -636px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1028px; + background-position: -742px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1028px; + background-position: -848px -1028px; width: 105px; height: 105px; } .Mount_Head_Slime-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1028px; + background-position: -954px -1028px; width: 105px; height: 105px; } .Mount_Head_Sloth-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1028px; + background-position: -1134px 0px; width: 105px; height: 105px; } .Mount_Head_Sloth-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1028px; + background-position: -1134px -106px; width: 105px; height: 105px; } .Mount_Head_Sloth-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1028px; + background-position: -1134px -212px; width: 105px; height: 105px; } .Mount_Head_Sloth-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1028px; + background-position: -1134px -318px; width: 105px; height: 105px; } .Mount_Head_Sloth-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1028px; + background-position: -1134px -424px; width: 105px; height: 105px; } .Mount_Head_Sloth-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1028px; + background-position: -1134px -530px; width: 105px; height: 105px; } .Mount_Head_Sloth-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px 0px; + background-position: -1134px -636px; width: 105px; height: 105px; } .Mount_Head_Sloth-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -106px; + background-position: -1134px -742px; width: 105px; height: 105px; } .Mount_Head_Sloth-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -212px; + background-position: -1134px -848px; width: 105px; height: 105px; } .Mount_Head_Sloth-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -318px; + background-position: -1134px -954px; width: 105px; height: 105px; } .Mount_Head_Snail-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -424px; + background-position: 0px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -530px; + background-position: -106px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -636px; + background-position: -212px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -742px; + background-position: -318px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -848px; + background-position: -424px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1164px -954px; + background-position: -530px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1134px; + background-position: -636px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1134px; + background-position: -742px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1134px; + background-position: -848px -1134px; width: 105px; height: 105px; } .Mount_Head_Snail-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1134px; + background-position: -954px -1134px; width: 105px; height: 105px; } .Mount_Head_Snake-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1134px; + background-position: -1060px -1134px; width: 105px; height: 105px; } .Mount_Head_Snake-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1134px; + background-position: -1240px 0px; width: 105px; height: 105px; } .Mount_Head_Snake-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1134px; + background-position: -1240px -106px; width: 105px; height: 105px; } .Mount_Head_Snake-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1134px; + background-position: -1240px -212px; width: 105px; height: 105px; } .Mount_Head_Snake-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1134px; + background-position: -1240px -318px; width: 105px; height: 105px; } .Mount_Head_Snake-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1134px; + background-position: -1240px -424px; width: 105px; height: 105px; } .Mount_Head_Snake-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1134px; + background-position: -1664px -1378px; width: 105px; height: 105px; } .Mount_Head_Snake-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px 0px; + background-position: -1240px -636px; width: 105px; height: 105px; } .Mount_Head_Snake-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -106px; + background-position: -1240px -742px; width: 105px; height: 105px; } .Mount_Head_Snake-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -212px; + background-position: -1240px -848px; width: 105px; height: 105px; } .Mount_Head_Spider-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1694px -1060px; + background-position: -1240px -954px; width: 105px; height: 105px; } .Mount_Head_Spider-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -424px; + background-position: -1240px -1060px; width: 105px; height: 105px; } .Mount_Head_Spider-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -530px; + background-position: 0px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -636px; + background-position: -106px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -742px; + background-position: -212px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -848px; + background-position: -318px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -954px; + background-position: -424px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1270px -1060px; + background-position: -530px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1240px; + background-position: -636px -1240px; width: 105px; height: 105px; } .Mount_Head_Spider-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1240px; + background-position: -742px -1240px; width: 105px; height: 105px; } @@ -756,7 +792,7 @@ } .Mount_Head_TRex-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px -136px; + background-position: 0px 0px; width: 135px; height: 135px; } @@ -768,7 +804,7 @@ } .Mount_Head_TRex-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px 0px; + background-position: -544px -408px; width: 135px; height: 135px; } @@ -786,451 +822,451 @@ } .Mount_Head_TigerCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1240px; + background-position: -848px -1240px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1240px; + background-position: -954px -1240px; width: 105px; height: 105px; } .Mount_Head_TigerCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1240px; + background-position: -1060px -1240px; width: 105px; height: 105px; } .Mount_Head_TigerCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1240px; + background-position: -1166px -1240px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1240px; + background-position: -1346px 0px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1240px; + background-position: -1346px -106px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1240px; + background-position: -1346px -212px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1240px; + background-position: -1346px -318px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1240px; + background-position: -1346px -424px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1240px; + background-position: -1346px -530px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px 0px; + background-position: -1346px -636px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -106px; + background-position: -1346px -742px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -212px; + background-position: -1346px -848px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -318px; + background-position: -1346px -954px; width: 105px; height: 105px; } .Mount_Head_TigerCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -424px; + background-position: -1346px -1060px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -530px; + background-position: -1346px -1166px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -636px; + background-position: 0px -1346px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -742px; + background-position: -106px -1346px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -848px; + background-position: -212px -1346px; width: 105px; height: 105px; } .Mount_Head_TigerCub-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px -136px; + background-position: -544px -680px; width: 120px; height: 120px; } .Mount_Head_TigerCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -1060px; + background-position: -424px -1346px; width: 105px; height: 105px; } .Mount_Head_TigerCub-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1376px -1166px; + background-position: -530px -1346px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1346px; + background-position: -636px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1346px; + background-position: -742px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1346px; + background-position: -848px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1346px; + background-position: -954px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1346px; + background-position: -1060px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1346px; + background-position: -1166px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1346px; + background-position: -1272px -1346px; width: 105px; height: 105px; } .Mount_Head_Treeling-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1346px; + background-position: -1452px 0px; width: 105px; height: 105px; } .Mount_Head_Treeling-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1346px; + background-position: -1452px -106px; width: 105px; height: 105px; } .Mount_Head_Treeling-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1346px; + background-position: -1452px -212px; width: 105px; height: 105px; } .Mount_Head_Treeling-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1346px; + background-position: -1452px -318px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -848px; + background-position: -106px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -954px; + background-position: -212px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -1060px; + background-position: -318px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -1166px; + background-position: -424px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1482px -1272px; + background-position: -530px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1452px; + background-position: -636px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1452px; + background-position: -742px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1452px; + background-position: -848px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1452px; + background-position: -954px -1452px; width: 105px; height: 105px; } .Mount_Head_Triceratops-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1452px; + background-position: -1060px -1452px; width: 105px; height: 105px; } .Mount_Head_Turkey-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1452px; + background-position: -1166px -1452px; width: 105px; height: 105px; } .Mount_Head_Turkey-Gilded { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1452px; + background-position: -1272px -1452px; width: 105px; height: 105px; } .Mount_Head_Turtle-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1452px; + background-position: -1378px -1452px; width: 105px; height: 105px; } .Mount_Head_Turtle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1452px; + background-position: -1558px 0px; width: 105px; height: 105px; } .Mount_Head_Turtle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1452px; + background-position: -1558px -106px; width: 105px; height: 105px; } .Mount_Head_Turtle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1452px; + background-position: -1558px -212px; width: 105px; height: 105px; } .Mount_Head_Turtle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1452px; + background-position: -1558px -318px; width: 105px; height: 105px; } .Mount_Head_Turtle-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1272px -1452px; + background-position: -1558px -424px; width: 105px; height: 105px; } .Mount_Head_Turtle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1378px -1452px; + background-position: -1558px -530px; width: 105px; height: 105px; } .Mount_Head_Turtle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px 0px; + background-position: -1558px -636px; width: 105px; height: 105px; } .Mount_Head_Turtle-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -106px; + background-position: -1558px -742px; width: 105px; height: 105px; } .Mount_Head_Turtle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -212px; + background-position: -1558px -848px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -318px; + background-position: -1558px -954px; width: 105px; height: 105px; } .Mount_Head_Unicorn-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -424px; + background-position: -1558px -1060px; width: 105px; height: 105px; } .Mount_Head_Unicorn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -530px; + background-position: -1558px -1166px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -636px; + background-position: -1558px -1272px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -742px; + background-position: -1558px -1378px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -848px; + background-position: 0px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -954px; + background-position: -106px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -1060px; + background-position: -212px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -1166px; + background-position: -318px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -1272px; + background-position: -424px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Base { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1588px -1378px; + background-position: -530px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1558px; + background-position: -636px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1558px; + background-position: -742px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Desert { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1558px; + background-position: -848px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Golden { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1558px; + background-position: -954px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Red { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1558px; + background-position: -1060px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Shade { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1558px; + background-position: -1166px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1558px; + background-position: -1272px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-White { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1558px; + background-position: -1378px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1558px; + background-position: -1484px -1558px; width: 105px; height: 105px; } @@ -1302,35 +1338,17 @@ } .Mount_Head_Wolf-Holly { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -408px -680px; + background-position: -408px -272px; width: 135px; height: 135px; } .Mount_Head_Wolf-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px -680px; + background-position: -408px -680px; width: 135px; height: 135px; } .Mount_Head_Wolf-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px -680px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -408px -272px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -816px 0px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-16.png'); background-position: -136px 0px; width: 135px; diff --git a/website/client/assets/css/sprites/spritesmith-main-17.css b/website/client/assets/css/sprites/spritesmith-main-17.css index f91b3fcdf1..06a9c8c5ef 100644 --- a/website/client/assets/css/sprites/spritesmith-main-17.css +++ b/website/client/assets/css/sprites/spritesmith-main-17.css @@ -1,1938 +1,1914 @@ -.Mount_Head_Wolf-Skeleton { +.Mount_Head_Wolf-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: 0px 0px; width: 135px; height: 135px; } -.Mount_Head_Wolf-Spooky { +.Mount_Head_Wolf-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: -136px 0px; width: 135px; height: 135px; } -.Mount_Head_Wolf-StarryNight { +.Mount_Head_Wolf-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px -136px; + background-position: -272px -272px; width: 135px; height: 135px; } -.Mount_Head_Wolf-Thunderstorm { +.Mount_Head_Wolf-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: 0px -136px; width: 135px; height: 135px; } -.Mount_Head_Wolf-White { +.Mount_Head_Wolf-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: -136px -136px; width: 135px; height: 135px; } -.Mount_Head_Wolf-Zombie { +.Mount_Head_Wolf-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: -272px 0px; width: 135px; height: 135px; } -.Mount_Head_Yarn-Base { +.Mount_Head_Wolf-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -272px; - width: 105px; - height: 105px; + background-position: -272px -136px; + width: 135px; + height: 135px; } -.Mount_Head_Yarn-CottonCandyBlue { +.Mount_Head_Wolf-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: 0px -272px; - width: 105px; - height: 105px; + width: 135px; + height: 135px; } -.Mount_Head_Yarn-CottonCandyPink { +.Mount_Head_Wolf-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -272px; - width: 105px; - height: 105px; + background-position: -136px -272px; + width: 135px; + height: 135px; } -.Mount_Head_Yarn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -378px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Golden { +.Mount_Head_Yarn-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: -408px 0px; width: 105px; height: 105px; } -.Mount_Head_Yarn-Red { +.Mount_Head_Yarn-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-17.png'); + background-position: -514px -212px; + width: 105px; + height: 105px; +} +.Mount_Head_Yarn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: -408px -106px; width: 105px; height: 105px; } -.Mount_Head_Yarn-Shade { +.Mount_Head_Yarn-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); background-position: -408px -212px; width: 105px; height: 105px; } +.Mount_Head_Yarn-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-17.png'); + background-position: 0px -408px; + width: 105px; + height: 105px; +} +.Mount_Head_Yarn-Red { + background-image: url('~assets/images/sprites/spritesmith-main-17.png'); + background-position: -106px -408px; + width: 105px; + height: 105px; +} +.Mount_Head_Yarn-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-17.png'); + background-position: -212px -408px; + width: 105px; + height: 105px; +} .Mount_Head_Yarn-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -378px; + background-position: -318px -408px; width: 105px; height: 105px; } .Mount_Head_Yarn-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -378px; + background-position: -514px 0px; width: 105px; height: 105px; } .Mount_Head_Yarn-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -378px; + background-position: -514px -106px; width: 105px; height: 105px; } .Mount_Icon_Aether-Invisible { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -272px; + background-position: -514px -318px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -378px; + background-position: -424px -408px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -514px 0px; + background-position: 0px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -514px -100px; + background-position: -82px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -514px -200px; + background-position: -164px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -514px -300px; + background-position: -246px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -484px; + background-position: -328px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -484px; + background-position: -410px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -484px; + background-position: -492px -514px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -484px; + background-position: -620px 0px; width: 81px; height: 99px; } .Mount_Icon_Armadillo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -484px; + background-position: -620px -100px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -484px; + background-position: -620px -200px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -484px; + background-position: -620px -300px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -596px 0px; + background-position: -620px -400px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -596px -100px; + background-position: -620px -500px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -596px -200px; + background-position: -702px 0px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -596px -300px; + background-position: -702px -100px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -596px -400px; + background-position: -702px -200px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -678px 0px; + background-position: -702px -300px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -678px -100px; + background-position: -702px -400px; width: 81px; height: 99px; } .Mount_Icon_Axolotl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -678px -200px; + background-position: -702px -500px; width: 81px; height: 99px; } .Mount_Icon_Badger-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -678px -300px; + background-position: 0px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -678px -400px; + background-position: -82px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -584px; + background-position: -164px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -584px; + background-position: -246px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -584px; + background-position: -328px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -584px; + background-position: -410px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -584px; + background-position: -492px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -584px; + background-position: -574px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -584px; + background-position: -656px -614px; width: 81px; height: 99px; } .Mount_Icon_Badger-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -584px; + background-position: -784px 0px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -584px; + background-position: -784px -100px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -760px 0px; + background-position: -784px -200px; width: 81px; height: 99px; } .Mount_Icon_BearCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -760px -100px; + background-position: -784px -300px; width: 81px; height: 99px; } .Mount_Icon_BearCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -760px -200px; + background-position: -784px -400px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -760px -300px; + background-position: -784px -500px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -760px -400px; + background-position: -784px -600px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -760px -500px; + background-position: 0px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -684px; + background-position: -82px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -684px; + background-position: -164px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -684px; + background-position: -246px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -684px; + background-position: -328px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -684px; + background-position: -410px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -684px; + background-position: -492px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Polar { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -684px; + background-position: -574px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -684px; + background-position: -656px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -684px; + background-position: -738px -714px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -684px; + background-position: -866px 0px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px 0px; + background-position: -866px -100px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px -100px; + background-position: -866px -200px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px -200px; + background-position: -866px -300px; width: 81px; height: 99px; } .Mount_Icon_BearCub-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px -300px; + background-position: -866px -400px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px -400px; + background-position: -866px -500px; width: 81px; height: 99px; } .Mount_Icon_BearCub-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px -500px; + background-position: -866px -600px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -842px -600px; + background-position: -866px -700px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -784px; + background-position: 0px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -784px; + background-position: -82px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -784px; + background-position: -164px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -784px; + background-position: -246px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -784px; + background-position: -328px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -784px; + background-position: -410px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -784px; + background-position: -492px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -784px; + background-position: -574px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -784px; + background-position: -656px -814px; width: 81px; height: 99px; } .Mount_Icon_Beetle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -784px; + background-position: -738px -814px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -784px; + background-position: -820px -814px; width: 81px; height: 99px; } .Mount_Icon_Bunny-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px 0px; + background-position: -948px 0px; width: 81px; height: 99px; } .Mount_Icon_Bunny-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -100px; + background-position: -948px -100px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -200px; + background-position: -948px -200px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -300px; + background-position: -948px -300px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -400px; + background-position: -948px -400px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -500px; + background-position: -948px -500px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -600px; + background-position: -948px -600px; width: 81px; height: 99px; } .Mount_Icon_Bunny-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -924px -700px; + background-position: -948px -700px; width: 81px; height: 99px; } .Mount_Icon_Bunny-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -884px; + background-position: -948px -800px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -884px; + background-position: 0px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -884px; + background-position: -82px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -884px; + background-position: -164px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -884px; + background-position: -246px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -884px; + background-position: -328px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -884px; + background-position: -410px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -884px; + background-position: -492px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -884px; + background-position: -574px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -884px; + background-position: -656px -914px; width: 81px; height: 99px; } .Mount_Icon_Butterfly-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -884px; + background-position: -738px -914px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -884px; + background-position: -820px -914px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px 0px; + background-position: -902px -914px; width: 81px; height: 99px; } .Mount_Icon_Cactus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -100px; + background-position: -1030px 0px; width: 81px; height: 99px; } .Mount_Icon_Cactus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -200px; + background-position: -1030px -100px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -300px; + background-position: -1030px -200px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -400px; + background-position: -1030px -300px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Ember { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -500px; + background-position: -1030px -400px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -600px; + background-position: -1030px -500px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Floral { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -700px; + background-position: -1030px -600px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1006px -800px; + background-position: -1030px -700px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -984px; + background-position: -1030px -800px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Holly { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -984px; + background-position: -1030px -900px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -984px; + background-position: -1112px 0px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -984px; + background-position: -1112px -100px; width: 81px; height: 99px; } .Mount_Icon_Cactus-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -984px; + background-position: -1112px -200px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -984px; + background-position: -1112px -300px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -984px; + background-position: -1112px -400px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -984px; + background-position: -1112px -500px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -984px; + background-position: -1112px -600px; width: 81px; height: 99px; } .Mount_Icon_Cactus-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -984px; + background-position: -1112px -700px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -984px; + background-position: -1112px -800px; width: 81px; height: 99px; } .Mount_Icon_Cactus-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -984px; + background-position: -1112px -900px; width: 81px; height: 99px; } .Mount_Icon_Cactus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -984px; + background-position: 0px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px 0px; + background-position: -82px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -100px; + background-position: -164px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -200px; + background-position: -246px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -300px; + background-position: -328px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -400px; + background-position: -410px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -500px; + background-position: -492px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -600px; + background-position: -574px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -700px; + background-position: -656px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -800px; + background-position: -738px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cheetah-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1088px -900px; + background-position: -820px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cow-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px 0px; + background-position: -902px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cow-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -100px; + background-position: -984px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cow-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -200px; + background-position: -1066px -1014px; width: 81px; height: 99px; } .Mount_Icon_Cow-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -300px; + background-position: -1194px 0px; width: 81px; height: 99px; } .Mount_Icon_Cow-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -400px; + background-position: -1194px -100px; width: 81px; height: 99px; } .Mount_Icon_Cow-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -500px; + background-position: -1194px -200px; width: 81px; height: 99px; } .Mount_Icon_Cow-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -600px; + background-position: -1194px -300px; width: 81px; height: 99px; } .Mount_Icon_Cow-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -700px; + background-position: -1194px -400px; width: 81px; height: 99px; } .Mount_Icon_Cow-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -800px; + background-position: -1194px -500px; width: 81px; height: 99px; } .Mount_Icon_Cow-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1170px -900px; + background-position: -1194px -600px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1084px; + background-position: -1194px -700px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -1084px; + background-position: -1194px -800px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -1084px; + background-position: -1194px -900px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -1084px; + background-position: -1194px -1000px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -1084px; + background-position: 0px -1114px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -1084px; + background-position: -82px -1114px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -1084px; + background-position: -164px -1114px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -1084px; + background-position: -246px -1114px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -1084px; + background-position: -328px -1114px; width: 81px; height: 99px; } .Mount_Icon_Cuttlefish-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -1084px; + background-position: -410px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -1084px; + background-position: -492px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -1084px; + background-position: -574px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -1084px; + background-position: -1686px -1200px; width: 81px; height: 99px; } .Mount_Icon_Deer-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1066px -1084px; + background-position: -738px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1148px -1084px; + background-position: -820px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px 0px; + background-position: -902px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -100px; + background-position: -984px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1066px -1584px; + background-position: -1066px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -300px; + background-position: -1148px -1114px; width: 81px; height: 99px; } .Mount_Icon_Deer-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -400px; + background-position: -1276px 0px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -500px; + background-position: -1276px -100px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -600px; + background-position: -1276px -200px; width: 81px; height: 99px; } .Mount_Icon_Dragon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -700px; + background-position: -1276px -300px; width: 81px; height: 99px; } .Mount_Icon_Dragon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -800px; + background-position: -1276px -400px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -900px; + background-position: -1276px -500px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -1000px; + background-position: -1276px -600px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Ember { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1184px; + background-position: -1276px -700px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -1184px; + background-position: -1276px -800px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Floral { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -1184px; + background-position: -1276px -900px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -1184px; + background-position: -1276px -1000px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -1184px; + background-position: -1276px -1100px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Holly { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -1184px; + background-position: 0px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -1184px; + background-position: -82px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -1184px; + background-position: -164px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -1184px; + background-position: -246px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -1184px; + background-position: -328px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -1184px; + background-position: -410px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -1184px; + background-position: -492px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -1184px; + background-position: -574px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1066px -1184px; + background-position: -656px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1148px -1184px; + background-position: -738px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1230px -1184px; + background-position: -820px -1214px; width: 81px; height: 99px; } .Mount_Icon_Dragon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px 0px; + background-position: -902px -1214px; width: 81px; height: 99px; } .Mount_Icon_Egg-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -100px; + background-position: -984px -1214px; width: 81px; height: 99px; } .Mount_Icon_Egg-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -200px; + background-position: -1066px -1214px; width: 81px; height: 99px; } .Mount_Icon_Egg-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -300px; + background-position: -1148px -1214px; width: 81px; height: 99px; } .Mount_Icon_Egg-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -400px; + background-position: -1230px -1214px; width: 81px; height: 99px; } .Mount_Icon_Egg-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -500px; + background-position: -1358px 0px; width: 81px; height: 99px; } .Mount_Icon_Egg-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -600px; + background-position: -1358px -100px; width: 81px; height: 99px; } .Mount_Icon_Egg-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -700px; + background-position: -1358px -200px; width: 81px; height: 99px; } .Mount_Icon_Egg-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -800px; + background-position: -1358px -300px; width: 81px; height: 99px; } .Mount_Icon_Egg-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -900px; + background-position: -1358px -400px; width: 81px; height: 99px; } .Mount_Icon_Egg-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -1000px; + background-position: -1358px -500px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1334px -1100px; + background-position: -1358px -600px; width: 81px; height: 99px; } .Mount_Icon_Falcon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1284px; + background-position: -1358px -700px; width: 81px; height: 99px; } .Mount_Icon_Falcon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -1284px; + background-position: -1358px -800px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -1284px; + background-position: -1358px -900px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -1284px; + background-position: -1358px -1000px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -1284px; + background-position: -1358px -1100px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -1284px; + background-position: -1358px -1200px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -1284px; + background-position: 0px -1314px; width: 81px; height: 99px; } .Mount_Icon_Falcon-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -1284px; + background-position: -82px -1314px; width: 81px; height: 99px; } .Mount_Icon_Falcon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -1284px; + background-position: -164px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -1284px; + background-position: -246px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -1284px; + background-position: -328px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -1284px; + background-position: -410px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -1284px; + background-position: -492px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1066px -1284px; + background-position: -574px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1148px -1284px; + background-position: -656px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1230px -1284px; + background-position: -738px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1312px -1284px; + background-position: -820px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px 0px; + background-position: -902px -1314px; width: 81px; height: 99px; } .Mount_Icon_Ferret-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -100px; + background-position: -984px -1314px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -200px; + background-position: -1066px -1314px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -300px; + background-position: -1148px -1314px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -400px; + background-position: -1230px -1314px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -500px; + background-position: -1312px -1314px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -600px; + background-position: -1440px 0px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -700px; + background-position: -1440px -100px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Ember { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -800px; + background-position: -1440px -200px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -900px; + background-position: -1440px -300px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Floral { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -1000px; + background-position: -1440px -400px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -1100px; + background-position: -1440px -500px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1416px -1200px; + background-position: -1440px -600px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Holly { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1384px; + background-position: -1440px -700px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -1384px; + background-position: -1440px -800px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -1384px; + background-position: -1440px -900px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -1384px; + background-position: -1440px -1000px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -1384px; + background-position: -1440px -1100px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -1384px; + background-position: -1440px -1200px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -1384px; + background-position: -1440px -1300px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -1384px; + background-position: 0px -1414px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -1384px; + background-position: -82px -1414px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -1384px; + background-position: -164px -1414px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -1384px; + background-position: -246px -1414px; width: 81px; height: 99px; } .Mount_Icon_FlyingPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -1384px; + background-position: -328px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -1384px; + background-position: -410px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1066px -1384px; + background-position: -492px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1148px -1384px; + background-position: -574px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1230px -1384px; + background-position: -656px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1312px -1384px; + background-position: -738px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1394px -1384px; + background-position: -820px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Ember { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px 0px; + background-position: -902px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -100px; + background-position: -984px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Floral { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -200px; + background-position: -1066px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -300px; + background-position: -1148px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -400px; + background-position: -1230px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Holly { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -500px; + background-position: -1312px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -600px; + background-position: -1394px -1414px; width: 81px; height: 99px; } .Mount_Icon_Fox-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -700px; + background-position: -1522px 0px; width: 81px; height: 99px; } .Mount_Icon_Fox-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -800px; + background-position: -1522px -100px; width: 81px; height: 99px; } .Mount_Icon_Fox-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -900px; + background-position: -1522px -200px; width: 81px; height: 99px; } .Mount_Icon_Fox-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -1000px; + background-position: -1522px -300px; width: 81px; height: 99px; } .Mount_Icon_Fox-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -1100px; + background-position: -1522px -400px; width: 81px; height: 99px; } .Mount_Icon_Fox-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -1200px; + background-position: -1522px -500px; width: 81px; height: 99px; } .Mount_Icon_Fox-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1498px -1300px; + background-position: -1522px -600px; width: 81px; height: 99px; } .Mount_Icon_Fox-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px 0px; + background-position: -1522px -700px; width: 81px; height: 99px; } .Mount_Icon_Fox-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -100px; + background-position: -1522px -800px; width: 81px; height: 99px; } .Mount_Icon_Fox-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -200px; + background-position: -1522px -900px; width: 81px; height: 99px; } .Mount_Icon_Frog-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -300px; + background-position: -1522px -1000px; width: 81px; height: 99px; } .Mount_Icon_Frog-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -400px; + background-position: -1522px -1100px; width: 81px; height: 99px; } .Mount_Icon_Frog-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -500px; + background-position: -1522px -1200px; width: 81px; height: 99px; } .Mount_Icon_Frog-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -600px; + background-position: -1522px -1300px; width: 81px; height: 99px; } .Mount_Icon_Frog-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -700px; + background-position: -1522px -1400px; width: 81px; height: 99px; } .Mount_Icon_Frog-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -800px; + background-position: -1604px 0px; width: 81px; height: 99px; } .Mount_Icon_Frog-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -900px; + background-position: -1604px -100px; width: 81px; height: 99px; } .Mount_Icon_Frog-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -1000px; + background-position: -1604px -200px; width: 81px; height: 99px; } .Mount_Icon_Frog-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -1100px; + background-position: -1604px -300px; width: 81px; height: 99px; } .Mount_Icon_Frog-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -1200px; + background-position: -1604px -400px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1580px -1300px; + background-position: -1604px -500px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1484px; + background-position: -1604px -600px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -1484px; + background-position: -1604px -700px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -1484px; + background-position: -1604px -800px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -1484px; + background-position: -1604px -900px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -1484px; + background-position: -1604px -1000px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -1484px; + background-position: -1604px -1100px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -1484px; + background-position: -1604px -1200px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -1484px; + background-position: -1604px -1300px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -1484px; + background-position: -1604px -1400px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -1484px; + background-position: 0px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -1484px; + background-position: -82px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -1484px; + background-position: -164px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -1484px; + background-position: -246px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1066px -1484px; + background-position: -328px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1148px -1484px; + background-position: -410px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1230px -1484px; + background-position: -492px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1312px -1484px; + background-position: -574px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1394px -1484px; + background-position: -656px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1476px -1484px; + background-position: -738px -1514px; width: 81px; height: 99px; } .Mount_Icon_GuineaPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -1484px; + background-position: -820px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px 0px; + background-position: -902px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -100px; + background-position: -984px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -200px; + background-position: -1066px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -300px; + background-position: -1148px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -400px; + background-position: -1230px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -500px; + background-position: -1312px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -600px; + background-position: -1394px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -700px; + background-position: -1476px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -800px; + background-position: -1558px -1514px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -900px; + background-position: -1686px 0px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -1000px; + background-position: -1686px -100px; width: 81px; height: 99px; } .Mount_Icon_Hippo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -1100px; + background-position: -1686px -200px; width: 81px; height: 99px; } .Mount_Icon_Hippo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -1200px; + background-position: -1686px -300px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -1300px; + background-position: -1686px -400px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1662px -1400px; + background-position: -1686px -500px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Red { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1584px; + background-position: -1686px -600px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -82px -1584px; + background-position: -1686px -700px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -164px -1584px; + background-position: -1686px -800px; width: 81px; height: 99px; } .Mount_Icon_Hippo-White { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -246px -1584px; + background-position: -1686px -900px; width: 81px; height: 99px; } .Mount_Icon_Hippo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -328px -1584px; + background-position: -1686px -1000px; width: 81px; height: 99px; } .Mount_Icon_Hippogriff-Hopeful { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -410px -1584px; + background-position: -1686px -1100px; width: 81px; height: 99px; } .Mount_Icon_Horse-Base { background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -492px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -574px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -656px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -738px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -820px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -902px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -984px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Horse-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1252px -200px; + background-position: -656px -1114px; width: 81px; height: 99px; } diff --git a/website/client/assets/css/sprites/spritesmith-main-18.css b/website/client/assets/css/sprites/spritesmith-main-18.css index 1e67970578..c2aee93139 100644 --- a/website/client/assets/css/sprites/spritesmith-main-18.css +++ b/website/client/assets/css/sprites/spritesmith-main-18.css @@ -1,2004 +1,1998 @@ -.Mount_Icon_Horse-White { +.Mount_Icon_Horse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); background-position: -82px 0px; width: 81px; height: 99px; } -.Mount_Icon_Horse-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_JackOLantern-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_JackOLantern-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Jackalope-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Ethereal { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_LionCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_MagicalBee-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Mammoth-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -1070px; - width: 78px; - height: 86px; -} -.Mount_Icon_MantisShrimp-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Monkey-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Nudibranch-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Octopus-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Orca-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -200px; - width: 78px; - height: 86px; -} -.Mount_Icon_Owl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Owl-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_PandaCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Parrot-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Peacock-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Penguin-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Phoenix-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Pterodactyl-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rat-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rock-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Rooster-Zombie { +.Mount_Icon_Horse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); background-position: -82px -1100px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Base { +.Mount_Icon_Horse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px 0px; + background-position: -164px 0px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-CottonCandyBlue { +.Mount_Icon_Horse-Golden { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -1100px; + background-position: 0px -100px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-CottonCandyPink { +.Mount_Icon_Horse-Red { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -1100px; + background-position: -82px -100px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Desert { +.Mount_Icon_Horse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -1100px; + background-position: -164px -100px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Golden { +.Mount_Icon_Horse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -1100px; + background-position: -246px 0px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Red { +.Mount_Icon_Horse-White { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -1100px; + background-position: -246px -100px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Shade { +.Mount_Icon_Horse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -1100px; + background-position: 0px -200px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Skeleton { +.Mount_Icon_JackOLantern-Base { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -1100px; + background-position: -164px -200px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-White { +.Mount_Icon_JackOLantern-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -1100px; + background-position: -246px -200px; width: 81px; height: 99px; } -.Mount_Icon_Sabretooth-Zombie { +.Mount_Icon_Jackalope-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -1100px; + background-position: -82px -200px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Base { +.Mount_Icon_LionCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -1100px; + background-position: -328px 0px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-CottonCandyBlue { +.Mount_Icon_LionCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -1100px; + background-position: -328px -100px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-CottonCandyPink { +.Mount_Icon_LionCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -1100px; + background-position: -328px -200px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Desert { +.Mount_Icon_LionCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px 0px; + background-position: 0px -300px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Golden { +.Mount_Icon_LionCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -100px; + background-position: -82px -300px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Red { +.Mount_Icon_LionCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -200px; + background-position: -164px -300px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Shade { +.Mount_Icon_LionCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -300px; + background-position: -246px -300px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Skeleton { +.Mount_Icon_LionCub-Ethereal { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -400px; + background-position: -328px -300px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-White { +.Mount_Icon_LionCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -500px; + background-position: -410px 0px; width: 81px; height: 99px; } -.Mount_Icon_Seahorse-Zombie { +.Mount_Icon_LionCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -600px; + background-position: -410px -100px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-Base { +.Mount_Icon_LionCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -700px; + background-position: -410px -200px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-CottonCandyBlue { +.Mount_Icon_LionCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -800px; + background-position: -410px -300px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-CottonCandyPink { +.Mount_Icon_LionCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -900px; + background-position: -492px 0px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-Desert { +.Mount_Icon_LionCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -1000px; + background-position: -492px -100px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-Golden { +.Mount_Icon_LionCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -1100px; + background-position: -492px -200px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-Red { +.Mount_Icon_LionCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -1200px; + background-position: -492px -300px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-Shade { +.Mount_Icon_LionCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -1200px; + background-position: 0px -400px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-Skeleton { +.Mount_Icon_LionCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -1200px; + background-position: -82px -400px; width: 81px; height: 99px; } -.Mount_Icon_Sheep-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sheep-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Slime-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Sloth-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snail-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Treeling-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Triceratops-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turkey-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: 0px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turkey-Gilded { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -82px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -164px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -246px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -328px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -410px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -492px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -574px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -738px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -820px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turtle-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -902px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -984px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1066px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1148px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1230px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1312px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1394px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1476px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1558px -1500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Unicorn-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -656px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Whale-Base { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -635px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -287px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -374px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -461px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -548px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-Red { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -1157px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -722px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -809px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-White { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -896px; - width: 78px; - height: 86px; -} -.Mount_Icon_Whale-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-18.png'); - background-position: -1640px -983px; - width: 78px; - height: 86px; -} -.Mount_Icon_Wolf-Aquatic { +.Mount_Icon_LionCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); background-position: -164px -400px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Base { +.Mount_Icon_LionCub-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_LionCub-StarryNight { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_LionCub-Thunderstorm { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_LionCub-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_LionCub-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_MagicalBee-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Mammoth-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -787px; + width: 78px; + height: 86px; +} +.Mount_Icon_MantisShrimp-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Monkey-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Nudibranch-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Octopus-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Orca-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -700px; + width: 78px; + height: 86px; +} +.Mount_Icon_Owl-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Owl-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Aquatic { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Cupid { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Ember { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Fairy { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Floral { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Ghost { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Holly { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-StarryNight { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Thunderstorm { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_PandaCub-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Parrot-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Peacock-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Penguin-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Phoenix-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Pterodactyl-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rat-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rock-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Rooster-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sabretooth-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Seahorse-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sheep-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Slime-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Sloth-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snail-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Snake-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Spider-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_TRex-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Aquatic { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Cupid { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Ember { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -800px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Fairy { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -900px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Floral { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -1000px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Ghost { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -1100px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Holly { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-StarryNight { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Thunderstorm { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Treeling-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -1200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -1300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -1400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: 0px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -82px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -164px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -246px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -328px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -410px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Triceratops-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -492px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turkey-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turkey-Gilded { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -656px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -820px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -902px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -984px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1066px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1148px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1230px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1312px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1394px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turtle-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1476px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1558px -1500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-18.png'); background-position: -1640px -100px; width: 81px; height: 99px; } +.Mount_Icon_Unicorn-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-Red { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -400px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -500px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-White { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -738px -600px; + width: 81px; + height: 99px; +} +.Mount_Icon_Unicorn-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -574px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Whale-Base { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -874px; + width: 78px; + height: 86px; +} +.Mount_Icon_Whale-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -961px; + width: 78px; + height: 86px; +} +.Mount_Icon_Whale-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -1048px; + width: 78px; + height: 86px; +} +.Mount_Icon_Whale-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-18.png'); + background-position: -1640px -1135px; + width: 78px; + height: 86px; +} diff --git a/website/client/assets/css/sprites/spritesmith-main-19.css b/website/client/assets/css/sprites/spritesmith-main-19.css index 4eee8bf4b3..fb2ae1570d 100644 --- a/website/client/assets/css/sprites/spritesmith-main-19.css +++ b/website/client/assets/css/sprites/spritesmith-main-19.css @@ -1,1197 +1,1245 @@ -.Mount_Icon_Wolf-CottonCandyBlue { +.Mount_Icon_Whale-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -574px -1203px; - width: 81px; - height: 99px; + background-position: -1640px -1135px; + width: 78px; + height: 86px; } -.Mount_Icon_Wolf-CottonCandyPink { +.Mount_Icon_Whale-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -82px -1103px; - width: 81px; - height: 99px; + background-position: -1640px -700px; + width: 78px; + height: 86px; } -.Mount_Icon_Wolf-Cupid { +.Mount_Icon_Whale-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -164px 0px; - width: 81px; - height: 99px; + background-position: -1640px -1048px; + width: 78px; + height: 86px; } -.Mount_Icon_Wolf-Desert { +.Mount_Icon_Whale-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: 0px -103px; - width: 81px; - height: 99px; + background-position: -1640px -961px; + width: 78px; + height: 86px; } -.Mount_Icon_Wolf-Ember { +.Mount_Icon_Whale-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -82px -103px; - width: 81px; - height: 99px; + background-position: -1640px -874px; + width: 78px; + height: 86px; } -.Mount_Icon_Wolf-Fairy { +.Mount_Icon_Whale-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -164px -103px; - width: 81px; - height: 99px; + background-position: -1640px -787px; + width: 78px; + height: 86px; } -.Mount_Icon_Wolf-Floral { +.Mount_Icon_Wolf-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px 0px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Ghost { +.Mount_Icon_Wolf-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -100px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Golden { +.Mount_Icon_Wolf-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -203px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Holly { +.Mount_Icon_Wolf-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -203px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Peppermint { +.Mount_Icon_Wolf-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -203px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Red { +.Mount_Icon_Wolf-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -203px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-RoyalPurple { +.Mount_Icon_Wolf-Ember { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px 0px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Shade { +.Mount_Icon_Wolf-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -100px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Shimmer { +.Mount_Icon_Wolf-Floral { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -200px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Skeleton { +.Mount_Icon_Wolf-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -303px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Spooky { +.Mount_Icon_Wolf-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -303px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-StarryNight { +.Mount_Icon_Wolf-Holly { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -303px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Thunderstorm { +.Mount_Icon_Wolf-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -303px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-White { +.Mount_Icon_Wolf-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -303px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Zombie { +.Mount_Icon_Wolf-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px 0px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Base { +.Mount_Icon_Wolf-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -100px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-CottonCandyBlue { +.Mount_Icon_Wolf-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -200px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-CottonCandyPink { +.Mount_Icon_Wolf-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -300px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Desert { +.Mount_Icon_Wolf-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px 0px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Golden { +.Mount_Icon_Wolf-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -100px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Red { +.Mount_Icon_Wolf-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -200px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Shade { +.Mount_Icon_Wolf-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -300px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Skeleton { +.Mount_Icon_Wolf-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -403px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-White { +.Mount_Icon_Yarn-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -403px; width: 81px; height: 99px; } -.Mount_Icon_Yarn-Zombie { +.Mount_Icon_Yarn-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -403px; width: 81px; height: 99px; } -.Pet-Armadillo-Base { +.Mount_Icon_Yarn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -403px; width: 81px; height: 99px; } -.Pet-Armadillo-CottonCandyBlue { +.Mount_Icon_Yarn-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -403px; width: 81px; height: 99px; } -.Pet-Armadillo-CottonCandyPink { +.Mount_Icon_Yarn-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -403px; width: 81px; height: 99px; } -.Pet-Armadillo-Desert { +.Mount_Icon_Yarn-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -403px; width: 81px; height: 99px; } -.Pet-Armadillo-Golden { +.Mount_Icon_Yarn-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px 0px; width: 81px; height: 99px; } -.Pet-Armadillo-Red { +.Mount_Icon_Yarn-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -100px; width: 81px; height: 99px; } -.Pet-Armadillo-Shade { +.Mount_Icon_Yarn-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -200px; width: 81px; height: 99px; } -.Pet-Armadillo-Skeleton { +.Mount_Icon_Yarn-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -300px; width: 81px; height: 99px; } -.Pet-Armadillo-White { +.Pet-Armadillo-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -400px; width: 81px; height: 99px; } -.Pet-Armadillo-Zombie { +.Pet-Armadillo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-Base { +.Pet-Armadillo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-CottonCandyBlue { +.Pet-Armadillo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-CottonCandyPink { +.Pet-Armadillo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-Desert { +.Pet-Armadillo-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-Golden { +.Pet-Armadillo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-Red { +.Pet-Armadillo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-Shade { +.Pet-Armadillo-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -503px; width: 81px; height: 99px; } -.Pet-Axolotl-Skeleton { +.Pet-Armadillo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px 0px; width: 81px; height: 99px; } -.Pet-Axolotl-White { +.Pet-Axolotl-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -100px; width: 81px; height: 99px; } -.Pet-Axolotl-Zombie { +.Pet-Axolotl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -200px; width: 81px; height: 99px; } -.Pet-Badger-Base { +.Pet-Axolotl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -300px; width: 81px; height: 99px; } -.Pet-Badger-CottonCandyBlue { +.Pet-Axolotl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -400px; width: 81px; height: 99px; } -.Pet-Badger-CottonCandyPink { +.Pet-Axolotl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -500px; width: 81px; height: 99px; } -.Pet-Badger-Desert { +.Pet-Axolotl-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -603px; width: 81px; height: 99px; } -.Pet-Badger-Golden { +.Pet-Axolotl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -603px; width: 81px; height: 99px; } -.Pet-Badger-Red { +.Pet-Axolotl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -603px; width: 81px; height: 99px; } -.Pet-Badger-Shade { +.Pet-Axolotl-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -603px; width: 81px; height: 99px; } -.Pet-Badger-Skeleton { +.Pet-Axolotl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -603px; width: 81px; height: 99px; } -.Pet-Badger-White { +.Pet-Badger-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -603px; width: 81px; height: 99px; } -.Pet-Badger-Zombie { +.Pet-Badger-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -603px; width: 81px; height: 99px; } -.Pet-Bear-Veteran { +.Pet-Badger-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -603px; width: 81px; height: 99px; } -.Pet-BearCub-Aquatic { +.Pet-Badger-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -603px; width: 81px; height: 99px; } -.Pet-BearCub-Base { +.Pet-Badger-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px 0px; width: 81px; height: 99px; } -.Pet-BearCub-CottonCandyBlue { +.Pet-Badger-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -100px; width: 81px; height: 99px; } -.Pet-BearCub-CottonCandyPink { +.Pet-Badger-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -200px; width: 81px; height: 99px; } -.Pet-BearCub-Cupid { +.Pet-Badger-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -300px; width: 81px; height: 99px; } -.Pet-BearCub-Desert { +.Pet-Badger-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -400px; width: 81px; height: 99px; } -.Pet-BearCub-Ember { +.Pet-Badger-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -500px; width: 81px; height: 99px; } -.Pet-BearCub-Fairy { +.Pet-Bear-Veteran { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -600px; width: 81px; height: 99px; } -.Pet-BearCub-Floral { +.Pet-BearCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Ghost { +.Pet-BearCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Golden { +.Pet-BearCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Holly { +.Pet-BearCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Peppermint { +.Pet-BearCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Polar { +.Pet-BearCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Red { +.Pet-BearCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -703px; width: 81px; height: 99px; } -.Pet-BearCub-RoyalPurple { +.Pet-BearCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Shade { +.Pet-BearCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Shimmer { +.Pet-BearCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -703px; width: 81px; height: 99px; } -.Pet-BearCub-Skeleton { +.Pet-BearCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px 0px; width: 81px; height: 99px; } -.Pet-BearCub-Spooky { +.Pet-BearCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -100px; width: 81px; height: 99px; } -.Pet-BearCub-StarryNight { +.Pet-BearCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -200px; width: 81px; height: 99px; } -.Pet-BearCub-Thunderstorm { +.Pet-BearCub-Polar { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -300px; width: 81px; height: 99px; } -.Pet-BearCub-White { +.Pet-BearCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -400px; width: 81px; height: 99px; } -.Pet-BearCub-Zombie { +.Pet-BearCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -500px; width: 81px; height: 99px; } -.Pet-Beetle-Base { +.Pet-BearCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -600px; width: 81px; height: 99px; } -.Pet-Beetle-CottonCandyBlue { +.Pet-BearCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -700px; width: 81px; height: 99px; } -.Pet-Beetle-CottonCandyPink { +.Pet-BearCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px 0px; width: 81px; height: 99px; } -.Pet-Beetle-Desert { +.Pet-BearCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -100px; width: 81px; height: 99px; } -.Pet-Beetle-Golden { +.Pet-BearCub-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -200px; width: 81px; height: 99px; } -.Pet-Beetle-Red { +.Pet-BearCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -300px; width: 81px; height: 99px; } -.Pet-Beetle-Shade { +.Pet-BearCub-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -400px; width: 81px; height: 99px; } -.Pet-Beetle-Skeleton { +.Pet-BearCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -500px; width: 81px; height: 99px; } -.Pet-Beetle-White { +.Pet-Beetle-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -600px; width: 81px; height: 99px; } -.Pet-Beetle-Zombie { +.Pet-Beetle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -700px; width: 81px; height: 99px; } -.Pet-Bunny-Base { +.Pet-Beetle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -803px; width: 81px; height: 99px; } -.Pet-Bunny-CottonCandyBlue { +.Pet-Beetle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -803px; width: 81px; height: 99px; } -.Pet-Bunny-CottonCandyPink { +.Pet-Beetle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -803px; width: 81px; height: 99px; } -.Pet-Bunny-Desert { +.Pet-Beetle-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -803px; width: 81px; height: 99px; } -.Pet-Bunny-Golden { +.Pet-Beetle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -803px; width: 81px; height: 99px; } -.Pet-Bunny-Red { +.Pet-Beetle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -803px; width: 81px; height: 99px; } -.Pet-Bunny-Shade { +.Pet-Beetle-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -803px; width: 81px; height: 99px; } -.Pet-Bunny-Skeleton { +.Pet-Beetle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -803px; width: 81px; height: 99px; } -.Pet-Bunny-White { +.Pet-Bunny-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -803px; width: 81px; height: 99px; } -.Pet-Bunny-Zombie { +.Pet-Bunny-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -803px; width: 81px; height: 99px; } -.Pet-Butterfly-Base { +.Pet-Bunny-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -803px; width: 81px; height: 99px; } -.Pet-Butterfly-CottonCandyBlue { +.Pet-Bunny-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -803px; width: 81px; height: 99px; } -.Pet-Butterfly-CottonCandyPink { +.Pet-Bunny-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px 0px; width: 81px; height: 99px; } -.Pet-Butterfly-Desert { +.Pet-Bunny-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -100px; width: 81px; height: 99px; } -.Pet-Butterfly-Golden { +.Pet-Bunny-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -200px; width: 81px; height: 99px; } -.Pet-Butterfly-Red { +.Pet-Bunny-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -300px; width: 81px; height: 99px; } -.Pet-Butterfly-Shade { +.Pet-Bunny-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -400px; width: 81px; height: 99px; } -.Pet-Butterfly-Skeleton { +.Pet-Bunny-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -500px; width: 81px; height: 99px; } -.Pet-Butterfly-White { +.Pet-Butterfly-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -600px; width: 81px; height: 99px; } -.Pet-Butterfly-Zombie { +.Pet-Butterfly-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -700px; width: 81px; height: 99px; } -.Pet-Cactus-Aquatic { +.Pet-Butterfly-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Base { +.Pet-Butterfly-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -903px; width: 81px; height: 99px; } -.Pet-Cactus-CottonCandyBlue { +.Pet-Butterfly-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -903px; width: 81px; height: 99px; } -.Pet-Cactus-CottonCandyPink { +.Pet-Butterfly-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Cupid { +.Pet-Butterfly-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Desert { +.Pet-Butterfly-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Ember { +.Pet-Butterfly-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Fairy { +.Pet-Butterfly-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Floral { +.Pet-Cactus-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Ghost { +.Pet-Cactus-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Golden { +.Pet-Cactus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Holly { +.Pet-Cactus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Peppermint { +.Pet-Cactus-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -903px; width: 81px; height: 99px; } -.Pet-Cactus-Red { +.Pet-Cactus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -903px; width: 81px; height: 99px; } -.Pet-Cactus-RoyalPurple { +.Pet-Cactus-Ember { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px 0px; width: 81px; height: 99px; } -.Pet-Cactus-Shade { +.Pet-Cactus-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -100px; width: 81px; height: 99px; } -.Pet-Cactus-Shimmer { +.Pet-Cactus-Floral { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -200px; width: 81px; height: 99px; } -.Pet-Cactus-Skeleton { +.Pet-Cactus-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -300px; width: 81px; height: 99px; } -.Pet-Cactus-Spooky { +.Pet-Cactus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -400px; width: 81px; height: 99px; } -.Pet-Cactus-StarryNight { +.Pet-Cactus-Holly { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -500px; width: 81px; height: 99px; } -.Pet-Cactus-Thunderstorm { +.Pet-Cactus-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -600px; width: 81px; height: 99px; } -.Pet-Cactus-White { +.Pet-Cactus-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -700px; width: 81px; height: 99px; } -.Pet-Cactus-Zombie { +.Pet-Cactus-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -800px; width: 81px; height: 99px; } -.Pet-Cheetah-Base { +.Pet-Cactus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -900px; width: 81px; height: 99px; } -.Pet-Cheetah-CottonCandyBlue { +.Pet-Cactus-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-CottonCandyPink { +.Pet-Cactus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-Desert { +.Pet-Cactus-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-Golden { +.Pet-Cactus-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-Red { +.Pet-Cactus-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-Shade { +.Pet-Cactus-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-Skeleton { +.Pet-Cactus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-White { +.Pet-Cheetah-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -1003px; width: 81px; height: 99px; } -.Pet-Cheetah-Zombie { +.Pet-Cheetah-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -1003px; width: 81px; height: 99px; } -.Pet-Cow-Base { +.Pet-Cheetah-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -1003px; width: 81px; height: 99px; } -.Pet-Cow-CottonCandyBlue { +.Pet-Cheetah-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -1003px; width: 81px; height: 99px; } -.Pet-Cow-CottonCandyPink { +.Pet-Cheetah-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -1003px; width: 81px; height: 99px; } -.Pet-Cow-Desert { +.Pet-Cheetah-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -1003px; width: 81px; height: 99px; } -.Pet-Cow-Golden { +.Pet-Cheetah-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -1003px; width: 81px; height: 99px; } -.Pet-Cow-Red { +.Pet-Cheetah-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px 0px; width: 81px; height: 99px; } -.Pet-Cow-Shade { +.Pet-Cheetah-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -100px; width: 81px; height: 99px; } -.Pet-Cow-Skeleton { +.Pet-Cheetah-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -200px; width: 81px; height: 99px; } -.Pet-Cow-White { +.Pet-Cow-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -300px; width: 81px; height: 99px; } -.Pet-Cow-Zombie { +.Pet-Cow-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -400px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Base { +.Pet-Cow-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -500px; width: 81px; height: 99px; } -.Pet-Cuttlefish-CottonCandyBlue { +.Pet-Cow-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -600px; width: 81px; height: 99px; } -.Pet-Cuttlefish-CottonCandyPink { +.Pet-Cow-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -700px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Desert { +.Pet-Cow-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -800px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Golden { +.Pet-Cow-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -900px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Red { +.Pet-Cow-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -1000px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Shade { +.Pet-Cow-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -1103px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Skeleton { +.Pet-Cow-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px 0px; width: 81px; height: 99px; } -.Pet-Cuttlefish-White { +.Pet-Cuttlefish-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -1103px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Zombie { +.Pet-Cuttlefish-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Base { +.Pet-Cuttlefish-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -1103px; width: 81px; height: 99px; } -.Pet-Deer-CottonCandyBlue { +.Pet-Cuttlefish-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -1103px; width: 81px; height: 99px; } -.Pet-Deer-CottonCandyPink { +.Pet-Cuttlefish-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Desert { +.Pet-Cuttlefish-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -574px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Golden { +.Pet-Cuttlefish-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -656px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Red { +.Pet-Cuttlefish-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -738px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Shade { +.Pet-Cuttlefish-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -820px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Skeleton { +.Pet-Cuttlefish-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -902px -1103px; width: 81px; height: 99px; } -.Pet-Deer-White { +.Pet-Deer-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -984px -1103px; width: 81px; height: 99px; } -.Pet-Deer-Zombie { +.Pet-Deer-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1066px -1103px; width: 81px; height: 99px; } -.Pet-Dragon-Aquatic { +.Pet-Deer-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1148px -1103px; width: 81px; height: 99px; } -.Pet-Dragon-Base { +.Pet-Deer-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px 0px; width: 81px; height: 99px; } -.Pet-Dragon-CottonCandyBlue { +.Pet-Deer-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -100px; width: 81px; height: 99px; } -.Pet-Dragon-CottonCandyPink { +.Pet-Deer-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -200px; width: 81px; height: 99px; } -.Pet-Dragon-Cupid { +.Pet-Deer-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -300px; width: 81px; height: 99px; } -.Pet-Dragon-Desert { +.Pet-Deer-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -400px; width: 81px; height: 99px; } -.Pet-Dragon-Ember { +.Pet-Deer-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -500px; width: 81px; height: 99px; } -.Pet-Dragon-Fairy { +.Pet-Deer-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -600px; width: 81px; height: 99px; } -.Pet-Dragon-Floral { +.Pet-Dragon-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -700px; width: 81px; height: 99px; } -.Pet-Dragon-Ghost { +.Pet-Dragon-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -800px; width: 81px; height: 99px; } -.Pet-Dragon-Golden { +.Pet-Dragon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -900px; width: 81px; height: 99px; } -.Pet-Dragon-Holly { +.Pet-Dragon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -1000px; width: 81px; height: 99px; } -.Pet-Dragon-Hydra { +.Pet-Dragon-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -1230px -1100px; width: 81px; height: 99px; } -.Pet-Dragon-Peppermint { +.Pet-Dragon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px -1203px; width: 81px; height: 99px; } -.Pet-Dragon-Red { +.Pet-Dragon-Ember { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -82px -1203px; width: 81px; height: 99px; } -.Pet-Dragon-RoyalPurple { +.Pet-Dragon-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -164px -1203px; width: 81px; height: 99px; } -.Pet-Dragon-Shade { +.Pet-Dragon-Floral { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -246px -1203px; width: 81px; height: 99px; } -.Pet-Dragon-Shimmer { +.Pet-Dragon-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -328px -1203px; width: 81px; height: 99px; } -.Pet-Dragon-Skeleton { +.Pet-Dragon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -410px -1203px; width: 81px; height: 99px; } -.Pet-Dragon-Spooky { +.Pet-Dragon-Holly { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: -492px -1203px; width: 81px; height: 99px; } +.Pet-Dragon-Hydra { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -574px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -656px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-Red { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -738px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -820px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -902px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -984px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -1066px -1203px; + width: 81px; + height: 99px; +} +.Pet-Dragon-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-19.png'); + background-position: -1148px -1203px; + width: 81px; + height: 99px; +} .Pet-Dragon-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); background-position: 0px 0px; @@ -1200,793 +1248,751 @@ } .Pet-Dragon-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -656px -1203px; + background-position: -1312px 0px; width: 81px; height: 99px; } .Pet-Dragon-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -738px -1203px; + background-position: -1312px -100px; width: 81px; height: 99px; } .Pet-Dragon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -820px -1203px; + background-position: -1312px -200px; width: 81px; height: 99px; } .Pet-Egg-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -902px -1203px; + background-position: -1312px -300px; width: 81px; height: 99px; } .Pet-Egg-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -984px -1203px; + background-position: -1312px -400px; width: 81px; height: 99px; } .Pet-Egg-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1066px -1203px; + background-position: -1312px -500px; width: 81px; height: 99px; } .Pet-Egg-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1148px -1203px; + background-position: -1312px -600px; width: 81px; height: 99px; } .Pet-Egg-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1230px -1203px; + background-position: -1312px -700px; width: 81px; height: 99px; } .Pet-Egg-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px 0px; + background-position: -1312px -800px; width: 81px; height: 99px; } .Pet-Egg-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -100px; + background-position: -1312px -900px; width: 81px; height: 99px; } .Pet-Egg-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -200px; + background-position: -1312px -1000px; width: 81px; height: 99px; } .Pet-Egg-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -300px; + background-position: -1312px -1100px; width: 81px; height: 99px; } .Pet-Egg-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -400px; + background-position: -1312px -1200px; width: 81px; height: 99px; } .Pet-Falcon-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -500px; + background-position: -1394px 0px; width: 81px; height: 99px; } .Pet-Falcon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -600px; + background-position: -1394px -100px; width: 81px; height: 99px; } .Pet-Falcon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -700px; + background-position: -1394px -200px; width: 81px; height: 99px; } .Pet-Falcon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -800px; + background-position: -1394px -300px; width: 81px; height: 99px; } .Pet-Falcon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -900px; + background-position: -1394px -400px; width: 81px; height: 99px; } .Pet-Falcon-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -1000px; + background-position: -1394px -500px; width: 81px; height: 99px; } .Pet-Falcon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -1100px; + background-position: -1394px -600px; width: 81px; height: 99px; } .Pet-Falcon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -1200px; + background-position: -1394px -700px; width: 81px; height: 99px; } .Pet-Falcon-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px 0px; + background-position: -1394px -800px; width: 81px; height: 99px; } .Pet-Falcon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -100px; + background-position: -1394px -900px; width: 81px; height: 99px; } .Pet-Ferret-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -200px; + background-position: -1394px -1000px; width: 81px; height: 99px; } .Pet-Ferret-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -300px; + background-position: -1394px -1100px; width: 81px; height: 99px; } .Pet-Ferret-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -400px; + background-position: -1394px -1200px; width: 81px; height: 99px; } .Pet-Ferret-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -500px; + background-position: 0px -1303px; width: 81px; height: 99px; } .Pet-Ferret-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -600px; + background-position: -82px -1303px; width: 81px; height: 99px; } .Pet-Ferret-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -700px; + background-position: -164px -1303px; width: 81px; height: 99px; } .Pet-Ferret-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -800px; + background-position: -246px -1303px; width: 81px; height: 99px; } .Pet-Ferret-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -900px; + background-position: -328px -1303px; width: 81px; height: 99px; } .Pet-Ferret-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -1000px; + background-position: -410px -1303px; width: 81px; height: 99px; } .Pet-Ferret-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -1100px; + background-position: -492px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -1200px; + background-position: -574px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: 0px -1303px; + background-position: -656px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -82px -1303px; + background-position: -738px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -164px -1303px; + background-position: -820px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -246px -1303px; + background-position: -902px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -328px -1303px; + background-position: -984px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Ember { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -410px -1303px; + background-position: -1066px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -492px -1303px; + background-position: -1148px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Floral { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -574px -1303px; + background-position: -1230px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -656px -1303px; + background-position: -1312px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -738px -1303px; + background-position: -1394px -1303px; width: 81px; height: 99px; } .Pet-FlyingPig-Holly { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -820px -1303px; + background-position: -1476px 0px; width: 81px; height: 99px; } .Pet-FlyingPig-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -902px -1303px; + background-position: -1476px -100px; width: 81px; height: 99px; } .Pet-FlyingPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -984px -1303px; + background-position: -1476px -200px; width: 81px; height: 99px; } .Pet-FlyingPig-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1066px -1303px; + background-position: -1476px -300px; width: 81px; height: 99px; } .Pet-FlyingPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1148px -1303px; + background-position: -1476px -400px; width: 81px; height: 99px; } .Pet-FlyingPig-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1230px -1303px; + background-position: -1476px -500px; width: 81px; height: 99px; } .Pet-FlyingPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -1303px; + background-position: -1476px -600px; width: 81px; height: 99px; } .Pet-FlyingPig-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -1303px; + background-position: -1476px -700px; width: 81px; height: 99px; } .Pet-FlyingPig-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px 0px; + background-position: -1476px -800px; width: 81px; height: 99px; } .Pet-FlyingPig-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -100px; + background-position: -1476px -900px; width: 81px; height: 99px; } .Pet-FlyingPig-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -200px; + background-position: -1476px -1000px; width: 81px; height: 99px; } .Pet-FlyingPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -300px; + background-position: -1476px -1100px; width: 81px; height: 99px; } .Pet-Fox-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -400px; + background-position: -1476px -1200px; width: 81px; height: 99px; } .Pet-Fox-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -500px; + background-position: -1476px -1300px; width: 81px; height: 99px; } .Pet-Fox-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -600px; + background-position: 0px -1403px; width: 81px; height: 99px; } .Pet-Fox-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -700px; + background-position: -82px -1403px; width: 81px; height: 99px; } .Pet-Fox-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -800px; + background-position: -164px -1403px; width: 81px; height: 99px; } .Pet-Fox-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -900px; + background-position: -246px -1403px; width: 81px; height: 99px; } .Pet-Fox-Ember { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -1000px; + background-position: -328px -1403px; width: 81px; height: 99px; } .Pet-Fox-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -1100px; + background-position: -410px -1403px; width: 81px; height: 99px; } .Pet-Fox-Floral { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -1200px; + background-position: -492px -1403px; width: 81px; height: 99px; } .Pet-Fox-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -1300px; + background-position: -574px -1403px; width: 81px; height: 99px; } .Pet-Fox-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: 0px -1403px; + background-position: -656px -1403px; width: 81px; height: 99px; } .Pet-Fox-Holly { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -82px -1403px; + background-position: -738px -1403px; width: 81px; height: 99px; } .Pet-Fox-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -164px -1403px; + background-position: -820px -1403px; width: 81px; height: 99px; } .Pet-Fox-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -246px -1403px; + background-position: -902px -1403px; width: 81px; height: 99px; } .Pet-Fox-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -328px -1403px; + background-position: -984px -1403px; width: 81px; height: 99px; } .Pet-Fox-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -410px -1403px; + background-position: -1066px -1403px; width: 81px; height: 99px; } .Pet-Fox-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -492px -1403px; + background-position: -1148px -1403px; width: 81px; height: 99px; } .Pet-Fox-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -574px -1403px; + background-position: -1230px -1403px; width: 81px; height: 99px; } .Pet-Fox-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -656px -1403px; + background-position: -1312px -1403px; width: 81px; height: 99px; } .Pet-Fox-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -738px -1403px; + background-position: -1394px -1403px; width: 81px; height: 99px; } .Pet-Fox-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -820px -1403px; + background-position: -1476px -1403px; width: 81px; height: 99px; } .Pet-Fox-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -902px -1403px; + background-position: -1558px 0px; width: 81px; height: 99px; } .Pet-Fox-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -984px -1403px; + background-position: -1558px -100px; width: 81px; height: 99px; } .Pet-Frog-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1066px -1403px; + background-position: -1558px -200px; width: 81px; height: 99px; } .Pet-Frog-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1148px -1403px; + background-position: -1558px -300px; width: 81px; height: 99px; } .Pet-Frog-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1230px -1403px; + background-position: -1558px -400px; width: 81px; height: 99px; } .Pet-Frog-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -1403px; + background-position: -1558px -500px; width: 81px; height: 99px; } .Pet-Frog-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -1403px; + background-position: -1558px -600px; width: 81px; height: 99px; } .Pet-Frog-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -1403px; + background-position: -1558px -700px; width: 81px; height: 99px; } .Pet-Frog-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px 0px; + background-position: -1558px -800px; width: 81px; height: 99px; } .Pet-Frog-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -100px; + background-position: -1558px -900px; width: 81px; height: 99px; } .Pet-Frog-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -200px; + background-position: -1558px -1000px; width: 81px; height: 99px; } .Pet-Frog-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -300px; + background-position: -1558px -1100px; width: 81px; height: 99px; } .Pet-Gryphon-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -400px; + background-position: -1558px -1200px; width: 81px; height: 99px; } .Pet-Gryphon-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -500px; + background-position: -1558px -1300px; width: 81px; height: 99px; } .Pet-Gryphon-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -600px; + background-position: -1558px -1400px; width: 81px; height: 99px; } .Pet-Gryphon-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -700px; + background-position: 0px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -800px; + background-position: -82px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -900px; + background-position: -164px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -1000px; + background-position: -246px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -1100px; + background-position: -328px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -1200px; + background-position: -410px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -1300px; + background-position: -492px -1503px; width: 81px; height: 99px; } .Pet-Gryphon-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -1400px; + background-position: -574px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: 0px -1503px; + background-position: -656px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -82px -1503px; + background-position: -738px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -164px -1503px; + background-position: -820px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -246px -1503px; + background-position: -902px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -328px -1503px; + background-position: -984px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -410px -1503px; + background-position: -1066px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -492px -1503px; + background-position: -1148px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -574px -1503px; + background-position: -1230px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -656px -1503px; + background-position: -1312px -1503px; width: 81px; height: 99px; } .Pet-GuineaPig-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -738px -1503px; + background-position: -1394px -1503px; width: 81px; height: 99px; } .Pet-Hedgehog-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -820px -1503px; + background-position: -1476px -1503px; width: 81px; height: 99px; } .Pet-Hedgehog-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -902px -1503px; + background-position: -1558px -1503px; width: 81px; height: 99px; } .Pet-Hedgehog-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -984px -1503px; + background-position: -1640px 0px; width: 81px; height: 99px; } .Pet-Hedgehog-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1066px -1503px; + background-position: -1640px -100px; width: 81px; height: 99px; } .Pet-Hedgehog-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1148px -1503px; + background-position: -1640px -200px; width: 81px; height: 99px; } .Pet-Hedgehog-Red { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1230px -1503px; + background-position: -1640px -300px; width: 81px; height: 99px; } .Pet-Hedgehog-Shade { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1312px -1503px; + background-position: -1640px -400px; width: 81px; height: 99px; } .Pet-Hedgehog-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1394px -1503px; + background-position: -1640px -500px; width: 81px; height: 99px; } .Pet-Hedgehog-White { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1476px -1503px; + background-position: -1640px -600px; width: 81px; height: 99px; } .Pet-Hedgehog-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1558px -1503px; + background-position: -82px -1103px; width: 81px; height: 99px; } .Pet-Hippo-Base { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px 0px; + background-position: -164px -103px; width: 81px; height: 99px; } .Pet-Hippo-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -100px; + background-position: -82px -103px; width: 81px; height: 99px; } .Pet-Hippo-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -200px; + background-position: 0px -103px; width: 81px; height: 99px; } .Pet-Hippo-Desert { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -300px; + background-position: -164px 0px; width: 81px; height: 99px; } .Pet-Hippo-Golden { background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -400px; - width: 81px; - height: 99px; -} -.Pet-Hippo-Red { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -500px; - width: 81px; - height: 99px; -} -.Pet-Hippo-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -600px; - width: 81px; - height: 99px; -} -.Pet-Hippo-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -700px; - width: 81px; - height: 99px; -} -.Pet-Hippo-White { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -800px; - width: 81px; - height: 99px; -} -.Pet-Hippo-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -900px; - width: 81px; - height: 99px; -} -.Pet-Hippogriff-Hopeful { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -1000px; - width: 81px; - height: 99px; -} -.Pet-Horse-Base { - background-image: url('~assets/images/sprites/spritesmith-main-19.png'); - background-position: -1640px -1100px; + background-position: -1230px -1203px; width: 81px; height: 99px; } diff --git a/website/client/assets/css/sprites/spritesmith-main-20.css b/website/client/assets/css/sprites/spritesmith-main-20.css index 606082cbe1..ed50406eb4 100644 --- a/website/client/assets/css/sprites/spritesmith-main-20.css +++ b/website/client/assets/css/sprites/spritesmith-main-20.css @@ -1,1990 +1,1990 @@ -.Pet-Horse-CottonCandyBlue { +.Pet-Hippo-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px 0px; width: 81px; height: 99px; } -.Pet-Horse-CottonCandyPink { +.Pet-Hippo-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -1100px; width: 81px; height: 99px; } -.Pet-Horse-Desert { +.Pet-Hippo-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px 0px; width: 81px; height: 99px; } -.Pet-Horse-Golden { +.Pet-Hippo-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -100px; width: 81px; height: 99px; } -.Pet-Horse-Red { +.Pet-Hippo-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -100px; width: 81px; height: 99px; } -.Pet-Horse-Shade { +.Pet-Hippogriff-Hopeful { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -100px; width: 81px; height: 99px; } -.Pet-Horse-Skeleton { +.Pet-Horse-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px 0px; width: 81px; height: 99px; } -.Pet-Horse-White { +.Pet-Horse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -100px; width: 81px; height: 99px; } -.Pet-Horse-Zombie { +.Pet-Horse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -200px; width: 81px; height: 99px; } -.Pet-JackOLantern-Base { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -164px -200px; - width: 81px; - height: 99px; -} -.Pet-JackOLantern-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -246px -200px; - width: 81px; - height: 99px; -} -.Pet-Jackalope-RoyalPurple { +.Pet-Horse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -200px; width: 81px; height: 99px; } -.Pet-Lion-Veteran { +.Pet-Horse-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -164px -200px; + width: 81px; + height: 99px; +} +.Pet-Horse-Red { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -246px -200px; + width: 81px; + height: 99px; +} +.Pet-Horse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px 0px; width: 81px; height: 99px; } -.Pet-LionCub-Aquatic { +.Pet-Horse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -100px; width: 81px; height: 99px; } -.Pet-LionCub-Base { +.Pet-Horse-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -200px; width: 81px; height: 99px; } -.Pet-LionCub-CottonCandyBlue { +.Pet-Horse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -300px; width: 81px; height: 99px; } -.Pet-LionCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -82px -300px; - width: 81px; - height: 99px; -} -.Pet-LionCub-Cupid { +.Pet-JackOLantern-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -300px; width: 81px; height: 99px; } -.Pet-LionCub-Desert { +.Pet-JackOLantern-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -300px; width: 81px; height: 99px; } -.Pet-LionCub-Ember { +.Pet-Jackalope-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -82px -300px; + width: 81px; + height: 99px; +} +.Pet-Lion-Veteran { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -300px; width: 81px; height: 99px; } -.Pet-LionCub-Fairy { +.Pet-LionCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px 0px; width: 81px; height: 99px; } -.Pet-LionCub-Floral { +.Pet-LionCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -100px; width: 81px; height: 99px; } -.Pet-LionCub-Ghost { +.Pet-LionCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -200px; width: 81px; height: 99px; } -.Pet-LionCub-Golden { +.Pet-LionCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -300px; width: 81px; height: 99px; } -.Pet-LionCub-Holly { +.Pet-LionCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px 0px; width: 81px; height: 99px; } -.Pet-LionCub-Peppermint { +.Pet-LionCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -100px; width: 81px; height: 99px; } -.Pet-LionCub-Red { +.Pet-LionCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -200px; width: 81px; height: 99px; } -.Pet-LionCub-RoyalPurple { +.Pet-LionCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -300px; width: 81px; height: 99px; } -.Pet-LionCub-Shade { +.Pet-LionCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -400px; width: 81px; height: 99px; } -.Pet-LionCub-Shimmer { +.Pet-LionCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -400px; width: 81px; height: 99px; } -.Pet-LionCub-Skeleton { +.Pet-LionCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -400px; width: 81px; height: 99px; } -.Pet-LionCub-Spooky { +.Pet-LionCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -400px; width: 81px; height: 99px; } -.Pet-LionCub-StarryNight { +.Pet-LionCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -400px; width: 81px; height: 99px; } -.Pet-LionCub-Thunderstorm { +.Pet-LionCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -400px; width: 81px; height: 99px; } -.Pet-LionCub-White { +.Pet-LionCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -400px; width: 81px; height: 99px; } -.Pet-LionCub-Zombie { +.Pet-LionCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px 0px; width: 81px; height: 99px; } -.Pet-MagicalBee-Base { +.Pet-LionCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -100px; width: 81px; height: 99px; } -.Pet-Mammoth-Base { +.Pet-LionCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -200px; width: 81px; height: 99px; } -.Pet-MantisShrimp-Base { +.Pet-LionCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -300px; width: 81px; height: 99px; } -.Pet-Monkey-Base { +.Pet-LionCub-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -400px; width: 81px; height: 99px; } -.Pet-Monkey-CottonCandyBlue { +.Pet-LionCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -500px; width: 81px; height: 99px; } -.Pet-Monkey-CottonCandyPink { +.Pet-LionCub-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -500px; width: 81px; height: 99px; } -.Pet-Monkey-Desert { +.Pet-LionCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -500px; width: 81px; height: 99px; } -.Pet-Monkey-Golden { +.Pet-MagicalBee-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -500px; width: 81px; height: 99px; } -.Pet-Monkey-Red { +.Pet-Mammoth-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -500px; width: 81px; height: 99px; } -.Pet-Monkey-Shade { +.Pet-MantisShrimp-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -500px; width: 81px; height: 99px; } -.Pet-Monkey-Skeleton { +.Pet-Monkey-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -500px; width: 81px; height: 99px; } -.Pet-Monkey-White { +.Pet-Monkey-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -500px; width: 81px; height: 99px; } -.Pet-Monkey-Zombie { +.Pet-Monkey-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px 0px; width: 81px; height: 99px; } -.Pet-Nudibranch-Base { +.Pet-Monkey-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -100px; width: 81px; height: 99px; } -.Pet-Nudibranch-CottonCandyBlue { +.Pet-Monkey-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -200px; width: 81px; height: 99px; } -.Pet-Nudibranch-CottonCandyPink { +.Pet-Monkey-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -300px; width: 81px; height: 99px; } -.Pet-Nudibranch-Desert { +.Pet-Monkey-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -400px; width: 81px; height: 99px; } -.Pet-Nudibranch-Golden { +.Pet-Monkey-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -500px; width: 81px; height: 99px; } -.Pet-Nudibranch-Red { +.Pet-Monkey-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -600px; width: 81px; height: 99px; } -.Pet-Nudibranch-Shade { +.Pet-Monkey-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -600px; width: 81px; height: 99px; } -.Pet-Nudibranch-Skeleton { +.Pet-Nudibranch-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -600px; width: 81px; height: 99px; } -.Pet-Nudibranch-White { +.Pet-Nudibranch-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -600px; width: 81px; height: 99px; } -.Pet-Nudibranch-Zombie { +.Pet-Nudibranch-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -600px; width: 81px; height: 99px; } -.Pet-Octopus-Base { +.Pet-Nudibranch-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -600px; width: 81px; height: 99px; } -.Pet-Octopus-CottonCandyBlue { +.Pet-Nudibranch-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -600px; width: 81px; height: 99px; } -.Pet-Octopus-CottonCandyPink { +.Pet-Nudibranch-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -600px; width: 81px; height: 99px; } -.Pet-Octopus-Desert { +.Pet-Nudibranch-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -600px; width: 81px; height: 99px; } -.Pet-Octopus-Golden { +.Pet-Nudibranch-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px 0px; width: 81px; height: 99px; } -.Pet-Octopus-Red { +.Pet-Nudibranch-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -100px; width: 81px; height: 99px; } -.Pet-Octopus-Shade { +.Pet-Nudibranch-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -200px; width: 81px; height: 99px; } -.Pet-Octopus-Skeleton { +.Pet-Octopus-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -300px; width: 81px; height: 99px; } -.Pet-Octopus-White { +.Pet-Octopus-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -400px; width: 81px; height: 99px; } -.Pet-Octopus-Zombie { +.Pet-Octopus-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -500px; width: 81px; height: 99px; } -.Pet-Orca-Base { +.Pet-Octopus-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -600px; width: 81px; height: 99px; } -.Pet-Owl-Base { +.Pet-Octopus-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -700px; width: 81px; height: 99px; } -.Pet-Owl-CottonCandyBlue { +.Pet-Octopus-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -700px; width: 81px; height: 99px; } -.Pet-Owl-CottonCandyPink { +.Pet-Octopus-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -700px; width: 81px; height: 99px; } -.Pet-Owl-Desert { +.Pet-Octopus-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -700px; width: 81px; height: 99px; } -.Pet-Owl-Golden { +.Pet-Octopus-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -700px; width: 81px; height: 99px; } -.Pet-Owl-Red { +.Pet-Octopus-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -700px; width: 81px; height: 99px; } -.Pet-Owl-Shade { +.Pet-Orca-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -700px; width: 81px; height: 99px; } -.Pet-Owl-Skeleton { +.Pet-Owl-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -700px; width: 81px; height: 99px; } -.Pet-Owl-White { +.Pet-Owl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -700px; width: 81px; height: 99px; } -.Pet-Owl-Zombie { +.Pet-Owl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -700px; width: 81px; height: 99px; } -.Pet-PandaCub-Aquatic { +.Pet-Owl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px 0px; width: 81px; height: 99px; } -.Pet-PandaCub-Base { +.Pet-Owl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -100px; width: 81px; height: 99px; } -.Pet-PandaCub-CottonCandyBlue { +.Pet-Owl-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -200px; width: 81px; height: 99px; } -.Pet-PandaCub-CottonCandyPink { +.Pet-Owl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -300px; width: 81px; height: 99px; } -.Pet-PandaCub-Cupid { +.Pet-Owl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -400px; width: 81px; height: 99px; } -.Pet-PandaCub-Desert { +.Pet-Owl-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -500px; width: 81px; height: 99px; } -.Pet-PandaCub-Ember { +.Pet-Owl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -600px; width: 81px; height: 99px; } -.Pet-PandaCub-Fairy { +.Pet-PandaCub-Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -700px; width: 81px; height: 99px; } -.Pet-PandaCub-Floral { +.Pet-PandaCub-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Ghost { +.Pet-PandaCub-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Golden { +.Pet-PandaCub-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Holly { +.Pet-PandaCub-Cupid { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Peppermint { +.Pet-PandaCub-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Red { +.Pet-PandaCub-Ember { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-RoyalPurple { +.Pet-PandaCub-Fairy { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Shade { +.Pet-PandaCub-Floral { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Shimmer { +.Pet-PandaCub-Ghost { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Skeleton { +.Pet-PandaCub-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-Spooky { +.Pet-PandaCub-Holly { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -800px; width: 81px; height: 99px; } -.Pet-PandaCub-StarryNight { +.Pet-PandaCub-Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px 0px; width: 81px; height: 99px; } -.Pet-PandaCub-Thunderstorm { +.Pet-PandaCub-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -100px; width: 81px; height: 99px; } -.Pet-PandaCub-White { +.Pet-PandaCub-RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -200px; width: 81px; height: 99px; } -.Pet-PandaCub-Zombie { +.Pet-PandaCub-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -300px; width: 81px; height: 99px; } -.Pet-Parrot-Base { +.Pet-PandaCub-Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -400px; width: 81px; height: 99px; } -.Pet-Parrot-CottonCandyBlue { +.Pet-PandaCub-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -500px; width: 81px; height: 99px; } -.Pet-Parrot-CottonCandyPink { +.Pet-PandaCub-Spooky { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -600px; width: 81px; height: 99px; } -.Pet-Parrot-Desert { +.Pet-PandaCub-StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -700px; width: 81px; height: 99px; } -.Pet-Parrot-Golden { +.Pet-PandaCub-Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -800px; width: 81px; height: 99px; } -.Pet-Parrot-Red { +.Pet-PandaCub-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px 0px; width: 81px; height: 99px; } -.Pet-Parrot-Shade { +.Pet-PandaCub-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -100px; width: 81px; height: 99px; } -.Pet-Parrot-Skeleton { +.Pet-Parrot-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -200px; width: 81px; height: 99px; } -.Pet-Parrot-White { +.Pet-Parrot-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -300px; width: 81px; height: 99px; } -.Pet-Parrot-Zombie { +.Pet-Parrot-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -400px; width: 81px; height: 99px; } -.Pet-Peacock-Base { +.Pet-Parrot-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -500px; width: 81px; height: 99px; } -.Pet-Peacock-CottonCandyBlue { +.Pet-Parrot-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -600px; width: 81px; height: 99px; } -.Pet-Peacock-CottonCandyPink { +.Pet-Parrot-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -700px; width: 81px; height: 99px; } -.Pet-Peacock-Desert { +.Pet-Parrot-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -800px; width: 81px; height: 99px; } -.Pet-Peacock-Golden { +.Pet-Parrot-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -900px; width: 81px; height: 99px; } -.Pet-Peacock-Red { +.Pet-Parrot-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -900px; width: 81px; height: 99px; } -.Pet-Peacock-Shade { +.Pet-Parrot-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -900px; width: 81px; height: 99px; } -.Pet-Peacock-Skeleton { +.Pet-Peacock-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -900px; width: 81px; height: 99px; } -.Pet-Peacock-White { +.Pet-Peacock-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -900px; width: 81px; height: 99px; } -.Pet-Peacock-Zombie { +.Pet-Peacock-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -900px; width: 81px; height: 99px; } -.Pet-Penguin-Base { +.Pet-Peacock-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -900px; width: 81px; height: 99px; } -.Pet-Penguin-CottonCandyBlue { +.Pet-Peacock-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -900px; width: 81px; height: 99px; } -.Pet-Penguin-CottonCandyPink { +.Pet-Peacock-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -900px; width: 81px; height: 99px; } -.Pet-Penguin-Desert { +.Pet-Peacock-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -900px; width: 81px; height: 99px; } -.Pet-Penguin-Golden { +.Pet-Peacock-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -900px; width: 81px; height: 99px; } -.Pet-Penguin-Red { +.Pet-Peacock-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -900px; width: 81px; height: 99px; } -.Pet-Penguin-Shade { +.Pet-Peacock-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -900px; width: 81px; height: 99px; } -.Pet-Penguin-Skeleton { +.Pet-Penguin-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px 0px; width: 81px; height: 99px; } -.Pet-Penguin-White { +.Pet-Penguin-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -100px; width: 81px; height: 99px; } -.Pet-Penguin-Zombie { +.Pet-Penguin-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -200px; width: 81px; height: 99px; } -.Pet-Phoenix-Base { +.Pet-Penguin-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -300px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Base { +.Pet-Penguin-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -400px; width: 81px; height: 99px; } -.Pet-Pterodactyl-CottonCandyBlue { +.Pet-Penguin-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -500px; width: 81px; height: 99px; } -.Pet-Pterodactyl-CottonCandyPink { +.Pet-Penguin-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -600px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Desert { +.Pet-Penguin-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -700px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Golden { +.Pet-Penguin-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -800px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Red { +.Pet-Penguin-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -900px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Shade { +.Pet-Phoenix-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -1000px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Skeleton { +.Pet-Pterodactyl-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -1000px; width: 81px; height: 99px; } -.Pet-Pterodactyl-White { +.Pet-Pterodactyl-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -1000px; width: 81px; height: 99px; } -.Pet-Pterodactyl-Zombie { +.Pet-Pterodactyl-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Base { +.Pet-Pterodactyl-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -1000px; width: 81px; height: 99px; } -.Pet-Rat-CottonCandyBlue { +.Pet-Pterodactyl-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -1000px; width: 81px; height: 99px; } -.Pet-Rat-CottonCandyPink { +.Pet-Pterodactyl-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Desert { +.Pet-Pterodactyl-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Golden { +.Pet-Pterodactyl-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Red { +.Pet-Pterodactyl-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Shade { +.Pet-Pterodactyl-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Skeleton { +.Pet-Rat-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -1000px; width: 81px; height: 99px; } -.Pet-Rat-White { +.Pet-Rat-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -1000px; width: 81px; height: 99px; } -.Pet-Rat-Zombie { +.Pet-Rat-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -1000px; width: 81px; height: 99px; } -.Pet-Rock-Base { +.Pet-Rat-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px 0px; width: 81px; height: 99px; } -.Pet-Rock-CottonCandyBlue { +.Pet-Rat-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -100px; width: 81px; height: 99px; } -.Pet-Rock-CottonCandyPink { +.Pet-Rat-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -200px; width: 81px; height: 99px; } -.Pet-Rock-Desert { +.Pet-Rat-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -300px; width: 81px; height: 99px; } -.Pet-Rock-Golden { +.Pet-Rat-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -400px; width: 81px; height: 99px; } -.Pet-Rock-Red { +.Pet-Rat-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -500px; width: 81px; height: 99px; } -.Pet-Rock-Shade { +.Pet-Rat-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -600px; width: 81px; height: 99px; } -.Pet-Rock-Skeleton { +.Pet-Rock-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -700px; width: 81px; height: 99px; } -.Pet-Rock-White { +.Pet-Rock-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -800px; width: 81px; height: 99px; } -.Pet-Rock-Zombie { +.Pet-Rock-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -900px; width: 81px; height: 99px; } -.Pet-Rooster-Base { +.Pet-Rock-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -1000px; width: 81px; height: 99px; } -.Pet-Rooster-CottonCandyBlue { +.Pet-Rock-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-CottonCandyPink { +.Pet-Rock-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px 0px; width: 81px; height: 99px; } -.Pet-Rooster-Desert { +.Pet-Rock-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-Golden { +.Pet-Rock-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-Red { +.Pet-Rock-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-Shade { +.Pet-Rock-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-Skeleton { +.Pet-Rooster-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-White { +.Pet-Rooster-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -1100px; width: 81px; height: 99px; } -.Pet-Rooster-Zombie { +.Pet-Rooster-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-Base { +.Pet-Rooster-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-CottonCandyBlue { +.Pet-Rooster-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-CottonCandyPink { +.Pet-Rooster-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-Desert { +.Pet-Rooster-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-Golden { +.Pet-Rooster-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-Red { +.Pet-Rooster-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -1100px; width: 81px; height: 99px; } -.Pet-Sabretooth-Shade { +.Pet-Rooster-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px 0px; width: 81px; height: 99px; } -.Pet-Sabretooth-Skeleton { +.Pet-Sabretooth-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -100px; width: 81px; height: 99px; } -.Pet-Sabretooth-White { +.Pet-Sabretooth-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -200px; width: 81px; height: 99px; } -.Pet-Sabretooth-Zombie { +.Pet-Sabretooth-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -300px; width: 81px; height: 99px; } -.Pet-Seahorse-Base { +.Pet-Sabretooth-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -400px; width: 81px; height: 99px; } -.Pet-Seahorse-CottonCandyBlue { +.Pet-Sabretooth-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -500px; width: 81px; height: 99px; } -.Pet-Seahorse-CottonCandyPink { +.Pet-Sabretooth-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -600px; width: 81px; height: 99px; } -.Pet-Seahorse-Desert { +.Pet-Sabretooth-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -700px; width: 81px; height: 99px; } -.Pet-Seahorse-Golden { +.Pet-Sabretooth-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -800px; width: 81px; height: 99px; } -.Pet-Seahorse-Red { +.Pet-Sabretooth-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -900px; width: 81px; height: 99px; } -.Pet-Seahorse-Shade { +.Pet-Sabretooth-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -1000px; width: 81px; height: 99px; } -.Pet-Seahorse-Skeleton { +.Pet-Seahorse-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -1100px; width: 81px; height: 99px; } -.Pet-Seahorse-White { +.Pet-Seahorse-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -1200px; width: 81px; height: 99px; } -.Pet-Seahorse-Zombie { +.Pet-Seahorse-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Base { +.Pet-Seahorse-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-CottonCandyBlue { +.Pet-Seahorse-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-CottonCandyPink { +.Pet-Seahorse-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Desert { +.Pet-Seahorse-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Golden { +.Pet-Seahorse-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Red { +.Pet-Seahorse-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Shade { +.Pet-Seahorse-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Skeleton { +.Pet-Sheep-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-White { +.Pet-Sheep-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -1200px; width: 81px; height: 99px; } -.Pet-Sheep-Zombie { +.Pet-Sheep-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -1200px; width: 81px; height: 99px; } -.Pet-Slime-Base { +.Pet-Sheep-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -1200px; width: 81px; height: 99px; } -.Pet-Slime-CottonCandyBlue { +.Pet-Sheep-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -1200px; width: 81px; height: 99px; } -.Pet-Slime-CottonCandyPink { +.Pet-Sheep-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -1200px; width: 81px; height: 99px; } -.Pet-Slime-Desert { +.Pet-Sheep-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -1200px; width: 81px; height: 99px; } -.Pet-Slime-Golden { +.Pet-Sheep-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px 0px; width: 81px; height: 99px; } -.Pet-Slime-Red { +.Pet-Sheep-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -100px; width: 81px; height: 99px; } -.Pet-Slime-Shade { +.Pet-Sheep-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -200px; width: 81px; height: 99px; } -.Pet-Slime-Skeleton { +.Pet-Slime-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -300px; width: 81px; height: 99px; } -.Pet-Slime-White { +.Pet-Slime-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -400px; width: 81px; height: 99px; } -.Pet-Slime-Zombie { +.Pet-Slime-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -500px; width: 81px; height: 99px; } -.Pet-Sloth-Base { +.Pet-Slime-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -600px; width: 81px; height: 99px; } -.Pet-Sloth-CottonCandyBlue { +.Pet-Slime-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -700px; width: 81px; height: 99px; } -.Pet-Sloth-CottonCandyPink { +.Pet-Slime-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -800px; width: 81px; height: 99px; } -.Pet-Sloth-Desert { +.Pet-Slime-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -900px; width: 81px; height: 99px; } -.Pet-Sloth-Golden { +.Pet-Slime-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -1000px; width: 81px; height: 99px; } -.Pet-Sloth-Red { +.Pet-Slime-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -1100px; width: 81px; height: 99px; } -.Pet-Sloth-Shade { +.Pet-Slime-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -1200px; width: 81px; height: 99px; } -.Pet-Sloth-Skeleton { +.Pet-Sloth-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px 0px; width: 81px; height: 99px; } -.Pet-Sloth-White { +.Pet-Sloth-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -100px; width: 81px; height: 99px; } -.Pet-Sloth-Zombie { +.Pet-Sloth-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -200px; width: 81px; height: 99px; } -.Pet-Snail-Base { +.Pet-Sloth-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -300px; width: 81px; height: 99px; } -.Pet-Snail-CottonCandyBlue { +.Pet-Sloth-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -400px; width: 81px; height: 99px; } -.Pet-Snail-CottonCandyPink { +.Pet-Sloth-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -500px; width: 81px; height: 99px; } -.Pet-Snail-Desert { +.Pet-Sloth-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -600px; width: 81px; height: 99px; } -.Pet-Snail-Golden { +.Pet-Sloth-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -700px; width: 81px; height: 99px; } -.Pet-Snail-Red { +.Pet-Sloth-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -800px; width: 81px; height: 99px; } -.Pet-Snail-Shade { +.Pet-Sloth-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -900px; width: 81px; height: 99px; } -.Pet-Snail-Skeleton { +.Pet-Snail-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -1000px; width: 81px; height: 99px; } -.Pet-Snail-White { +.Pet-Snail-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -1100px; width: 81px; height: 99px; } -.Pet-Snail-Zombie { +.Pet-Snail-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -1200px; width: 81px; height: 99px; } -.Pet-Snake-Base { +.Pet-Snail-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -1300px; width: 81px; height: 99px; } -.Pet-Snake-CottonCandyBlue { +.Pet-Snail-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -1300px; width: 81px; height: 99px; } -.Pet-Snake-CottonCandyPink { +.Pet-Snail-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -1300px; width: 81px; height: 99px; } -.Pet-Snake-Desert { +.Pet-Snail-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -1300px; width: 81px; height: 99px; } -.Pet-Snake-Golden { +.Pet-Snail-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -1300px; width: 81px; height: 99px; } -.Pet-Snake-Red { +.Pet-Snail-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -1300px; width: 81px; height: 99px; } -.Pet-Snake-Shade { +.Pet-Snail-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -1300px; width: 81px; height: 99px; } -.Pet-Snake-Skeleton { +.Pet-Snake-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -1300px; width: 81px; height: 99px; } -.Pet-Snake-White { +.Pet-Snake-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -1300px; width: 81px; height: 99px; } -.Pet-Snake-Zombie { +.Pet-Snake-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -1300px; width: 81px; height: 99px; } -.Pet-Spider-Base { +.Pet-Snake-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -1300px; width: 81px; height: 99px; } -.Pet-Spider-CottonCandyBlue { +.Pet-Snake-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -1300px; width: 81px; height: 99px; } -.Pet-Spider-CottonCandyPink { +.Pet-Snake-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -1300px; width: 81px; height: 99px; } -.Pet-Spider-Desert { +.Pet-Snake-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -1300px; width: 81px; height: 99px; } -.Pet-Spider-Golden { +.Pet-Snake-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -1300px; width: 81px; height: 99px; } -.Pet-Spider-Red { +.Pet-Snake-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -1300px; width: 81px; height: 99px; } -.Pet-Spider-Shade { +.Pet-Snake-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -1300px; width: 81px; height: 99px; } -.Pet-Spider-Skeleton { +.Pet-Spider-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -1300px; width: 81px; height: 99px; } -.Pet-Spider-White { +.Pet-Spider-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px 0px; width: 81px; height: 99px; } -.Pet-Spider-Zombie { +.Pet-Spider-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -100px; width: 81px; height: 99px; } -.Pet-TRex-Base { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -300px; - width: 81px; - height: 99px; -} -.Pet-TRex-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -400px; - width: 81px; - height: 99px; -} -.Pet-TRex-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -500px; - width: 81px; - height: 99px; -} -.Pet-TRex-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -600px; - width: 81px; - height: 99px; -} -.Pet-TRex-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -700px; - width: 81px; - height: 99px; -} -.Pet-TRex-Red { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -900px; - width: 81px; - height: 99px; -} -.Pet-TRex-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -1000px; - width: 81px; - height: 99px; -} -.Pet-TRex-White { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -1100px; - width: 81px; - height: 99px; -} -.Pet-TRex-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -1200px; - width: 81px; - height: 99px; -} -.Pet-Tiger-Veteran { +.Pet-Spider-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -200px; width: 81px; height: 99px; } -.Pet-TigerCub-Aquatic { +.Pet-Spider-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -300px; width: 81px; height: 99px; } -.Pet-TigerCub-Base { +.Pet-Spider-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -400px; width: 81px; height: 99px; } -.Pet-TigerCub-CottonCandyBlue { +.Pet-Spider-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -500px; width: 81px; height: 99px; } -.Pet-TigerCub-CottonCandyPink { +.Pet-Spider-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -600px; width: 81px; height: 99px; } -.Pet-TigerCub-Cupid { +.Pet-Spider-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -700px; width: 81px; height: 99px; } -.Pet-TigerCub-Desert { +.Pet-Spider-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Ember { +.Pet-TRex-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1476px -900px; + background-position: -1558px -1000px; width: 81px; height: 99px; } -.Pet-TigerCub-Fairy { +.Pet-TRex-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1476px -1000px; + background-position: -1558px -1100px; width: 81px; height: 99px; } -.Pet-TigerCub-Floral { +.Pet-TRex-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1476px -1100px; + background-position: -1558px -1200px; width: 81px; height: 99px; } -.Pet-TigerCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1476px -1200px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1476px -1300px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: 0px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -82px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -164px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -246px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -328px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -410px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -492px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -574px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -656px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -738px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -820px -1400px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -902px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Base { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -984px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1066px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1148px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1230px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1312px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Red { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1394px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1476px -1400px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px 0px; - width: 81px; - height: 99px; -} -.Pet-Treeling-White { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -100px; - width: 81px; - height: 99px; -} -.Pet-Treeling-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-20.png'); - background-position: -1558px -200px; - width: 81px; - height: 99px; -} -.Pet-Triceratops-Base { +.Pet-TRex-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1558px -1300px; width: 81px; height: 99px; } -.Pet-Triceratops-CottonCandyBlue { +.Pet-TRex-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1558px -1400px; width: 81px; height: 99px; } -.Pet-Triceratops-CottonCandyPink { +.Pet-TRex-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: 0px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-Desert { +.Pet-TRex-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -82px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-Golden { +.Pet-TRex-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -164px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-Red { +.Pet-TRex-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -246px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-Shade { +.Pet-TRex-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -328px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-Skeleton { +.Pet-Tiger-Veteran { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1476px -900px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Aquatic { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1476px -1000px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Base { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1476px -1100px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1476px -1200px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1476px -1300px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Cupid { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: 0px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -82px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Ember { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -164px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Fairy { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -246px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Floral { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -328px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Ghost { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -410px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -492px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Holly { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -574px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -656px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Red { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -738px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -820px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -902px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -984px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1066px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1148px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-StarryNight { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1230px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Thunderstorm { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1312px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-White { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1394px -1400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1476px -1400px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Base { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px 0px; + width: 81px; + height: 99px; +} +.Pet-Treeling-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -100px; + width: 81px; + height: 99px; +} +.Pet-Treeling-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -200px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -300px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -400px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Red { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -500px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -600px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -700px; + width: 81px; + height: 99px; +} +.Pet-Treeling-White { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -800px; + width: 81px; + height: 99px; +} +.Pet-Treeling-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-20.png'); + background-position: -1558px -900px; + width: 81px; + height: 99px; +} +.Pet-Triceratops-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -410px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-White { +.Pet-Triceratops-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -492px -1500px; width: 81px; height: 99px; } -.Pet-Triceratops-Zombie { +.Pet-Triceratops-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -574px -1500px; width: 81px; height: 99px; } -.Pet-Turkey-Base { +.Pet-Triceratops-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -656px -1500px; width: 81px; height: 99px; } -.Pet-Turkey-Gilded { +.Pet-Triceratops-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -738px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Base { +.Pet-Triceratops-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -820px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-CottonCandyBlue { +.Pet-Triceratops-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -902px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-CottonCandyPink { +.Pet-Triceratops-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -984px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Desert { +.Pet-Triceratops-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1066px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Golden { +.Pet-Triceratops-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1148px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Red { +.Pet-Turkey-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1230px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Shade { +.Pet-Turkey-Gilded { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1312px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Skeleton { +.Pet-Turtle-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1394px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-White { +.Pet-Turtle-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1476px -1500px; width: 81px; height: 99px; } -.Pet-Turtle-Zombie { +.Pet-Turtle-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1558px -1500px; width: 81px; height: 99px; } -.Pet-Unicorn-Base { +.Pet-Turtle-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px 0px; width: 81px; height: 99px; } -.Pet-Unicorn-CottonCandyBlue { +.Pet-Turtle-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -100px; width: 81px; height: 99px; } -.Pet-Unicorn-CottonCandyPink { +.Pet-Turtle-Red { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -200px; width: 81px; height: 99px; } -.Pet-Unicorn-Desert { +.Pet-Turtle-Shade { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -300px; width: 81px; height: 99px; } -.Pet-Unicorn-Golden { +.Pet-Turtle-Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -400px; width: 81px; height: 99px; } -.Pet-Unicorn-Red { +.Pet-Turtle-White { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -500px; width: 81px; height: 99px; } -.Pet-Unicorn-Shade { +.Pet-Turtle-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -600px; width: 81px; height: 99px; } -.Pet-Unicorn-Skeleton { +.Pet-Unicorn-Base { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -700px; width: 81px; height: 99px; } -.Pet-Unicorn-White { +.Pet-Unicorn-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -800px; width: 81px; height: 99px; } -.Pet-Unicorn-Zombie { +.Pet-Unicorn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -900px; width: 81px; height: 99px; } -.Pet-Whale-Base { +.Pet-Unicorn-Desert { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -1000px; width: 81px; height: 99px; } -.Pet-Whale-CottonCandyBlue { +.Pet-Unicorn-Golden { background-image: url('~assets/images/sprites/spritesmith-main-20.png'); background-position: -1640px -1100px; width: 81px; diff --git a/website/client/assets/css/sprites/spritesmith-main-21.css b/website/client/assets/css/sprites/spritesmith-main-21.css index de302c3bc4..f47492ac96 100644 --- a/website/client/assets/css/sprites/spritesmith-main-21.css +++ b/website/client/assets/css/sprites/spritesmith-main-21.css @@ -1,396 +1,438 @@ -.Pet-Whale-CottonCandyPink { +.Pet-Unicorn-Red { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: -82px 0px; width: 81px; height: 99px; } -.Pet-Whale-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -400px; - width: 81px; - height: 99px; -} -.Pet-Whale-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px 0px; - width: 81px; - height: 99px; -} -.Pet-Whale-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -100px; - width: 81px; - height: 99px; -} -.Pet-Whale-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -100px; - width: 81px; - height: 99px; -} -.Pet-Whale-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -100px; - width: 81px; - height: 99px; -} -.Pet-Whale-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px 0px; - width: 81px; - height: 99px; -} -.Pet-Whale-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Veteran { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -400px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -400px; - width: 81px; - height: 99px; -} -.Pet-Yarn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px 0px; - width: 81px; - height: 99px; -} -.Pet-Yarn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -400px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px 0px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Golden { +.Pet-Unicorn-Shade { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: -574px -100px; width: 81px; height: 99px; } -.Pet-Yarn-Red { +.Pet-Unicorn-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -164px 0px; + width: 81px; + height: 99px; +} +.Pet-Unicorn-White { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: 0px -100px; + width: 81px; + height: 99px; +} +.Pet-Unicorn-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -82px -100px; + width: 81px; + height: 99px; +} +.Pet-Whale-Base { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -164px -100px; + width: 81px; + height: 99px; +} +.Pet-Whale-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -246px 0px; + width: 81px; + height: 99px; +} +.Pet-Whale-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -246px -100px; + width: 81px; + height: 99px; +} +.Pet-Whale-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: 0px -200px; + width: 81px; + height: 99px; +} +.Pet-Whale-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -82px -200px; + width: 81px; + height: 99px; +} +.Pet-Whale-Red { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -164px -200px; + width: 81px; + height: 99px; +} +.Pet-Whale-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -246px -200px; + width: 81px; + height: 99px; +} +.Pet-Whale-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -328px 0px; + width: 81px; + height: 99px; +} +.Pet-Whale-White { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -328px -100px; + width: 81px; + height: 99px; +} +.Pet-Whale-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -328px -200px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Aquatic { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: 0px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Base { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -82px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-CottonCandyBlue { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -164px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-CottonCandyPink { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -246px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Cupid { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -328px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -410px 0px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Ember { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -410px -100px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Fairy { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -410px -200px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Floral { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -410px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Ghost { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -492px 0px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -492px -100px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Holly { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -492px -200px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Peppermint { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -492px -300px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Red { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: 0px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-RoyalPurple { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -82px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -164px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Shimmer { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -246px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -328px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Spooky { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -410px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-StarryNight { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -492px -400px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Thunderstorm { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -574px 0px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Veteran { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: 0px 0px; + width: 81px; + height: 99px; +} +.Pet-Wolf-White { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: -574px -200px; width: 81px; height: 99px; } -.Pet-Yarn-Shade { +.Pet-Wolf-Zombie { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: -574px -300px; width: 81px; height: 99px; } -.Pet-Yarn-Skeleton { +.Pet-Yarn-Base { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: -574px -400px; width: 81px; height: 99px; } -.Pet-Yarn-White { +.Pet-Yarn-CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: 0px -500px; width: 81px; height: 99px; } -.Pet-Yarn-Zombie { +.Pet-Yarn-CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); background-position: -82px -500px; width: 81px; height: 99px; } +.Pet-Yarn-Desert { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -164px -500px; + width: 81px; + height: 99px; +} +.Pet-Yarn-Golden { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -246px -500px; + width: 81px; + height: 99px; +} +.Pet-Yarn-Red { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -328px -500px; + width: 81px; + height: 99px; +} +.Pet-Yarn-Shade { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -410px -500px; + width: 81px; + height: 99px; +} +.Pet-Yarn-Skeleton { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -492px -500px; + width: 81px; + height: 99px; +} +.Pet-Yarn-White { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -574px -500px; + width: 81px; + height: 99px; +} +.Pet-Yarn-Zombie { + background-image: url('~assets/images/sprites/spritesmith-main-21.png'); + background-position: -656px 0px; + width: 81px; + height: 99px; +} .Pet_HatchingPotion_Aquatic { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -233px -500px; + background-position: -656px -169px; width: 68px; height: 68px; } .Pet_HatchingPotion_Base { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -345px; + background-position: -345px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_CottonCandyBlue { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -302px -500px; + background-position: -656px -238px; width: 68px; height: 68px; } .Pet_HatchingPotion_CottonCandyPink { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -371px -500px; + background-position: -656px -307px; width: 68px; height: 68px; } .Pet_HatchingPotion_Cupid { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -440px -500px; + background-position: -656px -376px; width: 68px; height: 68px; } .Pet_HatchingPotion_Desert { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -509px -500px; + background-position: -656px -445px; width: 68px; height: 68px; } .Pet_HatchingPotion_Ember { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -578px -500px; + background-position: -656px -514px; width: 68px; height: 68px; } .Pet_HatchingPotion_Fairy { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px 0px; + background-position: 0px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Floral { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -69px; + background-position: -69px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Ghost { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -138px; + background-position: -138px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Golden { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -207px; + background-position: -207px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Holly { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -276px; + background-position: -276px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Peppermint { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -500px; + background-position: -656px -100px; width: 68px; height: 68px; } .Pet_HatchingPotion_Purple { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -414px; + background-position: -414px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Red { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -483px; + background-position: -483px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_RoyalPurple { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -600px; + background-position: -552px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Shade { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -69px -600px; + background-position: -621px -600px; width: 68px; height: 68px; } .Pet_HatchingPotion_Shimmer { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -138px -600px; + background-position: 0px -669px; width: 68px; height: 68px; } .Pet_HatchingPotion_Skeleton { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -207px -600px; + background-position: -69px -669px; width: 68px; height: 68px; } .Pet_HatchingPotion_Spooky { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -276px -600px; + background-position: -138px -669px; width: 68px; height: 68px; } .Pet_HatchingPotion_StarryNight { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -345px -600px; + background-position: -207px -669px; width: 68px; height: 68px; } .Pet_HatchingPotion_Thunderstorm { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -414px -600px; + background-position: -276px -669px; width: 68px; height: 68px; } .Pet_HatchingPotion_White { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -483px -600px; + background-position: -345px -669px; width: 68px; height: 68px; } .Pet_HatchingPotion_Zombie { background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -552px -600px; + background-position: -414px -669px; width: 68px; height: 68px; } diff --git a/website/client/assets/css/sprites/spritesmith-main-7.css b/website/client/assets/css/sprites/spritesmith-main-7.css index a2db50936f..290469556f 100644 --- a/website/client/assets/css/sprites/spritesmith-main-7.css +++ b/website/client/assets/css/sprites/spritesmith-main-7.css @@ -1,312 +1,312 @@ .slim_armor_mystery_201503 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -91px; + background-position: -364px -1107px; width: 90px; height: 90px; } .back_mystery_201504 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -1092px; + background-position: -1318px -819px; width: 90px; height: 90px; } .broad_armor_mystery_201504 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -455px -1210px; + background-position: -728px -1198px; width: 90px; height: 90px; } .shop_armor_mystery_201504 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -1104px; + background-position: -1409px -966px; width: 68px; height: 68px; } .shop_back_mystery_201504 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -1173px; + background-position: -1409px -1035px; width: 68px; height: 68px; } .shop_set_mystery_201504 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1392px; + background-position: -1409px -1242px; width: 68px; height: 68px; } .slim_armor_mystery_201504 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -937px; + background-position: -728px -743px; width: 90px; height: 90px; } .head_mystery_201505 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -1210px; + background-position: -954px 0px; width: 90px; height: 90px; } .shop_head_mystery_201505 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -69px -1392px; + background-position: 0px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201505 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1518px -1599px; + background-position: -1685px 0px; width: 68px; height: 68px; } .shop_weapon_mystery_201505 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1449px -1599px; + background-position: -1587px -1565px; width: 68px; height: 68px; } .weapon_mystery_201505 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -846px; + background-position: 0px -1107px; width: 90px; height: 90px; } .broad_armor_mystery_201506 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -472px -197px; + background-position: -273px -455px; width: 90px; height: 105px; } .eyewear_mystery_201506 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -467px; + background-position: -587px -106px; width: 90px; height: 105px; } .shop_armor_mystery_201506 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1380px -1599px; + background-position: -1518px -1565px; width: 68px; height: 68px; } .shop_eyewear_mystery_201506 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1311px -1599px; + background-position: -1449px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201506 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1242px -1599px; + background-position: -1380px -1565px; width: 68px; height: 68px; } .slim_armor_mystery_201506 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -467px; + background-position: -182px -455px; width: 90px; height: 105px; } .back_mystery_201507 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -578px -212px; + background-position: -91px -455px; width: 90px; height: 105px; } .eyewear_mystery_201507 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -578px -318px; + background-position: 0px -455px; width: 90px; height: 105px; } .shop_back_mystery_201507 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1173px -1599px; + background-position: -1311px -1565px; width: 68px; height: 68px; } .shop_eyewear_mystery_201507 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1104px -1599px; + background-position: -1242px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201507 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1035px -1599px; + background-position: -1173px -1565px; width: 68px; height: 68px; } .broad_armor_mystery_201508 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -188px -664px; + background-position: -769px -455px; width: 93px; height: 90px; } .head_mystery_201508 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -658px -664px; + background-position: -769px -364px; width: 93px; height: 90px; } .shop_armor_mystery_201508 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -966px -1599px; + background-position: -1104px -1565px; width: 68px; height: 68px; } .shop_head_mystery_201508 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -897px -1599px; + background-position: -1035px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201508 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -828px -1599px; + background-position: -966px -1565px; width: 68px; height: 68px; } .slim_armor_mystery_201508 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px 0px; + background-position: -769px -273px; width: 93px; height: 90px; } .broad_armor_mystery_201509 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -455px; + background-position: -91px -925px; width: 90px; height: 90px; } .head_mystery_201509 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -546px; + background-position: -182px -925px; width: 90px; height: 90px; } .shop_armor_mystery_201509 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -759px -1599px; + background-position: -897px -1565px; width: 68px; height: 68px; } .shop_head_mystery_201509 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -690px -1599px; + background-position: -828px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201509 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -621px -1599px; + background-position: -759px -1565px; width: 68px; height: 68px; } .slim_armor_mystery_201509 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -546px -937px; + background-position: -455px -1016px; width: 90px; height: 90px; } .back_mystery_201510 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -573px; + background-position: -472px -264px; width: 105px; height: 90px; } .headAccessory_mystery_201510 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -470px -664px; + background-position: -769px -182px; width: 93px; height: 90px; } .shop_back_mystery_201510 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -552px -1599px; + background-position: -690px -1565px; width: 68px; height: 68px; } .shop_headAccessory_mystery_201510 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -483px -1599px; + background-position: -621px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201510 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -414px -1599px; + background-position: -552px -1565px; width: 68px; height: 68px; } .broad_armor_mystery_201511 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1119px; + background-position: -819px -1107px; width: 90px; height: 90px; } .head_mystery_201511 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -1119px; + background-position: -1001px -1107px; width: 90px; height: 90px; } .shop_armor_mystery_201511 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -345px -1599px; + background-position: -483px -1565px; width: 68px; height: 68px; } .shop_head_mystery_201511 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -276px -1599px; + background-position: -414px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201511 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -207px -1599px; + background-position: -345px -1565px; width: 68px; height: 68px; } .slim_armor_mystery_201511 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -182px; + background-position: -1227px -728px; width: 90px; height: 90px; } .broad_armor_mystery_201512 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -273px; + background-position: -1227px -1092px; width: 90px; height: 90px; } .head_mystery_201512 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -637px; + background-position: 0px -1198px; width: 90px; height: 90px; } .shop_armor_mystery_201512 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -138px -1599px; + background-position: -276px -1565px; width: 68px; height: 68px; } .shop_head_mystery_201512 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -69px -1599px; + background-position: -207px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201512 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1599px; + background-position: -138px -1565px; width: 68px; height: 68px; } .slim_armor_mystery_201512 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1210px; + background-position: -637px -1198px; width: 90px; height: 90px; } @@ -324,799 +324,799 @@ } .shop_head_mystery_201601 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1518px; + background-position: -69px -1565px; width: 68px; height: 68px; } .shop_set_mystery_201601 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1449px; + background-position: 0px -1565px; width: 68px; height: 68px; } .shop_shield_mystery_201601 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1380px; + background-position: -1616px -1449px; width: 68px; height: 68px; } .back_mystery_201602 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1092px -1210px; + background-position: -1318px -364px; width: 90px; height: 90px; } .head_mystery_201602 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1183px -1210px; + background-position: -1318px -455px; width: 90px; height: 90px; } .shop_back_mystery_201602 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1311px; + background-position: -1616px -1380px; width: 68px; height: 68px; } .shop_head_mystery_201602 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1242px; + background-position: -621px -1427px; width: 68px; height: 68px; } .shop_set_mystery_201602 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1173px; + background-position: -552px -1427px; width: 68px; height: 68px; } .broad_armor_mystery_201603 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px -482px; + background-position: -678px -391px; width: 90px; height: 90px; } .head_mystery_201603 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px -573px; + background-position: -678px -482px; width: 90px; height: 90px; } .shop_armor_mystery_201603 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1104px; + background-position: -483px -1427px; width: 68px; height: 68px; } .shop_head_mystery_201603 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -1035px; + background-position: -414px -1427px; width: 68px; height: 68px; } .shop_set_mystery_201603 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -966px; + background-position: -345px -1427px; width: 68px; height: 68px; } .slim_armor_mystery_201603 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -755px; + background-position: -273px -743px; width: 90px; height: 90px; } .broad_armor_mystery_201604 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -455px; + background-position: -769px -91px; width: 93px; height: 90px; } .head_mystery_201604 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -664px; + background-position: -769px 0px; width: 93px; height: 90px; } .shop_armor_mystery_201604 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -897px; + background-position: -276px -1427px; width: 68px; height: 68px; } .shop_head_mystery_201604 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -828px; + background-position: -207px -1427px; width: 68px; height: 68px; } .shop_set_mystery_201604 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -138px -1461px; + background-position: -138px -1427px; width: 68px; height: 68px; } .slim_armor_mystery_201604 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -94px -664px; + background-position: -515px -561px; width: 93px; height: 90px; } .broad_armor_mystery_201605 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -91px; + background-position: -863px -91px; width: 90px; height: 90px; } .head_mystery_201605 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -182px; + background-position: -863px -182px; width: 90px; height: 90px; } .shop_armor_mystery_201605 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -69px -1461px; + background-position: -69px -1427px; width: 68px; height: 68px; } .shop_head_mystery_201605 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1461px; + background-position: 0px -1427px; width: 68px; height: 68px; } .shop_set_mystery_201605 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -1380px; + background-position: -1478px -1311px; width: 68px; height: 68px; } .slim_armor_mystery_201605 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -546px; + background-position: -863px -546px; width: 90px; height: 90px; } .broad_armor_mystery_201606 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -578px -106px; + background-position: -587px -318px; width: 90px; height: 105px; } .head_mystery_201606 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -728px; + background-position: -863px -728px; width: 90px; height: 90px; } .shop_armor_mystery_201606 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -1311px; + background-position: -1478px -1242px; width: 68px; height: 68px; } .shop_head_mystery_201606 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -1242px; + background-position: -1478px -1173px; width: 68px; height: 68px; } .shop_set_mystery_201606 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -1173px; + background-position: -1478px -1104px; width: 68px; height: 68px; } .slim_armor_mystery_201606 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -472px -91px; + background-position: -587px -212px; width: 90px; height: 105px; } .broad_armor_mystery_201607 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -846px; + background-position: -364px -834px; width: 90px; height: 90px; } .head_mystery_201607 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -455px -846px; + background-position: -455px -834px; width: 90px; height: 90px; } .shop_armor_mystery_201607 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -1104px; + background-position: -1478px -1035px; width: 68px; height: 68px; } .shop_head_mystery_201607 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -1035px; + background-position: -1478px -966px; width: 68px; height: 68px; } .shop_set_mystery_201607 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -966px; + background-position: -1478px -897px; width: 68px; height: 68px; } .slim_armor_mystery_201607 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -819px -846px; + background-position: -819px -834px; width: 90px; height: 90px; } .back_mystery_201608 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -182px; + background-position: -564px -652px; width: 93px; height: 90px; } .head_mystery_201608 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -273px; + background-position: -470px -652px; width: 93px; height: 90px; } .shop_back_mystery_201608 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -897px; + background-position: -1478px -828px; width: 68px; height: 68px; } .shop_head_mystery_201608 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -828px; + background-position: -1478px -759px; width: 68px; height: 68px; } .shop_set_mystery_201608 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -759px; + background-position: -1478px -690px; width: 68px; height: 68px; } .broad_armor_mystery_201609 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -364px; + background-position: -376px -652px; width: 93px; height: 90px; } .head_mystery_201609 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -91px; + background-position: -282px -652px; width: 93px; height: 90px; } .shop_armor_mystery_201609 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -690px; + background-position: -1478px -621px; width: 68px; height: 68px; } .shop_head_mystery_201609 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -621px; + background-position: -1478px -552px; width: 68px; height: 68px; } .shop_set_mystery_201609 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -552px; + background-position: -1478px -483px; width: 68px; height: 68px; } .slim_armor_mystery_201609 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -546px; + background-position: -188px -652px; width: 93px; height: 90px; } .broad_armor_mystery_201610 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px 0px; + background-position: -678px 0px; width: 90px; height: 99px; } .head_mystery_201610 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px -100px; + background-position: -678px -100px; width: 90px; height: 99px; } .shop_armor_mystery_201610 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -483px; + background-position: -1478px -414px; width: 68px; height: 68px; } .shop_head_mystery_201610 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -414px; + background-position: -1478px -345px; width: 68px; height: 68px; } .shop_set_mystery_201610 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -345px; + background-position: -1478px -276px; width: 68px; height: 68px; } .slim_armor_mystery_201610 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px -200px; + background-position: -678px -200px; width: 90px; height: 99px; } .head_mystery_201611 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -637px -937px; + background-position: -637px -925px; width: 90px; height: 90px; } .shop_head_mystery_201611 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -276px; + background-position: -1478px -207px; width: 68px; height: 68px; } .shop_set_mystery_201611 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -207px; + background-position: -1478px -138px; width: 68px; height: 68px; } .shop_weapon_mystery_201611 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -138px; + background-position: -1478px -69px; width: 68px; height: 68px; } .weapon_mystery_201611 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px 0px; + background-position: -1045px 0px; width: 90px; height: 90px; } .broad_armor_mystery_201612 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -91px; + background-position: -1045px -91px; width: 90px; height: 90px; } .head_mystery_201612 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -182px; + background-position: -1045px -182px; width: 90px; height: 90px; } .shop_armor_mystery_201612 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px -69px; + background-position: -1478px 0px; width: 68px; height: 68px; } .shop_head_mystery_201612 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1469px 0px; + background-position: -1380px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201612 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1380px -1392px; + background-position: -1311px -1358px; width: 68px; height: 68px; } .slim_armor_mystery_201612 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -546px; + background-position: -1045px -546px; width: 90px; height: 90px; } .eyewear_mystery_201701 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -472px -303px; + background-position: -587px -424px; width: 90px; height: 105px; } .shield_mystery_201701 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -467px; + background-position: -587px 0px; width: 90px; height: 105px; } .shop_eyewear_mystery_201701 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1311px -1392px; + background-position: -1242px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201701 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1242px -1392px; + background-position: -1173px -1358px; width: 68px; height: 68px; } .shop_shield_mystery_201701 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1173px -1392px; + background-position: -1104px -1358px; width: 68px; height: 68px; } .back_mystery_201702 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -1028px; + background-position: -91px -1016px; width: 90px; height: 90px; } .head_mystery_201702 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -1028px; + background-position: -182px -1016px; width: 90px; height: 90px; } .shop_back_mystery_201702 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1104px -1392px; + background-position: -1035px -1358px; width: 68px; height: 68px; } .shop_head_mystery_201702 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1035px -1392px; + background-position: -966px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201702 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -966px -1392px; + background-position: -897px -1358px; width: 68px; height: 68px; } .broad_armor_mystery_201703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -546px -1028px; + background-position: -546px -1016px; width: 90px; height: 90px; } .head_mystery_201703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -637px -1028px; + background-position: -637px -1016px; width: 90px; height: 90px; } .shop_armor_mystery_201703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -897px -1392px; + background-position: -828px -1358px; width: 68px; height: 68px; } .shop_head_mystery_201703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -828px -1392px; + background-position: -759px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -759px -1392px; + background-position: -690px -1358px; width: 68px; height: 68px; } .slim_armor_mystery_201703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1001px -1028px; + background-position: -1001px -1016px; width: 90px; height: 90px; } .back_mystery_201704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px 0px; + background-position: -1136px 0px; width: 90px; height: 90px; } .broad_armor_mystery_201704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -91px; + background-position: -1136px -91px; width: 90px; height: 90px; } .shop_armor_mystery_201704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -690px -1392px; + background-position: -621px -1358px; width: 68px; height: 68px; } .shop_back_mystery_201704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -621px -1392px; + background-position: -552px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -552px -1392px; + background-position: -483px -1358px; width: 68px; height: 68px; } .slim_armor_mystery_201704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -455px; + background-position: -1136px -455px; width: 90px; height: 90px; } .body_mystery_201705 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -546px; + background-position: -1136px -546px; width: 90px; height: 90px; } .head_mystery_201705 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -637px; + background-position: -1136px -637px; width: 90px; height: 90px; } .shop_body_mystery_201705 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -483px -1392px; + background-position: -414px -1358px; width: 68px; height: 68px; } .shop_head_mystery_201705 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -414px -1392px; + background-position: -345px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201705 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -345px -1392px; + background-position: -276px -1358px; width: 68px; height: 68px; } .back_mystery_201706 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -342px -288px; + background-position: -115px -364px; width: 111px; height: 90px; } .body_mystery_201706 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -230px -288px; + background-position: -227px -364px; width: 111px; height: 90px; } .shop_back_mystery_201706 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -276px -1392px; + background-position: -207px -1358px; width: 68px; height: 68px; } .shop_body_mystery_201706 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -207px -1392px; + background-position: -138px -1358px; width: 68px; height: 68px; } .shop_set_mystery_201706 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -138px -1392px; + background-position: -69px -1358px; width: 68px; height: 68px; } .broad_armor_mystery_201707 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -467px; + background-position: -470px -455px; width: 105px; height: 90px; } .head_mystery_201707 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -470px -467px; + background-position: -364px -455px; width: 105px; height: 90px; } .shop_armor_mystery_201707 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -578px -530px; + background-position: -1685px -138px; width: 40px; height: 40px; } .shop_head_mystery_201707 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -619px -530px; + background-position: -1685px -179px; width: 40px; height: 40px; } .shop_set_mystery_201707 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -1311px; + background-position: -1409px -1173px; width: 68px; height: 68px; } .slim_armor_mystery_201707 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -472px 0px; + background-position: -472px -355px; width: 105px; height: 90px; } .shield_mystery_201708 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -910px -1119px; + background-position: -910px -1107px; width: 90px; height: 90px; } .shop_set_mystery_201708 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -1242px; + background-position: -1409px -1104px; width: 68px; height: 68px; } .shop_shield_mystery_201708 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -472px -409px; + background-position: -1685px -220px; width: 40px; height: 40px; } .shop_weapon_mystery_201708 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -513px -409px; + background-position: -1685px -261px; width: 40px; height: 40px; } .weapon_mystery_201708 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -91px; + background-position: -1227px -91px; width: 90px; height: 90px; } .back_mystery_201709 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -288px; + background-position: -115px -273px; width: 114px; height: 90px; } .shield_mystery_201709 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -357px 0px; + background-position: 0px -273px; width: 114px; height: 90px; } .shop_back_mystery_201709 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -1035px; + background-position: -1409px -897px; width: 68px; height: 68px; } .shop_set_mystery_201709 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -966px; + background-position: -1409px -828px; width: 68px; height: 68px; } .shop_shield_mystery_201709 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -897px; + background-position: -1409px -759px; width: 68px; height: 68px; } .broad_armor_mystery_201710 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -282px -664px; + background-position: 0px -652px; width: 93px; height: 90px; } .head_mystery_201710 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -376px -664px; + background-position: -658px -652px; width: 93px; height: 90px; } .shop_armor_mystery_201710 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -828px; + background-position: -1409px -690px; width: 68px; height: 68px; } .shop_head_mystery_201710 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -759px; + background-position: -1409px -621px; width: 68px; height: 68px; } .shop_set_mystery_201710 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -690px; + background-position: -1409px -276px; width: 68px; height: 68px; } .slim_armor_mystery_201710 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -564px -664px; + background-position: -94px -652px; width: 93px; height: 90px; } .body_mystery_201711 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -103px -91px; + background-position: -115px -91px; width: 114px; height: 90px; } .broad_armor_mystery_201711 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -115px -197px; + background-position: -242px 0px; width: 114px; height: 90px; } .shop_armor_mystery_201711 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -621px; + background-position: -1409px -207px; width: 68px; height: 68px; } .shop_body_mystery_201711 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -552px; + background-position: -1409px -138px; width: 68px; height: 68px; } .shop_set_mystery_201711 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -483px; + background-position: -1409px -69px; width: 68px; height: 68px; } .slim_armor_mystery_201711 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -197px; + background-position: -242px -91px; width: 114px; height: 90px; } .broad_armor_mystery_201712 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -242px -91px; + background-position: -357px 0px; width: 114px; height: 90px; } .head_mystery_201712 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -242px 0px; + background-position: -357px -182px; width: 114px; height: 90px; } .shop_armor_mystery_201712 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -414px; + background-position: -1104px -1289px; width: 68px; height: 68px; } .shop_head_mystery_201712 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -345px; + background-position: -1035px -1289px; width: 68px; height: 68px; } .shop_set_mystery_201712 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -276px; + background-position: -966px -1289px; width: 68px; height: 68px; } .slim_armor_mystery_201712 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -357px -182px; + background-position: -230px -273px; width: 114px; height: 90px; } .back_mystery_201801 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -230px -197px; + background-position: 0px -364px; width: 114px; height: 90px; } @@ -1128,1279 +1128,1285 @@ } .shop_back_mystery_201801 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1308px -1301px; + background-position: -552px -1289px; width: 68px; height: 68px; } .shop_headAccessory_mystery_201801 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1239px -1301px; + background-position: -483px -1289px; width: 68px; height: 68px; } .shop_set_mystery_201801 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1170px -1301px; + background-position: -414px -1289px; width: 68px; height: 68px; } +.broad_armor_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: -230px -182px; + width: 114px; + height: 90px; +} +.head_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: -115px -182px; + width: 114px; + height: 90px; +} +.shield_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: 0px -182px; + width: 114px; + height: 90px; +} +.shop_armor_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: -345px -1289px; + width: 68px; + height: 68px; +} +.shop_head_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: -276px -1289px; + width: 68px; + height: 68px; +} +.shop_set_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: -207px -1289px; + width: 68px; + height: 68px; +} +.shop_shield_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: -678px -573px; + width: 68px; + height: 68px; +} +.slim_armor_mystery_201802 { + background-image: url('~assets/images/sprites/spritesmith-main-7.png'); + background-position: 0px -91px; + width: 114px; + height: 90px; +} .broad_armor_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -273px; + background-position: -1318px -1001px; width: 90px; height: 90px; } .eyewear_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -364px; + background-position: -1318px -1092px; width: 90px; height: 90px; } .head_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -455px; + background-position: -769px -546px; width: 90px; height: 90px; } .shop_armor_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1101px -1301px; + background-position: -1173px -1427px; width: 68px; height: 68px; } .shop_eyewear_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -756px -1301px; + background-position: -609px -561px; width: 68px; height: 68px; } .shop_head_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -687px -1301px; + background-position: 0px -1289px; width: 68px; height: 68px; } .shop_set_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -618px -1301px; + background-position: -69px -1289px; width: 68px; height: 68px; } .shop_weapon_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -1301px; + background-position: -138px -1289px; width: 68px; height: 68px; } .slim_armor_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -1001px; + background-position: -1318px -728px; width: 90px; height: 90px; } .weapon_mystery_301404 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -760px -637px; + background-position: -1318px -637px; width: 90px; height: 90px; } .eyewear_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -1183px; + background-position: -1318px -546px; width: 90px; height: 90px; } .headAccessory_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -1301px; + background-position: -1318px -91px; width: 90px; height: 90px; } .head_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1301px; + background-position: -1318px -182px; width: 90px; height: 90px; } .shield_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -910px; + background-position: -1318px 0px; width: 90px; height: 90px; } .shop_eyewear_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1311px -1461px; + background-position: -621px -1289px; width: 68px; height: 68px; } .shop_headAccessory_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -411px -1301px; + background-position: -759px -1289px; width: 68px; height: 68px; } .shop_head_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -342px -1301px; + background-position: -690px -1289px; width: 68px; height: 68px; } .shop_set_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -480px -1301px; + background-position: -828px -1289px; width: 68px; height: 68px; } .shop_shield_mystery_301405 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -549px -1301px; + background-position: -897px -1289px; width: 68px; height: 68px; } .broad_armor_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -819px; + background-position: -910px -1198px; width: 90px; height: 90px; } .eyewear_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -728px; + background-position: -819px -1198px; width: 90px; height: 90px; } .head_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -345px -379px; + background-position: -472px 0px; width: 114px; height: 87px; } .shop_armor_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -825px -1301px; + background-position: -1173px -1289px; width: 68px; height: 68px; } .shop_eyewear_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -894px -1301px; + background-position: -1242px -1289px; width: 68px; height: 68px; } .shop_head_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -963px -1301px; + background-position: -1311px -1289px; width: 68px; height: 68px; } .shop_set_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1032px -1301px; + background-position: -1409px 0px; width: 68px; height: 68px; } .slim_armor_mystery_301703 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -546px; + background-position: -364px -1198px; width: 90px; height: 90px; } .broad_armor_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -182px; + background-position: -273px -1198px; width: 90px; height: 90px; } .head_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -91px; + background-position: -182px -1198px; width: 90px; height: 90px; } .shield_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px 0px; + background-position: -1227px -1001px; width: 90px; height: 90px; } .shop_armor_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px 0px; + background-position: -1409px -345px; width: 68px; height: 68px; } .shop_head_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -69px; + background-position: -1409px -414px; width: 68px; height: 68px; } .shop_set_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -138px; + background-position: -1409px -483px; width: 68px; height: 68px; } .shop_shield_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1400px -207px; + background-position: -1409px -552px; width: 68px; height: 68px; } .slim_armor_mystery_301704 { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -910px -1210px; + background-position: -1227px -910px; width: 90px; height: 90px; } .broad_armor_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -819px -1210px; + background-position: -1227px -819px; width: 90px; height: 90px; } .broad_armor_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -728px -1210px; + background-position: -1227px -546px; width: 90px; height: 90px; } .broad_armor_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -1210px; + background-position: -1227px -455px; width: 90px; height: 90px; } .broad_armor_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -1210px; + background-position: -1227px -364px; width: 90px; height: 90px; } .broad_armor_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -1210px; + background-position: -1227px 0px; width: 90px; height: 90px; } .broad_armor_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -1001px; + background-position: -1092px -1107px; width: 90px; height: 90px; } .broad_armor_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -209px -573px; + background-position: -309px -561px; width: 102px; height: 90px; } .broad_armor_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -819px; + background-position: -728px -1107px; width: 90px; height: 90px; } .broad_armor_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -546px; + background-position: -637px -1107px; width: 90px; height: 90px; } .broad_armor_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -455px; + background-position: -546px -1107px; width: 90px; height: 90px; } .broad_armor_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -364px; + background-position: -273px -1107px; width: 90px; height: 90px; } .broad_armor_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -115px -379px; + background-position: -472px -176px; width: 114px; height: 87px; } .broad_armor_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1092px -1119px; + background-position: -91px -1107px; width: 90px; height: 90px; } .broad_armor_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1001px -1119px; + background-position: -1136px -910px; width: 90px; height: 90px; } .broad_armor_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -728px -1119px; + background-position: -1136px -819px; width: 90px; height: 90px; } .broad_armor_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -637px -1119px; + background-position: -1136px -728px; width: 90px; height: 90px; } .headAccessory_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1028px; + background-position: -819px -925px; width: 90px; height: 90px; } .headAccessory_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -910px; + background-position: -728px -925px; width: 90px; height: 90px; } .headAccessory_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -819px; + background-position: -455px -925px; width: 90px; height: 90px; } .headAccessory_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -455px; + background-position: -364px -925px; width: 90px; height: 90px; } .headAccessory_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -364px; + background-position: -273px -925px; width: 90px; height: 90px; } .headAccessory_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -273px; + background-position: -954px -819px; width: 90px; height: 90px; } .headAccessory_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -518px -573px; + background-position: -206px -561px; width: 102px; height: 90px; } .headAccessory_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -819px -937px; + background-position: -954px -637px; width: 90px; height: 90px; } .headAccessory_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -728px -937px; + background-position: -954px -364px; width: 90px; height: 90px; } .headAccessory_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -455px -937px; + background-position: -954px -273px; width: 90px; height: 90px; } .headAccessory_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -937px; + background-position: -954px -182px; width: 90px; height: 90px; } .headAccessory_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -937px; + background-position: -728px -834px; width: 90px; height: 90px; } .headAccessory_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -819px; + background-position: -637px -834px; width: 90px; height: 90px; } .headAccessory_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -728px; + background-position: -546px -834px; width: 90px; height: 90px; } .headAccessory_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -637px; + background-position: -182px -834px; width: 90px; height: 90px; } .headAccessory_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -364px; + background-position: -91px -834px; width: 90px; height: 90px; } .head_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -546px -1119px; + background-position: -1136px -364px; width: 90px; height: 90px; } .head_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -1119px; + background-position: -1136px -273px; width: 90px; height: 90px; } .head_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -1119px; + background-position: -1136px -182px; width: 90px; height: 90px; } .head_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -1119px; + background-position: -910px -1016px; width: 90px; height: 90px; } .head_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -910px; + background-position: -819px -1016px; width: 90px; height: 90px; } .head_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -819px; + background-position: -728px -1016px; width: 90px; height: 90px; } .head_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -415px -573px; + background-position: 0px -561px; width: 102px; height: 90px; } .head_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -364px; + background-position: -364px -1016px; width: 90px; height: 90px; } .head_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -273px; + background-position: -273px -1016px; width: 90px; height: 90px; } .head_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -182px; + background-position: 0px -1016px; width: 90px; height: 90px; } .head_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -910px -1028px; + background-position: -1045px -910px; width: 90px; height: 90px; } .head_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -819px -1028px; + background-position: -1045px -819px; width: 90px; height: 90px; } .head_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -728px -1028px; + background-position: -1045px -455px; width: 90px; height: 90px; } .head_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -455px -1028px; + background-position: -1045px -364px; width: 90px; height: 90px; } .head_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -1028px; + background-position: -1045px -273px; width: 90px; height: 90px; } .head_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -1028px; + background-position: -910px -925px; width: 90px; height: 90px; } .shield_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -273px; + background-position: 0px -834px; width: 90px; height: 90px; } .shield_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px -182px; + background-position: -863px -455px; width: 90px; height: 90px; } .shield_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -728px -846px; + background-position: -863px -364px; width: 90px; height: 90px; } .shield_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -637px -846px; + background-position: -863px -273px; width: 90px; height: 90px; } .shield_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -312px -573px; + background-position: -103px -561px; width: 102px; height: 90px; } .shield_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -846px; + background-position: -637px -743px; width: 90px; height: 90px; } .shield_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -846px; + background-position: -546px -743px; width: 90px; height: 90px; } .shield_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -115px -288px; + background-position: -345px -273px; width: 114px; height: 90px; } .shield_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -230px -379px; + background-position: -339px -364px; width: 114px; height: 87px; } .shield_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -364px; + background-position: 0px -743px; width: 90px; height: 90px; } .shield_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -273px; + background-position: -678px -300px; width: 90px; height: 90px; } .shield_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -728px -755px; + background-position: -769px -637px; width: 90px; height: 90px; } .shop_armor_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -207px -1461px; + background-position: -690px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -276px -1461px; + background-position: -759px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -345px -1461px; + background-position: -828px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -414px -1461px; + background-position: -897px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -483px -1461px; + background-position: -966px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -552px -1461px; + background-position: -1035px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -621px -1461px; + background-position: -1104px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -690px -1461px; + background-position: -1685px -69px; width: 68px; height: 68px; } .shop_armor_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -759px -1461px; + background-position: -1242px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -828px -1461px; + background-position: -1311px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -897px -1461px; + background-position: -1380px -1427px; width: 68px; height: 68px; } .shop_armor_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -966px -1461px; + background-position: -1449px -1427px; width: 68px; height: 68px; } .shop_armor_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1035px -1461px; + background-position: -1547px 0px; width: 68px; height: 68px; } .shop_armor_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1104px -1461px; + background-position: -1547px -69px; width: 68px; height: 68px; } .shop_armor_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1173px -1461px; + background-position: -1547px -138px; width: 68px; height: 68px; } .shop_armor_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1242px -1461px; + background-position: -1547px -207px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -897px; + background-position: -1547px -1380px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -966px; + background-position: 0px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1035px; + background-position: -69px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1104px; + background-position: -138px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1173px; + background-position: -207px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1242px; + background-position: -276px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1311px; + background-position: -345px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1380px; + background-position: -414px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -1449px; + background-position: -483px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -1530px; + background-position: -552px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -69px -1530px; + background-position: -621px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -138px -1530px; + background-position: -690px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -207px -1530px; + background-position: -759px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -276px -1530px; + background-position: -828px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -345px -1530px; + background-position: -897px -1496px; width: 68px; height: 68px; } .shop_headAccessory_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -414px -1530px; + background-position: -966px -1496px; width: 68px; height: 68px; } .shop_head_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1587px -1599px; + background-position: -1547px -276px; width: 68px; height: 68px; } .shop_head_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1380px -1461px; + background-position: -1547px -345px; width: 68px; height: 68px; } .shop_head_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1449px -1461px; + background-position: -1547px -414px; width: 68px; height: 68px; } .shop_head_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px 0px; + background-position: -1547px -483px; width: 68px; height: 68px; } .shop_head_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -69px; + background-position: -1547px -552px; width: 68px; height: 68px; } .shop_head_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -138px; + background-position: -1547px -621px; width: 68px; height: 68px; } .shop_head_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -207px; + background-position: -1547px -690px; width: 68px; height: 68px; } .shop_head_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -276px; + background-position: -1547px -759px; width: 68px; height: 68px; } .shop_head_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -345px; + background-position: -1547px -828px; width: 68px; height: 68px; } .shop_head_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -414px; + background-position: -1547px -897px; width: 68px; height: 68px; } .shop_head_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -483px; + background-position: -1547px -966px; width: 68px; height: 68px; } .shop_head_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -552px; + background-position: -1547px -1035px; width: 68px; height: 68px; } .shop_head_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -621px; + background-position: -1547px -1104px; width: 68px; height: 68px; } .shop_head_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -690px; + background-position: -1547px -1173px; width: 68px; height: 68px; } .shop_head_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -759px; + background-position: -1547px -1242px; width: 68px; height: 68px; } .shop_head_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1538px -828px; + background-position: -1547px -1311px; width: 68px; height: 68px; } .shop_shield_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -483px -1530px; + background-position: -1035px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -552px -1530px; + background-position: -1104px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -621px -1530px; + background-position: -1173px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -690px -1530px; + background-position: -1242px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -759px -1530px; + background-position: -1311px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -828px -1530px; + background-position: -1380px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -897px -1530px; + background-position: -1449px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -966px -1530px; + background-position: -1518px -1496px; width: 68px; height: 68px; } .shop_shield_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1035px -1530px; + background-position: -1616px 0px; width: 68px; height: 68px; } .shop_shield_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1104px -1530px; + background-position: -1616px -69px; width: 68px; height: 68px; } .shop_shield_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1173px -1530px; + background-position: -1616px -138px; width: 68px; height: 68px; } .shop_shield_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1242px -1530px; + background-position: -1616px -207px; width: 68px; height: 68px; } .shop_weapon_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1311px -1530px; + background-position: -1616px -276px; width: 68px; height: 68px; } .shop_weapon_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1380px -1530px; + background-position: -1616px -345px; width: 68px; height: 68px; } .shop_weapon_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1449px -1530px; + background-position: -1616px -414px; width: 68px; height: 68px; } .shop_weapon_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1518px -1530px; + background-position: -1616px -483px; width: 68px; height: 68px; } .shop_weapon_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px 0px; + background-position: -1616px -552px; width: 68px; height: 68px; } .shop_weapon_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -69px; + background-position: -1616px -621px; width: 68px; height: 68px; } .shop_weapon_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -138px; + background-position: -1616px -690px; width: 68px; height: 68px; } .shop_weapon_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -207px; + background-position: -1616px -759px; width: 68px; height: 68px; } .shop_weapon_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -276px; + background-position: -1616px -828px; width: 68px; height: 68px; } .shop_weapon_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -345px; + background-position: -1616px -897px; width: 68px; height: 68px; } .shop_weapon_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -414px; + background-position: -1616px -966px; width: 68px; height: 68px; } .shop_weapon_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -483px; + background-position: -1616px -1035px; width: 68px; height: 68px; } .shop_weapon_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -552px; + background-position: -1616px -1104px; width: 68px; height: 68px; } .shop_weapon_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -621px; + background-position: -1616px -1173px; width: 68px; height: 68px; } .shop_weapon_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -690px; + background-position: -1616px -1242px; width: 68px; height: 68px; } .shop_weapon_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1607px -759px; + background-position: -1616px -1311px; width: 68px; height: 68px; } .slim_armor_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -637px -755px; + background-position: -1318px -910px; width: 90px; height: 90px; } .slim_armor_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -546px -755px; + background-position: -1318px -273px; width: 90px; height: 90px; } .slim_armor_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -755px; + background-position: -1183px -1198px; width: 90px; height: 90px; } .slim_armor_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -755px; + background-position: -1092px -1198px; width: 90px; height: 90px; } .slim_armor_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -755px; + background-position: -546px -1198px; width: 90px; height: 90px; } .slim_armor_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px -391px; + background-position: -455px -1198px; width: 90px; height: 90px; } .slim_armor_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -669px -300px; + background-position: -91px -1198px; width: 90px; height: 90px; } .slim_armor_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1309px -637px; + background-position: -1227px -637px; width: 90px; height: 90px; } .slim_armor_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1001px -1210px; + background-position: -1227px -273px; width: 90px; height: 90px; } .slim_armor_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -637px -1210px; + background-position: -1227px -182px; width: 90px; height: 90px; } .slim_armor_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -546px -1210px; + background-position: -455px -1107px; width: 90px; height: 90px; } .slim_armor_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -379px; + background-position: -472px -88px; width: 114px; height: 87px; } .slim_armor_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -910px; + background-position: -182px -1107px; width: 90px; height: 90px; } .slim_armor_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -728px; + background-position: -1045px -728px; width: 90px; height: 90px; } .slim_armor_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px 0px; + background-position: -1045px -637px; width: 90px; height: 90px; } .slim_armor_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -819px -1119px; + background-position: -546px -925px; width: 90px; height: 90px; } .weapon_special_spring2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -455px -1119px; + background-position: -954px -728px; width: 90px; height: 90px; } .weapon_special_spring2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -1001px; + background-position: -954px -546px; width: 90px; height: 90px; } .weapon_special_spring2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1127px -728px; + background-position: -954px -455px; width: 90px; height: 90px; } .weapon_special_spring2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -728px; + background-position: -273px -834px; width: 90px; height: 90px; } .weapon_special_spring2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -937px; + background-position: -863px -637px; width: 90px; height: 90px; } .weapon_special_spring2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -91px -937px; + background-position: -863px 0px; width: 90px; height: 90px; } .weapon_special_spring2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -106px -573px; + background-position: -412px -561px; width: 102px; height: 90px; } .weapon_special_spring2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -945px 0px; + background-position: -91px -743px; width: 90px; height: 90px; } .weapon_special_spring2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -546px -846px; + background-position: -1001px -1198px; width: 90px; height: 90px; } .weapon_special_spring2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -273px -846px; + background-position: -1136px -1001px; width: 90px; height: 90px; } .weapon_special_spring2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -455px; + background-position: 0px -925px; width: 90px; height: 90px; } .weapon_special_spring2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px 0px; + background-position: -954px -91px; width: 90px; height: 90px; } .weapon_special_springHealer { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -455px -755px; + background-position: -455px -743px; width: 90px; height: 90px; } .weapon_special_springMage { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1218px -1092px; + background-position: -364px -743px; width: 90px; height: 90px; } .weapon_special_springRogue { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -1036px -637px; + background-position: -182px -743px; width: 90px; height: 90px; } .weapon_special_springWarrior { background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -910px -937px; - width: 90px; - height: 90px; -} -.body_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -854px -637px; - width: 90px; - height: 90px; -} -.body_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -364px -755px; - width: 90px; - height: 90px; -} -.body_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: 0px -91px; - width: 102px; - height: 105px; -} -.body_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -578px -424px; - width: 90px; - height: 105px; -} -.body_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -578px 0px; - width: 90px; - height: 105px; -} -.body_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -467px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-7.png'); - background-position: -182px -1301px; + background-position: -1318px -1183px; width: 90px; height: 90px; } diff --git a/website/client/assets/css/sprites/spritesmith-main-8.css b/website/client/assets/css/sprites/spritesmith-main-8.css index 3802610b60..0f5a7a32d1 100644 --- a/website/client/assets/css/sprites/spritesmith-main-8.css +++ b/website/client/assets/css/sprites/spritesmith-main-8.css @@ -1,150 +1,192 @@ +.body_special_summer2015Healer { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -182px -1270px; + width: 90px; + height: 90px; +} +.body_special_summer2015Mage { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -1363px -819px; + width: 90px; + height: 90px; +} +.body_special_summer2015Rogue { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -454px -318px; + width: 102px; + height: 105px; +} +.body_special_summer2015Warrior { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -902px 0px; + width: 90px; + height: 105px; +} +.body_special_summerHealer { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -993px -106px; + width: 90px; + height: 105px; +} +.body_special_summerMage { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -993px -424px; + width: 90px; + height: 105px; +} +.broad_armor_special_summer2015Healer { + background-image: url('~assets/images/sprites/spritesmith-main-8.png'); + background-position: -91px -1179px; + width: 90px; + height: 90px; +} .broad_armor_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -91px; + background-position: -1272px 0px; width: 90px; height: 90px; } .broad_armor_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -315px -318px; + background-position: -212px -318px; width: 102px; height: 105px; } .broad_armor_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -364px -803px; + background-position: 0px -891px; width: 90px; height: 105px; } .broad_armor_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -318px; + background-position: -273px -891px; width: 90px; height: 105px; } .broad_armor_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px -636px; + background-position: -728px -891px; width: 90px; height: 105px; } .broad_armor_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -91px -803px; + background-position: -455px -891px; width: 90px; height: 105px; } .broad_armor_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -212px; + background-position: -364px -891px; width: 90px; height: 105px; } .broad_armor_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px 0px; + background-position: -115px 0px; width: 114px; height: 105px; } .broad_armor_special_summer2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -364px; + background-position: -1092px -1270px; width: 90px; height: 90px; } .broad_armor_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -230px -109px; + background-position: -106px -318px; width: 105px; height: 105px; } .broad_armor_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -230px -530px; + background-position: -424px -424px; width: 114px; height: 90px; } .broad_armor_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -530px; + background-position: -182px -891px; width: 90px; height: 105px; } .broad_armor_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -106px; + background-position: -91px -891px; width: 90px; height: 105px; } .broad_armor_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -712px; + background-position: -787px -364px; width: 111px; height: 90px; } .broad_armor_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -560px -712px; + background-position: -787px -455px; width: 111px; height: 90px; } .eyewear_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -224px -712px; + background-position: -336px -712px; width: 111px; height: 90px; } .eyewear_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -112px -712px; + background-position: -448px -712px; width: 111px; height: 90px; } .head_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -819px; + background-position: -1181px -910px; width: 90px; height: 90px; } .head_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -182px -1091px; + background-position: -1181px -1001px; width: 90px; height: 90px; } .head_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -103px -424px; + background-position: -315px -318px; width: 102px; height: 105px; } .head_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -273px -803px; + background-position: -902px -742px; width: 90px; height: 105px; } .head_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -546px; + background-position: -1272px -182px; width: 90px; height: 90px; } .head_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -910px -1000px; + background-position: -91px -1270px; width: 90px; height: 90px; } .head_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -109px -106px; + background-position: -230px 0px; width: 108px; height: 108px; } .head_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -91px -1091px; + background-position: -910px -1270px; width: 90px; height: 90px; } @@ -156,73 +198,73 @@ } .head_special_summer2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1092px -1091px; + background-position: -91px -997px; width: 90px; height: 90px; } .head_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -339px -209px; + background-position: -230px -109px; width: 105px; height: 105px; } .head_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -460px -530px; + background-position: -557px -91px; width: 114px; height: 90px; } .head_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -182px -803px; + background-position: -902px -636px; width: 90px; height: 105px; } .head_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px -106px; + background-position: -902px -106px; width: 90px; height: 105px; } .head_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px 0px; + background-position: -672px -712px; width: 111px; height: 90px; } .head_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -364px; + background-position: -560px -712px; width: 111px; height: 90px; } .Healer_Summer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px 0px; + background-position: -993px 0px; width: 90px; height: 105px; } .Mage_Summer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -424px; + background-position: -993px -530px; width: 90px; height: 105px; } .SummerRogue14 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -273px; + background-position: 0px -712px; width: 111px; height: 90px; } .SummerWarrior14 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -182px; + background-position: -787px -546px; width: 111px; height: 90px; } .shield_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -455px; + background-position: -1181px 0px; width: 90px; height: 90px; } @@ -234,481 +276,481 @@ } .shield_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px -530px; + background-position: -993px -636px; width: 90px; height: 105px; } .shield_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -728px; + background-position: 0px -1179px; width: 90px; height: 90px; } .shield_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -230px 0px; + background-position: -109px -106px; width: 108px; height: 108px; } .shield_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -424px; + background-position: -103px -424px; width: 102px; height: 105px; } .shield_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -215px; + background-position: -115px -215px; width: 114px; height: 102px; } .shield_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -339px -103px; + background-position: 0px -318px; width: 105px; height: 105px; } .shield_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -91px; + background-position: 0px -621px; width: 114px; height: 90px; } .shield_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px -424px; + background-position: -819px -891px; width: 90px; height: 105px; } .shield_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -712px; + background-position: -224px -712px; width: 111px; height: 90px; } .shield_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -546px; + background-position: -787px -91px; width: 111px; height: 90px; } .shop_armor_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -690px; + background-position: -1683px -345px; width: 68px; height: 68px; } .shop_armor_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -621px; + background-position: -1683px -276px; width: 68px; height: 68px; } .shop_armor_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -552px; + background-position: -1683px -207px; width: 68px; height: 68px; } .shop_armor_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1587px -1571px; + background-position: -1683px -138px; width: 68px; height: 68px; } .shop_armor_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1518px -1571px; + background-position: -1683px -69px; width: 68px; height: 68px; } .shop_armor_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1449px -1571px; + background-position: -1683px 0px; width: 68px; height: 68px; } .shop_armor_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1380px -1571px; + background-position: -1587px -1590px; width: 68px; height: 68px; } .shop_armor_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1311px -1571px; + background-position: -1518px -1590px; width: 68px; height: 68px; } .shop_armor_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1242px -1571px; + background-position: -966px -1590px; width: 68px; height: 68px; } .shop_armor_special_summer2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1173px -1571px; + background-position: -897px -1590px; width: 68px; height: 68px; } .shop_armor_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1104px -1571px; + background-position: -828px -1590px; width: 68px; height: 68px; } .shop_armor_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -552px -1571px; + background-position: -759px -1590px; width: 68px; height: 68px; } .shop_armor_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -483px -1571px; + background-position: -690px -1590px; width: 68px; height: 68px; } .shop_armor_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -414px -1571px; + background-position: -621px -1590px; width: 68px; height: 68px; } .shop_armor_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -345px -1571px; + background-position: -552px -1590px; width: 68px; height: 68px; } .shop_armor_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -276px -1571px; + background-position: -483px -1590px; width: 68px; height: 68px; } .shop_body_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -207px -1571px; + background-position: -414px -1590px; width: 68px; height: 68px; } .shop_body_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -138px -1571px; + background-position: -345px -1590px; width: 68px; height: 68px; } .shop_body_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -69px -1571px; + background-position: -276px -1590px; width: 68px; height: 68px; } .shop_body_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1571px; + background-position: -207px -1590px; width: 68px; height: 68px; } .shop_body_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1449px; + background-position: -138px -1590px; width: 68px; height: 68px; } .shop_body_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1380px; + background-position: -69px -1590px; width: 68px; height: 68px; } .shop_eyewear_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1311px; + background-position: 0px -1590px; width: 68px; height: 68px; } .shop_eyewear_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1242px; + background-position: -1614px -1518px; width: 68px; height: 68px; } .shop_head_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1173px; + background-position: -1614px -1449px; width: 68px; height: 68px; } .shop_head_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1104px; + background-position: -1614px -1380px; width: 68px; height: 68px; } .shop_head_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -1035px; + background-position: -1614px -1311px; width: 68px; height: 68px; } .shop_head_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -966px; + background-position: -1614px -1242px; width: 68px; height: 68px; } .shop_head_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -897px; + background-position: -1614px -1173px; width: 68px; height: 68px; } .shop_head_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -828px; + background-position: -1614px -1104px; width: 68px; height: 68px; } .shop_head_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -759px; + background-position: -1614px -1035px; width: 68px; height: 68px; } .shop_head_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -690px; + background-position: -1614px -966px; width: 68px; height: 68px; } .shop_head_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -621px; + background-position: -1614px -897px; width: 68px; height: 68px; } .shop_head_special_summer2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -552px; + background-position: -1614px -828px; width: 68px; height: 68px; } .shop_head_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -483px; + background-position: -1614px -759px; width: 68px; height: 68px; } .shop_head_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -414px; + background-position: -1614px -690px; width: 68px; height: 68px; } .shop_head_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -345px; + background-position: -1614px -621px; width: 68px; height: 68px; } .shop_head_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -276px; + background-position: -1614px -552px; width: 68px; height: 68px; } .shop_head_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -207px; + background-position: -1614px -483px; width: 68px; height: 68px; } .shop_head_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -138px; + background-position: -1614px -414px; width: 68px; height: 68px; } .shop_shield_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px -69px; + background-position: -1614px -345px; width: 68px; height: 68px; } .shop_shield_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1605px 0px; + background-position: -1614px -276px; width: 68px; height: 68px; } .shop_shield_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1518px -1502px; + background-position: -1614px -207px; width: 68px; height: 68px; } .shop_shield_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1449px -1502px; + background-position: -1614px -138px; width: 68px; height: 68px; } .shop_shield_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1380px -1502px; + background-position: -1614px -69px; width: 68px; height: 68px; } .shop_shield_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1311px -1502px; + background-position: -1614px 0px; width: 68px; height: 68px; } .shop_shield_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1242px -1502px; + background-position: -1518px -1521px; width: 68px; height: 68px; } .shop_shield_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1173px -1502px; + background-position: -1449px -1521px; width: 68px; height: 68px; } .shop_shield_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1104px -1502px; + background-position: -1380px -1521px; width: 68px; height: 68px; } .shop_shield_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1035px -1502px; + background-position: -1311px -1521px; width: 68px; height: 68px; } .shop_shield_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -966px -1502px; + background-position: -1242px -1521px; width: 68px; height: 68px; } .shop_shield_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -897px -1502px; + background-position: -1173px -1521px; width: 68px; height: 68px; } .shop_weapon_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -828px -1502px; + background-position: -1104px -1521px; width: 68px; height: 68px; } .shop_weapon_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -759px -1502px; + background-position: -1035px -1521px; width: 68px; height: 68px; } .shop_weapon_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -690px -1502px; + background-position: -966px -1521px; width: 68px; height: 68px; } .shop_weapon_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -621px -1502px; + background-position: -1272px -1183px; width: 68px; height: 68px; } .shop_weapon_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -552px -1502px; + background-position: -1363px -1274px; width: 68px; height: 68px; } .shop_weapon_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -483px -1502px; + background-position: -1454px -1377px; width: 68px; height: 68px; } .shop_weapon_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -910px; + background-position: -1454px -1308px; width: 68px; height: 68px; } .shop_weapon_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -1001px; + background-position: -1454px -1239px; width: 68px; height: 68px; } .shop_weapon_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -1092px; + background-position: -1454px -1170px; width: 68px; height: 68px; } .shop_weapon_special_summer2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -1183px; + background-position: -1454px -1101px; width: 68px; height: 68px; } .shop_weapon_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -1236px; + background-position: -1454px -1032px; width: 68px; height: 68px; } .shop_weapon_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -1167px; + background-position: -1454px -963px; width: 68px; height: 68px; } .shop_weapon_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -1098px; + background-position: -1454px -894px; width: 68px; height: 68px; } .shop_weapon_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -1029px; + background-position: -1454px -825px; width: 68px; height: 68px; } .shop_weapon_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -960px; + background-position: -1454px -756px; width: 68px; height: 68px; } .shop_weapon_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -891px; + background-position: -1454px -687px; width: 68px; height: 68px; } .slim_armor_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -546px -1000px; + background-position: -910px -1088px; width: 90px; height: 90px; } .slim_armor_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -637px -1000px; + background-position: -1001px -1088px; width: 90px; height: 90px; } @@ -720,25 +762,25 @@ } .slim_armor_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -455px -803px; + background-position: -902px -212px; width: 90px; height: 105px; } .slim_armor_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -728px -803px; + background-position: -902px -318px; width: 90px; height: 105px; } .slim_armor_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -819px -803px; + background-position: -902px -424px; width: 90px; height: 105px; } .slim_armor_special_summer2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px 0px; + background-position: -902px -530px; width: 90px; height: 105px; } @@ -750,85 +792,85 @@ } .slim_armor_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -115px 0px; + background-position: 0px 0px; width: 114px; height: 105px; } .slim_armor_special_summer2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -273px; + background-position: -1181px -637px; width: 90px; height: 90px; } .slim_armor_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -106px -318px; + background-position: -339px -209px; width: 105px; height: 105px; } .slim_armor_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -557px 0px; + background-position: -672px -91px; width: 114px; height: 90px; } .slim_armor_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px -212px; + background-position: -993px -212px; width: 90px; height: 105px; } .slim_armor_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -899px -318px; + background-position: -993px -318px; width: 90px; height: 105px; } .slim_armor_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -455px; + background-position: -784px -712px; width: 111px; height: 90px; } .slim_armor_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -91px; + background-position: -112px -712px; width: 111px; height: 90px; } .weapon_special_summer2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -910px; + background-position: -182px -1179px; width: 90px; height: 90px; } .weapon_special_summer2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1091px; + background-position: -273px -1179px; width: 90px; height: 90px; } .weapon_special_summer2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -212px -318px; + background-position: 0px -424px; width: 102px; height: 105px; } .weapon_special_summer2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -803px; + background-position: -993px -742px; width: 90px; height: 105px; } .weapon_special_summer2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -273px -1091px; + background-position: -546px -1179px; width: 90px; height: 90px; } .weapon_special_summer2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -364px -1091px; + background-position: -637px -1179px; width: 90px; height: 90px; } @@ -840,13 +882,13 @@ } .weapon_special_summer2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -454px -318px; + background-position: -206px -424px; width: 102px; height: 105px; } .weapon_special_summer2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -115px -215px; + background-position: 0px -215px; width: 114px; height: 102px; } @@ -858,1105 +900,1105 @@ } .weapon_special_summer2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -318px; + background-position: -339px -103px; width: 105px; height: 105px; } .weapon_special_summer2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -557px -91px; + background-position: -672px -182px; width: 114px; height: 90px; } .weapon_special_summerHealer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -546px -803px; + background-position: -546px -891px; width: 90px; height: 105px; } .weapon_special_summerMage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -637px -803px; + background-position: -637px -891px; width: 90px; height: 105px; } .weapon_special_summerRogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -336px -712px; + background-position: -787px -273px; width: 111px; height: 90px; } .weapon_special_summerWarrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -448px -712px; + background-position: -787px -182px; width: 111px; height: 90px; } .back_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -784px -712px; + background-position: 0px -803px; width: 114px; height: 87px; } .body_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -273px; + background-position: -1272px -546px; width: 90px; height: 90px; } .broad_armor_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -364px; + background-position: -1272px -637px; width: 90px; height: 90px; } .head_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -455px; + background-position: -1272px -728px; width: 90px; height: 90px; } .shield_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -587px -909px; + background-position: -1084px -455px; width: 93px; height: 90px; } .shop_armor_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -822px; + background-position: -1454px -618px; width: 68px; height: 68px; } .shop_back_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -753px; + background-position: -1454px -549px; width: 68px; height: 68px; } .shop_body_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -684px; + background-position: -1454px -480px; width: 68px; height: 68px; } .shop_head_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -615px; + background-position: -1454px -411px; width: 68px; height: 68px; } .shop_shield_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -1173px; + background-position: -1545px -1311px; width: 68px; height: 68px; } .shop_weapon_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -546px; + background-position: -1454px -342px; width: 68px; height: 68px; } .slim_armor_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -91px -1182px; + background-position: -273px -1270px; width: 90px; height: 90px; } .weapon_special_takeThis { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -182px -1182px; + background-position: -364px -1270px; width: 90px; height: 90px; } .broad_armor_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -273px -1182px; + background-position: -455px -1270px; width: 90px; height: 90px; } .broad_armor_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -364px -1182px; + background-position: -546px -1270px; width: 90px; height: 90px; } .broad_armor_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -455px -1182px; + background-position: -637px -1270px; width: 90px; height: 90px; } .broad_armor_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -546px -1182px; + background-position: -728px -1270px; width: 90px; height: 90px; } .broad_armor_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -637px -1182px; + background-position: -819px -1270px; width: 90px; height: 90px; } .broad_armor_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -575px -530px; + background-position: -1084px 0px; width: 96px; height: 90px; } .broad_armor_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -819px -1182px; + background-position: -1001px -1270px; width: 90px; height: 90px; } .broad_armor_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -493px -909px; + background-position: -1084px -819px; width: 93px; height: 90px; } .broad_armor_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1001px -1182px; + background-position: -1183px -1270px; width: 90px; height: 90px; } .broad_armor_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1092px -1182px; + background-position: -1363px 0px; width: 90px; height: 90px; } .broad_armor_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1183px -1182px; + background-position: -1363px -91px; width: 90px; height: 90px; } .broad_armor_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px 0px; + background-position: -1363px -182px; width: 90px; height: 90px; } .broad_armor_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -91px; + background-position: -1363px -273px; width: 90px; height: 90px; } .broad_armor_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -182px; + background-position: -1363px -364px; width: 90px; height: 90px; } .broad_armor_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -273px; + background-position: -1363px -455px; width: 90px; height: 90px; } .broad_armor_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -436px -424px; + background-position: -672px -455px; width: 114px; height: 90px; } .broad_armor_special_winter2018Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -321px -424px; + background-position: -672px -364px; width: 114px; height: 90px; } .broad_armor_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px 0px; + background-position: -672px -273px; width: 114px; height: 90px; } .broad_armor_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -345px -530px; + background-position: -557px 0px; width: 114px; height: 90px; } .broad_armor_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -728px; + background-position: -1363px -910px; width: 90px; height: 90px; } .head_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -819px; + background-position: -1363px -1001px; width: 90px; height: 90px; } .head_special_nye { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -910px; + background-position: -1363px -1092px; width: 90px; height: 90px; } .head_special_nye2014 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -1001px; + background-position: -1363px -1183px; width: 90px; height: 90px; } .head_special_nye2015 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -1092px; + background-position: 0px -1361px; width: 90px; height: 90px; } .head_special_nye2016 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1273px; + background-position: -91px -1361px; width: 90px; height: 90px; } .head_special_nye2017 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -91px -1273px; + background-position: -182px -1361px; width: 90px; height: 90px; } .head_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -636px; + background-position: -273px -1361px; width: 90px; height: 90px; } .head_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -273px -1273px; + background-position: -364px -1361px; width: 90px; height: 90px; } .head_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -364px -1273px; + background-position: -455px -1361px; width: 90px; height: 90px; } .head_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -455px -1273px; + background-position: -546px -1361px; width: 90px; height: 90px; } .head_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -202px -909px; + background-position: -1084px -273px; width: 96px; height: 90px; } .head_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -637px -1273px; + background-position: -728px -1361px; width: 90px; height: 90px; } .head_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -681px -909px; + background-position: -1084px -728px; width: 93px; height: 90px; } .head_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -819px -1273px; + background-position: -910px -1361px; width: 90px; height: 90px; } .head_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -910px -1273px; + background-position: -1001px -1361px; width: 90px; height: 90px; } .head_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1001px -1273px; + background-position: -1092px -1361px; width: 90px; height: 90px; } .head_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1092px -1273px; + background-position: -1183px -1361px; width: 90px; height: 90px; } .head_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1183px -1273px; + background-position: -1274px -1361px; width: 90px; height: 90px; } .head_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1274px -1273px; + background-position: -1454px 0px; width: 90px; height: 90px; } .head_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px 0px; + background-position: -1454px -91px; width: 90px; height: 90px; } .head_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -557px -182px; + background-position: -787px 0px; width: 114px; height: 90px; } .head_special_winter2018Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -530px; + background-position: -557px -182px; width: 114px; height: 90px; } .head_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -557px -364px; + background-position: -557px -273px; width: 114px; height: 90px; } .head_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -557px -273px; + background-position: -672px 0px; width: 114px; height: 90px; } .head_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1182px; + background-position: -1272px -1092px; width: 90px; height: 90px; } .shield_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -909px; + background-position: -910px -891px; width: 104px; height: 90px; } .shield_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -910px; + background-position: -1272px -910px; width: 90px; height: 90px; } .shield_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -819px; + background-position: -819px -1088px; width: 90px; height: 90px; } .shield_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -299px -909px; + background-position: -1084px -182px; width: 96px; height: 90px; } .shield_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -637px; + background-position: -637px -1088px; width: 90px; height: 90px; } .shield_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -869px -909px; + background-position: -1084px -637px; width: 93px; height: 90px; } .shield_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -364px -1000px; + background-position: -455px -1088px; width: 90px; height: 90px; } .shield_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -273px -1000px; + background-position: -364px -1088px; width: 90px; height: 90px; } .shield_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -182px -1000px; + background-position: -273px -1088px; width: 90px; height: 90px; } .shield_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -105px -909px; + background-position: -575px -530px; width: 96px; height: 90px; } .shield_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1000px; + background-position: -91px -1088px; width: 90px; height: 90px; } .shield_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -115px -530px; + background-position: -557px -364px; width: 114px; height: 90px; } .shield_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -182px; + background-position: 0px -530px; width: 114px; height: 90px; } .shield_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -273px; + background-position: -115px -530px; width: 114px; height: 90px; } .shield_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -546px; + background-position: -819px -997px; width: 90px; height: 90px; } .shop_armor_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -787px -637px; + background-position: -1181px -1092px; width: 68px; height: 68px; } .shop_armor_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -546px; + background-position: -1084px -910px; width: 68px; height: 68px; } .shop_armor_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -557px -455px; + background-position: -787px -637px; width: 68px; height: 68px; } .shop_armor_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -910px -803px; + background-position: -672px -546px; width: 68px; height: 68px; } .shop_armor_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1092px -1000px; + background-position: -557px -455px; width: 68px; height: 68px; } .shop_armor_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1183px -1091px; + background-position: -115px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1274px -1182px; + background-position: -184px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1365px -1273px; + background-position: -253px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1364px; + background-position: -322px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -69px -1364px; + background-position: -391px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -138px -1364px; + background-position: -460px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -207px -1364px; + background-position: -529px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -276px -1364px; + background-position: -598px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -345px -1364px; + background-position: -667px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -414px -1364px; + background-position: -736px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -483px -1364px; + background-position: -805px -803px; width: 68px; height: 68px; } .shop_armor_special_winter2018Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -552px -1364px; + background-position: -1015px -891px; width: 68px; height: 68px; } .shop_armor_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -621px -1364px; + background-position: -1092px -997px; width: 68px; height: 68px; } .shop_armor_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -690px -1364px; + background-position: -1092px -1088px; width: 68px; height: 68px; } .shop_armor_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -759px -1364px; + background-position: -1183px -1179px; width: 68px; height: 68px; } .shop_head_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -828px -1364px; + background-position: -1274px -1270px; width: 68px; height: 68px; } .shop_head_special_nye { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -897px -1364px; + background-position: -1365px -1361px; width: 68px; height: 68px; } .shop_head_special_nye2014 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -966px -1364px; + background-position: 0px -1452px; width: 68px; height: 68px; } .shop_head_special_nye2015 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1035px -1364px; + background-position: -69px -1452px; width: 68px; height: 68px; } .shop_head_special_nye2016 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1104px -1364px; + background-position: -138px -1452px; width: 68px; height: 68px; } .shop_head_special_nye2017 { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1173px -1364px; + background-position: -207px -1452px; width: 68px; height: 68px; } .shop_head_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1242px -1364px; + background-position: -276px -1452px; width: 68px; height: 68px; } .shop_head_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1311px -1364px; + background-position: -345px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1380px -1364px; + background-position: -414px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1449px -1364px; + background-position: -483px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1433px; + background-position: -552px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -69px -1433px; + background-position: -621px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -138px -1433px; + background-position: -690px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -207px -1433px; + background-position: -759px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -276px -1433px; + background-position: -828px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -345px -1433px; + background-position: -897px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -414px -1433px; + background-position: -966px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -483px -1433px; + background-position: -1035px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -552px -1433px; + background-position: -1104px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -621px -1433px; + background-position: -1173px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -690px -1433px; + background-position: -1242px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2018Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -759px -1433px; + background-position: -1311px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -828px -1433px; + background-position: -1380px -1452px; width: 68px; height: 68px; } .shop_head_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -897px -1433px; + background-position: -1449px -1452px; width: 68px; height: 68px; } .shop_head_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -966px -1433px; + background-position: -1545px 0px; width: 68px; height: 68px; } .shop_shield_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1035px -1433px; + background-position: -1545px -69px; width: 68px; height: 68px; } .shop_shield_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1104px -1433px; + background-position: -1545px -138px; width: 68px; height: 68px; } .shop_shield_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1173px -1433px; + background-position: -1545px -207px; width: 68px; height: 68px; } .shop_shield_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1242px -1433px; + background-position: -1545px -276px; width: 68px; height: 68px; } .shop_shield_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1311px -1433px; + background-position: -1545px -345px; width: 68px; height: 68px; } .shop_shield_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1380px -1433px; + background-position: -1545px -414px; width: 68px; height: 68px; } .shop_shield_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1449px -1433px; + background-position: -1545px -483px; width: 68px; height: 68px; } .shop_shield_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px 0px; + background-position: -1545px -552px; width: 68px; height: 68px; } .shop_shield_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -69px; + background-position: -1545px -621px; width: 68px; height: 68px; } .shop_shield_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -138px; + background-position: -1545px -690px; width: 68px; height: 68px; } .shop_shield_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -207px; + background-position: -1545px -759px; width: 68px; height: 68px; } .shop_shield_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -276px; + background-position: -1545px -828px; width: 68px; height: 68px; } .shop_shield_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -345px; + background-position: -1545px -897px; width: 68px; height: 68px; } .shop_shield_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -414px; + background-position: -1545px -966px; width: 68px; height: 68px; } .shop_shield_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -483px; + background-position: -1545px -1035px; width: 68px; height: 68px; } .shop_weapon_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -552px; + background-position: -1545px -1104px; width: 68px; height: 68px; } .shop_weapon_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -621px; + background-position: -1545px -1173px; width: 68px; height: 68px; } .shop_weapon_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -690px; + background-position: -1545px -1242px; width: 68px; height: 68px; } .shop_weapon_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -759px; + background-position: -1454px -273px; width: 68px; height: 68px; } .shop_weapon_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -828px; + background-position: -1545px -1380px; width: 68px; height: 68px; } .shop_weapon_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -897px; + background-position: -1545px -1449px; width: 68px; height: 68px; } .shop_weapon_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -966px; + background-position: 0px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -1035px; + background-position: -69px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -1104px; + background-position: -138px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -759px; + background-position: -207px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -1242px; + background-position: -276px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -1311px; + background-position: -345px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1536px -1380px; + background-position: -414px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -1502px; + background-position: -483px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -69px -1502px; + background-position: -552px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -138px -1502px; + background-position: -621px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2018Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -207px -1502px; + background-position: -690px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -276px -1502px; + background-position: -759px -1521px; width: 68px; height: 68px; } .shop_weapon_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -345px -1502px; + background-position: -828px -1521px; width: 68px; height: 68px; } .shop_weapon_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -414px -1502px; + background-position: -897px -1521px; width: 68px; height: 68px; } .slim_armor_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -455px; + background-position: -728px -997px; width: 90px; height: 90px; } .slim_armor_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -364px; + background-position: -637px -997px; width: 90px; height: 90px; } .slim_armor_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -273px; + background-position: -546px -997px; width: 90px; height: 90px; } .slim_armor_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -182px; + background-position: -455px -997px; width: 90px; height: 90px; } .slim_armor_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -91px; + background-position: -364px -997px; width: 90px; height: 90px; } .slim_armor_special_winter2015Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -396px -909px; + background-position: -1084px -91px; width: 96px; height: 90px; } .slim_armor_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -818px; + background-position: -182px -997px; width: 90px; height: 90px; } .slim_armor_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -963px -909px; + background-position: -1084px -364px; width: 93px; height: 90px; } .slim_armor_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -364px; + background-position: 0px -997px; width: 90px; height: 90px; } .slim_armor_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -273px; + background-position: -1454px -182px; width: 90px; height: 90px; } .slim_armor_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -182px; + background-position: -819px -1361px; width: 90px; height: 90px; } .slim_armor_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -91px; + background-position: -637px -1361px; width: 90px; height: 90px; } .slim_armor_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -728px -1273px; + background-position: -1363px -728px; width: 90px; height: 90px; } .slim_armor_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -546px -1273px; + background-position: -1363px -637px; width: 90px; height: 90px; } .slim_armor_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -182px -1273px; + background-position: -1363px -546px; width: 90px; height: 90px; } .slim_armor_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -206px -424px; + background-position: -230px -530px; width: 114px; height: 90px; } .slim_armor_special_winter2018Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -364px; + background-position: -345px -530px; width: 114px; height: 90px; } .slim_armor_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -460px -621px; + background-position: -460px -530px; width: 114px; height: 90px; } .slim_armor_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -575px -621px; + background-position: -309px -424px; width: 114px; height: 90px; } .slim_armor_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -910px -1182px; + background-position: 0px -1270px; width: 90px; height: 90px; } .weapon_special_candycane { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -728px -1182px; + background-position: -1272px -1001px; width: 90px; height: 90px; } .weapon_special_ski { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -1001px; + background-position: -1272px -819px; width: 90px; height: 90px; } .weapon_special_snowflake { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -728px; + background-position: -1272px -455px; width: 90px; height: 90px; } .weapon_special_winter2015Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -546px; + background-position: -1272px -364px; width: 90px; height: 90px; } .weapon_special_winter2015Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px -182px; + background-position: -1272px -273px; width: 90px; height: 90px; } @@ -1968,61 +2010,61 @@ } .weapon_special_winter2015Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1263px 0px; + background-position: -1272px -91px; width: 90px; height: 90px; } .weapon_special_winter2016Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -775px -909px; + background-position: -1084px -546px; width: 93px; height: 90px; } .weapon_special_winter2016Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1001px -1091px; + background-position: -1092px -1179px; width: 90px; height: 90px; } .weapon_special_winter2016Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -910px -1091px; + background-position: -1001px -1179px; width: 90px; height: 90px; } .weapon_special_winter2016Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -819px -1091px; + background-position: -910px -1179px; width: 90px; height: 90px; } .weapon_special_winter2017Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -728px -1091px; + background-position: -819px -1179px; width: 90px; height: 90px; } .weapon_special_winter2017Mage { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -637px -1091px; + background-position: -728px -1179px; width: 90px; height: 90px; } .weapon_special_winter2017Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -546px -1091px; + background-position: -455px -1179px; width: 90px; height: 90px; } .weapon_special_winter2017Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -455px -1091px; + background-position: -364px -1179px; width: 90px; height: 90px; } .weapon_special_winter2018Healer { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -345px -621px; + background-position: -115px -621px; width: 114px; height: 90px; } @@ -2034,271 +2076,211 @@ } .weapon_special_winter2018Rogue { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -115px -621px; + background-position: -345px -621px; width: 114px; height: 90px; } .weapon_special_winter2018Warrior { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: 0px -621px; + background-position: -575px -621px; width: 114px; height: 90px; } .weapon_special_yeti { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -637px; + background-position: -1181px -819px; width: 90px; height: 90px; } .back_special_wondercon_black { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -546px; + background-position: -1181px -728px; width: 90px; height: 90px; } .back_special_wondercon_red { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -455px; + background-position: -1181px -546px; width: 90px; height: 90px; } .body_special_wondercon_black { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -364px; + background-position: -1181px -455px; width: 90px; height: 90px; } .body_special_wondercon_gold { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -182px; + background-position: -1181px -364px; width: 90px; height: 90px; } .body_special_wondercon_red { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px -91px; + background-position: -1181px -273px; width: 90px; height: 90px; } .eyewear_special_wondercon_black { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1172px 0px; + background-position: -1181px -182px; width: 90px; height: 90px; } .eyewear_special_wondercon_red { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1001px -1000px; + background-position: -1181px -91px; width: 90px; height: 90px; } .shop_back_special_wondercon_black { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -621px -1571px; + background-position: -1035px -1590px; width: 68px; height: 68px; } .shop_back_special_wondercon_red { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -690px -1571px; + background-position: -1104px -1590px; width: 68px; height: 68px; } .shop_body_special_wondercon_black { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -759px -1571px; + background-position: -1173px -1590px; width: 68px; height: 68px; } .shop_body_special_wondercon_gold { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -828px -1571px; + background-position: -1242px -1590px; width: 68px; height: 68px; } .shop_body_special_wondercon_red { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -897px -1571px; + background-position: -1311px -1590px; width: 68px; height: 68px; } .shop_eyewear_special_wondercon_black { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -966px -1571px; + background-position: -1380px -1590px; width: 68px; height: 68px; } .shop_eyewear_special_wondercon_red { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1035px -1571px; + background-position: -1449px -1590px; width: 68px; height: 68px; } .eyewear_special_aetherMask { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -672px -455px; + background-position: -460px -621px; width: 114px; height: 90px; } .eyewear_special_blackTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -819px -1000px; + background-position: -728px -1088px; width: 90px; height: 90px; } .customize-option.eyewear_special_blackTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -844px -1015px; + background-position: -753px -1103px; width: 60px; height: 60px; } .eyewear_special_blueTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -728px -1000px; + background-position: -546px -1088px; width: 90px; height: 90px; } .customize-option.eyewear_special_blueTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -753px -1015px; + background-position: -571px -1103px; width: 60px; height: 60px; } .eyewear_special_greenTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -455px -1000px; + background-position: -182px -1088px; width: 90px; height: 90px; } .customize-option.eyewear_special_greenTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -480px -1015px; + background-position: -207px -1103px; width: 60px; height: 60px; } .eyewear_special_pinkTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -91px -1000px; + background-position: 0px -1088px; width: 90px; height: 90px; } .customize-option.eyewear_special_pinkTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -116px -1015px; + background-position: -25px -1103px; width: 60px; height: 60px; } .eyewear_special_redTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -819px; + background-position: -1001px -997px; width: 90px; height: 90px; } .customize-option.eyewear_special_redTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1106px -834px; + background-position: -1026px -1012px; width: 60px; height: 60px; } .eyewear_special_whiteTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -728px; + background-position: -910px -997px; width: 90px; height: 90px; } .customize-option.eyewear_special_whiteTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1106px -743px; + background-position: -935px -1012px; width: 60px; height: 60px; } .eyewear_special_yellowTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px -637px; + background-position: -273px -997px; width: 90px; height: 90px; } .customize-option.eyewear_special_yellowTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1106px -652px; + background-position: -298px -1012px; width: 60px; height: 60px; } .shop_eyewear_special_aetherMask { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px 0px; + background-position: -1683px -414px; width: 68px; height: 68px; } .shop_eyewear_special_blackTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -69px; + background-position: -1683px -483px; width: 68px; height: 68px; } .shop_eyewear_special_blueTopFrame { background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -138px; + background-position: -1683px -552px; width: 68px; height: 68px; } -.shop_eyewear_special_greenTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -207px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_pinkTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -276px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_redTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -345px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_whiteTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -414px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_yellowTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1674px -483px; - width: 68px; - height: 68px; -} -.head_0 { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1081px 0px; - width: 90px; - height: 90px; -} -.customize-option.head_0 { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1106px -15px; - width: 60px; - height: 60px; -} -.head_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -990px -727px; - width: 90px; - height: 90px; -} -.head_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1354px -637px; - width: 90px; - height: 90px; -} -.head_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-8.png'); - background-position: -1445px -455px; - width: 90px; - height: 90px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-9.css b/website/client/assets/css/sprites/spritesmith-main-9.css index a853d33e39..9115fca8c7 100644 --- a/website/client/assets/css/sprites/spritesmith-main-9.css +++ b/website/client/assets/css/sprites/spritesmith-main-9.css @@ -1,1836 +1,1896 @@ +.shop_eyewear_special_greenTopFrame { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -759px -1508px; + width: 68px; + height: 68px; +} +.shop_eyewear_special_pinkTopFrame { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -1506px -828px; + width: 68px; + height: 68px; +} +.shop_eyewear_special_redTopFrame { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -1575px -69px; + width: 68px; + height: 68px; +} +.shop_eyewear_special_whiteTopFrame { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -1575px -138px; + width: 68px; + height: 68px; +} +.shop_eyewear_special_yellowTopFrame { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -1575px -207px; + width: 68px; + height: 68px; +} +.head_0 { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -1233px -728px; + width: 90px; + height: 90px; +} +.customize-option.head_0 { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -1258px -743px; + width: 60px; + height: 60px; +} +.head_healer_1 { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -819px -1348px; + width: 90px; + height: 90px; +} +.head_healer_2 { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -637px -1348px; + width: 90px; + height: 90px; +} +.head_healer_3 { + background-image: url('~assets/images/sprites/spritesmith-main-9.png'); + background-position: -546px -1348px; + width: 90px; + height: 90px; +} .head_healer_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1105px; + background-position: -273px -1348px; width: 90px; height: 90px; } .head_healer_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1183px -1378px; + background-position: -182px -1348px; width: 90px; height: 90px; } .head_rogue_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -546px; + background-position: -91px -1348px; width: 90px; height: 90px; } .head_rogue_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -273px; + background-position: 0px -1348px; width: 90px; height: 90px; } .head_rogue_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -364px; + background-position: -1415px -1183px; width: 90px; height: 90px; } .head_rogue_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -455px; + background-position: -1415px -1092px; width: 90px; height: 90px; } .head_rogue_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -546px; + background-position: -1415px -1001px; width: 90px; height: 90px; } .head_special_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -637px; + background-position: -1415px -910px; width: 90px; height: 90px; } .head_special_bardHat { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -728px; + background-position: -1415px -819px; width: 90px; height: 90px; } .head_special_clandestineCowl { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -910px; + background-position: -1415px -728px; width: 90px; height: 90px; } .head_special_dandyHat { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -1001px; + background-position: -1415px -455px; width: 90px; height: 90px; } .head_special_fireCoralCirclet { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -1287px; + background-position: -1415px -364px; width: 90px; height: 90px; } .head_special_kabuto { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -1287px; + background-position: -1415px -273px; width: 90px; height: 90px; } .head_special_lunarWarriorHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -910px; + background-position: -1415px -182px; width: 90px; height: 90px; } .head_special_mammothRiderHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -1183px; + background-position: -1415px -91px; width: 90px; height: 90px; } .head_special_namingDay2017 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -491px; + background-position: -1183px -1257px; width: 90px; height: 90px; } .head_special_pageHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -582px; + background-position: -1001px -1257px; width: 90px; height: 90px; } .head_special_pyromancersTurban { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -673px; + background-position: 0px -1075px; width: 90px; height: 90px; } .head_special_roguishRainbowMessengerHood { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -764px; + background-position: -637px -1166px; width: 90px; height: 90px; } .head_special_snowSovereignCrown { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -855px; + background-position: -1142px -819px; width: 90px; height: 90px; } .head_special_spikedHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -946px; + background-position: -1142px -910px; width: 90px; height: 90px; } .head_special_turkeyHelmBase { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -190px -963px; + background-position: -662px -794px; width: 114px; height: 90px; } .head_warrior_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -505px -1105px; + background-position: -91px -1075px; width: 90px; height: 90px; } .head_warrior_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -1105px; + background-position: -182px -1075px; width: 90px; height: 90px; } .head_warrior_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -778px -1105px; + background-position: -273px -1075px; width: 90px; height: 90px; } .head_warrior_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -869px -1105px; + background-position: -455px -1075px; width: 90px; height: 90px; } .head_warrior_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -960px -1105px; + background-position: -546px -1075px; width: 90px; height: 90px; } .head_wizard_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1051px -1105px; + background-position: -1001px -1075px; width: 90px; height: 90px; } .head_wizard_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -1105px; + background-position: -1092px -1075px; width: 90px; height: 90px; } .head_wizard_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -273px; + background-position: -910px -1166px; width: 90px; height: 90px; } .head_wizard_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -364px; + background-position: -819px -1257px; width: 90px; height: 90px; } .head_wizard_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -455px; + background-position: -910px -1257px; width: 90px; height: 90px; } .shop_head_healer_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1538px; + background-position: -1575px -276px; width: 68px; height: 68px; } .shop_head_healer_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1518px; + background-position: -1575px -345px; width: 68px; height: 68px; } .shop_head_healer_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1607px; + background-position: -1575px -414px; width: 68px; height: 68px; } .shop_head_healer_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1607px; + background-position: -1575px -483px; width: 68px; height: 68px; } .shop_head_healer_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1607px; + background-position: -1575px -552px; width: 68px; height: 68px; } .shop_head_rogue_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1607px; + background-position: -1575px -1173px; width: 68px; height: 68px; } .shop_head_rogue_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1607px; + background-position: -1575px -1242px; width: 68px; height: 68px; } .shop_head_rogue_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1607px; + background-position: -1575px -1311px; width: 68px; height: 68px; } .shop_head_rogue_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1607px; + background-position: -1575px -1380px; width: 68px; height: 68px; } .shop_head_rogue_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1607px; + background-position: 0px -1508px; width: 68px; height: 68px; } .shop_head_special_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1607px; + background-position: -69px -1508px; width: 68px; height: 68px; } .shop_head_special_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1607px; + background-position: -138px -1508px; width: 68px; height: 68px; } .shop_head_special_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1607px; + background-position: -207px -1508px; width: 68px; height: 68px; } .shop_head_special_bardHat { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1607px; + background-position: -276px -1508px; width: 68px; height: 68px; } .shop_head_special_clandestineCowl { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1607px; + background-position: -345px -1508px; width: 68px; height: 68px; } .shop_head_special_dandyHat { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1607px; + background-position: -414px -1508px; width: 68px; height: 68px; } .shop_head_special_fireCoralCirclet { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1607px; + background-position: -483px -1508px; width: 68px; height: 68px; } .shop_head_special_kabuto { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1607px; + background-position: -552px -1508px; width: 68px; height: 68px; } .shop_head_special_lunarWarriorHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1449px -1607px; + background-position: -621px -1508px; width: 68px; height: 68px; } .shop_head_special_mammothRiderHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1587px -1607px; + background-position: -690px -1508px; width: 68px; height: 68px; } .shop_head_special_namingDay2017 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1078px; + background-position: -1713px -1479px; width: 40px; height: 40px; } .shop_head_special_pageHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px 0px; + background-position: -828px -1508px; width: 68px; height: 68px; } .shop_head_special_pyromancersTurban { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -69px; + background-position: -897px -1508px; width: 68px; height: 68px; } .shop_head_special_roguishRainbowMessengerHood { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -138px; + background-position: -966px -1508px; width: 68px; height: 68px; } .shop_head_special_snowSovereignCrown { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -207px; + background-position: -1035px -1508px; width: 68px; height: 68px; } .shop_head_special_spikedHelm { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -276px; + background-position: -1104px -1508px; width: 68px; height: 68px; } .shop_head_special_turkeyHelmBase { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -345px; + background-position: -1173px -1508px; width: 68px; height: 68px; } .shop_head_warrior_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -414px; + background-position: -1242px -1508px; width: 68px; height: 68px; } .shop_head_warrior_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -483px; + background-position: -1311px -1508px; width: 68px; height: 68px; } .shop_head_warrior_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1607px; + background-position: -1380px -1508px; width: 68px; height: 68px; } .shop_head_warrior_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1607px; + background-position: -1449px -1508px; width: 68px; height: 68px; } .shop_head_warrior_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1538px; + background-position: -1173px -1439px; width: 68px; height: 68px; } .shop_head_wizard_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1538px; + background-position: -1242px -1439px; width: 68px; height: 68px; } .shop_head_wizard_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1538px; + background-position: -1311px -1439px; width: 68px; height: 68px; } .shop_head_wizard_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1538px; + background-position: -1380px -1439px; width: 68px; height: 68px; } .shop_head_wizard_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1538px; + background-position: -1449px -1439px; width: 68px; height: 68px; } .shop_head_wizard_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1538px; + background-position: -1575px 0px; width: 68px; height: 68px; } .headAccessory_special_bearEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -728px; + background-position: -1092px -1257px; width: 90px; height: 90px; } .customize-option.headAccessory_special_bearEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1267px -743px; + background-position: -1117px -1272px; width: 60px; height: 60px; } .headAccessory_special_cactusEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -819px; + background-position: -1415px 0px; width: 90px; height: 90px; } .customize-option.headAccessory_special_cactusEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1267px -834px; + background-position: -1440px -15px; width: 60px; height: 60px; } .headAccessory_special_foxEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -910px; + background-position: -364px -1348px; width: 90px; height: 90px; } .customize-option.headAccessory_special_foxEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1267px -925px; + background-position: -389px -1363px; width: 60px; height: 60px; } .headAccessory_special_lionEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1001px; + background-position: -910px -1348px; width: 90px; height: 90px; } .customize-option.headAccessory_special_lionEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1267px -1016px; + background-position: -935px -1363px; width: 60px; height: 60px; } .headAccessory_special_pandaEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1092px; + background-position: -1001px -1348px; width: 90px; height: 90px; } .customize-option.headAccessory_special_pandaEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1267px -1107px; + background-position: -1026px -1363px; width: 60px; height: 60px; } .headAccessory_special_pigEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1196px; + background-position: -1142px 0px; width: 90px; height: 90px; } .customize-option.headAccessory_special_pigEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -25px -1211px; + background-position: -1167px -15px; width: 60px; height: 60px; } .headAccessory_special_tigerEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -1196px; + background-position: -1142px -91px; width: 90px; height: 90px; } .customize-option.headAccessory_special_tigerEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -116px -1211px; + background-position: -1167px -106px; width: 60px; height: 60px; } .headAccessory_special_wolfEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -1196px; + background-position: -1142px -182px; width: 90px; height: 90px; } .customize-option.headAccessory_special_wolfEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1211px; + background-position: -1167px -197px; width: 60px; height: 60px; } .shop_headAccessory_special_bearEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1538px; + background-position: -1575px -621px; width: 68px; height: 68px; } .shop_headAccessory_special_cactusEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1538px; + background-position: -1575px -690px; width: 68px; height: 68px; } .shop_headAccessory_special_foxEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1538px; + background-position: -1575px -759px; width: 68px; height: 68px; } .shop_headAccessory_special_lionEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1538px; + background-position: -1575px -828px; width: 68px; height: 68px; } .shop_headAccessory_special_pandaEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1538px; + background-position: -1575px -897px; width: 68px; height: 68px; } .shop_headAccessory_special_pigEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1538px; + background-position: -1575px -966px; width: 68px; height: 68px; } .shop_headAccessory_special_tigerEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1538px; + background-position: -1575px -1035px; width: 68px; height: 68px; } .shop_headAccessory_special_wolfEars { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1538px; + background-position: -1575px -1104px; width: 68px; height: 68px; } .shield_healer_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -1196px; + background-position: -1142px -273px; width: 90px; height: 90px; } .shield_healer_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1092px -1196px; + background-position: -1142px -364px; width: 90px; height: 90px; } .shield_healer_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1183px -1196px; + background-position: -1142px -455px; width: 90px; height: 90px; } .shield_healer_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px 0px; + background-position: -1142px -546px; width: 90px; height: 90px; } .shield_healer_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -91px; + background-position: -1142px -637px; width: 90px; height: 90px; } .shield_rogue_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -182px; + background-position: -1142px -728px; width: 90px; height: 90px; } .shield_rogue_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -104px -1105px; + background-position: -694px -933px; width: 103px; height: 90px; } .shield_rogue_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1105px; + background-position: -590px -933px; width: 103px; height: 90px; } .shield_rogue_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -764px -824px; + background-position: -851px -643px; width: 114px; height: 90px; } .shield_rogue_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -400px; + background-position: -1004px -933px; width: 96px; height: 90px; } .shield_rogue_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -649px -824px; + background-position: -317px -794px; width: 114px; height: 90px; } .shield_rogue_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -994px -824px; + background-position: -432px -794px; width: 114px; height: 90px; } .shield_special_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -819px; + background-position: -364px -1075px; width: 90px; height: 90px; } .shield_special_diamondStave { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -208px -1105px; + background-position: -798px -933px; width: 102px; height: 90px; } .shield_special_goldenknight { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -305px -963px; + background-position: -777px -794px; width: 111px; height: 90px; } .shield_special_lootBag { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -1092px; + background-position: -637px -1075px; width: 90px; height: 90px; } .shield_special_mammothRiderHorn { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1333px -1183px; + background-position: -728px -1075px; width: 90px; height: 90px; } .shield_special_moonpearlShield { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1287px; + background-position: -819px -1075px; width: 90px; height: 90px; } .shield_special_roguishRainbowMessage { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -1287px; + background-position: -910px -1075px; width: 90px; height: 90px; } .shield_special_wakizashi { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -417px -963px; + background-position: -889px -794px; width: 114px; height: 87px; } .shield_special_wintryMirror { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -532px -963px; + background-position: -1004px -794px; width: 114px; height: 87px; } .shield_warrior_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -1287px; + background-position: -1233px 0px; width: 90px; height: 90px; } .shield_warrior_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -1287px; + background-position: -1233px -91px; width: 90px; height: 90px; } .shield_warrior_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -1287px; + background-position: -1233px -182px; width: 90px; height: 90px; } .shield_warrior_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -1287px; + background-position: -1233px -273px; width: 90px; height: 90px; } .shield_warrior_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -1287px; + background-position: -1233px -364px; width: 90px; height: 90px; } .shop_shield_healer_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1449px; + background-position: -1518px -1508px; width: 68px; height: 68px; } .shop_shield_healer_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1380px; + background-position: -414px -1577px; width: 68px; height: 68px; } .shop_shield_healer_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1311px; + background-position: -552px -1577px; width: 68px; height: 68px; } .shop_shield_healer_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1242px; + background-position: -621px -1577px; width: 68px; height: 68px; } .shop_shield_healer_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1173px; + background-position: -759px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1104px; + background-position: -828px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -1035px; + background-position: -897px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -966px; + background-position: -1035px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -897px; + background-position: -1173px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -828px; + background-position: -1242px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -759px; + background-position: -1311px -1577px; width: 68px; height: 68px; } .shop_shield_rogue_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -690px; + background-position: -1380px -1577px; width: 68px; height: 68px; } .shop_shield_special_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -621px; + background-position: -1449px -1577px; width: 68px; height: 68px; } .shop_shield_special_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -552px; + background-position: -1518px -1577px; width: 68px; height: 68px; } .shop_shield_special_diamondStave { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -483px; + background-position: -1587px -1577px; width: 68px; height: 68px; } .shop_shield_special_goldenknight { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -414px; + background-position: -1713px 0px; width: 68px; height: 68px; } .shop_shield_special_lootBag { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -345px; + background-position: -1713px -69px; width: 68px; height: 68px; } .shop_shield_special_mammothRiderHorn { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -276px; + background-position: -1713px -138px; width: 68px; height: 68px; } .shop_shield_special_moonpearlShield { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -207px; + background-position: -1713px -207px; width: 68px; height: 68px; } .shop_shield_special_roguishRainbowMessage { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -138px; + background-position: -1713px -276px; width: 68px; height: 68px; } .shop_shield_special_wakizashi { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px -69px; + background-position: -1713px -345px; width: 68px; height: 68px; } .shop_shield_special_wintryMirror { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1584px 0px; + background-position: -1713px -414px; width: 68px; height: 68px; } .shop_shield_warrior_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1449px -1469px; + background-position: -1713px -483px; width: 68px; height: 68px; } .shop_shield_warrior_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1469px; + background-position: -1713px -552px; width: 68px; height: 68px; } .shop_shield_warrior_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1469px; + background-position: -1713px -621px; width: 68px; height: 68px; } .shop_shield_warrior_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1469px; + background-position: -1713px -690px; width: 68px; height: 68px; } .shop_shield_warrior_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1469px; + background-position: -1713px -759px; width: 68px; height: 68px; } .shop_weapon_healer_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1469px; + background-position: -1713px -828px; width: 68px; height: 68px; } .shop_weapon_healer_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1469px; + background-position: -1713px -897px; width: 68px; height: 68px; } .shop_weapon_healer_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1469px; + background-position: -1713px -966px; width: 68px; height: 68px; } .shop_weapon_healer_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1469px; + background-position: -1415px -1274px; width: 68px; height: 68px; } .shop_weapon_healer_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1469px; + background-position: -1324px -1183px; width: 68px; height: 68px; } .shop_weapon_healer_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1469px; + background-position: -1233px -1092px; width: 68px; height: 68px; } .shop_weapon_healer_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1469px; + background-position: -1142px -1001px; width: 68px; height: 68px; } .shop_weapon_rogue_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -828px; + background-position: -660px -544px; width: 68px; height: 68px; } .shop_weapon_rogue_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1380px; + background-position: -1506px 0px; width: 68px; height: 68px; } .shop_weapon_rogue_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1538px; + background-position: -1506px -69px; width: 68px; height: 68px; } .shop_weapon_rogue_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1518px -1607px; + background-position: -1506px -138px; width: 68px; height: 68px; } .shop_weapon_rogue_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1274px -1378px; + background-position: -1506px -207px; width: 68px; height: 68px; } .shop_weapon_rogue_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1343px -1378px; + background-position: -1506px -276px; width: 68px; height: 68px; } .shop_weapon_rogue_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1412px -1378px; + background-position: -1506px -345px; width: 68px; height: 68px; } .shop_weapon_special_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px 0px; + background-position: -1506px -414px; width: 68px; height: 68px; } .shop_weapon_special_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -69px; + background-position: -1506px -483px; width: 68px; height: 68px; } .shop_weapon_special_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -138px; + background-position: -1506px -552px; width: 68px; height: 68px; } .shop_weapon_special_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -207px; + background-position: -1506px -621px; width: 68px; height: 68px; } .shop_weapon_special_aetherCrystals { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -276px; + background-position: -1506px -690px; width: 68px; height: 68px; } .shop_weapon_special_bardInstrument { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -345px; + background-position: -1506px -759px; width: 68px; height: 68px; } .shop_weapon_special_critical { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -414px; + background-position: -1713px -1035px; width: 68px; height: 68px; } .shop_weapon_special_fencingFoil { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -483px; + background-position: -1506px -897px; width: 68px; height: 68px; } .shop_weapon_special_lunarScythe { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -552px; + background-position: -1506px -966px; width: 68px; height: 68px; } .shop_weapon_special_mammothRiderSpear { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -621px; + background-position: -1506px -1035px; width: 68px; height: 68px; } .shop_weapon_special_nomadsScimitar { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -690px; + background-position: -1506px -1104px; width: 68px; height: 68px; } .shop_weapon_special_pageBanner { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -759px; + background-position: -1506px -1173px; width: 68px; height: 68px; } .shop_weapon_special_roguishRainbowMessage { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -552px; + background-position: -1506px -1242px; width: 68px; height: 68px; } .shop_weapon_special_skeletonKey { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -897px; + background-position: -1506px -1311px; width: 68px; height: 68px; } .shop_weapon_special_tachi { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -966px; + background-position: 0px -1439px; width: 68px; height: 68px; } .shop_weapon_special_taskwoodsLantern { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -1035px; + background-position: -69px -1439px; width: 68px; height: 68px; } .shop_weapon_special_tridentOfCrashingTides { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -1104px; + background-position: -138px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -1173px; + background-position: -207px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -1242px; + background-position: -276px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -1311px; + background-position: -345px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1515px -1380px; + background-position: -414px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1469px; + background-position: -483px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1469px; + background-position: -552px -1439px; width: 68px; height: 68px; } .shop_weapon_warrior_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1469px; + background-position: -621px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1469px; + background-position: -690px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1469px; + background-position: -759px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1469px; + background-position: -828px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1469px; + background-position: -897px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1469px; + background-position: -966px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1469px; + background-position: -1035px -1439px; width: 68px; height: 68px; } .shop_weapon_wizard_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1469px; + background-position: -1104px -1439px; width: 68px; height: 68px; } .weapon_healer_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1092px -1378px; + background-position: -1233px -455px; width: 90px; height: 90px; } .weapon_healer_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -1378px; + background-position: -1233px -546px; width: 90px; height: 90px; } .weapon_healer_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -1378px; + background-position: -1233px -637px; width: 90px; height: 90px; } .weapon_healer_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -1378px; + background-position: -1092px -1348px; width: 90px; height: 90px; } .weapon_healer_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -1378px; + background-position: -1233px -819px; width: 90px; height: 90px; } .weapon_healer_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -1378px; + background-position: -1233px -910px; width: 90px; height: 90px; } .weapon_healer_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -1378px; + background-position: -1233px -1001px; width: 90px; height: 90px; } .weapon_rogue_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -1378px; + background-position: 0px -1166px; width: 90px; height: 90px; } .weapon_rogue_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -1378px; + background-position: -91px -1166px; width: 90px; height: 90px; } .weapon_rogue_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -1378px; + background-position: -182px -1166px; width: 90px; height: 90px; } .weapon_rogue_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -1378px; + background-position: -273px -1166px; width: 90px; height: 90px; } .weapon_rogue_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -1378px; + background-position: -364px -1166px; width: 90px; height: 90px; } .weapon_rogue_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1378px; + background-position: -455px -1166px; width: 90px; height: 90px; } .weapon_rogue_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -1274px; + background-position: -546px -1166px; width: 90px; height: 90px; } .weapon_special_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -311px -1105px; + background-position: -901px -933px; width: 102px; height: 90px; } .weapon_special_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -1092px; + background-position: -728px -1166px; width: 90px; height: 90px; } .weapon_special_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -1001px; + background-position: -819px -1166px; width: 90px; height: 90px; } .weapon_special_aetherCrystals { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -879px -824px; + background-position: -547px -794px; width: 114px; height: 90px; } .weapon_special_bardInstrument { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -819px; + background-position: -1001px -1166px; width: 90px; height: 90px; } .weapon_special_fencingFoil { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -728px; + background-position: -1092px -1166px; width: 90px; height: 90px; } .weapon_special_lunarScythe { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -637px; + background-position: -1183px -1166px; width: 90px; height: 90px; } .weapon_special_mammothRiderSpear { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -546px; + background-position: -1324px 0px; width: 90px; height: 90px; } .weapon_special_nomadsScimitar { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -455px; + background-position: -1324px -91px; width: 90px; height: 90px; } .weapon_special_pageBanner { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -364px; + background-position: -1324px -182px; width: 90px; height: 90px; } .weapon_special_roguishRainbowMessage { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -273px; + background-position: -1324px -273px; width: 90px; height: 90px; } .weapon_special_skeletonKey { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -182px; + background-position: -1324px -364px; width: 90px; height: 90px; } .weapon_special_tachi { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px -91px; + background-position: -1324px -455px; width: 90px; height: 90px; } .weapon_special_taskwoodsLantern { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1424px 0px; + background-position: -1324px -546px; width: 90px; height: 90px; } .weapon_special_tridentOfCrashingTides { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1274px -1287px; + background-position: -1324px -637px; width: 90px; height: 90px; } .weapon_warrior_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1183px -1287px; + background-position: -1324px -728px; width: 90px; height: 90px; } .weapon_warrior_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1092px -1287px; + background-position: -1324px -819px; width: 90px; height: 90px; } .weapon_warrior_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -1287px; + background-position: -1324px -910px; width: 90px; height: 90px; } .weapon_warrior_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -1287px; + background-position: -1324px -1001px; width: 90px; height: 90px; } .weapon_warrior_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -1287px; + background-position: -1324px -1092px; width: 90px; height: 90px; } .weapon_warrior_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -1196px; + background-position: 0px -1257px; width: 90px; height: 90px; } .weapon_warrior_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -1196px; + background-position: -91px -1257px; width: 90px; height: 90px; } .weapon_wizard_0 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -1196px; + background-position: -182px -1257px; width: 90px; height: 90px; } .weapon_wizard_1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -1196px; + background-position: -273px -1257px; width: 90px; height: 90px; } .weapon_wizard_2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -1196px; + background-position: -364px -1257px; width: 90px; height: 90px; } .weapon_wizard_3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -1196px; + background-position: -455px -1257px; width: 90px; height: 90px; } .weapon_wizard_4 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -1196px; + background-position: -546px -1257px; width: 90px; height: 90px; } .weapon_wizard_5 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -1196px; + background-position: -637px -1257px; width: 90px; height: 90px; } .weapon_wizard_6 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -637px; + background-position: -728px -1257px; width: 90px; height: 90px; } .Pet_Currency_Gem { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1449px; + background-position: -483px -1577px; width: 68px; height: 68px; } .Pet_Currency_Gem1x { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1774px -840px; + background-position: -1765px -1323px; width: 15px; height: 13px; } .Pet_Currency_Gem2x { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1751px -1235px; + background-position: -1604px -1478px; width: 30px; height: 26px; } .PixelPaw-Gold { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -840px; + background-position: -1713px -1323px; width: 51px; height: 51px; } .PixelPaw { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -892px; + background-position: -1713px -1375px; width: 51px; height: 51px; } .PixelPaw002 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -944px; + background-position: -1713px -1427px; width: 51px; height: 51px; } .avatar_floral_healer { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px 0px; + background-position: -190px -933px; width: 99px; height: 99px; } .avatar_floral_rogue { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -300px; + background-position: -290px -933px; width: 99px; height: 99px; } .avatar_floral_warrior { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -100px; + background-position: -390px -933px; width: 99px; height: 99px; } .avatar_floral_wizard { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -200px; + background-position: -490px -933px; width: 99px; height: 99px; } .empty_bottles { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -785px; + background-position: -1713px -1268px; width: 64px; height: 54px; } .ghost { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -182px; + background-position: -1274px -1257px; width: 90px; height: 90px; } .inventory_present { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -276px; + background-position: -1644px -828px; width: 68px; height: 68px; } .inventory_present_01 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1538px; + background-position: -1644px 0px; width: 68px; height: 68px; } .inventory_present_02 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1538px; + background-position: -1644px -69px; width: 68px; height: 68px; } .inventory_present_03 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1538px; + background-position: -1644px -138px; width: 68px; height: 68px; } .inventory_present_04 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1538px; + background-position: -1644px -207px; width: 68px; height: 68px; } .inventory_present_05 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1538px; + background-position: -1644px -276px; width: 68px; height: 68px; } .inventory_present_06 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -660px -544px; + background-position: -1644px -345px; width: 68px; height: 68px; } .inventory_present_07 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1449px -1538px; + background-position: -1644px -414px; width: 68px; height: 68px; } .inventory_present_08 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1518px -1538px; + background-position: -1644px -483px; width: 68px; height: 68px; } .inventory_present_09 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px 0px; + background-position: -1644px -552px; width: 68px; height: 68px; } .inventory_present_10 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -69px; + background-position: -1644px -621px; width: 68px; height: 68px; } .inventory_present_11 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -138px; + background-position: -1644px -690px; width: 68px; height: 68px; } .inventory_present_12 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -207px; + background-position: -1644px -759px; width: 68px; height: 68px; } .inventory_special_birthday { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -345px; + background-position: -1644px -897px; width: 68px; height: 68px; } .inventory_special_congrats { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -414px; + background-position: -1644px -966px; width: 68px; height: 68px; } .inventory_special_fortify { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -483px; + background-position: -1644px -1035px; width: 68px; height: 68px; } .inventory_special_getwell { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -552px; + background-position: -1644px -1104px; width: 68px; height: 68px; } .inventory_special_goodluck { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -621px; + background-position: -1644px -1173px; width: 68px; height: 68px; } .inventory_special_greeting { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -690px; + background-position: -1644px -1242px; width: 68px; height: 68px; } .inventory_special_nye { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -759px; + background-position: -1644px -1311px; width: 68px; height: 68px; } .inventory_special_opaquePotion { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -828px; + background-position: -1644px -1380px; width: 68px; height: 68px; } .inventory_special_seafoam { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -897px; + background-position: -1644px -1449px; width: 68px; height: 68px; } .inventory_special_shinySeed { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -966px; + background-position: 0px -1577px; width: 68px; height: 68px; } .inventory_special_snowball { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1035px; + background-position: -69px -1577px; width: 68px; height: 68px; } .inventory_special_spookySparkles { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1104px; + background-position: -138px -1577px; width: 68px; height: 68px; } .inventory_special_thankyou { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1173px; + background-position: -207px -1577px; width: 68px; height: 68px; } .inventory_special_trinket { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1242px; + background-position: -276px -1577px; width: 68px; height: 68px; } .inventory_special_valentine { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1653px -1311px; + background-position: -345px -1577px; width: 68px; height: 68px; } .knockout { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -647px -963px; + background-position: -1183px -1348px; width: 120px; height: 47px; } .pet_key { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1607px; + background-position: -690px -1577px; width: 68px; height: 68px; } .rebirth_orb { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1607px; + background-position: -966px -1577px; width: 68px; height: 68px; } .seafoam_star { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -91px; + background-position: -1415px -546px; width: 90px; height: 90px; } .shop_armoire { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1607px; + background-position: -1104px -1577px; width: 68px; height: 68px; } .snowman { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px 0px; + background-position: -1415px -637px; width: 90px; height: 90px; } .zzz { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1037px; + background-position: -1713px -1561px; width: 40px; height: 40px; } .zzz_light { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -996px; + background-position: -1713px -1520px; width: 40px; height: 40px; } .notif_inventory_present_01 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1148px; + background-position: -1575px -1478px; width: 28px; height: 28px; } .notif_inventory_present_02 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1235px; + background-position: -1604px -1449px; width: 28px; height: 28px; } .notif_inventory_present_03 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1751px -1206px; + background-position: -1575px -1449px; width: 28px; height: 28px; } .notif_inventory_present_04 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1206px; + background-position: -1673px -1547px; width: 28px; height: 28px; } .notif_inventory_present_05 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1751px -1177px; + background-position: -1644px -1547px; width: 28px; height: 28px; } .notif_inventory_present_06 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1177px; + background-position: -1644px -1518px; width: 28px; height: 28px; } .notif_inventory_present_07 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1751px -1148px; + background-position: -1742px -1602px; width: 28px; height: 28px; } .notif_inventory_present_08 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1751px -1119px; + background-position: -1713px -1602px; width: 28px; height: 28px; } .notif_inventory_present_09 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1119px; + background-position: -1750px -1229px; width: 28px; height: 28px; } .notif_inventory_present_10 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1759px -746px; + background-position: -1750px -1200px; width: 28px; height: 28px; } .notif_inventory_present_11 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1759px -717px; + background-position: -1750px -1171px; width: 28px; height: 28px; } .notif_inventory_present_12 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1759px -688px; + background-position: -1673px -1518px; width: 28px; height: 28px; } .notif_inventory_special_birthday { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1763px -1078px; + background-position: -1506px -1380px; width: 20px; height: 24px; } .notif_inventory_special_congrats { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1764px -1264px; + background-position: -1548px -1380px; width: 20px; height: 22px; } .notif_inventory_special_getwell { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1289px; + background-position: -1506px -1405px; width: 20px; height: 22px; } .notif_inventory_special_goodluck { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1763px -1037px; + background-position: -1754px -1520px; width: 20px; height: 26px; } .notif_inventory_special_greeting { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1743px -1289px; + background-position: -1527px -1405px; width: 20px; height: 22px; } .notif_inventory_special_nye { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1763px -996px; + background-position: -1754px -1479px; width: 24px; height: 26px; } .notif_inventory_special_thankyou { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -1264px; + background-position: -1754px -1561px; width: 20px; height: 24px; } .notif_inventory_special_valentine { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1743px -1264px; + background-position: -1527px -1380px; width: 20px; height: 24px; } .npc_alex { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -967px -504px; + background-position: -967px -214px; width: 162px; height: 138px; } .npc_aprilFool { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -528px -824px; + background-position: -196px -794px; width: 120px; height: 120px; } .npc_bailey { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -621px; + background-position: -1713px -1104px; width: 63px; height: 66px; } .npc_daniel { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -392px -824px; + background-position: -967px -631px; width: 135px; height: 123px; } @@ -1848,37 +1908,37 @@ } .npc_justin_head { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1722px -688px; + background-position: -1713px -1171px; width: 36px; height: 96px; } .npc_matt { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -824px; + background-position: -459px -643px; width: 195px; height: 138px; } .npc_sabe { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -596px -1105px; + background-position: -728px -1348px; width: 90px; height: 90px; } .npc_timetravelers { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -196px -824px; + background-position: -655px -643px; width: 195px; height: 138px; } .npc_timetravelers_active { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -676px -643px; + background-position: 0px -794px; width: 195px; height: 138px; } .npc_tyler { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -872px -643px; + background-position: -455px -1348px; width: 90px; height: 90px; } @@ -1890,13 +1950,13 @@ } .seasonalshop_closed { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -967px -365px; + background-position: -967px -353px; width: 162px; height: 138px; } .seasonalshop_open { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -967px -643px; + background-position: -967px -492px; width: 162px; height: 138px; } @@ -1908,79 +1968,79 @@ } .banner_flair_dysheartener { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1142px -1037px; + background-position: -967px -755px; width: 69px; height: 18px; } .phobia_dysheartener { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -527px -220px; + background-position: -747px -422px; width: 201px; height: 195px; } .quest_armadillo { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -527px 0px; + background-position: -440px -423px; width: 219px; height: 219px; } .quest_atom1 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -217px -643px; + background-position: 0px -643px; width: 250px; height: 150px; } .quest_atom2 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -468px -643px; + background-position: -251px -643px; width: 207px; height: 138px; } .quest_atom3 { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -643px; + background-position: -307px -220px; width: 216px; height: 180px; } .quest_axolotl { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -440px -423px; + background-position: -747px 0px; width: 219px; height: 219px; } .quest_badger { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -203px; + background-position: -220px -423px; width: 219px; height: 219px; } .quest_basilist { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -963px; + background-position: 0px -933px; width: 189px; height: 141px; } .quest_beetle { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -747px -431px; + background-position: -747px -220px; width: 204px; height: 201px; } .quest_bunny { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -307px -220px; + background-position: -527px -220px; width: 210px; height: 186px; } .quest_butterfly { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -220px -423px; + background-position: -527px 0px; width: 219px; height: 219px; } .quest_cheetah { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -423px; + background-position: -307px 0px; width: 219px; height: 219px; } @@ -1992,25 +2052,13 @@ } .quest_dilatory { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -747px 0px; + background-position: 0px -203px; width: 219px; height: 219px; } -.quest_dilatoryDistress1 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -747px -220px; - width: 210px; - height: 210px; -} -.quest_dilatoryDistress2 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -967px -214px; - width: 150px; - height: 150px; -} .quest_dilatory_derby { background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -307px 0px; + background-position: 0px -423px; width: 219px; height: 219px; } diff --git a/website/client/assets/images/npc/broken/rage-strike-seasonalShop-scaled@2x.png b/website/client/assets/images/npc/broken/rage-strike-seasonalShop-scaled@2x.png new file mode 100644 index 0000000000..1e8775f93d Binary files /dev/null and b/website/client/assets/images/npc/broken/rage-strike-seasonalShop-scaled@2x.png differ diff --git a/website/client/assets/images/npc/broken/seasonal_shop_broken_background.png b/website/client/assets/images/npc/broken/seasonal_shop_broken_background.png new file mode 100644 index 0000000000..0c4a79919c Binary files /dev/null and b/website/client/assets/images/npc/broken/seasonal_shop_broken_background.png differ diff --git a/website/client/assets/images/npc/broken/seasonal_shop_broken_layer.png b/website/client/assets/images/npc/broken/seasonal_shop_broken_layer.png new file mode 100644 index 0000000000..f071210b10 Binary files /dev/null and b/website/client/assets/images/npc/broken/seasonal_shop_broken_layer.png differ diff --git a/website/client/assets/images/npc/broken/seasonal_shop_broken_npc.png b/website/client/assets/images/npc/broken/seasonal_shop_broken_npc.png new file mode 100644 index 0000000000..897faf3154 Binary files /dev/null and b/website/client/assets/images/npc/broken/seasonal_shop_broken_npc.png differ diff --git a/website/client/assets/images/sprites/spritesmith-largeSprites-0.png b/website/client/assets/images/sprites/spritesmith-largeSprites-0.png index 2b2972012f..63979ed9ee 100644 Binary files a/website/client/assets/images/sprites/spritesmith-largeSprites-0.png and b/website/client/assets/images/sprites/spritesmith-largeSprites-0.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-10.png b/website/client/assets/images/sprites/spritesmith-main-10.png index 3b459b44b5..89a0823223 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-10.png and b/website/client/assets/images/sprites/spritesmith-main-10.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-11.png b/website/client/assets/images/sprites/spritesmith-main-11.png index f33f3f7d49..2bd5de4e9f 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-11.png and b/website/client/assets/images/sprites/spritesmith-main-11.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-12.png b/website/client/assets/images/sprites/spritesmith-main-12.png index 249e3fbb60..7a768320d8 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-12.png and b/website/client/assets/images/sprites/spritesmith-main-12.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-13.png b/website/client/assets/images/sprites/spritesmith-main-13.png index 5504810649..951e7b9713 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-13.png and b/website/client/assets/images/sprites/spritesmith-main-13.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-14.png b/website/client/assets/images/sprites/spritesmith-main-14.png index 2831283a9f..f9b9ff4a65 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-14.png and b/website/client/assets/images/sprites/spritesmith-main-14.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-15.png b/website/client/assets/images/sprites/spritesmith-main-15.png index a37eddd876..0e6c99f287 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-15.png and b/website/client/assets/images/sprites/spritesmith-main-15.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-16.png b/website/client/assets/images/sprites/spritesmith-main-16.png index d88e9f36aa..2bd3c6492c 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-16.png and b/website/client/assets/images/sprites/spritesmith-main-16.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-17.png b/website/client/assets/images/sprites/spritesmith-main-17.png index 8942b2743d..49391a1846 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-17.png and b/website/client/assets/images/sprites/spritesmith-main-17.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-18.png b/website/client/assets/images/sprites/spritesmith-main-18.png index 95f758a887..667fb83a86 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-18.png and b/website/client/assets/images/sprites/spritesmith-main-18.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-19.png b/website/client/assets/images/sprites/spritesmith-main-19.png index b76a3c4d01..eaa28b044a 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-19.png and b/website/client/assets/images/sprites/spritesmith-main-19.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-20.png b/website/client/assets/images/sprites/spritesmith-main-20.png index 8f4800025f..afd00c666c 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-20.png and b/website/client/assets/images/sprites/spritesmith-main-20.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-21.png b/website/client/assets/images/sprites/spritesmith-main-21.png index da1355da2d..64e9023150 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-21.png and b/website/client/assets/images/sprites/spritesmith-main-21.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-7.png b/website/client/assets/images/sprites/spritesmith-main-7.png index becd596016..1113863d2d 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-7.png and b/website/client/assets/images/sprites/spritesmith-main-7.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-8.png b/website/client/assets/images/sprites/spritesmith-main-8.png index 4c03abd2a2..af9a33b9ee 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-8.png and b/website/client/assets/images/sprites/spritesmith-main-8.png differ diff --git a/website/client/assets/images/sprites/spritesmith-main-9.png b/website/client/assets/images/sprites/spritesmith-main-9.png index 8a09f58701..11773267dc 100644 Binary files a/website/client/assets/images/sprites/spritesmith-main-9.png and b/website/client/assets/images/sprites/spritesmith-main-9.png differ diff --git a/website/client/assets/images/world-boss/heart-translucent-shadow-notification@3x.png b/website/client/assets/images/world-boss/heart-translucent-shadow-notification@3x.png new file mode 100755 index 0000000000..28c4700f77 Binary files /dev/null and b/website/client/assets/images/world-boss/heart-translucent-shadow-notification@3x.png differ diff --git a/website/client/assets/images/world-boss/mantis-static-notification@3x.png b/website/client/assets/images/world-boss/mantis-static-notification@3x.png new file mode 100755 index 0000000000..3dbe6ad91d Binary files /dev/null and b/website/client/assets/images/world-boss/mantis-static-notification@3x.png differ diff --git a/website/client/assets/images/world-boss/rage_strike-market@2x.png b/website/client/assets/images/world-boss/rage_strike-market@2x.png new file mode 100644 index 0000000000..3f98a6ed9c Binary files /dev/null and b/website/client/assets/images/world-boss/rage_strike-market@2x.png differ diff --git a/website/client/assets/images/world-boss/rage_strike-quests@2x.png b/website/client/assets/images/world-boss/rage_strike-quests@2x.png new file mode 100644 index 0000000000..1501155b56 Binary files /dev/null and b/website/client/assets/images/world-boss/rage_strike-quests@2x.png differ diff --git a/website/client/assets/images/world-boss/rage_strike-seasonalShop@2x.png b/website/client/assets/images/world-boss/rage_strike-seasonalShop@2x.png new file mode 100644 index 0000000000..1b74cef647 Binary files /dev/null and b/website/client/assets/images/world-boss/rage_strike-seasonalShop@2x.png differ diff --git a/website/client/assets/images/rage_strike2x.png b/website/client/assets/images/world-boss/rage_strike@2x.png similarity index 100% rename from website/client/assets/images/rage_strike2x.png rename to website/client/assets/images/world-boss/rage_strike@2x.png diff --git a/website/client/assets/scss/item.scss b/website/client/assets/scss/item.scss index 01021ec567..9b8bd68e79 100644 --- a/website/client/assets/scss/item.scss +++ b/website/client/assets/scss/item.scss @@ -19,6 +19,10 @@ margin-bottom: 8px; } +.item.pet-slot { + margin: 0 2px; +} + .item { position: relative; width: 94px; diff --git a/website/client/components/chat/copyAsTodoModal.vue b/website/client/components/chat/copyAsTodoModal.vue index 7e61dd3523..b347fe13fe 100644 --- a/website/client/components/chat/copyAsTodoModal.vue +++ b/website/client/components/chat/copyAsTodoModal.vue @@ -38,7 +38,7 @@ export default { }, mounted () { this.$root.$on('habitica::copy-as-todo', message => { - const notes = `${message.user} wrote in [${this.groupName}](${baseUrl}/groups/guild/${this.groupId})`; + const notes = `${message.user || 'system message'}${message.user ? ' wrote' : ''} in [${this.groupName}](${baseUrl}/groups/guild/${this.groupId})`; const newTask = { text: message.text, type: 'todo', diff --git a/website/client/components/groups/membersModal.vue b/website/client/components/groups/membersModal.vue index eb0199fc03..8b63c6b21a 100644 --- a/website/client/components/groups/membersModal.vue +++ b/website/client/components/groups/membersModal.vue @@ -432,10 +432,10 @@ export default { if (!lastMember) return; let newMembers = await this.$store.state.memberModalOptions.fetchMoreMembers({ - challengeId: this.challengeId, - groupId: this.groupId, - lastMemberId: lastMember._id, - includeAllPublicFields: true, + challengeId: this.challengeId, + groupId: this.groupId, + lastMemberId: lastMember._id, + includeAllPublicFields: true, }); this.members = this.members.concat(newMembers); diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue index 0314ade398..7ed00400dd 100644 --- a/website/client/components/groups/tavern.vue +++ b/website/client/components/groups/tavern.vue @@ -1,6 +1,7 @@ diff --git a/website/client/store/actions/common.js b/website/client/store/actions/common.js index ae242fea7b..e3e2ac8428 100644 --- a/website/client/store/actions/common.js +++ b/website/client/store/actions/common.js @@ -8,9 +8,9 @@ export function equip (store, params) { equipOp(user, {params}); axios .post(`/api/v3/user/equip/${params.type}/${params.key}`); - // TODO - // .then((res) => console.log('equip', res)) - // .catch((err) => console.error('equip', err)); + // TODO + // .then((res) => console.log('equip', res)) + // .catch((err) => console.error('equip', err)); } export function hatch (store, params) { @@ -18,9 +18,9 @@ export function hatch (store, params) { hatchOp(user, {params}); axios .post(`/api/v3/user/hatch/${params.egg}/${params.hatchingPotion}`); - // TODO - // .then((res) => console.log('equip', res)) - // .catch((err) => console.error('equip', err)); + // TODO + // .then((res) => console.log('equip', res)) + // .catch((err) => console.error('equip', err)); } export async function feed (store, params) { diff --git a/website/client/store/actions/index.js b/website/client/store/actions/index.js index bbf917552a..4fc0b035f3 100644 --- a/website/client/store/actions/index.js +++ b/website/client/store/actions/index.js @@ -15,6 +15,7 @@ import * as tags from './tags'; import * as hall from './hall'; import * as shops from './shops'; import * as snackbars from './snackbars'; +import * as worldState from './world-state'; // Actions should be named as 'actionName' and can be accessed as 'namespace:actionName' // Example: fetch in user.js -> 'user:fetch' @@ -35,6 +36,7 @@ const actions = flattenAndNamespace({ hall, shops, snackbars, + worldState, }); export default actions; diff --git a/website/client/store/actions/shops.js b/website/client/store/actions/shops.js index 554694f499..46480de461 100644 --- a/website/client/store/actions/shops.js +++ b/website/client/store/actions/shops.js @@ -69,16 +69,16 @@ async function buyArmoire (store, params) { // @TODO: We might need to abstract notifications to library rather than mixin const notificationOptions = isExperience ? - { - text: `+ ${item.value}`, - type: 'xp', - flavorMessage: message, - } : - { - text: message, - type: 'drop', - icon: getDropClass({type: item.type, key: item.dropKey}), - }; + { + text: `+ ${item.value}`, + type: 'xp', + flavorMessage: message, + } : + { + text: message, + type: 'drop', + icon: getDropClass({type: item.type, key: item.dropKey}), + }; store.dispatch('snackbars:add', { title: '', diff --git a/website/client/store/actions/world-state.js b/website/client/store/actions/world-state.js new file mode 100644 index 0000000000..924335992f --- /dev/null +++ b/website/client/store/actions/world-state.js @@ -0,0 +1,7 @@ +import axios from 'axios'; + +export async function getWorldState () { + const url = '/api/v3/world-state'; + const response = await axios.get(url); + return response.data.data; +} diff --git a/website/common/locales/bg/character.json b/website/common/locales/bg/character.json index ee68a5bbfc..cb41d0cdf7 100644 --- a/website/common/locales/bg/character.json +++ b/website/common/locales/bg/character.json @@ -64,6 +64,7 @@ "classBonusText": "Вашият клас (воин, ако не сте отключили или избрали друг клас) използва собствената си екипировка по-ефективно, отколкото тази на другите класове. Екипирана броня за сегашния Ви клас дава 50% повече точки към показателя, който предоставя.", "classEquipBonus": "Класов бонус", "battleGear": "Бойно снаряжение", + "gear": "Gear", "battleGearText": "Това е снаряжението, което носите в битка; то влияе върху числата, когато взаимодействате със задачите си.", "autoEquipBattleGear": "Автоматично екипиране на новите предмети", "costume": "Костюм", diff --git a/website/common/locales/bg/faq.json b/website/common/locales/bg/faq.json index 65ed401d66..a3e7003eda 100644 --- a/website/common/locales/bg/faq.json +++ b/website/common/locales/bg/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Има няколко неща, които могат да Ви нанесат щети. Първо, ако не изпълните своите ежедневни задачи през деня, и ако не ги отметнете на екрана, който Ви се появи на следващата сутрин, тези незавършени ежедневни задачи ще Ви наранят. Второ, ако щракнете върху лош навик, ще поемете щети. И накрая, ако се биете срещу главатар заедно с групата си и някой от нея не е изпълнил всичките си ежедневни задачи, главатарят ще Ви нападне. Основният начин да оздравеете е да качите ниво, тъй като така възстановявате изцяло здравето си. Може също така да си купите лековита отвара от колоната с награди, използвайки златото си. Освен това, след ниво 10 може да изберете да станете лечител и да придобиете умения за лечение. Ако в групата Ви има лечител, той също може да Ви излекува. Научете повече като изберете „Група“ от лентата за навигация.", "faqQuestion5": "Как да играя Хабитика с приятелите си?", "iosFaqAnswer5": "Най-добрият начин е да си направите група! Групите могат заедно да изпълняват мисии, да се бият с чудовища и да използват уменията си, за да се подкрепят. Идете в Меню > Група и щракнете „Създаване на нова група“, ако все още нямате такава. След това докоснете списъка с членовете и докоснете „Покана“ в горния десен ъгъл, за да добавите приятелите си, като въведете техните потребителски идентификатори (низ от цифри и букви, които може да откриете в „Настройки > Подробности за профила“ в приложението, или в „Настройки > ППИ“ в уеб сайта). В уеб сайта можете да поканите приятелите си и чрез е-писмо; тази възможност ще бъде добавена и към приложението в някое бъдещо обновление.\n\nВ уеб сайта, вие и приятелите Ви можете също да се присъединявате към гилдии, които представляват обществени стаи за разговори. Гилдиите ще бъдат добавени към приложението в някое бъдещо обновление!", - "androidFaqAnswer5": "Най-добрият начин е да си направите група! Групите могат заедно да изпълняват мисии, да се бият с чудовища и да използват уменията си, за да се подкрепят. Ако все още нямата група, идете в [уеб сайта(https://habitica.com/), за да си направите. Също така можете заедно да се присъединявате към гилдии (Общност > Гилдии). Гилдиите представляват стаи за разговори, концентрирани върху споделен интерес или преследването на обща цел и могат да бъдат обществени или частни. Можете да се присъедините към колкото желаете гилдии, но групата Ви може да бъде само една.\n\nЗа повече подробности, вижте страниците в уикито за [Групите](http://habitrpg.wikia.com/wiki/Party) и [Гилдиите](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "Най-добрият начин е да си направите група като щракнете върху „Група“ в лентата за навигация! Групите могат заедно да изпълняват мисии, да се бият с чудовища и да използват уменията си, за да се подкрепят. Можете също заедно да се присъединявате към гилдии („Общност > Гилдии“ в лентата за навигация). Гилдиите са стаи за разговори, организирани около общ интерес или преследването на обща цел, и могат да бъдат обществени или частни. Можете да се присъедините към колкото искате гилдии, но само към една група. За по-подробна информация, прегледайте страниците в уикито относно [Групите](http://habitrpg.wikia.com/wiki/Party) и [Гилдиите](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Как да се сдобия с любимец или превоз?", "iosFaqAnswer6": "Когато достигнете ниво 3 се отключва системата за падане на предмети. Всеки път когато завършите задача, ще имате шанс да Ви се падне яйце, излюпваща отвара или храна. Тези неща ще се съхраняват в Меню > Предмети.\n\nЗа да се излюпи любимец Ви трябва яйце и излюпваща отвара. Докоснете яйцето, за да определите какво искате да се излюпи и изберете „Излюпване“. След това изберете излюпваща отвара, за да определите цвета! Идете в Меню > Любимци, за да екипирате новия си любимец като го докоснете.\n\nМожете да превърнете любимците си в превози като ги храните от Меню > Любимци. Докоснете любимец и изберете „Хранене“! Ще трябва да нахраните любимеца си много пъти, преди той да се превърне в превоз, но ако разберете каква е любимата му храна, той ще расте по-бързо. Опитайте чрез проба и грешка или [вижте информацията наготово тук](http://habitica.wikia.com/wiki/Food#Food_Preferences). След като вече имате превоз, идете в Меню > Превози и го докоснете, за да го екипирате.\n\nМоже да получите яйца за любимци от мисии, ако завършите някои конкретни мисии. (Вижте по-надолу, за да научите повече относно мисиите.)", "androidFaqAnswer6": "Когато достигнете ниво 3 се отключва системата за падане на предмети. Всеки път когато завършите задача, ще имате шанс да Ви се падне яйце, излюпваща отвара или храна. Тези неща ще се съхраняват в Меню > Предмети.\n\nЗа да се излюпи любимец Ви трябва яйце и излюпваща отвара. Докоснете яйцето, за да определите какво искате да се излюпи от него, и изберете „Излюпване с отвара“. След това изберете излюпваща отвара, за да определите цвета! За да екипирате новия си любимец, идете в Меню > Конюшня > Любимци, изберете вид, а след това желания любимец и изберете „Използване“ (героят Ви няма да се обнови, за да видите промяната).\n\nМожете да превърнете любимците си в превози, като ги храните от Меню > Конюшня [ > Любимци ]. Докоснете любимец и изберете „Хранене“! Ще трябва да нахраните любимеца си много пъти, преди той да се превърне в превоз, но ако разберете каква е любимата му храна, той ще расте по-бързо. Опитайте чрез проба и грешка, или [вижте информацията наготово тук](http://habitica.wikia.com/wiki/Food#Food_Preferences). За да екипирате превоза си, идете в Меню > Конюшня > Превози, изберете вид, а след това желания превози, и изберете „Използване“ (героят Ви няма да се обнови, за да видите промяната).\n\nМоже да получите яйца за любимци от мисии, ако завършите някои конкретни мисии. (Вижте по-надолу, за да научите повече относно мисиите.)", diff --git a/website/common/locales/bg/gear.json b/website/common/locales/bg/gear.json index 1eec39eace..a2ca9c0c61 100644 --- a/website/common/locales/bg/gear.json +++ b/website/common/locales/bg/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "Този удобен пуловер ще Ви държи топло докато се носите из облаците! Не променя показателите. Предмет за абонати: ноември 2017 г.", "armorMystery201712Text": "Броня на майстор-свещар", "armorMystery201712Notes": "Топлината и светлината произведени от тази вълшебна броня ще стоплят сърцето Ви, но няма да изгорят кожата Ви! Не променя показателите. Предмет за абонати: декември 2017 г.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Изтънчен костюм", "armorMystery301404Notes": "Спретнат и елегантен! Не променя показателите. Предмет за абонати: февруари 3015 г.", "armorMystery301703Text": "Изтънчена паунова рокля", @@ -984,6 +986,8 @@ "headMystery201710Notes": "С този шлем ще изглеждате страховито… но пък няма да имате добро 3-измерно зрение! Не променя показателите. Предмет за абонати: октомври 2017 г.", "headMystery201712Text": "Корона на майстор-свещар", "headMystery201712Notes": "Тази корона ще донесе светлина и топлина и в най-тъмната зимна нощ. Не променя показателите. Предмет за абонати: декември 2017 г.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Украсен цилиндър", "headMystery301404Notes": "Украсен цилиндър за най-изтънчените и високопоставени членове на обществото. Не променя показателите. Предмет за абонати: януари 3015 г.", "headMystery301405Text": "Обикновен цилиндър", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Този як щит от разтопена скала Ви защитава от лошите навици, но няма да изгори ръцете Ви. Не променя показателите. Предмет за абонати: август 2017 г.", "shieldMystery201709Text": "Магьоснически наръчник", "shieldMystery201709Notes": "Тази книга ще Ви води по пътя Ви към усвояването на магията. Не променя показателите. Предмет за абонати: октомври 2017 г.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Часовников щит", "shieldMystery301405Notes": "Времето е на Ваша страна с този внушителен часовников щит! Не променя показателите. Предмет за абонати: юни 3015 г.", "shieldMystery301704Text": "Пърхащо ветрило", diff --git a/website/common/locales/bg/generic.json b/website/common/locales/bg/generic.json index a16e91eaa0..1f97ddd3a5 100644 --- a/website/common/locales/bg/generic.json +++ b/website/common/locales/bg/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Айру", "audioTheme_beatscribeNesTheme": "Бийтскрайб — конзола „NES“", "audioTheme_arashiTheme": "Араши", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Лунасол", "audioTheme_spacePenguinTheme": "КосмоПингвин", "audioTheme_maflTheme": "МАФЛ", diff --git a/website/common/locales/bg/groups.json b/website/common/locales/bg/groups.json index dbc5821c63..2fd05cac0f 100644 --- a/website/common/locales/bg/groups.json +++ b/website/common/locales/bg/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Купонът продължава", "partyUpText": "Присъединил(а) се към група с още един човек! Забавлявайте се, докато заедно се биете с чудовища и се подкрепяте взаимно.", "partyOnText": "Присъединил(а) се към група с поне четири човека! Радвайте се на допълнителната отговорност, докато се съюзявате с приятелите си, за да побеждавате враговете си!", - "largeGroupNote": "Забележка: тази гилдия вече е твърде голяма, за да поддържа известяване! Ще трябва да проверявате всеки ден за нови съобщения.", "groupIdRequired": "„groupId“ трябва да бъде правилно форматиран идентификатор UUID", "groupNotFound": "Групата не е намерена или нямате достъп.", "groupTypesRequired": "Трябва да подадете правилен низ за заявка в „type“.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "В поканата липсва потребителски идентификатор", "inviteMustNotBeEmpty": "Поканата не трябва да бъде празна.", "partyMustbePrivate": "Групите трябва да бъдат частни", - "userAlreadyInGroup": "Потребителят вече членува в тази група.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Не можете да поканите себе си в група.", - "userAlreadyInvitedToGroup": "Потребителят вече е поканен в тази група.", - "userAlreadyPendingInvitation": "Потребителят вече изчаква покана.", - "userAlreadyInAParty": "Потребителят вече членува в група.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Не е намерен потребител с идентификатора „<%= userId %>“.", "userHasNoLocalRegistration": "Потребителят няма местна регистрация (потребителско име, е-поща, парола).", "uuidsMustBeAnArray": "Поканите чрез потребителски идентификатор трябва да бъдат масив.", @@ -417,11 +416,13 @@ "managerAdded": "Управителят е добавен успешно", "managerRemoved": "Управителят е премахнат успешно.", "leaderChanged": "Водачът беше сменен", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "Какво е световен главатар?", "worldBossDesc": "Световният главатар е специално събитие, при което цялата общност на Хабитика работи заедно, за да победи могъщо чудовище, използвайки задачите си! След побеждаването му всички потребители на Хабитика получават награда, дори и онези, които са почивали в странноприемницата, или които изобщо не са използвали Хабитика по време на мисията.", "worldBossLink": "Прочетете повече относно предишните световни главатари на Хабитика в Уикито.", "worldBossBullet1": "Завършете задачите си, за да нанесете щети на световния главатар.", "worldBossBullet2": "Главатарят няма да Ви нанесе щети за пропуснатите задачи, но яростомерът му ще се запълни. Ако лентата се запълни, главатарят ще нападне някой от продавачите на Хабитика!", "worldBossBullet3": "Можете да продължите с нормалните главатари от мисиите си, като щетите ще се прилагат и на двамата главатари.", - "worldBossBullet4": "Проверявайте в кръчмата, за да видите напредъка за световния главатар и яростните удари." + "worldBossBullet4": "Проверявайте в кръчмата, за да видите напредъка за световния главатар и яростните удари.", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/bg/limited.json b/website/common/locales/bg/limited.json index ae9d495676..3dbb852b28 100644 --- a/website/common/locales/bg/limited.json +++ b/website/common/locales/bg/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Честит Есенен фестивал!! Искате ли да си купите редки предмети? Те ще бъдат налични само до 31 октомври!", "seasonalShopWinterText": "Честито Приказно зимно събитие!! Искате ли да си купите редки предмети? Те ще бъдат налични само до 31 януари!", "seasonalShopFallTextBroken": "О… добре дошли в сезонния магазин… В момента предлагаме стоки от есенното сезонно издание, или нещо такова… Всичко тук ще бъде налично за купуване по време на Есенния фестивал всяка година, но магазинът ще бъде отворен само до 31-ви октомври… предполагам, че няма да е лошо да се запасите сега, или ще трябва да чакате… и чакате… и чакате… *въздишка*", + "seasonalShopBrokenText": "Павилионът ми!!!!!!! Декорациите ми!!!! О, Обезсърчителят унищожи всичко :( Моля Ви, помогнете да го победим в кръчмата, за да мога да построя всичко отново!", "seasonalShopRebirth": "Ако сте купили някой от тези предмети преди време, но в момента не го притежавате, можете да го закупите отново в колонката с награди. Първоначално ще можете да закупувате само предметите за класа Ви (воин, по подразбиране), но не се безпокойте — останалите класово-специфични предмети ще се появят, ако превключите към съответния клас.", "candycaneSet": "Захарна пръчка (магьосник)", "skiSet": "Ски-убиец (мошеник)", diff --git a/website/common/locales/bg/questscontent.json b/website/common/locales/bg/questscontent.json index 7bc0b27d57..89f26b434c 100644 --- a/website/common/locales/bg/questscontent.json +++ b/website/common/locales/bg/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "Обезсърчителят е ПОБЕДЕН!\n\nЗаедно, всички в Хабитика нанасят последен удар на задачите си. Обезсърчителят изревава и отстъпва. „Какво има, Обезсърчителю?“ — пита AnnDeLune, с блясък в очите. — „Обезкуражен ли си?“\n\nПо черупките на Обезсърчителя се появяват светещи розови пукнатини, и той се разпада в розов пушек. Ново чувство на жизненост и решителност залива страната и от небето започват да валят сладки неща.\n\nТълпата се радва, хората се прегръщат, а любимците им нападат сладките. Изведнъж, радостен хор от песни огласява въздуха, и из въздуха се появяват блестящи силуети.\n\nОтново съживеният ни оптимизъм е привлякъл ято Обнадеждени хипогрифи! Грациозните същества кацат леко на земята, разрошвайки перата си, наперено и с интерес. „Изглежда имаме нови приятели, които ще поддържат духа ни, дори когато задачите ни ни отчайват.“ — казва Lemoness.\n\nBeffymaroo вече гали пернатите пухкавковци. — „Може би те ще ни помогнат да поправим повредените части от Хабитика!“\n\nПрипявайки, хипогрифите повеждат всички хабитиканци, за да могат заедно да възстановят обичния ни дом.", "questDysheartenerBossRageTitle": "Сърцеразбиване", "questDysheartenerBossRageDescription": "Яростомерът се запълва, когато хабитиканците пропускат ежедневните си задачи. Ако се запълни докрай, Обезсърчителят ще отприщи своето Сърцеразбиване върху някой от продавачите на Хабитика, така че не пропускайте задачите си!", - "questDysheartenerBossRageSeasonal": "Обезсърчителят използва СЪРЦЕРАЗБИВАНЕ!`\n\nО, не! След като се нахрани с неизпълнените ни ежедневни задачи, Обезсърчителят вече има силата да нанесе своята атака – Сърцеразбиване. С пронизителен писък, той стоварва тънките си предни крака върху беседката, в която се намира Сезонният магазин! Магическата ударна вълна натрошава дъските и Сезонната магьосница се натъжава от гледката.\n\nБързо, да продължаваме да изпълняваме ежедневните си задачи, за да не ни удари отново чудовището!", + "questDysheartenerBossRageSeasonal": "Обезсърчителят използва СЪРЦЕРАЗБИВАНЕ!`\n\nО, не! След като се нахрани с неизпълнените ни ежедневни задачи, Обезсърчителят вече има силата да нанесе своята атака – Сърцеразбиване. С пронизителен писък, той стоварва тънките си предни крака върху павилиона, в която се намира Сезонният магазин! Магическата ударна вълна натрошава дъските и Сезонната магьосница се натъжава от гледката.\n\nБързо, да продължаваме да изпълняваме ежедневните си задачи, за да не ни удари отново чудовището!", + "seasonalShopRageStrikeHeader": "Сезонният магазин беше атакуван!", + "seasonalShopRageStrikeLead": "Лесли е сърцеразбита!", + "seasonalShopRageStrikeRecap": "На 21 февруари любимата ни сезонна магьосница – Лесли, беше съсипана, след като Обезсърчителят разруши Сезонния магазин. Бързо, свършете задачите си, за да победим чудовището и да ѝ помогнем да го построи отново!", "questDysheartenerBossRageMarket": "Обезсърчителят използва СЪРЦЕРАЗБИВАНЕ!`\n\nО, не! След като се нахранва с неизпълнените ни ежедневни задачи, Обезсърчителят нанася още едно Сърцеразбиване, разбивайки стените и пода на пазара! Камъните му започват да падат, а Алекс Търговеца се разплаква, виждайки как стоката му е напълно унищожена.\n\nНе трябва да позволяваме на това да стане отново! Изпълнявайте ежедневните си задачи, за да не ни удари отново Обезсърчителят!", "questDysheartenerBossRageQuests": "Обезсърчителят използва СЪРЦЕРАЗБИВАНЕ!`\n\nОоо! Отново оставихме ежедневните си задачи неизпълнени, и Обезсърчителят използва тази енергия, зад а нанесе последен удар на любимите ни продавачи. Земята около Пазителя на мисиите е опустошена от Сърцеразбиването, а Иън не може да понесе гледката. Толкова сме близо до победата над това чудовище… Побързайте! Не спирайте сега!", "questDysheartenerDropHippogriffPet": "Обнадежден хипогриф (любимец)", diff --git a/website/common/locales/bg/subscriber.json b/website/common/locales/bg/subscriber.json index ea50893427..f9df47b988 100644 --- a/website/common/locales/bg/subscriber.json +++ b/website/common/locales/bg/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Комплект на килимния летец", "mysterySet201712": "Комплект на майстора-свещар", "mysterySet201801": "Комплект на снежната фея", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Стандартен изтънчен комплект", "mysterySet301405": "Комплект изтънчени принадлежности", "mysterySet301703": "Изтънчен паунов комплект", diff --git a/website/common/locales/cs/achievements.json b/website/common/locales/cs/achievements.json index a937a19082..08592c37d2 100644 --- a/website/common/locales/cs/achievements.json +++ b/website/common/locales/cs/achievements.json @@ -3,6 +3,6 @@ "onwards": "Kupředu!", "levelup": "Díky dosažení tvých cílů v reálném životě jsi se dostal na vyšší úroveň, a jsi díky tomu plně uzdraven!", "reachedLevel": "Dosáhl jsi úrovně <%= level %>", - "achievementLostMasterclasser": "Quest Completionist: Masterclasser Series", - "achievementLostMasterclasserText": "Completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!" + "achievementLostMasterclasser": "Dokončení výprav: Série Mistra třídy", + "achievementLostMasterclasserText": "Splň všech šestnáct výprav ve sérii výprav Mistra třídy a vyřeš záhadu Ztraceného Mistra!" } diff --git a/website/common/locales/cs/character.json b/website/common/locales/cs/character.json index 5ddde72f2d..c69c55e531 100644 --- a/website/common/locales/cs/character.json +++ b/website/common/locales/cs/character.json @@ -64,6 +64,7 @@ "classBonusText": "Tvé povolání (Válečník, pokud jsi neodemkl nebo nevybral jiné povolání) využívá svoje vlastní vybavení efektivněji, než vybavení pro jiné povolání. Nasazené vybavení ti přidává 50% bonus k poskytované vlastnosti.", "classEquipBonus": "Bonus třídy", "battleGear": "Bojová výzbroj", + "gear": "Gear", "battleGearText": "Tohle je tvé vybavení, které máš na sobě do bitvy; ovlivňuje čísla, když pracuješ se svými úkoly.", "autoEquipBattleGear": "Automaticky použít nové vybavení", "costume": "Kostým", @@ -215,9 +216,9 @@ "headAccess": "Příslušenství na hlavu", "backAccess": "Příslušenství na záda", "bodyAccess": "Příslušenství na tělo", - "mainHand": "Main-Hand", - "offHand": "Off-Hand", + "mainHand": "Hlavní ruka", + "offHand": "Druhá ruka", "pointsAvailable": "Dostupné body", - "pts": "pts", + "pts": "Body", "statsObjectRequired": "Je požadována aktualizace atributů" } \ No newline at end of file diff --git a/website/common/locales/cs/communityguidelines.json b/website/common/locales/cs/communityguidelines.json index 448e5dd176..3694a69b6e 100644 --- a/website/common/locales/cs/communityguidelines.json +++ b/website/common/locales/cs/communityguidelines.json @@ -43,7 +43,7 @@ "commGuideList02H": "Rozporuplné či kontroverzní diskuze by měly být hlášeny moderátorům pomocí označení týkajících se zpráv. Pokud si myslíš, že konverzace začíná být napjatá, příliš emocionální, nebo může někomu ublížit, přestaň se v ní zapojovat. Místo toho zprávy označ, aby jsi nám dal vědět. Moderátoři zareagují jak rychle to jen půjde. Naší prací je tě chránit. Pokud myslíš, že screenshoty by byly nápomocné, prosím, pošli nám je na email <%= hrefCommunityManagerEmail %>.", "commGuideList02I": "Nespamujte. Spamování může zahrnovat, kromě jiného: zasílání stejného komentáře nebo dotazu na různá místa, zasílání odkazů bez vysvětlení nebo kontextu, zasílání nesmyslných zpráv, zasílání velkého množství zpráv v řadě. Žádost o drahokamy nebo předplatné ve veřejném prostoru nebo soukromých zprávách je považováno za spam.", "commGuideList02J": "Prosíme vyhněte se postování textů ve fontu obřích nadpisů v prostorech veřejného chatu, obzvláště v Krčmě. Podobně jako KDYŽ PÍŠETE VŠECHNO S CAPS LOCKEM, vypadá to, jako kdybyste řvali, a narušuje to pohodovou atmosféru.", - "commGuideList02K": "We highly discourage the exchange of personal information - particularly information that can be used to identify you - in public chat spaces. Identifying information can include but is not limited to: your address, your email address, and your API token/password. This is for your safety! Staff or moderators may remove such posts at their discretion. If you are asked for personal information in a private Guild, Party, or PM, we highly recommend that you politely refuse and alert the staff and moderators by either 1) flagging the message if it is in a Party or private Guild, or 2) taking screenshots and emailing Lemoness at <%= hrefCommunityManagerEmail %> if the message is a PM.", + "commGuideList02K": "Velmi odrazujeme výměnu osobních informací - zejména informací, které mohou být použity ke tvé identifikaci - ve veřejných chatových prostorách. Identifikační informace mohou mimo jiné zahrnovat: tvoji adresu, e-mailovou adresu a token / heslo API. Toto je pro tvoji bezpečnost! Personál nebo moderátoři mohou tyto příspěvky odstranit podle svého uvážení. Pokud jsi požádán o osobní informace v soukromém cechu, družině, nebo zprávě, důrazně doporučujeme, aby jsi zdvořile odmítl, a informoval personál a moderátory, a to buď: 1) Označením zprávy, pokud je v družině nebo soukromém cechu, nebo 2) pořízením screenshotů a posláním je Lemoness na <%= hrefCommunityManagerEmail %>, pokud se jedná o zprávu ve schránce.", "commGuidePara019": "V soukromém prostoru mají uživatelé větší volnost diskutovat na libovolná témata, která však stále musí být v souladu s Pravidly užití, včetně zákazu diskriminačního, násilného nebo výhružného obsahu. Upozorňujeme, že jména výzev se zobrazují na profilu vítěze, proto MUSÍ být názvy Výzev tvořeny v souladu s pravidly pro veřejný prostor, přestože se vyskytují v soukromém prostoru.", "commGuidePara020": "Soukromé zprávy (SZ) mají pár dalších zásad. Pokud tě někdo zablokoval, nekontaktuj je jiným způsobem, aby tě odblokoval. Dále, neměl bys posílat soukromé zprávy někomu, kdo žádá o pomoc (veřejné odpovědi na žádosti o pomoc mohou pomoc i jiným v komunitě). Nakonec, neposílej nikomu soukromé zprávy, ve kterých prosíš o drahokamy nebo předplatné, jelikož by to mohlo být považováno za spam.", "commGuidePara020A": "Jestli uvidíš příspěvek, který věříš, že porušuje směrnice veřejného prostoru, které jsou načrtnuty nahoře, nebo jestli uvidíš příspěvek, který ti udělal starostil nebo se kvůli němu cítíš nepříjemně, můžeš to přivést k pozornosti moderátorů a personálu tím, že je označíš, aby ho nahlásili. Člen personálu nebo moderátor se pokusí tuto situaci vyřešit tak rychle, jak jen to bude možné. Prosím všimni si, že označování nevinných příspěvků naschvál je porušení těchto směrnic (podívej se dolů do sekce \"Porušení\"). Osobní zprávy nemohou být momentálně označeny, takže pokud chceš nahlásit osobní zprávu, udělej si screenshot a pošli ho emailem Lemonessovi na <%= hrefCommunityManagerEmail %>.", @@ -56,14 +56,14 @@ "commGuideHeadingPublicGuilds": "Veřejné cechy", "commGuidePara029": "Veřejné cechy jsou hodně jako krčma, akorát místo obecných diskuzí se v nich mluví na specifické téma. Chat ve veřejném cechu by se měl soustředit na téma. Například, členové cechu řečníků se asi nebudou bavit o zahradničení, a cech přemožitelů draků asi nebude mít zájem o luštění starých run. Některé cechy jsou laxnější než jiné, ale i tak, drž se tématu!", "commGuidePara031": "Některé veřejné cechy budou obsahovat citlivá témata jako je deprese, náboženství, politika, atd. To je v pořádku pokud konverzace neporušují Pravidla a podmínky nebo Pravidla veřejných prostor a pokud budou k tématu.", - "commGuidePara033": "Public Guilds may NOT contain 18+ content. If they plan to regularly discuss sensitive content, they should say so in the Guild title. This is to keep Habitica safe and comfortable for everyone.

If the guild in question has different kinds of sensitive issues, it is respectful to your fellow Habiticans to place your comment behind a warning (ex. \"Warning: references self-harm\"). These may be characterized as trigger warnings and/or content notes, and guilds may have their own rules in addition to those given here. If possible, please use markdown to hide the potentially sensitive content below line breaks so that those who may wish to avoid reading it can scroll past it without seeing the content. Habitica staff and moderators may still remove this material at their discretion. Additionally, the sensitive material should be topical -- bringing up self-harm in a guild focused on fighting depression may make sense, but may be less appropriate in a music guild. If you see someone who is repeatedly violating this guideline, especially after several requests, please flag the posts and email <%= hrefCommunityManagerEmail %> with screenshots.", + "commGuidePara033": "Veřejné cechy by NEMĚLY obsahovat 18+ obsah. Pokud mají v úmyslu často diskutovat citlivá témata, mělo by to být uvedeno v názvu cechu. Toto opatření je zde proto, aby byli na Habitice všichni v bezpečí, a cítili se zde dobře.

Pokud by takový cech obsahoval jiné druhy citlivých témat, bylo by slušné ostatní Habiťany varovat (např. \"Varování: diskuze je o sebepoškozování\"). Toto může být charakterizováno jako spouštěcí varování, a/nebo obsahové poznámky, a cechy mohou mít svá vlastní pravidla kromě těch, které jsou zde uvedeny. Pokud je to možné, prosím, použij formátování pro skrytí potencionálního citlivého příspěvku pod řádkem, aby se ti, kteří si přejí se tento obsah nečíst, jím mohli proscrollovat bez vidění onoho obsahu. Personál a moderátoři Habitici mohou stejně tento materiál odstranit dle svého uvážení. Navíc, citlivé téma by mělo být relevantní k cechu - začít mluvit o sebepoškozování v cechu o boji s depresí se může zdát jako dobrý nápad, ale už to nemusí být správné rozhodnutí v cechu o muzice. Pokud uvidíš, jak tohle pravidlo někdo neustále poškozuje, zejména když byl několikrát napomenut, prosím, označ tento post a pošli nám email na <%= hrefCommunityManagerEmail %> se screenshoty.", "commGuidePara035": "Žádný cech, ať už veřejný nebo soukromý by neměl být založen za účelem útoku na skupinu nebo jednotlivce. Vytvoření takového cechu je důvodem k okamžitému banu. Bojuj proti špatným návykům, nebo proti dalším dobrodruhům!", "commGuidePara037": "Všechny výzvy v krčmě a výzvy veřejných cechů se musí těmito pravidly řídit také.", "commGuideHeadingBackCorner": "Zadní koutek", - "commGuidePara038": "Sometimes a conversation will get too heated or sensitive to be continued in a Public Space without making users uncomfortable. In that case, the conversation will be directed to the Back Corner Guild. Note that being directed to the Back Corner is not at all a punishment! In fact, many Habiticans like to hang out there and discuss things at length.", - "commGuidePara039": "The Back Corner Guild is a free public space to discuss sensitive subjects, and it is carefully moderated. It is not a place for general discussions or conversations. The Public Space Guidelines still apply, as do all of the Terms and Conditions. Just because we are wearing long cloaks and clustering in a corner doesn't mean that anything goes! Now pass me that smoldering candle, will you?", + "commGuidePara038": "Někdy se konverzace může stát příliš napjatou nebo citlivou natolik, aby se v ní už nemohlo pokračovat ve veřejném prostoru, aniž by nebyla někomu nepříjemná. V takovém případě by se měla konverzace přesunout do cechu Zadního Koutku (the Back Corner Guild). Přemístění do Zadního koutku není v žádném případě trest! Naopak, Habiťané tam rádi chodí vést dlouhé diskuze.", + "commGuidePara039": "Cech Zadního Koutku (The Back Corner Guild) je bezplatný veřejný prostor pro diskuzi citlivých témat, a je pečlivě moderován. Není to místo pro všeobecnou diskuzi nebo konverzace. Stále tu platí pravidla pro veřejné prostory, stejně tak i Pravidla a podmínky. Jen protože nosíme dlouhé kabáty a držíme se v koutě neznamená, že pravidla neplatí! A teď mi podej tu doutnající svíčku, můžeš?", "commGuideHeadingTrello": "Trello fóra", - "commGuidePara040": "Trello serves as an open forum for suggestions and discussion of site features. Habitica is ruled by the people in the form of valiant contributors -- we all build the site together. Trello lends structure to our system. Out of consideration for this, try your best to contain all your thoughts into one comment, instead of commenting many times in a row on the same card. If you think of something new, feel free to edit your original comments. Please, take pity on those of us who receive a notification for every new comment. Our inboxes can only withstand so much.", + "commGuidePara040": "Trello slouží jako otevřené fórum pro návrhy a pro diskuze funkcí stránky. Zemi Habitica vládnou lidé ve formě udatných přispěvatelů - my všichni budujeme tuto stránku společně. Trello nám poskytuje strukturu pro náš systém. Tak tedy prosíme snaž se sepsat všechny své myšlenky do jednoho komentáře místo několik komentářů na jedné kartě. Pokud vymyslíš něco nového, můžeš svůj komentář kdykoliv upravit. Prosím, slituj se nad námi. S každým komentářem dostaneme upozornění a naše inboxy pak praskají ve švech.", "commGuidePara041": "Habitica používá čtyři různé Trello komise:", "commGuideList03A": "Hlavní fórum je místo pro požadavky a kde se hlasuje o nových funkcích.", "commGuideList03B": "Mobilní fórum je místo pro požadavky a kde se hlasuje o nových funkcích pro aplikace pro mobily.", @@ -83,14 +83,14 @@ "commGuideList04B": "Být otevřený o svém návrhu na změnu", "commGuideList04C": "Diskutovat o kolizi změn na diskuzní stránce stránky", "commGuideList04D": "Upozornit adminy na nevyřešený konflikt", - "commGuideList04DRev": "Mentioning any unresolved conflict in the Wizards of the Wiki guild for additional discussion, or if the conflict has become abusive, contacting moderators (see below) or emailing Lemoness at <%= hrefCommunityManagerEmail %>", + "commGuideList04DRev": "Zmínění jakéhokoli nevyřešeného konfliktu v cechu Wizards of the Wiki pro další diskusi nebo v případě, že se konflikt stal urážlivým, kontaktování moderátorů (viz. níže), nebo zaslání e-mailu Lemoness na <%= hrefCommunityManagerEmail %>", "commGuideList04E": "Nespamovat či sabotovat stránky z osobních důvodů", - "commGuideList04F": "Reading Guidance for Scribes before making any changes", - "commGuideList04G": "Using an impartial tone within wiki pages", + "commGuideList04F": "Přečti si Vodítko pro Písaře (Guidance for Scribes) před provedením jakýchkoliv změn.", + "commGuideList04G": "Používat nestranný tón na Wiki stránkách", "commGuideList04H": "Zajištění, že obsah wiki je relevatní celému Habitica a neprotěžuje konkrétní cech nebo družinu (takové informace mohou být přesunuty do fór)", "commGuidePara049": "Následující lidé jsou současnými wiki administrátory:", - "commGuidePara049A": "The following moderators can make emergency edits in situations where a moderator is needed and the above admins are unavailable:", - "commGuidePara018": "Wiki Administrators Emeritus are:", + "commGuidePara049A": "Následující moderátoři mohou provádět naléhavé úpravy v situacích, kde je moderátor potřeba, a vyšší admini nejsou k dispozici. ", + "commGuidePara018": "Vysloužilí administrátoři Wiki jsou:", "commGuideHeadingInfractionsEtc": "Porušení, důsledky a náprava", "commGuideHeadingInfractions": "Porušení", "commGuidePara050": "Habiťané si pomáhají, respektují se a udržují komunitu zábavnou a přátelskou. Avšak, jednou za čas, něco, co některý Habiťan udělá, může porušovat jedno z uvedených pravidel. Když se to stane, moderátoři zakročí jak uznají za vhodné aby zemi Habitica ochránili.", @@ -101,17 +101,17 @@ "commGuideList05A": "Porušení Pravidel a podmínek", "commGuideList05B": "Nenávistná prohlášení/obrázky, harašení/stalking, kyberšikana, klení a trolling", "commGuideList05C": "Porušení podmínky", - "commGuideList05D": "Impersonation of Staff or Moderators", + "commGuideList05D": "Vydávání se za moderátora nebo personál", "commGuideList05E": "Opakovaná mírnější porušení", - "commGuideList05F": "Creation of a duplicate account to avoid consequences (for example, making a new account to chat after having chat privileges revoked)", - "commGuideList05G": "Intentional deception of Staff or Moderators in order to avoid consequences or to get another user in trouble", + "commGuideList05F": "Vytvoření duplikátního účtu, aby jsi se vyhnul následkům (například vytvoření nového účtu poté, co ti byl zablokován přístup na chat)", + "commGuideList05G": "Úmyslné podvádění personálu nebo moderátorů, aby jsi se vyhnul následkům, nebo aby jsi dostal jiného uživatele do potíží.", "commGuideHeadingModerateInfractions": "Mírnější porušení", "commGuidePara054": "Lehčí porušení pravidel neohrožuje naši komunitu, ale mohou být velmi nepříjemná. Lehčí porušení pravidel budou mít lehčí následky. Pokud se ale porušení nakupí, budou i jejich následky vážnější.", "commGuidePara055": "Následují příklady mírnějších porušení. Toto není úplný seznam.", - "commGuideList06A": "Ignoring or Disrespecting a Mod. This includes publicly complaining about moderators or other users/publicly glorifying or defending banned users. If you are concerned about one of the rules or Mods, please contact Lemoness via email (<%= hrefCommunityManagerEmail %>).", + "commGuideList06A": "Ignorování nebo nerespektování moderátora. To zahrnuje i veřejné stížnosti o moderátorech nebo další uživatelích/veřejné obhajování nebo oslavování zabanovaných uživatelů. Pokud se ti nezdá nějaké pravidlo nebo chování moderátora, prosím, kontaktuj Lemoness přes email (<%= hrefCommunityManagerEmail %>).", "commGuideList06B": "Hraní si na moderátora. Jen pro upřesnění: přátelské připomenutí pravidel není na škodu. Hraní si na moderátora zahrnuje nařizování, vyžadování a/nebo trvání na to, aby někdo udělal co jsi popsal k napravení chyby. Můžeš někoho upozornit na to, že někdo spáchal přestupek, ale prosím nevyžaduj nějakou akci. Například říct \"Abys věděl, vulgarity jsou v Krčmě zakázané, tak by asi bylo lepší to smazat\" je lepší než říct \"Budu tě muset požádat o smazání příspěvku.\"", - "commGuideList06C": "Repeatedly Violating Public Space Guidelines", - "commGuideList06D": "Repeatedly Committing Minor Infractions", + "commGuideList06C": "Opakované porušování Pravidel veřejného prostoru", + "commGuideList06D": "Opakované páchání menších porušení", "commGuideHeadingMinorInfractions": "Lehčí porušení", "commGuidePara056": "Lehčí porušení, i když je vidíme neradi, mají lehčí důsledky. Pokud se budou opakovat, mohou časem vést k vážnějším důsledkům.", "commGuidePara057": "Následují příklady lehčích porušení. Toto není kompletní seznam.", @@ -120,19 +120,19 @@ "commGuideHeadingConsequences": "Důsledky", "commGuidePara058": "V zemi Habitica - stejně jako v reálném životě - každý čin má svůj důsledek, ať je to lepší forma po cvičení, kazy po jezení hodně cukru, nebo dobrá známka z testu, protože jsi studoval.", "commGuidePara059": "Stejně tak každé porušení má přímé důsledky. Některé důsledky jsou uvedeny dole.", - "commGuidePara060": "If your infraction has a moderate or severe consequence, there will be a post from a staff member or moderator in the forum in which the infraction occurred explaining:", + "commGuidePara060": "Pokud tvé porušení má mírné nebo těžší následky, bude na fórum, kde došlo k porušení, přidán příspěvek od člena personálu nebo moderátora vysvětlující:", "commGuideList08A": "jaké bylo tvé porušení", "commGuideList08B": "jaký je jeho důsledek", "commGuideList08C": "co udělat pro nápravu a znovuzískání statusu, pokud to je vůbec možné.", "commGuidePara060A": "Jestliže si to situace vyžádá, můžeš dostat PM (osobní zprávu) nebo email ještě navíc k příspěvku ve fóru, kde se porušení vyskytlo.", - "commGuidePara060B": "If your account is banned (a severe consequence), you will not be able to log into Habitica and will receive an error message upon attempting to log in. If you wish to apologize or make a plea for reinstatement, please email Lemoness at <%= hrefCommunityManagerEmail %> with your UUID (which will be given in the error message). It is your responsibility to reach out if you desire reconsideration or reinstatement.", + "commGuidePara060B": "Pokud je tvůj účet zablokován (z vážného důsledku), nebudeš se moci přihlásit do programu Habitica, a obdržíš chybovou zprávu během pokusu o přihlášení. Pokud si přeješ se omluvit nebo požádat o obnovení, prosím, pošli email Lemoness na <%= hrefCommunityManagerEmail %> s tvým UUID (které ti bude dáno v chybové zprávě). Je tvojí povinností nás oslovit, pokud si přeješ věci přehodnotit, nebo obnovit účet.", "commGuideHeadingSevereConsequences": "Příklady vážných důsledků", "commGuideList09A": "Bany účtu (viz. výše)", "commGuideList09B": "vymazání účtu", "commGuideList09C": "Permanentní zmražení postupu na žebříčku přispěvatelů", "commGuideHeadingModerateConsequences": "Příklady mírnějších důsledků", "commGuideList10A": "Omezená práva veřejného chatu", - "commGuideList10A1": "If your actions result in revocation of your chat privileges, a Moderator or Staff member will PM you and/or post in the forum in which you were muted to notify you of the reason for your muting and the length of time for which you will be muted. At the end of that period, you will receive your chat privileges back, provided you are willing to correct the behavior for which you were muted and comply with the Community Guidelines.", + "commGuideList10A1": "Pokud tvé akce vedou k odebrání tvých chatových práv, moderátor nebo člen personálu ti pošle soukromou zprávu a/nebo příspěvek ve fóru, ve kterém jsi byl vypnut, aby ti oznámil důvod tvého vypnutí a dobu, po kterou budeš blokován. Na konci této doby ti budou práva k chatu vrácena za předpokladu, že jsi ochotný napravit chování, pro které jsi byl ztlumen, a budeš dodržovat Zásady komunity.", "commGuideList10B": "Omezená práva soukromého chatu", "commGuideList10C": "Omezená práva tvoření cechu/družin", "commGuideList10D": "Dočasné zmražení postupu na žebříčku přispěvatelů", @@ -146,7 +146,7 @@ "commGuideList11E": "Změny (moderátoři/zaměstnanci mohou měnit problémový obsah)", "commGuideHeadingRestoration": "Obnovení", "commGuidePara061": "Habitica je země zasvěcená sebezlepšování a věříme ve druhé šance. Pokud spácháš přestupek a bude to pro tebe mít důsledky, dívej se na to jako na šanci zhodnotit své činy a šanci stát se lepším členem komunity.", - "commGuidePara062": "The announcement, message, and/or email that you receive explaining the consequences of your actions (or, in the case of minor consequences, the Mod/Staff announcement) is a good source of information. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.", + "commGuidePara062": "Oznámení, zpráva, a/nebo email, který ti byl zaslán, ve kterém vysvětlujeme důsledky tvých činů (nebo, v případě lehčích přestupků, oznámení moderátora/zaměstnance), je dobrým zdrojem informací. Spolupracuj s omezeními, které na tebe byli uvaleny a snaž se dosáhnout podmínek, abys jich byl zbaven.", "commGuidePara063": "Pokud nerozumíš důsledkům nebo svému přestupku, požádej zaměstnance/moderátory o rady, aby ses mohl přestupkům v budoucnosti vyhnout.", "commGuideHeadingContributing": "Přispět programu Habitica", "commGuidePara064": "Habitica je open-source projekt, což znamená že kterýkoliv z Habiťanů může přispět! Ti, kteří přispějí, budou odměněni následujícími stupni přispěvatelů:", @@ -164,7 +164,7 @@ "commGuideList13C": "Úrovně nezačínají odznovu v každé oblasti. Při zjišťování obtížnosti přihlížíme a všechny tvé příspěvky, tak aby lidé, kteří udělají pár obrázků, pak spraví malou chybu, pak se porýpou ve wiki, nepostupovali výše rychleji než lidé, kteří tvrdě dřou na jednom úkolu. To udržuje věci fér!", "commGuideList13D": "Uživatelé v podmínce nemohou povýšení na vyšší úroveň. Moderátoři mají právo zmrazit uživatelův postup za přestupky. Pokud se tak stane, uživatel bude vždy informován o rozhodnutí a jak to napravit. Úrovně mohou být také odebrány jako důsledek závažného porušení pravidel nebo jako důsledek podmínky.", "commGuideHeadingFinal": "Poslední část", - "commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some XP for reading it all. If you have any questions or concerns about these Community Guidelines, please email Lemoness (<%= hrefCommunityManagerEmail %>) and she will be happy to help clarify things.", + "commGuidePara067": "Tak takhle to je, odvážný Habiťane - Zásady komunity! Setři si pot z čela a přidej si pár zkušenostních bodů za tu práci se čtením. Pokud máš jakékoliv otázky nebo obavy o těchto Zásad komunity, prosím, pošli email Lemoness (<%= hrefCommunityManagerEmail %>) a ona ti ráda vše vysvětlí.", "commGuidePara068": "Nyní kupředu, chrabrý dobrodruhu, a přemož nějaké Denní úkoly!", "commGuideHeadingLinks": "Užitečné odkazy", "commGuidePara069": "Následují talentovaní umělci přispěli ilustracemi:", diff --git a/website/common/locales/cs/faq.json b/website/common/locales/cs/faq.json index 25ac5aec6c..3eb5651745 100644 --- a/website/common/locales/cs/faq.json +++ b/website/common/locales/cs/faq.json @@ -6,15 +6,15 @@ "webFaqAnswer0": "Nejprve si zadáš nějaký úkol, který chceš splnit v reálném životě. Až ho splníš a odškrtneš, dostaneš Zkušenostní body a zlato. Zlato se používá na nákup vybavení nebo jiných předmětů a vlastních odměn. Díky zkušenosti budeš získávat vyšší a vyšší úrovně a odemykat obsah, jakým jsou třeba Mazlíčci, Dovednosti, nebo Výpravy! Pro více informací se podívej na přehled krok-za-krokem v [Nápověda -> Přehled pro nové uživatele] (https://habitica.com/static/overview).", "faqQuestion1": "Jak si přidám úkoly?", "iosFaqAnswer1": "Dobré zvyky (ty s +), jsou věci, které můžeš plnit kolikrát chceš, například jedení zeleniny. Zlozvyky (ty s -) jsou věci, kterým se chceš vyhnout, třeba kousání nehtů. Zvyky s + a - jsou takové věci, kde můžeš udělat dobré či špatné rozhodnutí, jako třeba když jdeš po schodech vs. jízda výtahem. Dobré zvyky tě za splnění odmění Zkušenostmi a zlatem. Zlozvyky ti uberou Zdraví.\n\nDenní úkoly jsou věci, které musíš dělat každý den, jako třeba čištění zubů nebo kontrola emailu. Můžeš si nastavit ve které dny máš plnit které denní úkoly tak, že na ně ťukneš. Pokud naplánovaný Denní úkol nesplníš, odečte se ti přes noc Zdraví. Dávej pozor, aby sis nepřidal moc Denních úkolů najednou!\n\nÚkolníček obsahuje tvoje naplánované úkoly. Když je splníš, přinesou ti Zkušenost a zlato. Za nesplněné úkoly v Úkolníčku nikdy neztratíš Zdraví. Můžeš jim přiřadit datum splnění tím, že na ně ťukneš.", - "androidFaqAnswer1": "Good Habits (the ones with a +) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a -) are tasks that you should avoid, like biting nails. Habits with a + and a - have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award experience and gold. Bad Habits subtract health.\n\n Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by tapping to edit it. If you skip a Daily that is due, your character will take damage overnight. Be careful not to add too many Dailies at once!\n\n To-Dos are your To-Do list. Completing a To-Do earns you gold and experience. You never lose health from To-Dos. You can add a due date to a To-Do by tapping to edit.", - "webFaqAnswer1": "* Good Habits (the ones with a :heavy_plus_sign:) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a :heavy_minus_sign:) are tasks that you should avoid, like biting nails. Habits with a :heavy_plus_sign: and a :heavy_minus_sign: have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award Experience and Gold. Bad Habits subtract Health.\n* Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by clicking the pencil item to edit it. If you skip a Daily that is due, your avatar will take damage overnight. Be careful not to add too many Dailies at once!\n* To-Dos are your To-Do list. Completing a To-Do earns you Gold and Experience. You never lose Health from To-Dos. You can add a due date to a To-Do by clicking the pencil icon to edit.", + "androidFaqAnswer1": "Dobré zvyky (ty s +), jsou věci, které můžeš plnit kolikrát chceš, například jedení zeleniny. Zlozvyky (ty s -) jsou věci, kterým se chceš vyhnout, třeba kousání nehtů. Zvyky s + a - jsou takové věci, kde můžeš udělat dobré či špatné rozhodnutí, jako třeba když jdeš po schodech vs. jízda výtahem. Dobré zvyky tě za splnění odmění Zkušenostmi a zlatem. Zlozvyky ti uberou Zdraví.\n\nDenní úkoly jsou věci, které musíš dělat každý den, jako třeba čištění zubů nebo kontrola emailu. Můžeš si nastavit ve které dny máš plnit které denní úkoly tak, že na ně ťukneš. Pokud naplánovaný Denní úkol nesplníš, odečte se ti přes noc Zdraví. Dávej pozor, aby sis nepřidal moc Denních úkolů najednou!\n\nÚkolníček obsahuje tvoje naplánované úkoly. Když je splníš, přinesou ti Zkušenost a zlato. Za nesplněné úkoly v Úkolníčku nikdy neztratíš Zdraví. Můžeš jim přiřadit datum splnění tím, že na ně ťukneš.", + "webFaqAnswer1": "* Dobré zvyky (ty s +), jsou věci, které můžeš plnit kolikrát chceš, například jedení zeleniny. Zlozvyky (ty s -) jsou věci, kterým se chceš vyhnout, třeba kousání nehtů. Zvyky s + a - jsou takové věci, kde můžeš udělat dobré či špatné rozhodnutí, jako třeba když jdeš po schodech vs. jízda výtahem. Dobré zvyky tě za splnění odmění Zkušenostmi a zlatem. Zlozvyky ti uberou Zdraví.\n* Denní úkoly jsou věci, které musíš dělat každý den, jako třeba čištění zubů nebo kontrola emailu. Můžeš si nastavit ve které dny máš plnit které denní úkoly tak, že klikneš na ikonku tužky pro úpravu.. Pokud naplánovaný Denní úkol nesplníš, odečte se ti přes noc Zdraví. Dávej pozor, aby sis nepřidal moc Denních úkolů najednou!\n* Úkolníček obsahuje tvoje naplánované úkoly. Když je splníš, přinesou ti Zkušenost a zlato. Za nesplněné úkoly v Úkolníčku nikdy neztratíš Zdraví. Můžeš jim přiřadit datum splnění tím, že klikneš na ikonku tužky pro úpravu.", "faqQuestion2": "Co jsou ukázkové úkoly?", "iosFaqAnswer2": "Wiki má čtyři seznamy ukázkových úkolů, kterými se můžeš inspirovat:\n

\n* [Sample Habits](http://habitica.wikia.com/wiki/Sample_Habits)\n* [Sample Dailies](http://habitica.wikia.com/wiki/Sample_Dailies)\n* [Sample To-Dos](http://habitica.wikia.com/wiki/Sample_To-Dos)\n* [Sample Custom Rewards](http://habitica.wikia.com/wiki/Sample_Custom_Rewards)", "androidFaqAnswer2": "Habitica wiki má čtyři seznamy ukázkových úkolů pro inspiraci:\n

\n * [Ukázkové zvyky](http://habitica.wikia.com/wiki/Sample_Habits)\n * [Ukázkové Denní úkoly](http://habitica.wikia.com/wiki/Sample_Dailies)\n * [Ukázkové úkoly(http://habitica.wikia.com/wiki/Sample_To-Dos)\n * [Ukázkové vlastní odměny](http://habitica.wikia.com/wiki/Sample_Custom_Rewards)", "webFaqAnswer2": "Wiki má čtyři seznamy ukázkových úkolů, kterými se můžeš inspirovat:\n [Sample Habits](http://habitica.wikia.com/wiki/Sample_Habits)\n* [Sample Dailies](http://habitica.wikia.com/wiki/Sample_Dailies)\n* [Sample To-Dos](http://habitica.wikia.com/wiki/Sample_To-Dos)\n* [Sample Custom Rewards](http://habitica.wikia.com/wiki/Sample_Custom_Rewards)", "faqQuestion3": "Proč moje úkoly mění barvu?", "iosFaqAnswer3": "Tvé úkoly mění barvu v závislosti na tom, jak dobře si v nich vedeš! Každý nový úkol začíná na neutrální žluté. Plň Denní úkoly a Zvyky často a začnou modrat. Když nesplníš Denní úkol nebo se poddáš zlozvyku, začnou tvé úkoly červenat. Čím červenější úkol bude, tím více odměn za něj získáš, ale pokud to je Denní úkol nebo Zvyk, tak tím více ti ublíží! Tento systém tě pomáhá motivovat a plnit úkoly, se kterými máš problém.", - "androidFaqAnswer3": "Your tasks change color based on how well you are currently accomplishing them! Each new task starts out as a neutral yellow. Perform Dailies or positive Habits more frequently and they move toward blue. Miss a Daily or give in to a bad Habit and the task moves toward red. The redder a task, the more rewards it will give you, but if it's a Daily or bad Habit, the more it will hurt you! This helps motivate you to complete the tasks that are giving you trouble.", + "androidFaqAnswer3": "Tvé úkoly mění barvu v závislosti na tom, jak dobře si v nich vedeš! Každý nový úkol začíná na neutrální žluté. Plň Denní úkoly a Zvyky často a začnou modrat. Když nesplníš Denní úkol nebo se poddáš zlozvyku, začnou tvé úkoly červenat. Čím červenější úkol bude, tím více odměn za něj získáš, ale pokud to je Denní úkol nebo Zvyk, tak tím více ti ublíží! Tento systém tě pomáhá motivovat a plnit úkoly, se kterými máš problém.", "webFaqAnswer3": "Tvé úkoly mění barvu v závislosti na tom, jak dobře si v nich vedeš! Každý nový úkol začíná na neutrální žluté. Plň Denní úkoly a Zvyky často a začnou modrat. Když nesplníš Denní úkol nebo se poddáš zlozvyku, začnou tvé úkoly červenat. Čím červenější úkol bude, tím více odměn za něj získáš, ale pokud to je Denní úkol nebo Zvyk, tak tím více ti ublíží! Tento systém tě pomáhá motivovat a plnit úkoly, se kterými máš problém.", "faqQuestion4": "Proč má postava ztratila Zdraví a jak ho mohu získat zpátky?", "iosFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you tap a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your Party and one of your Party mates did not complete all their Dailies, the Boss will attack you.\n\n The main way to heal is to gain a level, which restores all your health. You can also buy a Health Potion with gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. If you are in a Party with a Healer, they can heal you as well.", @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Jak můžu hrát hru Habitica s přáteli?", "iosFaqAnswer5": "Nejlepším způsobem je pozvat je do tvé Družiny! Družiny se mohou vydávat na výpravy, bojovat proti příšerám, a navzájem se podporovat. Jdi do Menu > Družina a klikni na \"Vytvořit novou družinu\", pokud ještě žádnou nemáš. Pak ťukni na Pozvat v pravém horním rohu a pozvi přátele zadáním jejich uživatelského ID (řetězec čísel a písmen, který v aplikaci najdou v nastavení > Detaily účtu, nebo v Nastavení > API na stránce). Na stránce také můžeš pozvat přátele přes email. Do aplikace tuto možnost přidáme výhledově.\n\nNa stránce se také můžeš přidat do Cechů, což jsou veřejné chaty. Cechy budou do aplikace přidány v nějaké z příštích aktualizací!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Jak získám Mazlíčka nebo Zvíře?", "iosFaqAnswer6": "Ve 3. úrovni odemkneš systém nálezů. Pokaždé, když splní úkol, naskytne se ti náhodná šance nalézt vejce, líhnoucí lektvar, nebo jídlo. Budou se ti ukládat v Menu > Předměty.\n\nAbys mohl vylíhnout mazlíčka, musíš mít vejce a líhnoucí lektvar. Ťukni na vejce, aby bylo jasné, kterého mazlíčka chceš vylíhnout, a vyber \"Vylíhnout vejce\". Poté si vyber líhnoucí lektvar a tím zvolíš bravu mazlíčka! Jdi do Menu > Mazlíčci a kliknutím můžeš svého mazlíčka přidat ke své postavě.\n\nTaké můžeš z mazlíčků vykrmit Zvířata v Menu > Mazlíčci. Ťukni na mazlíčka a poté vyber \"Nakrmit mazlíčka!\" Budeš ho muset nakrmit několikrát, aby vyrostl ve velké zvíře, ale když zjistíš, které jídlo mu chutná, poroste rychleji. Zkus metodu pokus a omyl, nebo [použij tenhle tahák](http://habitica.wikia.com/wiki/Food#Food_Preferences). Jakmile zvíře vykrmíš, jdi do Menu > Zvířata a ťuknutím si ho tvoje postava osedlá.\n\nTaké můžeš získat vejce z výprav po jejich dokončení. (O výpravách více níže.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/cs/front.json b/website/common/locales/cs/front.json index d28a249425..1e4cad8faf 100644 --- a/website/common/locales/cs/front.json +++ b/website/common/locales/cs/front.json @@ -295,22 +295,22 @@ "heroIdRequired": "\"heroId\" musí být platné UUID.", "cannotFulfillReq": "Tvůj požadavek nemůže být splněn. Pokud chyba přetrvává, napiš e-mail na admin@habitica.com", "modelNotFound": "This model does not exist.", - "signUpWithSocial": "Sign up with <%= social %>", - "loginWithSocial": "Log in with <%= social %>", - "confirmPassword": "Confirm Password", - "usernameLimitations": "Login Name must be 1 to 20 characters long, containing only letters a to z, or numbers 0 to 9, or hyphens, or underscores.", - "usernamePlaceholder": "e.g., HabitRabbit", - "emailPlaceholder": "e.g., rabbit@example.com", - "passwordPlaceholder": "e.g., ******************", - "confirmPasswordPlaceholder": "Make sure it's the same password!", - "joinHabitica": "Join Habitica", - "alreadyHaveAccountLogin": "Already have a Habitica account? Log in.", - "dontHaveAccountSignup": "Don’t have a Habitica account? Sign up.", - "motivateYourself": "Motivate yourself to achieve your goals.", + "signUpWithSocial": "Zaregistruj se pomocí <%= social %>", + "loginWithSocial": "Přihlaš se pomocí <%= social %>", + "confirmPassword": "Potvrdit heslo", + "usernameLimitations": "Přihlašovací jméno musí být dlouhé 1 až 20 znaků, obsahující pouze písmena od a do z, nebo čísla 0 až 9, nebo pomlčky či podtržítka.", + "usernamePlaceholder": "např., HabitKrálík", + "emailPlaceholder": "např., kralik@priklad.com", + "passwordPlaceholder": "např., ******************", + "confirmPasswordPlaceholder": "Ujisti se, že se jedná o stejné heslo!", + "joinHabitica": "Vydej se do země Habitica", + "alreadyHaveAccountLogin": "Již máš Habitica účet? Přihlaš se.", + "dontHaveAccountSignup": "Ještě nemáš Habitica účet? Zaregistruj se.", + "motivateYourself": "Motivuj se k dosáhnutí svých cílů.", "timeToGetThingsDone": "It's time to have fun when you get things done! Join over 2.5 million Habiticans and improve your life one task at a time.", - "singUpForFree": "Sign Up For Free", - "or": "OR", - "gamifyYourLife": "Gamify Your Life", + "singUpForFree": "Zaregistruj se zdarma", + "or": "NEBO", + "gamifyYourLife": "Ať je život hrou", "aboutHabitica": "Habitica is a free habit-building and productivity app that treats your real life like a game. With in-game rewards and punishments to motivate you and a strong social network to inspire you, Habitica can help you achieve your goals to become healthy, hard-working, and happy.", "trackYourGoals": "Track Your Habits and Goals", "trackYourGoalsDesc": "Stay accountable by tracking and managing your Habits, Daily goals, and To-Do list with Habitica’s easy-to-use mobile apps and web interface.", @@ -325,13 +325,13 @@ "schoolAndWorkDesc": "Whether you're preparing a report for your teacher or your boss, it's easy to keep track of your progress as you tackle your toughest tasks.", "muchmuchMore": "And much, much more!", "muchmuchMoreDesc": "Our fully customizable task list means that you can shape Habitica to fit your personal goals. Work on creative projects, emphasize self-care, or pursue a different dream -- it's all up to you.", - "levelUpAnywhere": "Level Up Anywhere", - "levelUpAnywhereDesc": "Our mobile apps make it simple to keep track of your tasks on-the-go. Accomplish your goals with a single tap, no matter where you are.", - "joinMany": "Join over 2,000,000 people having fun while accomplishing their goals!", - "joinToday": "Join Habitica Today", - "signup": "Sign Up", - "getStarted": "Get Started", - "mobileApps": "Mobile Apps", - "learnMore": "Learn More", - "useMobileApps": "Habitica is not optimized for a mobile browser. We recommend downloading our mobile apps." + "levelUpAnywhere": "Postupuj na další úroveň kdekoliv", + "levelUpAnywhereDesc": "Naše mobilní aplikace ti zjednoduší držet přehled o svých úkolech i na cestách. Dosahuj svých cílů s jednoduchým klepnutím bez ohledu na to, kde jsi.", + "joinMany": "Přidej se k 2,000,000 lidí, kteří se již baví při dosahování svých cílů!", + "joinToday": "Vydej se do země Habitica ještě dnes", + "signup": "Zaregistruj se", + "getStarted": "Začni", + "mobileApps": "Mobilní aplikace", + "learnMore": "Zjisti více", + "useMobileApps": "Habitica není optimalizována pro mobilní prohlížeče. Doporučujeme si stáhnout naší mobilní aplikaci." } \ No newline at end of file diff --git a/website/common/locales/cs/gear.json b/website/common/locales/cs/gear.json index 0f2466027f..d1c26e97bd 100644 --- a/website/common/locales/cs/gear.json +++ b/website/common/locales/cs/gear.json @@ -19,7 +19,7 @@ "sortByStr": "SÍL", "sortByInt": "INT", "weapon": "zbraň", - "weaponCapitalized": "Main-Hand Item", + "weaponCapitalized": "Předmět v hlavní ruce", "weaponBase0Text": "Žádná zbraň", "weaponBase0Notes": "Žádná zbraň", "weaponWarrior0Text": "Tréninkový meč", @@ -109,17 +109,17 @@ "weaponSpecialNomadsScimitarText": "Nomádův Scimitar", "weaponSpecialNomadsScimitarNotes": "Zahnutá čepel tohoto Scimitaru je perfektní pro útočení na Úkoly ze zad jezdeckého zvířete. Zvyšuje inteligenci o <%= int %>.", "weaponSpecialFencingFoilText": "Šermířský Fleret", - "weaponSpecialFencingFoilNotes": "Should anyone dare to impugn your honor, you'll be ready with this fine foil! Increases Strength by <%= str %>.", + "weaponSpecialFencingFoilNotes": "Ať už tě kdokoliv odváží napadnout tvoji čest, budeš připraven s tímto skvělým fleretem. Zvyšuje sílu o <%= str %>.", "weaponSpecialTachiText": "Tachi", - "weaponSpecialTachiNotes": "This light and curved sword will shred your tasks to ribbons! Increases Strength by <%= str %>.", - "weaponSpecialAetherCrystalsText": "Aether Crystals", + "weaponSpecialTachiNotes": "Tento lehký a zakřivený meč rozseká tvé úkoly na cucky! Zvyšuje sílu o <%= str %>.", + "weaponSpecialAetherCrystalsText": "Éterový Krystal", "weaponSpecialAetherCrystalsNotes": "These bracers and crystals once belonged to the Lost Masterclasser herself. Increases all Stats by <%= attrs %>.", "weaponSpecialYetiText": "Kopí krotitele Yettiho", "weaponSpecialYetiNotes": "Toto kopí umožňuje svému uživateli velet jakémukoliv Yettimu. Zvyšuje sílu o <%= str %>. Limitovaná edice zimního vybavení 2013-2014!", "weaponSpecialSkiText": "Lyžovražedná hůl", "weaponSpecialSkiNotes": "Zbraň schopná ničení hord nepřátel! Také pomáhá svému uživateli dělat pěkně souběžné obraty. Zvyšuje sílu o <%= str %>. Limitovaná edice Zimního vybavení 2013-2014!", "weaponSpecialCandycaneText": "Cukrátková hůl", - "weaponSpecialCandycaneNotes": "A powerful mage's staff. Powerfully DELICIOUS, we mean! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2013-2014 Winter Gear.", + "weaponSpecialCandycaneNotes": "Mocná kouzelnická hůl. Mocně VYNIKAJÍCÍ, máme na mysli! Zvyšuje inteligenci o <%= int %> a vnímání o <%= per %>. Limitovaná edice 2013-2014 Zimního vybavení.", "weaponSpecialSnowflakeText": "Vločková hůlka", "weaponSpecialSnowflakeNotes": "Tato hůlka září nekonečnou léčebnou silou. Zvyšuje Inteligenci o <%= int %>. Limitovaná edice Zimního vybavení 2013-2014!", "weaponSpecialSpringRogueText": "Hákové drápy", @@ -195,19 +195,19 @@ "weaponSpecialSpring2016HealerText": "Hůlka jarních květin", "weaponSpecialSpring2016HealerNotes": "S zamáváním a mrknutím, necháš rozkvést louky a lesy! Nebo trefit nepříjemné myši do hlavy. Přidá <%= int %> bodů k Inteligenci. Limitovaná edice 2016 Jarní výbava.", "weaponSpecialSummer2016RogueText": "Elektrická tyč", - "weaponSpecialSummer2016RogueNotes": "Anyone who battles you is in for a shocking surprise... Increases Strength by <%= str %>. Limited Edition 2016 Summer Gear.", + "weaponSpecialSummer2016RogueNotes": "Každého, kdo s tebou bude bojovat, čeká šokující překvapení... Zvyšuje sílu o <%= str %>. Limitovaná edice 2016 Letní výbavy.", "weaponSpecialSummer2016WarriorText": "Zahnutý meč", - "weaponSpecialSummer2016WarriorNotes": "Bite those tough tasks with this hooked sword! Increases Strength by <%= str %>. Limited Edition 2016 Summer Gear.", + "weaponSpecialSummer2016WarriorNotes": "Zakousni se do těch těžkých úkolů s tímto zakřiveným mečem! Zvyšuje sílu o <%= str %>. Limitovaná edice 2016 Letní výbavy.", "weaponSpecialSummer2016MageText": "Seafoam Staff", "weaponSpecialSummer2016MageNotes": "All the power of the seas filters through this staff. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2016 Summer Gear.", - "weaponSpecialSummer2016HealerText": "Healing Trident", - "weaponSpecialSummer2016HealerNotes": "One spike harms, the other heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.", - "weaponSpecialFall2016RogueText": "Spiderbite Dagger", - "weaponSpecialFall2016RogueNotes": "Feel the sting of the spider's bite! Increases Strength by <%= str %>. Limited Edition 2016 Autumn Gear.", - "weaponSpecialFall2016WarriorText": "Attacking Roots", - "weaponSpecialFall2016WarriorNotes": "Attack your tasks with these twisting roots! Increases Strength by <%= str %>. Limited Edition 2016 Autumn Gear.", - "weaponSpecialFall2016MageText": "Ominous Orb", - "weaponSpecialFall2016MageNotes": "Don't ask this orb to tell your future... Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2016 Autumn Gear.", + "weaponSpecialSummer2016HealerText": "Léčivý Trojzubec", + "weaponSpecialSummer2016HealerNotes": "Jeden hrot zraňuje, druhý léčí. Zvyšuje Inteligenci o <%= int %>. Limitovaná edice 2015 Letní výbavy.", + "weaponSpecialFall2016RogueText": "Dýka Pavoučího kousnutí", + "weaponSpecialFall2016RogueNotes": "Pociť bodnutí pavoučího zakousnutí! Zvyšuje Sílu o <%= str %>. Limitovaná edice 2016 Podzimní výbavy.", + "weaponSpecialFall2016WarriorText": "Útočící Kořeny", + "weaponSpecialFall2016WarriorNotes": "Zaútoč na tvé úkoly s těmito zakroucenými kořeny! Zvyšuje Sílu o <%= str %>. Limitovaná edice 2016 Podzimní výbavy.", + "weaponSpecialFall2016MageText": "Zlověstná Koule", + "weaponSpecialFall2016MageNotes": "Této koule se na svoji budoucnost raději neptej... Zvyšuje Inteligenci o <%= int %> a Vnímání o <%= per %>. Limitovaná edice 2016 Podzimní výbavy.", "weaponSpecialFall2016HealerText": "Venomous Serpent", "weaponSpecialFall2016HealerNotes": "One bite harms, and another bite heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Autumn Gear.", "weaponSpecialWinter2017RogueText": "Ice Axe", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk oblek", "armorMystery301404Notes": "Elegantní a fešácký, joj! Nepřináší žádný benefit. Předmět pro předplatitele únor 3015.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fešný cylindr", "headMystery301404Notes": "Fešný cylindr pro ty největší džentlmeny. Předmět pro předplatitele leden 2015. Nepřináší žádný benefit.", "headMystery301405Text": "Obyčejný cylindr", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Štít z hodin", "shieldMystery301405Notes": "Čas je na tvé straně s tímhle štítem z hodin! Nepřináší žádný benefit. Předmět pro předplatitele červen 3015.", "shieldMystery301704Text": "Fluttery Fan", @@ -1419,7 +1425,7 @@ "headAccessoryArmoireComicalArrowText": "Komický šíp", "headAccessoryArmoireComicalArrowNotes": "This whimsical item doesn't provide a Stat boost, but it sure is good for a laugh! Confers no benefit. Enchanted Armoire: Independent Item.", "eyewear": "Brýle", - "eyewearCapitalized": "Eyewear", + "eyewearCapitalized": "Brýle", "eyewearBase0Text": "Žádné vybavení pro oči", "eyewearBase0Notes": "Žádné vybavení pro oči.", "eyewearSpecialBlackTopFrameText": "černé standardní brýle", @@ -1436,8 +1442,8 @@ "eyewearSpecialWhiteTopFrameNotes": "Brýle s bílými obroučkami. Nepřináší žádné výhody.", "eyewearSpecialYellowTopFrameText": "žluté standardní brýle", "eyewearSpecialYellowTopFrameNotes": "Brýle s žlutými obroučkami. Nepřináší žádné výhody.", - "eyewearSpecialAetherMaskText": "Aether Mask", - "eyewearSpecialAetherMaskNotes": "This mask has a mysterious history. Increases Intelligence by <%= int %>.", + "eyewearSpecialAetherMaskText": "Éterová Maska", + "eyewearSpecialAetherMaskNotes": "Tato maska má tajemnou minulost. Zvyšuje Inteligenci o <%= int %>.", "eyewearSpecialSummerRogueText": "Ničemné brýle", "eyewearSpecialSummerRogueNotes": "Člověk nemusí být mořský červ aby poznal, že je stylová! Nepřidává žádný bonus. Limitovaná edice 2014 Letní Výbava.", "eyewearSpecialSummerWarriorText": "Úžasná páska na oko", @@ -1452,8 +1458,8 @@ "eyewearMystery201506Notes": "Tento neonový šnorchl umožňuje svému nositeli vidět pod vodou. Nepřináší žádný benefit. Předmět pro předplatitele červen 2015.", "eyewearMystery201507Text": "Čupr sluneční brýle", "eyewearMystery201507Notes": "Díky těmto slunečním brýlím budeš cool i v tom největším vedru. Nepřináší žádný benefit. Předmět pro předplatitele červenec 2015.", - "eyewearMystery201701Text": "Timeless Shades", - "eyewearMystery201701Notes": "These sunglasses will protect your eyes from harmful rays and will look stylish no matter where you find yourself in time! Confers no benefit. January 2017 Subscriber Item.", + "eyewearMystery201701Text": "Nadčasové Sluneční Brýle", + "eyewearMystery201701Notes": "Tyto sluneční brýle ochrání tvé oči před škodlivými paprsky a budou vypadat skvěle, ať už se objevíš kdekoliv a kdykoliv! Nepřináší žádný benefit. Leden 2017 - Předmět pro předplatitele.", "eyewearMystery301404Text": "Brýle na oči", "eyewearMystery301404Notes": "Nic na oči nemůže být trendovějšího než brýle - možná tedy kromě monoklu. Nepřináší žádný benefit. Předmět pro předplatitele duben 3015.", "eyewearMystery301405Text": "Monokl", diff --git a/website/common/locales/cs/generic.json b/website/common/locales/cs/generic.json index c9468bbcba..18d9524694 100644 --- a/website/common/locales/cs/generic.json +++ b/website/common/locales/cs/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/cs/groups.json b/website/common/locales/cs/groups.json index f5235fb2d1..5f60235c9e 100644 --- a/website/common/locales/cs/groups.json +++ b/website/common/locales/cs/groups.json @@ -3,8 +3,8 @@ "tavernChat": "Chat v krčmě", "innCheckOut": "Odhlásit se z hostince", "innCheckIn": "Odpočívat v hostinci", - "innText": "You're resting in the Inn! While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day. Be warned: If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies unless they are also in the Inn! Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn.", - "innTextBroken": "You're resting in the Inn, I guess... While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day... If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies... unless they are also in the Inn... Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn... so tired...", + "innText": "Odpočíváš v Hostinci! Zatímco tu budeš, tvé Denní úkoly ti na konci dne nijak neublíží, ale vždy se resetují. Ale pozor: pokud jsi v boji s příšerou, ublíží ti nesplněné úkoly tvých přátel v družině, pokud také nejsou v Hostinci! Navíc, jakákoliv újma, kterou uštědříš příšeře (nebo nasbírané předměty) se ti nepřipíšou dokud se z Hostince neodhlásíš.", + "innTextBroken": "Odpočíváš v Hostinci, asi... Zatímco tu budeš, tvé Denní úkoly ti na konci dne nijak neublíží, ale vždy se resetují... Pokud jsi v boji s příšerou, ublíží ti nesplněné úkoly tvých přátel v družině... Pokud také nejsou v Hostinci... Navíc, jakákoliv újma, kterou uštědříš příšeře (nebo nasbírané předměty) se ti nepřipíšou dokud se z Hostince neodhlásíš... Jsem tak unavený...", "helpfulLinks": "Pomocné odkazy", "communityGuidelinesLink": "Zásady komunity", "lookingForGroup": "Hledá se skupina (družina) příspěvky", @@ -32,13 +32,13 @@ "communityGuidelines": "zásady komunity", "communityGuidelinesRead1": "Prosíme, přečti si naše", "communityGuidelinesRead2": "než začneš chatovat.", - "bannedWordUsed": "Oops! Looks like this post contains a swearword, religious oath, or reference to an addictive substance or adult topic. Habitica has users from all backgrounds, so we keep our chat very clean. Feel free to edit your message so you can post it!", + "bannedWordUsed": "Oops! Vypadá to, že příspěvek obsahuje sprosté slovo, náboženskou přísahu, nebo referenci na návykovou látku či dospělé téma. Habitica má uživatele z různých prostředí a věkových kategorií, takže se snažíme držet náš chat co nejvíce přístupný. Nebojte se tedy upravit svoji zprávu tak, aby jste ji mohli zveřejnit!", "bannedSlurUsed": "Tvůj příspěvek obsahoval nevhodný jazyk, takže ti byl zrušen přístup na chat.", "party": "Družina", "createAParty": "Vytvořit družinu", "updatedParty": "Nastavení družiny aktualizováno.", "errorNotInParty": "Nejsi v družině", - "noPartyText": "You are either not in a Party or your Party is taking a while to load. You can either create one and invite friends, or if you want to join an existing Party, have them enter your Unique User ID below and then come back here to look for the invitation:", + "noPartyText": "Nejsi členem družiny, nebo načítání tvé družiny trvá déle než obvykle. Můžeš družinu založit a pozvat do ní přátele, nebo se stát členem již existující družiny, a v tom případě je nech zadat následující Uživatelské ID a poté se sem vrať přijmout pozvánku:", "LFG": "K prezentování tvé Družiny, nebo abys našel novou, ke které se přidáš, navštiv cech <%= linkStart %>Party Wanted (Looking for Group)<%= linkEnd %>.", "wantExistingParty": "Chceš se přidat k existující družině? Pak navštiv cech <%= linkStart %>Party Wanted Guild<%= linkEnd %> a zveřejni toto Uživatelské ID:", "joinExistingParty": "Přidej se k družině někoho jiného", @@ -48,31 +48,31 @@ "userId": "Uživatelské ID", "invite": "Pozvat", "leave": "Odejít", - "invitedToParty": "You were invited to join the Party <%= party %>", - "invitedToPrivateGuild": "You were invited to join the private Guild <%= guild %>", - "invitedToPublicGuild": "You were invited to join the Guild <%= guild %>", - "partyInvitationsText": "You have <%= numberInvites %> Party invitations! Choose wisely, because you can only be in one Party at a time.", - "joinPartyConfirmationText": "Are you sure you want to join the Party \"<%= partyName %>\"? You can only be in one Party at a time. If you join, all other Party invitations will be rejected.", - "invitationAcceptedHeader": "Your Invitation has been Accepted", - "invitationAcceptedBody": "<%= username %> accepted your invitation to <%= groupName %>!", + "invitedToParty": "Byl jsi pozván do družiny <%= party %>", + "invitedToPrivateGuild": "Byl jsi pozván do soukromého cechu <%= guild %>", + "invitedToPublicGuild": "Byl jsi pozván do cechu <%= guild %>", + "partyInvitationsText": "Máš <%= numberInvites %>pozvánek do družiny. Vybírej pečlivě, protože můžeš být pouze v 1 družině najednou.", + "joinPartyConfirmationText": "Jsi si jistý, že se chceš přidat do družiny \"<%= partyName %>\"? Můžeš být pouze v jedné družině najednou. Pokud se přidáš, všechny ostatní pozvánky do družiny budou odmítnuty.", + "invitationAcceptedHeader": "Tvá pozvánka byla přijata", + "invitationAcceptedBody": "<%= username %> přijal tvoji pozvánku do <%= groupName %>!", "joinNewParty": "Přidej se k nové družině", "declineInvitation": "Odmítni pozvání", - "partyLoading1": "Your Party is being summoned. Please wait...", - "partyLoading2": "Your Party is coming in from battle. Please wait...", - "partyLoading3": "Your Party is gathering. Please wait...", - "partyLoading4": "Your Party is materializing. Please wait...", + "partyLoading1": "Tvoje družina je povolán. Prosím, čekejte...", + "partyLoading2": "Tvoje družina přichází z bitvy. Prosím čekejte...", + "partyLoading3": "Tvoje družina se shromažďuje. Prosím, čekej...", + "partyLoading4": "Tvoje družina se zhmotňuje. Prosím čekejte...", "systemMessage": "Systémová zpráva", - "newMsgGuild": "<%= name %> has new posts", - "newMsgParty": "Your Party, <%= name %>, has new posts", + "newMsgGuild": "<%= name %> má nový příspěvek", + "newMsgParty": "Tvá družina, <%= name %>, má nový příspěvek", "chat": "Chat", "sendChat": "Poslat zprávu", "toolTipMsg": "Aktualizovat seznam zpráv", "sendChatToolTip": "You can send a chat from the keyboard by tabbing to the 'Send Chat' button and pressing Enter or by pressing Control (Command on a Mac) + Enter.", - "syncPartyAndChat": "Sync Party and Chat", + "syncPartyAndChat": "Synchronizovat družinu a chat", "guildBankPop1": "Banka cechu", "guildBankPop2": "Drahokamy, které může vůdce cechu použít jako ceny pro výzvy.", "guildGems": "Drahokamy cechu", - "group": "Group", + "group": "Skupina", "editGroup": "Upravit družinu", "newGroupName": "<%= groupType %> jméno", "groupName": "Jméno družiny", @@ -82,8 +82,8 @@ "logoUrl": "Adresa loga", "assignLeader": "Zvolit vůdce družiny", "members": "Členové", - "memberList": "Member List", - "partyList": "Order for Party members in header", + "memberList": "Seznam členů", + "partyList": "Seřadit členy družiny v hlavičce", "banTip": "Vykopnout člena", "moreMembers": "více členů", "invited": "Pozván", @@ -96,11 +96,11 @@ "search": "Vyhledávání", "publicGuilds": "Veřejné cechy", "createGuild": "Vytvořit cech", - "createGuild2": "Create", + "createGuild2": "Vytvořit", "guild": "Cech", "guilds": "Cechy", "guildsLink": "Spolky", - "sureKick": "Do you really want to remove this member from the Party/Guild?", + "sureKick": "Opravdu chceš tohoto člena odebrat z družiny/cechu?", "optionalMessage": "Nepovinná zpráva", "yesRemove": "Ano, odstraň je", "foreverAlone": "Nemůže se ti líbit tvoje vlastní zpráva. Nebuď takový.", @@ -202,7 +202,6 @@ "partyOnName": "Velká družina", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "„groupId\" musí být platné UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Družiny musí být soukromé.", - "userAlreadyInGroup": "Uživatel již je ve skupině.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "Uživatel byl již pozván do skupiny.", - "userAlreadyPendingInvitation": "Uživatel přijal pozvánku.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Uživatel s id „<%= userId %>\" nenalezen.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/cs/limited.json b/website/common/locales/cs/limited.json index 6df490f0a0..0ed2f46e01 100644 --- a/website/common/locales/cs/limited.json +++ b/website/common/locales/cs/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Eh... vítej v Sezonním obchodě... Zrovna tu máme podzimní Sezonní edici zboží nebo tak... Všechno zde je možné zakoupit v průběhu Podzimního estivalu každý rok, ale máme otevřeno pouze do 31. října... asi si nakup teď, nebo budeš muset čekat... a čekat... a čekat *ugh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Cukrátková hůl (mág)", "skiSet": "Lyžovrah (zloděj)", diff --git a/website/common/locales/cs/loadingscreentips.json b/website/common/locales/cs/loadingscreentips.json index 481b57dc3c..aa5062cb5c 100644 --- a/website/common/locales/cs/loadingscreentips.json +++ b/website/common/locales/cs/loadingscreentips.json @@ -1,17 +1,17 @@ { "tipTitle": "Tip #<%= tipNumber %>", "tip1": "Kontroluj úkoly na cestách s mobilní aplikací Habitica.", - "tip2": "Click any equipment to see a preview, or equip it instantly by clicking the star in its upper-left corner!", + "tip2": "Klikni na jakékoliv vybavení pro náhled, nebo jej okamžitě vybav kliknutím na hvězdičku v jeho horním levém rohu!", "tip3": "Používej emoji pro rychlé odlišení svých úkolů.", "tip4": "Napiš # na začátek názvu úkolu a bude obrovský!", - "tip5": "It’s best to use skills that cause buffs in the morning so they last longer.", - "tip6": "Hover over a task and click the dots to access advanced task controls, such as the ability to push tasks to the top/bottom of your list.", - "tip7": "Some backgrounds connect perfectly if Party members use the same background. Ex: Mountain Lake, Pagodas, and Rolling Hills.", - "tip8": "Send a Message to someone by clicking their name in chat and then clicking the envelope icon at the top of their profile!", - "tip9": "Use the filters + search bar in the Inventories, Shops, Guilds, and Challenges to quickly find what you want.", + "tip5": "Nejlepší je použít dovednosti, které dočasně zlepšují vlastnosti, hned ráno, aby vydržely déle.", + "tip6": "Přejeď ukazatelem přes úkol a klikni na tečky pro přístup k pokročilému nastavení úkolu, jako je například možnost posunout úkoly nahoru/dolu ve tvém seznamu.", + "tip7": "Některá pozadí na sebe perfektně navazují, když členové družiny používají stejné pozadí. Např.: Horské jezero, Pagody a Kopce.", + "tip8": "Pošli někomu zprávu pomocí kliknutí na jejich jméno v chatu, a poté kliknutím na ikonku obálky nahoře v jejich profilu!", + "tip9": "Používej filtry + vyhledávací lištu v inventáři, obchodech, cechách, a ve výzvách, aby jsi rychle našel to, co chceš.", "tip10": "Soutěžením ve výzvách můžeš vyhrát drahokamy. Nové výzvy jsou přidávány každý den!", - "tip11": "Having more than four Party members increases accountability!", - "tip12": "Add checklists to your To-Dos to multiply your rewards!", + "tip11": "S více než čtyřmi členy družiny zvyšuješ odpovědnost!", + "tip12": "Přidej seznam do tvého úkolníčku, aby jsi znásobil odměnu!", "tip13": "Click “Filters” on your task page to make an unwieldy task list very manageable!", "tip14": "Můžeš přidat hlavičku nebo inspirační citát do tvého seznamu jako zvyk bez žádných (+/-).", "tip15": "Complete all the Masterclasser Quest-lines to learn about Habitica’s secret lore.", diff --git a/website/common/locales/cs/pets.json b/website/common/locales/cs/pets.json index 337957cd67..32012fdf65 100644 --- a/website/common/locales/cs/pets.json +++ b/website/common/locales/cs/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "Vznešený fialový gryf", "phoenix": "Fénix", "magicalBee": "Magická včela", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "Nadějný Gryf", + "hopefulHippogriffMount": "Nadějný Gryf", "royalPurpleJackalope": "Královský Fialový Zajdalen", "invisibleAether": "Neviditelný Éter", "rarePetPop1": "Klikni na zlatou packu pro více informací o tom, jak získat toto vzácné zvíře za přispívání programu Habitica!", diff --git a/website/common/locales/cs/questscontent.json b/website/common/locales/cs/questscontent.json index 5f96a5460b..9774818e59 100644 --- a/website/common/locales/cs/questscontent.json +++ b/website/common/locales/cs/questscontent.json @@ -1,11 +1,11 @@ { "questEvilSantaText": "Santa - Lovec kožešin", "questEvilSantaNotes": "Hluboko na ledových pláních slyšíš zoufalý řev. Sleduješ vrčení přerušované chichotáním a dojdeš na mýtinu v lese, kde uvidíš velkou lední medvědici. Spoutaná v kleci bojuje o život. Nahoře na kleci tančí zlomyslný malý skrček ve zbytcích vánočního kostýmu. Poraž Santu, lovce kožešin, a zachraň to zvíře!", - "questEvilSantaCompletion": "Trapper Santa squeals in anger, and bounces off into the night. The grateful she-bear, through roars and growls, tries to tell you something. You take her back to the stables, where Matt Boch the Beast Master listens to her tale with a gasp of horror. She has a cub! He ran off into the icefields when mama bear was captured.", + "questEvilSantaCompletion": "Lovec kožešin Santa kvičí vzteky a odskakuje do noci. Vděčná medvědice se ti skrz řev a vrčení snaží něco říct. Vezmeš jí zpět do stájí, kde zaříkávač Matt Boch vyslechne její příběh lapajíc po dechu hrůzou. Ona má mládě! Uteklo do ledových plání, když mámu medvědici zajali.", "questEvilSantaBoss": "Santa - Lovec kožešin", "questEvilSantaDropBearCubPolarMount": "Lední medvěd (zkrocený)", "questEvilSanta2Text": "Najdi mládě", - "questEvilSanta2Notes": "When Trapper Santa captured the polar bear mount, her cub ran off into the icefields. You hear twig-snaps and snow crunch through the crystalline sound of the forest. Paw prints! You start racing to follow the trail. Find all the prints and broken twigs, and retrieve the cub!", + "questEvilSanta2Notes": "Když Lovec kožešin Santa zajal polární medvědici, její mládě odběhlo do ledových plání. Slyšíš praskání větviček a křupání sněhu skrze krystalický zvuk lesa. Otisky tlapek! Vystřelíš do rychlého běhu následujíc stopu. Najdi všechny otisky a polámané větvičky a dostaň mládě zpět!", "questEvilSanta2Completion": "Našel jsi mládě! Bude navždy s tebou.", "questEvilSanta2CollectTracks": "Stopy", "questEvilSanta2CollectBranches": "Polámané větvičky", @@ -21,46 +21,46 @@ "questHedgehogCompletion": "Tvá družina ježka úspěšně uklidnila! Po navrácení do své normální velikosti, spěchá rychle ke svým vejcím. Vrací se pištící a dává vám nějaká svá vejce. Doufejme, že těmhle ježkům bude mléko chutnat více!", "questHedgehogBoss": "Ježobluda", "questHedgehogDropHedgehogEgg": "Ježek (Vejce)", - "questHedgehogUnlockText": "Unlocks purchasable Hedgehog eggs in the Market", + "questHedgehogUnlockText": "Odemyká vejce ježka na Trhu", "questGhostStagText": "Duch jara", "questGhostStagNotes": "Ach, jaro. To roční období, kdy se zas začne příroda vybarvovat. Pryč jsou sněhy a zima. Kde dřív byl led, tam se nyní rostliny probouzí k životu. Zelené listy plní stromy, trávě se vrací její původní živý odstín, duha květin se zvedá na pláních a mystická bílá mlha zakrývá zem! ... Počkat. Mystická mlha? \"Ale ne,\" říká Inventrix s obavami, \"Zdá se, že nějaký přízrak je zdrojem této mlhy. Ou, a míří přímo k tobě.\"", "questGhostStagCompletion": "Přízrak, na první pohled nezraněn, sklání nos k zemi. Uklidňující hlas obklopí tvou družinu. \"Omlouvám se za své chování. Právě jsem se probudil ze spánku a zdá se, že mi trochu přeskočilo. Prosím, přijměte tato vejce na důkaz mé omluvy.\" Shluk vajec se objeví na trávě před přízrakem. Bez jakéhokoliv dalšího slova přízrak prchá pryč do lesa a květiny za ním opadávají.", "questGhostStagBoss": "Přízračný jelen", "questGhostStagDropDeerEgg": "Jelen (Vejce)", - "questGhostStagUnlockText": "Unlocks purchasable Deer eggs in the Market", + "questGhostStagUnlockText": "Odemyká vejce jelena na Trhu", "questRatText": "Myší král", "questRatNotes": "Nepořádek! Napříč zemí Habitica se válejí obří hromady nesplněných úkolů. Problém je tak vážný, že se všude objevily hordy myší. Všimneš si, že @Pandah jednu z nich láskyplně hladí. Vysvětlí ti, že myši jsou jemná stvoření živící se nesplněnými úkoly. Skutečným problémem je, že nesplněné úkoly spadly do stoky a vytvořily nebezpečnou jámu, kterou je třeba pročistit. Když se spouštíš do stoky, zaútočí na tebe obří myš s krvavě červenýma očima a děravými žlutými zuby a brání svojí hordu. Schoulíš se strachy, nebo se proslulému králi myší postavíš?", "questRatCompletion": "Tvůj poslední úder vysává sílu obrovité myši a její oči zešednou. Bestie se rozpadá na mnoho malinkých myší, které se bázlivě rozprchnou. Všimneš si, že za tebou stojí @Pandah a kdysi mocnou příšeru sleduje. Vysvětlí ti, že obyvatelé země Habitica byly tvou odvahou inspirováni a rychle dokončují všechny své nesplněné úkoly. Varuje tě, že musíš být na pozoru, protože když začneme být lhostejní, král myší se může vrátit. Za odměnu ti @Pandah nabízí několik myších vajec. Všimla si tvého znepokojeného výrazu a usmívá se: \"Jsou z nich skvělí mazlíčci.\"", "questRatBoss": "Myší král", "questRatDropRatEgg": "Myšák (vejce)", - "questRatUnlockText": "Unlocks purchasable Rat eggs in the Market", + "questRatUnlockText": "Odemyká vejce myšáka na Trhu", "questOctopusText": "Volání Octothulu", "questOctopusNotes": "@Urse, vyděšený mladý písař, tě požádal o pomoc při průzkumu záhadné jeskyně na břehu moře. Mezi třpytícími se tůňkami se tkví obrovská brána ze stalaktitů a stalagmitů. Když se k té bráně přibližujete, začne se u ní točit tmavý vodní vír. Užasle zíráte jak se z něj vynořuje sépiovitý drak. \"Ulepený zplozenec hvězd se probudil,\" zaječí @Urse šíleně. \"Po všech těch věcích je velký Octothulu znovu volný a lační po potěšení!\"", "questOctopusCompletion": "S posledním zásahem, se potvora vytratila do víru, ze kterého vzešla. Nejste si jistý jak se @Urse cítí, zda-li je šťastný, protože jste vyhráli nebo smutný, protože bestie zmizela. Bez jediného slova váš společník ukazuje na tři obrovská slizká vejce v nedalekém přílivovém jezírku, nacházejícím se v hroudě zlatých mincí. „Snad jsou to jen vajíčka nějakých chobotnic\", nervózně podotknete. Když se vracíte domu, @Urse šíleně čmárá do deníku, a vy tušíte, že tohle není naposledy co slyšíte o monstru zvaném „Octothulu\".", "questOctopusBoss": "Octothulu", "questOctopusDropOctopusEgg": "Chobotnice (Vejce)", - "questOctopusUnlockText": "Unlocks purchasable Octopus eggs in the Market", + "questOctopusUnlockText": "Odemyká vejce chobotnice na Trhu", "questHarpyText": "Pomoc! Harpyje!", "questHarpyNotes": "Chrabrý dobrodruh @UncommonCriminal zmizel v lese, když sledoval stopu okřídleného monstra, které bylo spatřeno před několika dny. Zrovna chcete začít hledat, když ti na ruce přistane zraněný papoušek s ošklivou jizvou přes jeho krásná peříčka. K jeho nožce je připevněn vzkaz, který vysvětluje, že @UncommonCriminal byl zahat zlou harpyjí při obranně papoušků a naléhavě potřebuje vaši pomoc. Budete sledovat papouška, přemůžete Harpyji a zachráníte @UncommonCriminal?", "questHarpyCompletion": "Poslední zásah harpyji srazí k zemi a všude kolem létá peří. Rychle vylezete do jejího hnízda, kde najdete @UncommonCriminal obklopeného papouščími vejci. Jako tým rychle přenesete vajíčka do nedalekých hnízd. Zjizvený papoušek, který vás našel, hlasitě zapíská a upustí několik vajec do vašich rukou. \"Kvůli útoku harpyje potřebují tato vejce ochranu,\" vysvětluje @UcommonCriminal. \"Zdá se, že jste se stali čestnými papoušky.\"", "questHarpyBoss": "Harpyje", "questHarpyDropParrotEgg": "Papoušek (vajíčko)", - "questHarpyUnlockText": "Unlocks purchasable Parrot eggs in the Market", + "questHarpyUnlockText": "Odemyká vejce papouška na Trhu", "questRoosterText": "Kohoutí řádění", "questRoosterNotes": "Léta používal farmář @extrajordanary kohouty jako budíček. Ale nyní se objevil obrovský kohout, který kokrhá hlasitěji než kterýkoliv kohout před ním - a budí všechny v zemi Habitica! Habiťané trpící nedostatkem spánkem zápolí se svými denními úkoly. @Pandoro se rozhodne, že nastal čas to kokrhání zastavit. \"Prosím, je tu někdo, kdo dokáže naučit toho kohouta kokrhat tišeji?\" Přihlásíte se dobrovolně a jednoho rána se ke kohoutu přiblížíte - ale on se otočí mávajíce svými obřími křídly, ukazuje své ostré drápy a kokrhá bojový pokřik.", "questRoosterCompletion": "S finesou a silou jste zkrotili to divoké zvíře. Jeho uši, předtím zacpané peřím a napůl zapomenutými úkoly, jsou nyní úplně čisté. Potichu na vás zakokrhá a nabídne vám zobák k pohlazení. Následující den jste připraveni pokračovat dále v cestě, ale @EmeraldOx k vám běží se zakrytým košíkem. \"Počkejte! Ráno jsem šel do kurníku a našel jsem tato vejce u dveří. Myslím, že ten kohout chce, abyste si je vzali.\" Odkryjete košík a uvidíte jemně zabarvená vejce.", "questRoosterBoss": "Kohout", "questRoosterDropRoosterEgg": "Kohout (vejce)", - "questRoosterUnlockText": "Unlocks purchasable Rooster eggs in the Market", + "questRoosterUnlockText": "Odemyká vejce kohouta na Trhu", "questSpiderText": "Ledový Arachnid", "questSpiderNotes": "Počasí je stále chladnější a na oknech Habiťanů se objevují ledové pavučinky.... Až na @Arcosine, jehož okna jsou úplně zamrzlá, protože u něj přebývá Mrazivý pavouk. Ajéje.", "questSpiderCompletion": "Ledový pavouk padá na zem a zanechává za sebou malou kupičku ledu a několik kouzelných váčků s vajíčky. @Arcosine vám je až skoro moc rychle nabídne jako odměnu -- možná byste z nich mohli vychovat hodné pavoučí mazlíčky?", "questSpiderBoss": "Pavouk", "questSpiderDropSpiderEgg": "Pavouk (vejce)", - "questSpiderUnlockText": "Unlocks purchasable Spider eggs in the Market", - "questGroupVice": "Vice the Shadow Wyrm", + "questSpiderUnlockText": "Odemyká vejce pavouka na Trhu", + "questGroupVice": "Zlořád, Stínový Drak", "questVice1Text": "Zlořád, část 1: Osvoboď se od vlivu draka", - "questVice1Notes": "

They say there lies a terrible evil in the caverns of Mt. Habitica. A monster whose presence twists the wills of the strong heroes of the land, turning them towards bad habits and laziness! The beast is a grand dragon of immense power and comprised of the shadows themselves: Vice, the treacherous Shadow Wyrm. Brave Habiteers, stand up and defeat this foul beast once and for all, but only if you believe you can stand against its immense power.

Vice Part 1:

How can you expect to fight the beast if it already has control over you? Don't fall victim to laziness and vice! Work hard to fight against the dragon's dark influence and dispel his hold on you!

", + "questVice1Notes": "

Říká se, že v jeskyních hory Habitica leží zlo. Stvůra, jejíž přítomnost svádí silné hrdiny země k lenosti a špatným zvykům! Tou stvůrou je obrovský ze stínů zrozený drak nepředstavitelné síly: Zlořád, zrádný Stínový Drak. Chrabří Habiťané, postavte se mu a zdolejte tuto příšernou stvůru jednou provždy. Ale pouze pokud věříte, že se dokážete postavit jeho nezměrné síle.

Zlořád část 1:

Jak chceš bojovat se stvůrou, když už nad tebou má moc? Nepodlehni lenosti a zlozvykům! Tvrdě pracuj, abys mohl odolat drakovu temnému vlivu a přemohl jeho vliv na tebe!

", "questVice1Boss": "Zlořádův stín", "questVice1DropVice2Quest": "Zlořád část 2 (svitek)", "questVice2Text": "Zlořád, část 2: Najdi drakovo doupě", @@ -69,22 +69,22 @@ "questVice2DropVice3Quest": "Zlořád část 3. (svitek)", "questVice3Text": "Zlořád, část 3: Zlořád se probouzí", "questVice3Notes": "Po dlouhém snažení objevila tvá družina Zlořádovo doupě. Mohutná stvůra se zadívá na tvou družinu s nelibostí. Kolem vás se točí stíny a v hlavě slyšíte hlas \"Více bláznivých obyvatel země Habitica mě přišlo zastavit? Roztomilé. Přišel by sem jen blázen.\" Šupinatý titán stáhne hlavu zpět a připaví se k útoku. Tohle je vaše šance! Dejte mu vše, co ve vás je a přemožte ho jednou pro vždy!", - "questVice3Completion": "The shadows dissipate from the cavern and a steely silence falls. My word, you've done it! You have defeated Vice! You and your party may finally breathe a sigh of relief. Enjoy your victory, brave Habiteers, but take the lessons you've learned from battling Vice and move forward. There are still Habits to be done and potentially worse evils to conquer!", + "questVice3Completion": "Stíny se rozptýlí z jeskyně a padne železné ticho. Páni, dokázali jste to! Porazili jste Zlořáda! Ty a tvá družina si můžete konečně vydechnout. Užijte si své vítězství, chrabří Habiťané, ale vezměte si k srdci lekce, které jste dostali v boji se Zlořádem a jděte dál. Stále tu jsou zvyky, které musí být splněny a potenciálně horší zla ke zdolání!", "questVice3Boss": "Zlořád, stínový drak", "questVice3DropWeaponSpecial2": "Dračí hůl Stephena Webera", "questVice3DropDragonEgg": "Drak (vejce)", "questVice3DropShadeHatchingPotion": "Stínový líhnoucí lektvar", - "questGroupMoonstone": "Recidivate Rising", - "questMoonstone1Text": "Recidivate, Part 1: The Moonstone Chain", - "questMoonstone1Notes": "A terrible affliction has struck Habiticans. Bad Habits thought long-dead are rising back up with a vengeance. Dishes lie unwashed, textbooks linger unread, and procrastination runs rampant!

You track some of your own returning Bad Habits to the Swamps of Stagnation and discover the culprit: the ghostly Necromancer, Recidivate. You rush in, weapons swinging, but they slide through her specter uselessly.

\"Don’t bother,\" she hisses with a dry rasp. \"Without a chain of moonstones, nothing can harm me – and master jeweler @aurakami scattered all the moonstones across Habitica long ago!\" Panting, you retreat... but you know what you must do.", + "questGroupMoonstone": "Recidiva Povstává", + "questMoonstone1Text": "Recidiva, část 1.: Řetěz Měsíčních kamenů", + "questMoonstone1Notes": "Strašlivé neštěstí sužuje Habiťany. Špatné návyky, které byly pokládány za již dávno mrtvé, se vrací k životu a mstí se. Neumyté nádobí se povaluje kolem, nikdo se nevěnuje knihám a flákání nekontrolovatelně řádí!

Sleduješ pár svých starých zlozvyků až do Bažiny Stagnace a objevíš, kdo za tím stojí - přízračný Nekromant, Recidiva. Vpadneš tam, zbraně sviští vzduchem, ale nekromantem jen zbytečně projíždí.

\"Neobtěžuj se,\" zasyčí na tebe. \"Bez řetězu z měsíčních kamenů se na nic nezmůžeš - a hlavní klenotník @aurakami rozházel měsíční kameny po zemi Habitica už před mnoha lety!\" Lapajíc po dechu ustupuješ... ale už víš, co musíš udělat.", "questMoonstone1CollectMoonstone": "Měsíční kameny", - "questMoonstone1DropMoonstone2Quest": "Recidivate, Part 2: Recidivate the Necromancer (Scroll)", - "questMoonstone2Text": "Recidivate, Part 2: Recidivate the Necromancer", - "questMoonstone2Notes": "The brave weaponsmith @Inventrix helps you fashion the enchanted moonstones into a chain. You’re ready to confront Recidivate at last, but as you enter the Swamps of Stagnation, a terrible chill sweeps over you.

Rotting breath whispers in your ear. \"Back again? How delightful...\" You spin and lunge, and under the light of the moonstone chain, your weapon strikes solid flesh. \"You may have bound me to the world once more,\" Recidivate snarls, \"but now it is time for you to leave it!\"", + "questMoonstone1DropMoonstone2Quest": "Recidiva, část 2.: Nekromant Recidiva (Svitek)", + "questMoonstone2Text": "Recidiva, část 2.: Nekromant Recidiva", + "questMoonstone2Notes": "Chrabrý zbrojíř @Inventrix ti pomůže uspořádat kouzelné měsíční kameny do řetězu. Jsi připraven postavit se Recidivě, ale jakmile vstoupíš do Bažin Stagnace, přejede ti mráz po zádech.

Hnilobný dech ti do ucha zašeptá. \"Už jsi zpátky? Jak úžasné...\" Otočíš se a vydechneš, a pod světlem měsíčních kamenů, tvá zbraň zakousne maso. \"Možná jsi mě znovu připoutal znovu ke světu\" zavrčí Recidiva, \"ale nyní je na čase, abys tento svět opustil!\"", "questMoonstone2Boss": "Nekromancr", - "questMoonstone2DropMoonstone3Quest": "Recidivate, Part 3: Recidivate Transformed (Scroll)", - "questMoonstone3Text": "Recidivate, Part 3: Recidivate Transformed", - "questMoonstone3Notes": "Recidivate crumples to the ground, and you strike at her with the moonstone chain. To your horror, Recidivate seizes the gems, eyes burning with triumph.

\"Foolish creature of flesh!\" she shouts. \"These moonstones will restore me to a physical form, true, but not as you imagined. As the full moon waxes from the dark, so too does my power flourish, and from the shadows I summon the specter of your most feared foe!\"

A sickly green fog rises from the swamp, and Recidivate’s body writhes and contorts into a shape that fills you with dread – the undead body of Vice, horribly reborn.", + "questMoonstone2DropMoonstone3Quest": "Recidiva, část 3.: Recidiva Transformován (Svitek)", + "questMoonstone3Text": "Recidiva, část 3.: Recidiva Transformován", + "questMoonstone3Notes": "Recidiva padá k zemi a ty jej zasáhneš řetězem z měsíčních kamenů. K tvému nemilému překvapení ti Recidiva kameny vezme a v očích ji žhne triumf.

\"Blázne z masa a kostí!\" křičí. \"Tyto měsíční kameny mne učiní smrtelným, to ano, ale ne tak, jak doufáš. Stejně jako úplněk přibývá z temnoty i má moc roste a ze stínů přivolám stvoření, jehož se nejvíce obáváš!\"

Hnusná zelená mlha se zvedá z bažiny a tělo Recidivy se zmítá a mění se ve tvar, který ve vás vzbuzuje hrůzu - nemrtvé tělo Zlořáda.", "questMoonstone3Completion": "Your breath comes hard and sweat stings your eyes as the undead Wyrm collapses. The remains of Recidivate dissipate into a thin grey mist that clears quickly under the onslaught of a refreshing breeze, and you hear the distant, rallying cries of Habiticans defeating their Bad Habits for once and for all.

@Baconsaur the beast master swoops down on a gryphon. \"I saw the end of your battle from the sky, and I was greatly moved. Please, take this enchanted tunic – your bravery speaks of a noble heart, and I believe you were meant to have it.\"", "questMoonstone3Boss": "Nekro-Zlořád", "questMoonstone3DropRottenMeat": "Zkažené maso (jídlo)", @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/cs/spells.json b/website/common/locales/cs/spells.json index e8d3d8d34e..dcf45209f0 100644 --- a/website/common/locales/cs/spells.json +++ b/website/common/locales/cs/spells.json @@ -1,55 +1,55 @@ { "spellWizardFireballText": "Vzplanutí ohňů", - "spellWizardFireballNotes": "You summon XP and deal fiery damage to Bosses! (Based on: INT)", + "spellWizardFireballNotes": "Vyvoláš zkušenosti a uštědříš Bossům ohnivý zásah! (Vypočteno na základě: INT)", "spellWizardMPHealText": "Éterický příval", - "spellWizardMPHealNotes": "You sacrifice mana so the rest of your Party gains MP! (Based on: INT)", + "spellWizardMPHealNotes": "Obětuješ manu, aby ostatní členové tvé družiny získali MP! (Vypočteno na základě: INT)", "spellWizardEarthText": "Zemětřesení", - "spellWizardEarthNotes": "Your mental power shakes the earth and buffs your Party's Intelligence! (Based on: Unbuffed INT)", + "spellWizardEarthNotes": "Tvá psychická síla otřásá zemí a tvá družina získává bonus k Inteligenci! (Vypočteno na základě: INT před bonusem)", "spellWizardFrostText": "Ledový mráz", - "spellWizardFrostNotes": "With one cast, ice freezes all your streaks so they won't reset to zero tomorrow!", + "spellWizardFrostNotes": "S jedním sesláním kouzla led zmrazil všechny tvé série, takže se žádná zítra nezresetuje na 0!", "spellWizardFrostAlreadyCast": "Toto kouzlo už jsi dnes seslal. Tvé série jsou zmraženy a tak není důvod sesílat tohle kouzlo znovu.", "spellWarriorSmashText": "Brutální rána", - "spellWarriorSmashNotes": "You make a task more blue/less red and deal extra damage to Bosses! (Based on: STR)", + "spellWarriorSmashNotes": "Úkoly ti více zmodrají/méně zčervenají, a uštědříš extra poškození Bossům! (Vypočteno na základě: SÍL)", "spellWarriorDefensiveStanceText": "Obranný postoj", - "spellWarriorDefensiveStanceNotes": "You crouch low and gain a buff to Constitution! (Based on: Unbuffed CON)", + "spellWarriorDefensiveStanceNotes": "Přikrčíš se a získáš tak bonus k Obraně! (Vypočteno na základě: OBR před bonusem)", "spellWarriorValorousPresenceText": "Chrabrá přítomnost", - "spellWarriorValorousPresenceNotes": "Your boldness buffs your whole Party's Strength! (Based on: Unbuffed STR)", + "spellWarriorValorousPresenceNotes": "Tvá odvaha přidá bonus k Síle celé tvé družině! (Vypočteno na základě: SÍL před bonusem)", "spellWarriorIntimidateText": "Zastrašující pohled", - "spellWarriorIntimidateNotes": "Your fierce stare buffs your whole Party's Constitution! (Based on: Unbuffed CON)", + "spellWarriorIntimidateNotes": "Tvůj nebojácný pohled přidá bonus k Obraně celé tvé družiny! (Vypočteno na základě: OBR před bonusem)", "spellRoguePickPocketText": "Vybrat kapsy", - "spellRoguePickPocketNotes": "You rob a nearby task and gain gold! (Based on: PER)", + "spellRoguePickPocketNotes": "Okradeš blízký úkol a získáš zlato! (Vypočteno na základě: VNM)", "spellRogueBackStabText": "Kudla do zad", - "spellRogueBackStabNotes": "You betray a foolish task and gain gold and XP! (Based on: STR)", + "spellRogueBackStabNotes": "Podvedeš naivní úkol a získáš zlato a zkušenosti! (Vypočteno na základě: SÍL)", "spellRogueToolsOfTradeText": "Nástroje k obchodování", - "spellRogueToolsOfTradeNotes": "Your tricky talents buff your whole Party's Perception! (Based on: Unbuffed PER)", + "spellRogueToolsOfTradeNotes": "Tvé lstivé talenty přidají bonus celé tvé družině k Vnímání! (Vypočteno na základě: VNM před bonusem)", "spellRogueStealthText": "Plížení", - "spellRogueStealthNotes": "With each cast, a few of your undone Dailies won't cause damage tonight. Their streaks and colors won't change. (Based on: PER)", + "spellRogueStealthNotes": "S každým sesláním kouzla ti pár z tvých nesplněných úkolů dnes v noci neublíží. Jejich série a barva zůstane nezměněna. (Vypočteno na základě: VNM)", "spellRogueStealthDaliesAvoided": "<%= originalText %> Počet denních úkolů, kterým ses vyhnul: <%= number %>.", "spellRogueStealthMaxedOut": "Už ses vyhnul všem svým denním úkolům, takže není důvod tuto schopnost používat znovu.", "spellHealerHealText": "Léčivé světlo", - "spellHealerHealNotes": "Shining light restores your health! (Based on: CON and INT)", + "spellHealerHealNotes": "Zářivé světlo obnovuje tvé zdraví! (Vypočteno na základě: OBR a INT)", "spellHealerBrightnessText": "Spalující záře", - "spellHealerBrightnessNotes": "A burst of light makes your tasks more blue/less red! (Based on: INT)", + "spellHealerBrightnessNotes": "Záblesk světla změní tvé úkoly na více modré/méně červené! (Vypočteno na základě: INT)", "spellHealerProtectAuraText": "Ochranná aura", - "spellHealerProtectAuraNotes": "You shield your Party by buffing their Constitution! (Based on: Unbuffed CON)", + "spellHealerProtectAuraNotes": "Zaštítíš tvoji družinu tím, že jim přidáš bonus k jejich Obraně! (Vypočteno na základě: OBR před bonusem)", "spellHealerHealAllText": "Požehnání", - "spellHealerHealAllNotes": "Your soothing spell restores your whole Party's health! (Based on: CON and INT)", + "spellHealerHealAllNotes": "Tvé uklidňující kouzlo obnovuje celé tvé družině zdraví! (Vypočteno na základě: OBR a INT)", "spellSpecialSnowballAuraText": "Sněhová koule", - "spellSpecialSnowballAuraNotes": "Turn a friend into a frosty snowman!", + "spellSpecialSnowballAuraNotes": "Změň svého kamaráda na mrazivého sněhuláka!", "spellSpecialSaltText": "Sůl", - "spellSpecialSaltNotes": "Reverse the spell that made you a snowman.", + "spellSpecialSaltNotes": "Zvrať kouzlo, které z tebe udělalo sněhuláka.", "spellSpecialSpookySparklesText": "Strašidelné jiskry", - "spellSpecialSpookySparklesNotes": "Turn your friend into a transparent pal!", + "spellSpecialSpookySparklesNotes": "Proměň svého kamaráda na průhledného parťáka!", "spellSpecialOpaquePotionText": "Neprůhledný lektvar", - "spellSpecialOpaquePotionNotes": "Reverse the spell that made you transparent.", + "spellSpecialOpaquePotionNotes": "Zvrať kouzlo, které tě udělalo průhledným.", "spellSpecialShinySeedText": "Třpytivé semínko", "spellSpecialShinySeedNotes": "Změň svého kamaráda na veselou kytičku!", "spellSpecialPetalFreePotionText": "Bezlístečkový lektvar", - "spellSpecialPetalFreePotionNotes": "Reverse the spell that made you a flower.", + "spellSpecialPetalFreePotionNotes": "Zvrať kouzlo, které z tebe udělalo kytku.", "spellSpecialSeafoamText": "Mořská pěna", "spellSpecialSeafoamNotes": "Přeměň svého kamaráda na mořskou příšerku!", "spellSpecialSandText": "Písek", - "spellSpecialSandNotes": "Reverse the spell that made you a sea star.", + "spellSpecialSandNotes": "Zvrať kouzlo, které z tebe udělalo mořskou hvězdu.", "spellNotFound": "Schopnost „<%= spellId %>\" nenalezena.", "partyNotFound": "Družina nenalezena", "targetIdUUID": "„cílovéId\" musí být platné ID uživatele. ", diff --git a/website/common/locales/cs/subscriber.json b/website/common/locales/cs/subscriber.json index 37e8adaab3..aa928c2d86 100644 --- a/website/common/locales/cs/subscriber.json +++ b/website/common/locales/cs/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Standardní steampunkový set", "mysterySet301405": "Set steampunkových doplňků", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/da/character.json b/website/common/locales/da/character.json index 763d4ca1e6..249a7ee08d 100644 --- a/website/common/locales/da/character.json +++ b/website/common/locales/da/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Klassebonus", "battleGear": "Kampudstyr", + "gear": "Gear", "battleGearText": "Dette er den udrustning du bærer i kamp. Den påvirker resultaterne når du interagerer med dine opgaver.", "autoEquipBattleGear": "Benyt automatisk nyt udstyr", "costume": "Kostume", diff --git a/website/common/locales/da/faq.json b/website/common/locales/da/faq.json index 803a019f74..e4ea9c5128 100644 --- a/website/common/locales/da/faq.json +++ b/website/common/locales/da/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Hvordan spiller jeg Habitica med mine venner?", "iosFaqAnswer5": "Den bedste måde at gøre det på er ved at invitere dem til din gruppe! Grupper kan lave quests, kæmpe mod monstre, og kaste evner for at hjælpe hinanden. Gå til [Menu > Party] og vælg \"Create New Party\" hvis du ikke allerede har en gruppe. Vælg da listen over medlemmer, og tryk på \"Inviter\" i de øverste højre hjørne for at invitere dine venner ved enten at skrive deres Bruger ID (en serie af tal og bogstaver, de kan finde under [Indstillinger > Kontodetaljer] på app'en, og [Settings > API] på hjemmesiden. På hjemmesiden kan du også invitere dine venner via email, hvilket vi også vil gøre muligt på app'en i fremtiden.\n\nPå hjemmesiden kan du og dine venner også melde jer ind i klaner, der er offentlige chatrooms. Klaner vil også blive en del af app'en i fremtiden!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Hvordan får jeg et kæledyr eller ridedyr?", "iosFaqAnswer6": "Ved Niveau 3 aktiveres Dropsystemet. Hver gang du fuldfører en opgave, vil du have en tilfældig chance for at modtage et æg, en udrugningseleksir, eller et stykke mad. De vil opbevares i Menu > Genstande.\n\n For at udruge et kæledyr skal du bruge et æg og en udrugningseleksir. Klik på ægget for at afklare hvilken art du vil udruge, og klik så på \"Udrug Æg\". Vælg derefter en udrugningseleksir for at vælge dens farve! Gå til menu > Kæledyr for at tilføje dit nye kæledyr på din avatar ved at klikke på det.\n\n Du kan også opfostre dine kæledyr til Ridedyr ved at fodre dem under Menu > Kæledyr. Tryk på et Kæledyr og vælg \"Fodr Kæledyr\"! Du skal fodre et kæledyr mange gange før det bliver et Ridedyr, men hvis du kan regne ud hvilken slags mad det kan lide, vil det vokse langt hurtigere. Prøv dig frem, eller [se løsningen her](http://habitica.wikia.com/wiki/Food#Food_Preferences). Når du har et Ridedyr, så gå til Menu > Ridedyr og klik på den for at tilføje den til din avatar.\n\n Du kan også få æg til Quest-Kæledyr ved at fuldføre visse Quests. (Se herunder for at få mere at vide om Quests.)", "androidFaqAnswer6": "Ved Niveau 3 aktiveres Dropsystemet. Hver gang du fuldfører en opgave, vil du have en tilfældig chance for at modtage et æg, en udrugningseleksir, eller et stykke mad. De vil opbevares i Menu > Genstande.\n\n For at udruge et kæledyr skal du bruge et æg og en udrugningseleksir. Klik på ægget for at afklare hvilken art du vil udruge, og klik så på \"Udrug Æg\". Vælg derefter en udrugningseleksir for at vælge dens farve! For at tilføje et nyt Kæledyr skal du gå til Menu > Stald > Kæledyr, vælge en art, klikke på det Kæledyr du ønsker og vælge \"Brug\" (Din avatar opdateres ikke med det nye valg).\n\n Du kan også opfostre dine kæledyr til Ridedyr ved at fodre dem under Menu Stald [ > Kæledyr ]. Tryk på et Kæledyr og vælg \"Fodr\"! Du skal fodre et kæledyr mange gange før det bliver et Ridedyr, men hvis du kan regne ud hvilken slags mad det kan lide, vil det vokse langt hurtigere. Prøv dig frem, eller [se løsningen her](http://habitica.wikia.com/wiki/Food#Food_Preferences). For at tilføje dit Ridedyr skal du gå til Menu > Stald > Ridedyr, klikke på det Ridedyr du vil ønsker og vælge \"Brug\" (Din avatar opdateres ikke med det nye valg).\n\n Du kan også få æg til Quest-Kæledyr ved at fuldføre visse Quests. (Se herunder for at få mere at vide om Quests.)", diff --git a/website/common/locales/da/gear.json b/website/common/locales/da/gear.json index 074f87e42b..8818ac5d7a 100644 --- a/website/common/locales/da/gear.json +++ b/website/common/locales/da/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk-dragt", "armorMystery301404Notes": "Nydelig og elegant, selvfølgelig! Giver ingen bonusser. Februar 3015 Abonnentting.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Smart Tophat", "headMystery301404Notes": "En smart tophat for de fineste folk! Giver ingen bonusser. Januar 3015 Abonnentting.", "headMystery301405Text": "Simpel Tophat", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Urskjold", "shieldMystery301405Notes": "Tiden er på din side med dette tårnhøje urskjold. Giver ingen bonusser. Juni 3015 Abonnentting.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/da/generic.json b/website/common/locales/da/generic.json index 6278f06bb1..9d844b91ba 100644 --- a/website/common/locales/da/generic.json +++ b/website/common/locales/da/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Tema", "audioTheme_beatscribeNesTheme": "Beatscribes NES Tema", "audioTheme_arashiTheme": "Arashis Tema", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/da/groups.json b/website/common/locales/da/groups.json index 1009e579e3..f5995643be 100644 --- a/website/common/locales/da/groups.json +++ b/website/common/locales/da/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Et godt selskab", "partyUpText": "Sluttede sig til en Gruppe med en anden! Hav det sjovt med at bekæmpe monstre og støtte hinanden.", "partyOnText": "Sluttede sig til en gruppe med mindst fire personer! Nyd at du har flere at stå til regnskab for mens du og dine venner går sammen for at besejre jeres fjender!", - "largeGroupNote": "Bemærk: Denne klan er for stor til at understøtte notifikationer. Sørg for at kikke forbi hver dag for at se nye beskeder.", "groupIdRequired": "\"groupId\" skal være et gyldigt Unikt Bruger-ID", "groupNotFound": "Gruppen blev ikke fundet eller du har ikke adgang.", "groupTypesRequired": "Du skal angive en gyldig \"type\" forespørgelses-string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Manglende bruger-id i invitationen", "inviteMustNotBeEmpty": "Invitér må ikke være tomt.", "partyMustbePrivate": "Grupper skal være private", - "userAlreadyInGroup": "Bruger er allerede i den gruppe.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Du kan ikke invitere dig selv til en gruppe.", - "userAlreadyInvitedToGroup": "Bruger er allerede inviteret til den gruppe.", - "userAlreadyPendingInvitation": "Bruger har allerede en afventede invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Bruger med id'et \"<%= userId %>\" blev ikke fundet.", "userHasNoLocalRegistration": "Bruger har ikke en lokal registrering (brugernavn, email, kodeord).", "uuidsMustBeAnArray": "Invitationer via Bruger-ID skal være en tabel.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/da/limited.json b/website/common/locales/da/limited.json index 0adcc7ec94..cd13031b78 100644 --- a/website/common/locales/da/limited.json +++ b/website/common/locales/da/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Åh.... Velkommen til Sæson-markedet... Vi har efterårs-sæson varer, eller noget... Alting her kan købes under Efterårsfestival-eventet hvert år, men vi har kun åbent indtil den 31. oktober... Du burde nok købe ind nu, ellers vil du skulle vente... og vente... og vente... *suk*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Hvis du har købt noget af detteudstyr før, men ikke ejer det i øjeblikket, kan du genkøbe det i Belønningskolonnen. I starten vil du kun kunne købe de ting der passer til din nuværende klasse (Kriger som standard), men frygt ej, de andre klasse-specifikke varer bliver tilgængelige hvis du skifter til den klasse.", "candycaneSet": "Slikstok (Magiker)", "skiSet": "Ski-morder (Slyngel)", diff --git a/website/common/locales/da/questscontent.json b/website/common/locales/da/questscontent.json index 61ae664ca9..ac2506c424 100644 --- a/website/common/locales/da/questscontent.json +++ b/website/common/locales/da/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/da/subscriber.json b/website/common/locales/da/subscriber.json index 565d982ea7..507b562cc2 100644 --- a/website/common/locales/da/subscriber.json +++ b/website/common/locales/da/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standardsæt", "mysterySet301405": "Steampunk Tilbehørssæt", "mysterySet301703": "Påfugle-Steampunk-sæt", diff --git a/website/common/locales/de/backgrounds.json b/website/common/locales/de/backgrounds.json index 8918096c2e..8173e3debe 100644 --- a/website/common/locales/de/backgrounds.json +++ b/website/common/locales/de/backgrounds.json @@ -178,7 +178,7 @@ "backgroundLilypadText": "Seerosenblatt", "backgroundLilypadNotes": "Hüpfe auf ein Seerosenblatt.", "backgroundWaterfallRockText": "Wasserfall-Felsen", - "backgroundWaterfallRockNotes": "Plantsche auf einem Wasserfall-Felsen herum.", + "backgroundWaterfallRockNotes": "Plansche auf einem Wasserfall-Felsen herum.", "backgrounds072016": "Set 26: Veröffentlicht im Juli 2016", "backgroundAquariumText": "Aquarium", "backgroundAquariumNotes": "Hüpf in ein Aquarium.", diff --git a/website/common/locales/de/character.json b/website/common/locales/de/character.json index 7cd3d7468c..baeff92e53 100644 --- a/website/common/locales/de/character.json +++ b/website/common/locales/de/character.json @@ -1,5 +1,5 @@ { - "communityGuidelinesWarning": "Bitte denke daran, dass Dein angezeigter Name, Dein Profilbild und Dein Profiltext die Community-Richtlinien einhalten müssen (d.h. keine Schimpfwörter, keine sexuellen Themen, keine Beleidigungen, usw.). Wenn Du Fragen willst, ob etwas angebracht ist oder nicht, schreibe einfach eine E-Mail an <%= hrefBlankCommunityManagerEmail %>!", + "communityGuidelinesWarning": "Bitte denke daran, dass Dein angezeigter Name, Dein Profilbild und Dein Profiltext die Community-Richtlinien einhalten müssen (d.h. keine Schimpfwörter, keine sexuellen Themen, keine Beleidigungen, usw.). Wenn Du fragen willst, ob etwas angebracht ist oder nicht, schreibe einfach eine E-Mail an <%= hrefBlankCommunityManagerEmail %>!", "profile": "Profil", "avatar": "Avatar anpassen", "editAvatar": "Avatar bearbeiten", @@ -53,7 +53,7 @@ "spookySkins": "Unheimliche Hautfarben", "supernaturalSkins": "Übernatürliche Hautfarben", "splashySkins": "Sensationelle Hautfarben", - "winterySkins": "Winter-Hautfarben", + "winterySkins": "Winterliche Hautfarben", "rainbowColors": "Regenbogenfarben", "shimmerColors": "‎Schimmernde Farben", "hauntedColors": "Spukfarben", @@ -64,16 +64,17 @@ "classBonusText": "Deine Klasse (Krieger, wenn Du keine andere Klasse freigeschaltet oder gewählt hast) kann ihre eigene Ausrüstung besser nutzen, als die Ausrüstung anderer Klassen. Ausrüstung Deiner aktuellen Klasse verleiht einen 50% größeren Attributbonus als klassenfremde Ausrüstung.", "classEquipBonus": "Klassenbonus", "battleGear": "Kampfausrüstung", + "gear": "Gear", "battleGearText": "Das ist Deine Kampfausrüstung; sie beeinflusst Zahlen, wenn Du mit Deinen Aufgaben interagierst.", "autoEquipBattleGear": "Neue Ausrüstung automatisch verwenden", "costume": "Verkleidung", "costumeText": "Wenn Du das Aussehen einer anderen Ausrüstung Deiner Kampfausrüstung vorziehst, dann klicke auf die \"Verkleidung tragen\" Box um über Deiner Kampfausrüstung andere Ausrüstungsgegenstände zu tragen.", "useCostume": "Verkleidung tragen", - "useCostumeInfo1": "Click \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can equip for the best Stats on the left, and dress up your avatar with your equipment on the right.", + "useCostumeInfo1": "Drücke auf \"Verwende Kostüm\" um deinem Avatar Ausrüstung anzulegen, ohne dass diese die Statuswerte deiner Kampf-Ausrüstung beeinträchtigt! Das heißt, während du dich links für die besten Statuswerte ausrüstest, kannst du rechts deinen Avatar opitsch anpassen. ", "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your Stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", - "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", + "costumePopoverText": "Wähle \"Kostüm nutzen\", um Deinen Avatar mit Ausrüstung auszustatten, ohne die Werte Deiner Kampfausrüstung zu beeinflussen! Damit kannst Du Deinen Avatar anziehen, wie Du willst und gleichzeitig Deine beste Kampfausrüstung angelegt haben. ", "autoEquipPopoverText": "Wähle diese Option um Ausrüstung automatisch anzulegen, sobald Du sie erworben hast.", - "costumeDisabled": "Du hast Deine Kostümoption abgeschaltet.", + "costumeDisabled": "Du hast dein Kostüm deaktiviert. ", "gearAchievement": "Du hast den Erfolg \"Ultimative Ausrüstung\" erhalten, da Du die beste Ausrüstung erworben hast! Du hast die folgenden Sets vollständig:", "moreGearAchievements": "Um noch mehr Ultimative Ausrüstung Abzeichen zu erhalten, wechsle die Klasse auf der Einstellungen > Seite Seite und kaufe die Ausrüstung Deiner neuen Klasse!", "armoireUnlocked": "Sieh' Dir den Verzauberten Schrank für weitere Ausrüstung an! Klicke auf die Belohnung: \"Verzauberter Schrank\" um eine zufällige Ausrüstung zu erhalten! Du kannst auch zufällige Erfahrungspunkte oder Nahrung bekommen.", @@ -99,7 +100,7 @@ "allocateInt": "Zugewiesene Intelligenzpunkte:", "allocateIntPop": "Erhöhe Intelligenz um einen Punkt", "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", - "stats": "Werte", + "stats": "Statuswerte", "achievs": "Erfolge", "strength": "Stärke", "strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.", @@ -110,7 +111,7 @@ "intelligence": "Intelligenz", "intText": "Intelligenz erhöht die Erfahrungspunkte die Du erhältst und bestimmt wieviel Mana Dir maximal zur Verfügung steht, sobald Du das Klassensystem freigeschaltet hast.", "levelBonus": "Levelbonus", - "levelBonusText": "Each Stat gets a bonus equal to half of (your Level minus 1).", + "levelBonusText": "Jeder Statuswert bekommt einen Bonus der so groß ist wie die Hälfte von (Deinem Level minus 1). ", "allocatedPoints": "Verteilte Punkte", "allocatedPointsText": "Stat Points you've earned and assigned. Assign Points using the Character Build column.", "allocated": "Verteilt", @@ -130,15 +131,15 @@ "changeClassConfirmCost": "Bist Du Dir sicher, dass Du deine Klasse für 3 Edelsteine wechseln möchtest?", "invalidClass": "Ungültige Klasse. Bitte gib 'warrior', 'rogue', 'wizard' oder 'healer' an.", "levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.", - "unallocated": "Freie Attributpunkte", + "unallocated": "Freie Attributspunkte", "haveUnallocated": "Du hast <%= points %> freie(n) Attributpunkt(e)", "autoAllocation": "Verteilungsmuster", "autoAllocationPop": "Places Points into Stats according to your preferences, when you level up.", - "evenAllocation": "Attributpunkte gleichmäßig verteilen", - "evenAllocationPop": "Weist jedem Attribut die gleiche Anzahl an Punkten zu.", + "evenAllocation": "Attributspunkte gleichmäßig verteilen", + "evenAllocationPop": "Weist jedem Statuswert die gleiche Anzahl an Punkten zu.", "classAllocation": "Punkte anhand der Klasse verteilen", - "classAllocationPop": "Weist mehr Punkte den Attributen zu, die wichtig für Deine Klasse sind.", - "taskAllocation": "Distribute Points based on task activity", + "classAllocationPop": "Weist den Statuswerten die wichtig für deine Klasse sind, mehr Punkte zu.", + "taskAllocation": "Verteile Punkte abhängig von Aufgaben Aktivität.", "taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.", "distributePoints": "Verteile freie Punkte automatisch", "distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.", @@ -161,22 +162,22 @@ "respawn": "Auferstehen!", "youDied": "Du bist gestorben!", "dieText": "Du hast ein Level, Dein gesamtes Gold und einen zufälliges Teil Deiner Ausrüstung verloren. Erhebe Dich, Habiticaner, und versuche es erneut! Gebiete diesen schlechten Gewohnheiten Einhalt, sei gewissenhaft bei der Erfüllung Deiner täglichen Aufgaben und halte Dir den Tod mit Heiltränken vom Leib, wenn Du einmal straucheln solltest!", - "sureReset": "Are you sure? This will reset your character's class and allocated Stat Points (you'll get them all back to re-allocate), and costs 3 Gems.", + "sureReset": "Bist Du sicher? Dies wird Deine Klasse und Attributpunkte zurücksetzen (Du erhältst alle Punkte zurück und kannst sie neu zuzuweisen). Es kostet 3 Edelsteine.", "purchaseFor": "Für <%= cost %> Edelsteine erwerben?", - "purchaseForHourglasses": "Gegen <%= cost %> Sanduhren eintauschen?", + "purchaseForHourglasses": "Kaufe für <%= cost %> Sanduhr/en?", "notEnoughMana": "Nicht genug Mana.", - "invalidTarget": "Du kannst Deine Fähigkeit hierauf nicht anwenden.", + "invalidTarget": "Du kannst hierrauf keine Fähigkeit verwenden.", "youCast": "Du verwendest <%= spell %>.", "youCastTarget": "Du wendest <%= spell %> auf <%= target %> an.", "youCastParty": "Du wendest <%= spell %> auf Deine Gruppe an.", "critBonus": "Kritischer Treffer! Bonus:", - "gainedGold": "Du hast etwas Gold erhalten", + "gainedGold": "Du hast etwas Gold erlangt.", "gainedMana": "Du hast etwas Mana erhalten", "gainedHealth": "Du hast ein paar Lebenspunkte erhalten", - "gainedExperience": "Du hast etwas Erfahrung erhalten", - "lostGold": "Dir wurde Gold abgezogen", - "lostMana": "Dir wurde Mana abgezogen", - "lostHealth": "Dir wurden Lebenspunkte abgezogen", + "gainedExperience": "Du hast etwas Erfahrung errungen", + "lostGold": "Du hast etwas Gold ausgegeben", + "lostMana": "Du hast etwas Mana verwendet", + "lostHealth": "Du hast etwas Lebenspunkte verloren", "lostExperience": "Dir wurden Erfahrungspunkte abgezogen", "displayNameDescription1": "Dieser wird bei Nachrichten, die Du im Gasthaus postest, sowie im Gruppenchat und auch auf Deinem Avatar angezeigt. Um den Namen anzupassen, verwende den Bearbeiten-Knopf oben. Wenn Du stattdessen Deinen Anmeldenamen ändern willst, gehe zu", "displayNameDescription2": "Einstellungen->Seite", @@ -197,7 +198,7 @@ "con": "Ausdauer", "per": "Wahrnehmung", "int": "Intelligenz", - "showQuickAllocation": "Attributwertzuweisung anzeigen", + "showQuickAllocation": "Attributspunkte verteilung anzeigen", "hideQuickAllocation": "Attributwertzuweisung ausblenden", "quickAllocationLevelPopover": "Mit jedem Level erhältst Du einen Punkt, den Du einem Attribut Deiner Wahl zuweisen kannst. Du kannst Deine Punkte manuell verteilen, oder das Spiel entscheiden lassen, indem Du eines der vorgegebenen Verteilungsmuster unter Benutzer Icon > Werte wählst.", "invalidAttribute": "\"<%= attr %>\" ist kein gültiges Attribut.", diff --git a/website/common/locales/de/content.json b/website/common/locales/de/content.json index bc9eb96992..33715c7d77 100644 --- a/website/common/locales/de/content.json +++ b/website/common/locales/de/content.json @@ -194,95 +194,95 @@ "hatchingPotionNotes": "Gieße dies über ein Ei und es wird ein <%= potText(locale) %> Haustier daraus schlüpfen.", "premiumPotionAddlNotes": "Nicht auf Eier von Quest-Haustieren anwendbar.", "foodMeat": "Fleisch", - "foodMeatThe": "the Meat", - "foodMeatA": "Meat", + "foodMeatThe": "das Fleisch", + "foodMeatA": "Fleisch", "foodMilk": "Milch", - "foodMilkThe": "the Milk", - "foodMilkA": "Milk", + "foodMilkThe": "die Milch", + "foodMilkA": "Milch", "foodPotatoe": "Kartoffel", - "foodPotatoeThe": "the Potato", - "foodPotatoeA": "a Potato", + "foodPotatoeThe": "die Kartoffel", + "foodPotatoeA": "eine Kartoffel", "foodStrawberry": "Erdbeere", - "foodStrawberryThe": "the Strawberry", - "foodStrawberryA": "a Strawberry", + "foodStrawberryThe": "die Erdbeere", + "foodStrawberryA": "eine Erdbeere", "foodChocolate": "Schokolade", - "foodChocolateThe": "the Chocolate", - "foodChocolateA": "Chocolate", + "foodChocolateThe": "die Schokolade", + "foodChocolateA": "Schokolade", "foodFish": "Fisch", - "foodFishThe": "the Fish", - "foodFishA": "a Fish", + "foodFishThe": "den Fisch", + "foodFishA": "einen Fisch", "foodRottenMeat": "Verrottetes Fleisch", - "foodRottenMeatThe": "the Rotten Meat", - "foodRottenMeatA": "Rotten Meat", + "foodRottenMeatThe": "das verrottete Fleisch", + "foodRottenMeatA": "verrottetes Fleisch", "foodCottonCandyPink": "Rosa Zuckerwatte", - "foodCottonCandyPinkThe": "the Pink Cotton Candy", - "foodCottonCandyPinkA": "Pink Cotton Candy", + "foodCottonCandyPinkThe": "die rosa Zuckerwatte", + "foodCottonCandyPinkA": "rosa Zuckerwatte", "foodCottonCandyBlue": "Blaue Zuckerwatte", - "foodCottonCandyBlueThe": "the Blue Cotton Candy", - "foodCottonCandyBlueA": "Blue Cotton Candy", + "foodCottonCandyBlueThe": "die blaue Zuckerwatte", + "foodCottonCandyBlueA": "blaue Zuckerwatte", "foodHoney": "Honig", - "foodHoneyThe": "the Honey", - "foodHoneyA": "Honey", + "foodHoneyThe": "den Honig", + "foodHoneyA": "Honig", "foodCakeSkeleton": "Knochenkuchen", - "foodCakeSkeletonThe": "the Bare Bones Cake", - "foodCakeSkeletonA": "a Bare Bones Cake", + "foodCakeSkeletonThe": "den Knochenkuchen", + "foodCakeSkeletonA": "ein Stück Knochenkuchen", "foodCakeBase": "Normaler Kuchen", - "foodCakeBaseThe": "the Basic Cake", - "foodCakeBaseA": "a Basic Cake", + "foodCakeBaseThe": "den normalen Kuchen", + "foodCakeBaseA": "einen normalen Kuchen", "foodCakeCottonCandyBlue": "Blauer Zuckerkuchen", - "foodCakeCottonCandyBlueThe": "the Candy Blue Cake", - "foodCakeCottonCandyBlueA": "a Candy Blue Cake", + "foodCakeCottonCandyBlueThe": "den blauen Zuckerkuchen", + "foodCakeCottonCandyBlueA": "einen blauen Zuckerkuchen", "foodCakeCottonCandyPink": "Rosa Zuckerkuchen", - "foodCakeCottonCandyPinkThe": "the Candy Pink Cake", - "foodCakeCottonCandyPinkA": "a Candy Pink Cake", + "foodCakeCottonCandyPinkThe": "den rosa Zuckerkuchen", + "foodCakeCottonCandyPinkA": "einen rosa Zuckerkuchen", "foodCakeShade": "Schokoladenkuchen", - "foodCakeShadeThe": "the Chocolate Cake", - "foodCakeShadeA": "a Chocolate Cake", + "foodCakeShadeThe": "den Schokoladenkuchen", + "foodCakeShadeA": "ein Stück Schokoladenkuchen", "foodCakeWhite": "Sahnekuchen", - "foodCakeWhiteThe": "the Cream Cake", - "foodCakeWhiteA": "a Cream Cake", + "foodCakeWhiteThe": "den Sahnekuchen", + "foodCakeWhiteA": "ein Stück Sahnekuchen", "foodCakeGolden": "Honigkuchen", - "foodCakeGoldenThe": "the Honey Cake", - "foodCakeGoldenA": "a Honey Cake", + "foodCakeGoldenThe": "den Honigkuchen", + "foodCakeGoldenA": "ein Stück Honigkuchen", "foodCakeZombie": "Verrotteter Kuchen", - "foodCakeZombieThe": "the Rotten Cake", - "foodCakeZombieA": "a Rotten Cake", + "foodCakeZombieThe": "den verrotteten Kuchen", + "foodCakeZombieA": "einen verrotteten Kuchen", "foodCakeDesert": "Sandkuchen", - "foodCakeDesertThe": "the Sand Cake", - "foodCakeDesertA": "a Sand Cake", + "foodCakeDesertThe": "den Sandkuchen", + "foodCakeDesertA": "ein Stück Sandkuchen", "foodCakeRed": "Erdbeerkuchen", - "foodCakeRedThe": "the Strawberry Cake", - "foodCakeRedA": "a Strawberry Cake", + "foodCakeRedThe": "den Erdbeerkuchen", + "foodCakeRedA": "ein Stück Erdbeerkuchen", "foodCandySkeleton": "Knochenbonbon", - "foodCandySkeletonThe": "the Bare Bones Candy", - "foodCandySkeletonA": "Bare Bones Candy", + "foodCandySkeletonThe": "das Knochenbonbon", + "foodCandySkeletonA": "ein Knochenbonbon", "foodCandyBase": "Normales Bonbon", - "foodCandyBaseThe": "the Basic Candy", - "foodCandyBaseA": "Basic Candy", + "foodCandyBaseThe": "das normale Bonbon", + "foodCandyBaseA": "ein normales Bonbon", "foodCandyCottonCandyBlue": "Saures blaues Bonbon", - "foodCandyCottonCandyBlueThe": "the Sour Blue Candy", - "foodCandyCottonCandyBlueA": "Sour Blue Candy", + "foodCandyCottonCandyBlueThe": "das saure blaue Bonbon", + "foodCandyCottonCandyBlueA": "ein saures blaues Bonbon", "foodCandyCottonCandyPink": "Saures rosa Bonbon", - "foodCandyCottonCandyPinkThe": "the Sour Pink Candy", - "foodCandyCottonCandyPinkA": "Sour Pink Candy", + "foodCandyCottonCandyPinkThe": "das saure rosa Bonbon", + "foodCandyCottonCandyPinkA": "ein saures rosa Bonbon", "foodCandyShade": "Schokoladenbonbon", - "foodCandyShadeThe": "the Chocolate Candy", - "foodCandyShadeA": "Chocolate Candy", + "foodCandyShadeThe": "das Schokoladenbonbon", + "foodCandyShadeA": "ein Schokoladenbonbon", "foodCandyWhite": "Vanillebonbon", - "foodCandyWhiteThe": "the Vanilla Candy", - "foodCandyWhiteA": "Vanilla Candy", + "foodCandyWhiteThe": "das Vanillebonbon", + "foodCandyWhiteA": "ein Vanillebonbon", "foodCandyGolden": "Honigbonbon", - "foodCandyGoldenThe": "the Honey Candy", - "foodCandyGoldenA": "Honey Candy", + "foodCandyGoldenThe": "das Honigbonbon", + "foodCandyGoldenA": "ein Honigbonbon", "foodCandyZombie": "Verrottetes Bonbon", - "foodCandyZombieThe": "the Rotten Candy", - "foodCandyZombieA": "Rotten Candy", + "foodCandyZombieThe": "das verrottete Bonbon", + "foodCandyZombieA": "ein verrottetes Bonbon", "foodCandyDesert": "Sandbonbon", - "foodCandyDesertThe": "the Sand Candy", - "foodCandyDesertA": "Sand Candy", + "foodCandyDesertThe": "das Sandbonbon", + "foodCandyDesertA": "ein Sandbonbon", "foodCandyRed": "Zimtbonbon", - "foodCandyRedThe": "the Cinnamon Candy", - "foodCandyRedA": "Cinnamon Candy", + "foodCandyRedThe": "das Zimtbonbon", + "foodCandyRedA": "ein Zimtbonbon", "foodSaddleText": "Magischer Sattel", "foodSaddleNotes": "Lässt eines Deiner Haustiere augenblicklich zum Reittier heranwachsen.", "foodSaddleSellWarningNote": "Hey! Das ist ein sehr nützlicher Gegenstand! Bist Du vertraut damit, wie Du den Sattel mit Deinen Haustieren nutzt?", diff --git a/website/common/locales/de/faq.json b/website/common/locales/de/faq.json index 62d379ee03..da8eb3bc72 100644 --- a/website/common/locales/de/faq.json +++ b/website/common/locales/de/faq.json @@ -7,7 +7,7 @@ "faqQuestion1": "Wie erstelle ich meine Aufgaben?", "iosFaqAnswer1": "Gute Gewohnheiten (die mit einem +) sind Aufgaben, die Du mehrmals am Tag wiederholen kannst, wie zum Beispiel Gemüse essen. Schlechte Angewohnheiten (die mit einem -) sind Aufgaben, die Du vermeiden solltest, wie zum Beispiel Fingernägel kauen. Gewohnheiten mit einem + und einem - haben eine gute und eine schlechte Seite, wie die Treppe zu nehmen bzw. den Aufzug zu nehmen. Gute Gewohnheiten werden mit Erfahrung und Gold belohnt. Schlechte Angewohnheiten ziehen Gesundheit ab.\n\nTägliche Aufgaben sind Aufgaben, die Du jeden Tag machen musst, wie zum Beispiel Deine Zähne zu putzen oder Deine E-Mails abzurufen. Du kannst die Tage, an denen eine tägliche Aufgabe fällig ist, anpassen, indem Du auf Bearbeiten klickst. Wenn Du eine tägliche Aufgabe, die fällig ist, auslässt, wird Deinem Charakter über Nacht Schaden zugefügt. Sei vorsichtig und füge nicht zu viele tägliche Aufgaben auf einmal hinzu!\n\nTo-Dos sind Deine Aufgabenlisten. Ein To-Do zu erledigen, bringt Dir Gold und Erfahrung. Du verlierst niemals Gesundheit durch To-Dos. Du kannst ein Ablaufdatum bei jedem To-Do hinzufügen, indem Du auf Bearbeiten klickst.", "androidFaqAnswer1": "Gute Gewohnheiten (die mit einem +) sind Aufgaben, die Du mehrmals am Tag wiederholen kannst, wie zum Beispiel Gemüse essen. Schlechte Angewohnheiten (die mit einem -) sind Aufgaben, die Du vermeiden solltest, wie zum Beispiel Fingernägel kauen. Gewohnheiten mit einem + und einem - haben eine gute und eine schlechte Seite, wie die Treppe zu steigen bzw. den Aufzug zu nehmen. Gute Gewohnheiten werden mit Erfahrung und Gold belohnt. Schlechte Angewohnheiten ziehen Gesundheit ab.\n\nTägliche Aufgaben sind Aufgaben, die Du jeden Tag erledigen musst, wie zum Beispiel die Zähne zu putzen oder E-Mails abzurufen. Du kannst die Tage, an denen eine tägliche Aufgabe fällig ist, anpassen, indem Du sie zum Bearbeiten berührst. Wenn Du eine tägliche Aufgabe, die fällig ist, auslässt, wird Deinem Charakter über Nacht Schaden zugefügt. Sei vorsichtig und füge nicht zu viele tägliche Aufgaben auf einmal hinzu!\n\nTo-Dos sind Deine Aufgabenlisten. Eine Aufgabe zu erledigen, bringt Dir Gold und Erfahrung. Du verlierst niemals Gesundheit durch To-Do-Aufgaben. Du kannst ein Ablaufdatum bei jeder Aufgabe hinzufügen, indem Du sie zum Bearbeiten berührst.", - "webFaqAnswer1": "* Good Habits (the ones with a :heavy_plus_sign:) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a :heavy_minus_sign:) are tasks that you should avoid, like biting nails. Habits with a :heavy_plus_sign: and a :heavy_minus_sign: have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award Experience and Gold. Bad Habits subtract Health.\n* Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by clicking the pencil item to edit it. If you skip a Daily that is due, your avatar will take damage overnight. Be careful not to add too many Dailies at once!\n* To-Dos are your To-Do list. Completing a To-Do earns you Gold and Experience. You never lose Health from To-Dos. You can add a due date to a To-Do by clicking the pencil icon to edit.", + "webFaqAnswer1": "* Gute Gewohnheiten (die mit einem :heavy_plus_sign:) sind Aufgaben, die Du mehrmals am Tag wiederholen kannst, wie zum Beispiel Gemüse essen. Schlechte Angewohnheiten (die mit einem :heavy_minus_sign:) sind Aufgaben, die Du vermeiden solltest, wie zum Beispiel Fingernägel kauen. Gewohnheiten mit einem :heavy_plus_sign: und einem :heavy_minus_sign: haben eine gute und eine schlechte Seite, wie die Treppe zu steigen bzw. den Aufzug zu nehmen. Gute Gewohnheiten werden mit Erfahrung und Gold belohnt. Schlechte Angewohnheiten ziehen Gesundheit ab.\n* Tägliche Aufgaben sind Aufgaben, die Du jeden Tag erledigen musst, wie zum Beispiel die Zähne zu putzen oder E-Mails abzurufen. Du kannst die Tage, an denen eine tägliche Aufgabe fällig ist, anpassen, indem Du zum Bearbeiten auf den Bleistift klickst. Wenn Du eine tägliche Aufgabe, die fällig ist, auslässt, wird Deinem Charakter über Nacht Schaden zugefügt. Sei vorsichtig und füge nicht zu viele tägliche Aufgaben auf einmal hinzu!\n* To-Dos sind Deine Aufgabenlisten. Eine Aufgabe zu erledigen, bringt Dir Gold und Erfahrung. Du verlierst niemals Gesundheit durch To-Dos. Du kannst ein Ablaufdatum bei jeder Aufgabe hinzufügen, indem Du zum Bearbeiten auf den Bleistift klickst.", "faqQuestion2": "Wo finde ich Beispielaufgaben?", "iosFaqAnswer2": "Das Wiki hat vier Listen mit Beispielaufgaben, die Du als Inspiration nutzen kannst:\n

\n* [Sample Habits](http://habitica.wikia.com/wiki/Sample_Habits)\n* [Sample Dailies](http://habitica.wikia.com/wiki/Sample_Dailies)\n* [Sample To-Dos](http://habitica.wikia.com/wiki/Sample_To-Dos)\n* [Sample Custom Rewards](http://habitica.wikia.com/wiki/Sample_Custom_Rewards)", "androidFaqAnswer2": "Das Wiki hat vier Listen mit Beispielaufgaben, die Du als Inspiration nutzen kannst:\n

\n* [Sample Habits](http://habitica.wikia.com/wiki/Sample_Habits)\n* [Sample Dailies](http://habitica.wikia.com/wiki/Sample_Dailies)\n* [Sample To-Dos](http://habitica.wikia.com/wiki/Sample_To-Dos)\n* [Sample Custom Rewards](http://habitica.wikia.com/wiki/Sample_Custom_Rewards)", @@ -17,13 +17,13 @@ "androidFaqAnswer3": "Deine Aufgaben verändern die Farbe je nachdem wie gut Du diese zur Zeit erfüllst! Jede neue Aufgabe besitzt anfangs die neutrale Farbe Gelb. Erledigst Du tägliche Aufgaben oder gute Gewohnheiten regelmäßig, werden diese blau. Verpasst Du eine tägliche Aufgabe oder gibst Du einer schlechten Gewohnheit nach, werden die Aufgaben rot. Je röter die Aufgabe ist, desto mehr Belohnung bekommst Du für sie, allerdings verletzen Dich tägliche Aufgaben und schlechte Gewohnheiten umso mehr! Das hilft Dir Dich zu motivieren diese Aufgaben zu erledigen.", "webFaqAnswer3": "Deine Aufgaben verändern die Farbe je nachdem wie gut Du diese zur Zeit erfüllst! Jede neue Aufgabe besitzt anfangs die neutrale Farbe Gelb. Erledigst Du tägliche Aufgaben oder gute Gewohnheiten regelmäßig, werden diese blau. Verpasst Du eine tägliche Aufgabe oder gibst Du einer schlechten Gewohnheit nach, werden die Aufgaben rot. Je röter die Aufgabe ist, desto mehr Belohnung bekommst Du für sie, allerdings verletzen Dich tägliche Aufgaben und schlechte Gewohnheiten umso mehr! Das hilft Dir Dich zu motivieren diese Aufgaben zu erledigen.", "faqQuestion4": "Warum hat mein Avatar Lebenspunkte verloren, und wie kann ich sie wieder auffüllen?", - "iosFaqAnswer4": "Verschiedene Dinge können Dir Schaden zufügen. Erstens, Tagesaufgaben, die Du über Nacht unerledigt lässt, werden Dir schaden. Zweitens, eine schlechte Gewohnheit die Du anklickst, fügt Dir ebenfalls Schaden zu. Zuletzt, wenn Du mit Deiner Gruppe in einem Bosskampf bist und eines der Gruppenmitglieder seine Tagesaufgaben nicht erledigt hat, wird Dich der Boss angreifen. Der gewöhnliche Weg zu heilen, ist im Level aufzusteigen, was Deine komplette Gesundheit wiederherstellt. Du kannst auch mit Gold einen Heiltrank in der Belohnungsspalte erwerben. Zudem kannst Du, ab Level 10 oder höher, wählen, ein Heiler zu werden, wodurch Du Heilfähigkeiten erlernst. Wenn Du in einer Gruppe mit einem Heiler bist, kann dieser Dich ebenfalls heilen.", + "iosFaqAnswer4": "Verschiedene Dinge können Dir Schaden zufügen. Erstens, Tagesaufgaben, die Du über Nacht unerledigt lässt, werden Dir schaden. Zweitens, eine schlechte Gewohnheit die Du anklickst, fügt Dir ebenfalls Schaden zu. Zuletzt, wenn Du mit Deiner Gruppe in einem Boss-Kampf bist und eines der Gruppenmitglieder seine Tagesaufgaben nicht erledigt hat, wird Dich der Boss angreifen. Der gewöhnliche Weg zu heilen, ist im Level aufzusteigen, was Deine komplette Gesundheit wiederherstellt. Du kannst auch mit Gold einen Heiltrank in der Belohnungsspalte erwerben. Zudem kannst Du, ab Level 10 oder höher, wählen, ein Heiler zu werden, wodurch Du Heilfähigkeiten erlernst. Wenn Du in einer Gruppe mit einem Heiler bist, kann dieser Dich ebenfalls heilen.", "androidFaqAnswer4": "Verschiedene Dinge können Dir Schaden zufügen. Erstens, Tagesaufgaben, die Du über Nacht unerledigt lässt, werden Dir schaden. Zweitens, eine schlechte Gewohnheit die Du anklickst, fügt Dir ebenfalls Schaden zu. Zuletzt, wenn Du mit Deiner Gruppe in einem Bosskampf bist und eines der Gruppenmitglieder seine Tagesaufgaben nicht erledigt hat, wird Dich der Boss angreifen. Der gewöhnliche Weg zu heilen, ist im Level aufzusteigen, was Deine komplette Gesundheit wiederherstellt. Du kannst auch mit Gold einen Heiltrank auf der Aufgabenseite unter Belohnungen erwerben. Zudem kannst Du, ab Level 10 oder höher, wählen, ein Heiler zu werden, wodurch Du Heilfähigkeiten erlernst. Wenn Du in einer Gruppe mit einem Heiler bist, kann dieser Dich ebenfalls heilen.", - "webFaqAnswer4": "Verschiedene Dinge können Dir Schaden zufügen. Erstens, Tagesaufgaben, die Du über Nacht unerledigt lässt, werden Dir schaden. Zweitens, eine schlechte Gewohnheit die Du anklickst, fügt Dir ebenfalls Schaden zu. Zuletzt, wenn Du mit Deiner Gruppe in einem Bosskampf bist und eines der Gruppenmitglieder seine Tagesaufgaben nicht erledigt hat, wird Dich der Boss angreifen. Der gewöhnliche Weg zu heilen, ist im Level aufzusteigen, was Deine komplette Gesundheit wiederherstellt. Du kannst auch mit Gold einen Heiltrank in der Belohnungsspalte erwerben. Zudem kannst Du, ab Level 10 oder höher, wählen, ein Heiler zu werden, wodurch Du Heilfähigkeiten erlernst. Auch andere Heiler, die mit Dir in einer Gruppe sind können Dich heilen. Erfahre mehr, indem Du Gruppe im Navigationsbalken klickst.", + "webFaqAnswer4": "Verschiedene Dinge können Dir Schaden zufügen. Erstens, Tagesaufgaben, die Du über Nacht unerledigt lässt, werden Dir schaden. Zweitens, eine schlechte Gewohnheit die Du anklickst, fügt Dir ebenfalls Schaden zu. Zuletzt, wenn Du mit Deiner Gruppe in einem Bosskampf bist und eines der Gruppenmitglieder seine Tagesaufgaben nicht erledigt hat, wird Dich der Boss angreifen. Der gewöhnliche Weg zu heilen, ist im Level aufzusteigen, was Deine komplette Gesundheit wiederherstellt. Du kannst auch mit Gold einen Heiltrank in der Belohnungsspalte erwerben. Zudem kannst Du, ab Level 10 oder höher, wählen, ein Heiler zu werden, wodurch Du Heilfähigkeiten erlernst. Auch andere Heiler, die mit Dir in einer Gruppe sind können Dich heilen. Erfahre mehr, indem Du \"Gruppe\" im Navigationsbalken klickst.", "faqQuestion5": "Wie spiele ich Habitica mit meinen Freunden?", "iosFaqAnswer5": "Am Besten lädst Du sie in eine Gruppe mit Dir ein! Gruppen können zusammen Quests bestreiten, Monster bekämpfen und sich gegenseitig mit Zaubern unterstützen. Geh auf Menü > Gruppe und klicke auf \"Neue Gruppe erstellen\" wenn Du noch keine Gruppe hast. Dann klicke auf die Mitgliederliste und lade sie ein indem Du oben rechts auf einladen klickst und ihre Benutzer-ID (die aus einer langen Zahlen-, Buchstabenkombination besteht, welche sie unter Einstellungen > Konto Details bei der App und unter Einstellungen > API auf der Webseite finden können) eingibst. Außerdem kannst Du auf der Webseite Freunde auch per E-Mail einladen, was für die App auch noch folgen wird.\n\nAuf der Webseite können Du und Deine Freunde auch Gilden beitreten, welche öffentliche Chat-Räume sind. Gilden werden der App auch noch hinzugefügt werden.", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Woher bekomme ich Haustiere oder Reittiere?", "iosFaqAnswer6": "Wenn Du Level 3 erreichst, wirst Du das Beutesystem freischalten. Jedes Mal wenn Du eine Aufgabe erledigst, hast Du eine zufällige Chance ein Ei, einen Schlüpftrank oder Futter zu erhalten. Diese werden unter Inventar > Marktplatz gespeichert. \n\nUm ein Haustier auszubrüten benötigst Du ein Ei und einen Schlüpftrank. Klicke auf das Ei, um die Spezies auszuwählen, welche Du schlüpfen lassen möchtest, und klicke anschließend auf den Schlüpftrank, um die Farbe zu bestimmen! Um es Deinem Avatar hinzuzufügen, gehe zu Inventar > Haustiere und klicke auf das gewünschte Tier.\n\nDu kannst Deine Haustiere unter Inventar > Haustiere auch füttern, sodass sie zu Reittieren heranwachsen. Klicke auf ein Haustier und dann auf das Futter aus dem Menü auf der rechten Seite, um es zu füttern! Damit es zu einem Reittier heranwächst, musst Du Dein Haustier mehrmals füttern, wenn Du jedoch sein bevorzugtes Futter herausfindest, wächst es schneller. Dies kannst Du entweder durch ausprobieren selbst herausfinden oder [im Wiki nachschauen - Vorsicht: Spoiler!](http://de.habitica.wikia.com/wiki/Futter#Bevorzugtes_Futter). Wenn Du ein Reittier erhalten hast, gehe zu Inventar > Reittiere und klicke das Tier an, um es Deinem Avatar hinzuzufügen.\n\nDu kannst auch Eier für Quest-Haustiere erhalten, indem Du bestimmte Quests abschließt. (Siehe weiter unten, um mehr über Quests zu erfahren.)", "androidFaqAnswer6": "Wenn Du Level 3 erreichst, wirst Du das Beutesystem freischalten. Jedes Mal wenn Du eine Aufgabe erledigst, hast Du eine zufällige Chance ein Ei, einen Schlüpftrank oder Futter zu erhalten. Diese werden unter Inventar > Marktplatz gespeichert. \n\nUm ein Haustier auszubrüten benötigst Du ein Ei und einen Schlüpftrank. Klicke auf das Ei, um die Spezies auszuwählen, welche Du schlüpfen lassen möchtest, und klicke anschließend auf den Schlüpftrank, um die Farbe zu bestimmen! Um es Deinem Avatar hinzuzufügen, gehe zu Inventar > Haustiere und klicke auf das gewünschte Tier.\n\nDu kannst Deine Haustiere unter Inventar > Haustiere auch füttern, sodass sie zu Reittieren heranwachsen. Klicke auf ein Haustier und dann auf das Futter aus dem Menü auf der rechten Seite, um es zu füttern! Damit es zu einem Reittier heranwächst, musst Du Dein Haustier mehrmals füttern, wenn Du jedoch sein bevorzugtes Futter herausfindest, wächst es schneller. Dies kannst Du entweder durch ausprobieren selbst herausfinden oder [im Wiki nachschauen - Vorsicht: Spoiler!](http://de.habitica.wikia.com/wiki/Futter#Bevorzugtes_Futter). Wenn Du ein Reittier erhalten hast, gehe zu Inventar > Reittiere und klicke das Tier an, um es Deinem Avatar hinzuzufügen.\n\nDu kannst auch Eier für Quest-Haustiere erhalten, indem Du bestimmte Quests abschließt. (Siehe weiter unten, um mehr über Quests zu erfahren.)", diff --git a/website/common/locales/de/front.json b/website/common/locales/de/front.json index 8c3dc1ad25..ae9d74508a 100644 --- a/website/common/locales/de/front.json +++ b/website/common/locales/de/front.json @@ -84,7 +84,7 @@ "joinOthers": "Schließe Dich <%= userCount %> Leuten an, die Spaß dabei haben, ihre Ziele zu erreichen!", "kazuiQuote": "Vor [Habitica] kam ich mit meiner Dissertation nicht weiter und war unzufrieden mit meiner Selbstdisziplin bei Hausarbeiten, Vokabellernen und dem Studium der Go-Theorie. Es hat sich herausgestellt, dass das Aufteilen der Aufgaben in kleinere, machbare Checklisten etwas ist, das mich motiviert und zum konstanten Arbeiten anregt.", "landingend": "Noch nicht überzeugt?", - "landingend2": "See a more detailed list of [our features](/static/overview). Are you looking for a more private approach? Check out our [administrative packages](/static/plans), which are perfect for families, teachers, support groups, and businesses.", + "landingend2": "Sieh Dir hier eine detaillierte Liste der [Funktionen und Spielelemente](/static/overview) an. Oder suchst Du eine vertraulichere Plattform? Dann schau in unsere [Team-Pläne](/static/plans), welche sich vor allem für Familien, Lehrer, Unterstützer und Unternehmen eignen.", "landingp1": "Das Problem der meisten Produktivitäts-Apps auf dem Markt ist, dass sie keinen Anreiz bieten, sie dauerhaft zu benutzen. Habitica löst dieses Problem, indem es das Aufbauen von Gewohnheiten zum Spiel macht. Durch Belohnen von Erfolgen und Bestrafen von Misserfolgen, bietet Habitica eine Motivation für Ihre täglichen Aktivitäten.", "landingp2": "Whenever you reinforce a positive habit, complete a daily task, or take care of an old to-do, Habitica immediately rewards you with Experience points and Gold. As you gain experience, you can level up, increasing your Stats and unlocking more features, like classes and pets. Gold can be spent on in-game items that change your experience or personalized rewards you've created for motivation. When even the smallest successes provide you with an immediate reward, you're less likely to procrastinate.", "landingp2header": "Sofortige Belohnung", diff --git a/website/common/locales/de/gear.json b/website/common/locales/de/gear.json index 97e03691ce..9100b67c13 100644 --- a/website/common/locales/de/gear.json +++ b/website/common/locales/de/gear.json @@ -119,7 +119,7 @@ "weaponSpecialSkiText": "Stock des Sk(i)-attentäters", "weaponSpecialSkiNotes": "Zermalmt ganze Horden von Gegnern! Außerdem hilft es dem Träger dabei, schöne Parallelschwünge zu fahren. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2013-2014 Winterausrüstung.", "weaponSpecialCandycaneText": "Zuckerstangenstab", - "weaponSpecialCandycaneNotes": "A powerful mage's staff. Powerfully DELICIOUS, we mean! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2013-2014 Winter Gear.", + "weaponSpecialCandycaneNotes": "Ein mächtiger Zauberstab. Mächtig LECKER, wollten wir sagen! Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2013-2014 Winterausrüstung.", "weaponSpecialSnowflakeText": "Zauberstab der Schneeflocke", "weaponSpecialSnowflakeNotes": "Dieser Zauberstab funkelt mit unerschöpflicher Heilkraft. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2013-2014 Winterausrüstung.", "weaponSpecialSpringRogueText": "Hakenkrallen", @@ -273,7 +273,7 @@ "weaponArmoireIronCrookText": "Eiserner Hirtenstab", "weaponArmoireIronCrookNotes": "Dieser mit Leidenschaft gehämmerte eiserne Hirtenstab ist nützlich zum Schafe hüten. Erhöht Wahrnehmung und Stärke jeweils um <%= attrs %>. Verzauberter Schrank: Gehörntes Eisen-Set (Gegenstand 3 von 3).", "weaponArmoireGoldWingStaffText": "Goldener Flügelstab", - "weaponArmoireGoldWingStaffNotes": "The wings on this staff constantly flutter and twist. Increases all Stats by <%= attrs %> each. Enchanted Armoire: Independent Item.", + "weaponArmoireGoldWingStaffNotes": "Die Flügel dieses Stabes flattern und drehen sich ständig. Erhöht alle Attribute um <%= attrs %>. Verzauberter Schrank: Unabhängiger Gegenstand.", "weaponArmoireBatWandText": "Fledermaus-Zauberstab", "weaponArmoireBatWandNotes": "Dieser Zauberstab kann jede Aufgabe in eine Fledermaus verwandeln! Schwinge ihn und schau zu wie sie davonfliegen. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Verzauberter Schrank: Unabhängiger Gegenstand.", "weaponArmoireShepherdsCrookText": "Hirtenstab", @@ -320,10 +320,10 @@ "weaponArmoireWeaversCombNotes": "Verwende diesen Kamm, um Deine Schussfäden zu einem dicht gewebten Stoff zusammenzuschieben. Erhöht Wahrnehmung um <%= per %> und Stärke um <%= str %>. Verzauberter Schrank: Weber-Set (Gegenstand 2 von 3).", "weaponArmoireLamplighterText": "Laternenanzünder", "weaponArmoireLamplighterNotes": "Dieser lange Stab hat an einem Ende einen Docht, um Laternen anzuzünden, und am anderen Ende einen Haken, um sie wieder auszumachen. Erhöht Ausdauer um <%= con %> und Wahrnehmung um <%= per %>.", - "weaponArmoireCoachDriversWhipText": "Coach Driver's Whip", - "weaponArmoireCoachDriversWhipNotes": "Your steeds know what they're doing, so this whip is just for show (and the neat snapping sound!). Increases Intelligence by <%= int %> and Strength by <%= str %>. Enchanted Armoire: Coach Driver Set (Item 3 of 3).", - "weaponArmoireScepterOfDiamondsText": "Scepter of Diamonds", - "weaponArmoireScepterOfDiamondsNotes": "This scepter shines with a warm red glow as it grants you increased willpower. Increases Strength by <%= str %>. Enchanted Armoire: King of Diamonds Set (Item 3 of 3).", + "weaponArmoireCoachDriversWhipText": "Peitsche des Kutschers", + "weaponArmoireCoachDriversWhipNotes": "Da Deine Rösser wissen, was sie tun, ist diese Peitsche nur zur Zierde (und ein ordentliches Knallen!) gut. Erhöht Intelligenz um <%= int %> und Stärke u <%= str %>. Verzauberter Schrank: Kutscherset (Gegenstand 3 von 3).", + "weaponArmoireScepterOfDiamondsText": "Diamantenzepter", + "weaponArmoireScepterOfDiamondsNotes": "Dieses Zepter erstrahlt in einem warmen, roten Schimmer, der dir mehr Willenskraft verleiht. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Diamantenkönig-Set (Gegenstand 3 von 3).", "armor": "Rüstung", "armorCapitalized": "Rüstung", "armorBase0Text": "Schlichte Kleidung", @@ -610,8 +610,10 @@ "armorMystery201710Notes": "Geschuppt, glänzend und gehärtet! Gewährt keinen Attributbonus. Abonnentengegenstand, Oktober 2017.", "armorMystery201711Text": "Teppichreitergewand", "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", - "armorMystery201712Text": "Candlemancer Armor", - "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201712Text": "Kerzenzauberer-Rüstung", + "armorMystery201712Notes": "Die Hitze und das Licht, das diese magische Rüstung erzeugt, wird Dein Herz wärmen, aber niemals Deine Haut verbrennen! Gewährt keinen Attributbonus. Abonnentengegenstand, Dezember 2017.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunkanzug", "armorMystery301404Notes": "Adrett und schneidig, hoho! Gewährt keinen Attributbonus. Abonnentengegenstand, Februar 3015.", "armorMystery301703Text": "Steampunk-Pfauen-Robe", @@ -984,6 +986,8 @@ "headMystery201710Notes": "Dieser Helm lässt Dich einschüchternd aussehen... aber er wird Deiner Tiefenwahrnehmung keinen Gefallen tun! Gewährt keinen Attributbonus. Abonnentengegenstand, Oktober 2017.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Schicker Zylinder", "headMystery301404Notes": "Ein schicker Zylinder für die feinsten Ehrenleute! Gewährt keinen Attributbonus. Abonnentengegenstand, Januar 3015.", "headMystery301405Text": "Einfacher Zylinder", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Dieser zerklüftete Schild aus geschmolzenem Stein schützt Dich vor schlechten Gewohnheiten ohne Deine Hände zu versengen. Gewährt keinen Attributbonus. Abonnentengegenstand, August 2017.", "shieldMystery201709Text": "Handbuch der Hexerei", "shieldMystery201709Notes": "Dieses Buch führt Dich in die Untiefen der Hexerei. Gewährt keinen Attributbonus. Abonnentengegenstand, September 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Uhrenschild", "shieldMystery301405Notes": "Die Zeit ist auf Deiner Seite mit diesem gewaltigen Uhrenschild! Gewährt keinen Attributbonus. Abonnentengegenstand, Juni 3015.", "shieldMystery301704Text": "Flatteriger Fächer", @@ -1462,5 +1468,5 @@ "eyewearMystery301703Notes": "Perfekt für ausgefallene Maskeraden oder um sich unentdeckt an besonders gut gekleideten Massen vorbei zu schleichen. Gewährt keinen Attributbonus. Abonnentengegenstand, März 3017.", "eyewearArmoirePlagueDoctorMaskText": "Pestarzt-Maske", "eyewearArmoirePlagueDoctorMaskNotes": "Eine authentische Maske wie sie Ärzte tragen, die die Pest des Aufschubs bekämpfen! Gewährt keinen Attributbonus. Verzauberter Schrank: Pestarzt-Set (Gegenstand 2 von 3).", - "twoHandedItem": "Two-handed item." + "twoHandedItem": "Zweihändiger Gegenstand." } \ No newline at end of file diff --git a/website/common/locales/de/generic.json b/website/common/locales/de/generic.json index bc9ef6a907..f96e2a7b14 100644 --- a/website/common/locales/de/generic.json +++ b/website/common/locales/de/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Melodie", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Melodie", "audioTheme_arashiTheme": "Arashi's Melodie", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Melodie", @@ -168,9 +169,9 @@ "achievementBewilderText": "Hat bei der Frühlingsfeier 2016 geholfen, den Verwirrer zu besiegen.", "checkOutProgress": "Schau Dir meinen Fortschritt in Habitica an!", "cards": "Karten", - "sentCardToUser": "You sent a card to <%= profileName %>", - "cardReceivedFrom": "<%= cardType %> from <%= userName %>", - "cardReceived": "You received a <%= card %>", + "sentCardToUser": "Du hast eine Karte an <%= profileName %> gesendet", + "cardReceivedFrom": "<%= cardType %> von <%= userName %>", + "cardReceived": "Du hast eine <%= card %> erhalten!", "greetingCard": "Grußkarte", "greetingCardExplanation": "Ihr erhaltet beide den Fröhlicher-Freund-Erfolg!", "greetingCardNotes": "Einem Gruppenmitglied eine Karte schicken.", @@ -275,11 +276,11 @@ "spirituality": "Spiritualität", "time_management": "Zeitmanagement + Verantwortlichkeit", "recovery_support_groups": "Heilung + Selbsthilfegruppen", - "dismissAll": "Dismiss All", + "dismissAll": "Alle entfernen", "messages": "Nachrichten", "emptyMessagesLine1": "Du hast im Moment keine Nachrichten", "emptyMessagesLine2": "Beginne eine Unterhaltung, indem Du eine Nachricht verschickst!", - "userSentMessage": "<%= user %> sent you a message", + "userSentMessage": "<%= user %> hat Dir eine Nachricht gesendet", "letsgo": "Auf geht's!", "selected": "Ausgewählt", "howManyToBuy": "Wie viele möchtest Du kaufen?", diff --git a/website/common/locales/de/groups.json b/website/common/locales/de/groups.json index 14747301ec..c41bafa825 100644 --- a/website/common/locales/de/groups.json +++ b/website/common/locales/de/groups.json @@ -3,8 +3,8 @@ "tavernChat": "Gasthaus-Chat", "innCheckOut": "Das Gasthaus verlassen", "innCheckIn": "Im Gasthaus erholen", - "innText": "You're resting in the Inn! While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day. Be warned: If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies unless they are also in the Inn! Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn.", - "innTextBroken": "You're resting in the Inn, I guess... While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day... If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies... unless they are also in the Inn... Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn... so tired...", + "innText": "Du erholst Dich im Gasthaus! Während Du dort verweilst, werden Dir Deine täglichen Aufgaben keinen Schaden zufügen, aber trotzdem täglich aktualisiert. Vorsicht: Wenn Du an einem Bosskampf teilnimmst, erhältst Du weiterhin Schaden für die verpassten Aufgaben Deiner Gruppenmitglieder, sofern sich diese nicht auch im Gasthaus befinden! Außerdem wird der Schaden, den Du dem Boss zufügst, (und gefundene Gegenstände) erst angewendet, wenn Du das Gasthaus verlässt.", + "innTextBroken": "Du erholst Dich im Gasthaus, schätze ich ... Während Du dort verweilst, werden Dir Deine täglichen Aufgaben keinen Schaden zufügen, aber trotzdem täglich aktualisiert ... Wenn Du an einem Bosskampf teilnimmst, erhältst Du weiterhin Schaden für die verpassten Aufgaben Deiner Gruppenmitglieder ... sofern sich diese nicht auch im Gasthaus befinden ... Außerdem wird Dein Schaden am Boss (oder gesammelte Gegenstände) nicht berücksichtigt, bis Du das Gasthaus verlässt ... So müde ...", "helpfulLinks": "Weiterführende Links", "communityGuidelinesLink": "Community-Richtlinien", "lookingForGroup": "Gruppe gesucht (Party wanted) Posts", @@ -83,7 +83,7 @@ "assignLeader": "Gruppenleiter bestimmen", "members": "Mitglieder", "memberList": "Mitglieder-Liste", - "partyList": "Order for Party members in header", + "partyList": "Sortierung der Gruppenmitglieder in der Kopfzeile", "banTip": "Mitglied ausschließen", "moreMembers": "weitere Mitglieder", "invited": "Eingeladen", @@ -100,7 +100,7 @@ "guild": "Gilde", "guilds": "Gilden", "guildsLink": "Gilden", - "sureKick": "Do you really want to remove this member from the Party/Guild?", + "sureKick": "Willst Du dieses Mitglied wirklich aus der Gruppe/Gilde entfernen?", "optionalMessage": "Optionale Nachricht", "yesRemove": "Ja, entferne sie", "foreverAlone": "\"Gefällt mir\" funktioniert nicht bei eigenen Nachrichten. Sei nicht so einer.", @@ -117,9 +117,9 @@ "confirmGuild": "Gilde für 4 Edelsteine gründen?", "leaveGroupCha": "Gildenwettbewerbe verlassen und ...", "confirm": "Bestätigen", - "leaveGroup": "Leave Guild", - "leavePartyCha": "Leave Party challenges and...", - "leaveParty": "Leave Party", + "leaveGroup": "Gilde verlassen", + "leavePartyCha": "Gruppenwettbewerbe verlassen und...", + "leaveParty": "Gruppe verlassen", "sendPM": "Private Nachricht schicken", "send": "Abschicken", "messageSentAlert": "Nachricht abgeschickt", @@ -160,7 +160,7 @@ "inviteFriends": "Lade Freunde ein", "partyMembersInfo": "Your Party currently has <%= memberCount %> members and <%= invitationCount %> pending invitations. The limit of members in a Party is <%= limitMembers %>. Invitations above this limit cannot be sent.", "inviteByEmail": "Lade per E-Mail ein", - "inviteByEmailExplanation": "If a friend joins Habitica via your email, they'll automatically be invited to your Party!", + "inviteByEmailExplanation": "Wenn Freunde über Deine E-Mail zu Habitica stoßen, werden sie automatisch zu Deiner Gruppe eingeladen!", "inviteMembersHowTo": "Leute einladen: mit einer gültigen Email-Adresse oder der 36-stelligen Nutzer ID. Wenn eine Email-Adresse noch nicht registriert ist, laden wir diejenigen nach Habitica ein.", "inviteFriendsNow": "Jetzt Freunde einladen", "inviteFriendsLater": "Freunde später einladen", @@ -202,7 +202,6 @@ "partyOnName": "Riesenparty!", "partyUpText": "Du bist einer Gruppe mit einer anderen Person beigetreten! Ihr werdet zusammen Monster bekämpfen und euch unterstützen - viel Spaß dabei. ", "partyOnText": "Du bist einer Gruppe mit mindestens vier Personen beigetreten! Erkenne die Vorteile einer erhöhten Verantwortung während Du Dich mit Deinen Freunden vereinst, um Eure Gegner zu besiegen!", - "largeGroupNote": "Hinweis: Diese Gilde ist zu groß, um Hinweismeldungen zu unterstützen! Versichere Dich täglich die neuen Nachrichten abzurufen.", "groupIdRequired": "\"groupId\" muss eine gültige UUID sein", "groupNotFound": "Team nicht gefunden, oder Du hast keine Zugriffsrechte.", "groupTypesRequired": "Du musst einen gültigen \"Type\" Suchbegriff eingeben.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "User-ID in der Einladung fehlt", "inviteMustNotBeEmpty": "Einladung muss Daten enthalten", "partyMustbePrivate": "Gruppen müssen privat sein", - "userAlreadyInGroup": "Benutzer bereits in dieser Gruppe.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Du kannst Dich nicht selbst in eine Gruppe einladen.", - "userAlreadyInvitedToGroup": "Benutzer bereits zu diesem Team eingeladen.", - "userAlreadyPendingInvitation": "Benutzereinladung noch unbeantwortet.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Benutzer mit ID \"<%= userId %>\" nicht gefunden", "userHasNoLocalRegistration": "Benutzer ist lokal nicht registriert (Benutzername, E-Mail, Passwort).", "uuidsMustBeAnArray": "Benutzer-ID-Einladungen müssen ein Array sein.", @@ -417,11 +416,13 @@ "managerAdded": "Manager erfolgreich hinzugefügt", "managerRemoved": "Manager erfolgreich entfernt", "leaderChanged": "Gruppenleitung wurde gewechselt", - "whatIsWorldBoss": "What is a World Boss?", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", + "whatIsWorldBoss": "Was ist ein Weltboss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/de/inventory.json b/website/common/locales/de/inventory.json index a823716930..1fb840b070 100644 --- a/website/common/locales/de/inventory.json +++ b/website/common/locales/de/inventory.json @@ -2,7 +2,7 @@ "noItemsAvailableForType": "Du hast keine <%= type %>.", "foodItemType": "Nahrung", "eggsItemType": "Eier", - "hatchingPotionsItemType": "Schlüpfelexier", + "hatchingPotionsItemType": "Schlüpfelixiere", "specialItemType": "Besondere Gegenstände", "lockedItem": "Gesperrter Gegenstand" } diff --git a/website/common/locales/de/limited.json b/website/common/locales/de/limited.json index 983a027cf1..0b84283b49 100644 --- a/website/common/locales/de/limited.json +++ b/website/common/locales/de/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Fröhlichen Herbstball!! Wärst du daran interessiert einige seltene Gegenstände zu erwerben? Sie werden nur bis zum 31. Oktober verfügbar sein!", "seasonalShopWinterText": "Fröhliches Winter-Wunderland!! Wärst du daran interessiert einige seltene Gegenstände zu erwerben? Sie werden nur bis zum 31. Januar verfügbar sein!", "seasonalShopFallTextBroken": "Oh… Willkommen auf dem Jahreszeitenmarkt… Momentan haben wir Herbst-Gegenstände, oder so, auf Lager… Alles hier wird während des Herbstballs, der jedes Jahr stattfindet, verfügbar sein. Allerdings nur bis zum 31. Oktober, also stocke jetzt Deine Vorräte auf, ansonsten musst Du bis nächstes Jahr warten... und warten... und warten... *seufz*", + "seasonalShopBrokenText": "Mein Pavillon!!!!!!! Meine Einrichtung!!!! Oh, der Entmutiger hat alles zerstört :( Bitte helft im Gasthaus mit, ihn zu besiegen, damit ich bald wieder alles aufbauen kann!", "seasonalShopRebirth": "Wenn Du etwas von dieser Ausrüstung bereits früher gekauft hast aber im Moment nicht im Besitz hast, kannst Du diesen Ausrüstungsgegenstand in der Belohnungsspalte erneut kaufen. Anfangs wirst Du nur Gegenstände für Deine momentane Klasse (Standard ist Krieger) kaufen können, aber keine Sorge, die anderen klassenspezifischen Gegenstände werden verfügbar, sobald Du zur jeweiligen Klasse wechselst.", "candycaneSet": "Zuckerstange (Magier)", "skiSet": "Ski-Attentäter (Schurke)", diff --git a/website/common/locales/de/messages.json b/website/common/locales/de/messages.json index 8fca3724d9..dd95f3c83f 100644 --- a/website/common/locales/de/messages.json +++ b/website/common/locales/de/messages.json @@ -9,8 +9,8 @@ "messageCannotFeedPet": "Dieses Haustier will und kann nicht gefüttert werden.", "messageAlreadyMount": "Du hast dieses Reittier bereits. Füttere lieber ein anderes Haustier.", "messageEvolve": "<%= egg %> wurde gezähmt. Es ist an der Zeit aufzusitzen!", - "messageLikesFood": "<%= egg %> ist begeistert. <%= foodText %> ist seine Lieblingsspeise!", - "messageDontEnjoyFood": "<%= egg %> ist von <%= foodText %> nicht gerade begeistert, aber würgt es hinunter.", + "messageLikesFood": "<%= egg %> freut sich wirklich über <%= foodText %>!", + "messageDontEnjoyFood": "<%= egg %> isst zwar <%= foodText %>, scheint aber nicht gerade begeistert davon zu sein.", "messageBought": "<%= itemText %> gekauft", "messageEquipped": "<%= itemText %> angelegt.", "messageUnEquipped": "<%= itemText %> abgelegt.", diff --git a/website/common/locales/de/overview.json b/website/common/locales/de/overview.json index a87c3c2d1d..fc2fa5ed75 100644 --- a/website/common/locales/de/overview.json +++ b/website/common/locales/de/overview.json @@ -2,13 +2,13 @@ "needTips": "Brauchst Du ein paar Tipps, wie man anfängt? Hier findest Du eine einfache Anleitung!", "step1": "Schritt 1: Füge Aufgaben hinzu", - "webStep1Text": "Habitica funktioniert nur mit Aufgaben und Zielen aus deinem realen Leben, also erstelle ein paar Aufgaben. Du kannst später weitere hinzufügen, wenn sie dir einfallen. Alle Aufgaben können hinzugefügt werden, indem du die grüne \"Aufgabe hinzufügen\" Schaltfläche auswählst.\n* **Set up [To-Dos](http://habitica.wikia.com/wiki/To-Dos):** Füge einmalige oder seltene Aufgaben einzeln in der Spalte \"To-Dos\" hinzu. Wenn du auf diese Aufgabe klickst, kannst du die Aufgabe anpassen und zum Beispiel ein Fälligkeitsdatum oder eine Checkliste hinzufügen.\n* **Set up [Dailies](http://habitica.wikia.com/wiki/Dailies):** Füge Aufgaben die täglich, oder an einem bestimmten Tag in der Woche, im Monat, oder im Jahr anfallen in der Spalte \"Tägliche Aufgaben\" hinzu. Klicke auf die Aufgabe um anzupassen an welchen Wochentagen sie fällig sind. Alternativ kannst du auch eine periodische Fälligkeit einstellen, z.B. alle 3 Tage. \n* **Set up [Habits](http://habitica.wikia.com/wiki/Habits):** Füge Gewohnheiten in der Spalte \"Gewohnheiten\" hinzu. Du kannst einstellen, ob es sich um eine gute Gewohnheit :heavy_plus_sign: oder eine schlechte Angewohnheit :heavy_minus_sign: handelt.\n* **Set up [Rewards](http://habitica.wikia.com/wiki/Rewards):** Zusätzlich zu den Belohnungen die das Spiel dir gibt, kannst du in der Spalte \"Belohnungen\" eigene Aktivitäten oder Vergnügen eintragen, die dich motivieren. Es ist wichtig, dass du dir auch hin und wieder eine Pause, oder etwas Luxus gönnst! \n*Falls du Anregungen brauchst welche Aufgaben du hinzufügen solltest, schau auf die Wiki-Seiten unter [Sample Habits](http://habitica.wikia.com/wiki/Sample_Habits), [Sample Dailies](http://habitica.wikia.com/wiki/Sample_Dailies), [Sample To-Dos](http://habitica.wikia.com/wiki/Sample_To-Dos), und [Sample Rewards](http://habitica.wikia.com/wiki/Sample_Custom_Rewards).", + "webStep1Text": "Habitica funktioniert nur mit Aufgaben und Zielen aus Deinem realen Leben, also erstelle ein paar Aufgaben. Du kannst später weitere hinzufügen, wenn sie Dir einfallen. Alle Aufgaben können hinzugefügt werden, indem Du die grüne \"Aufgabe hinzufügen\" Schaltfläche auswählst.\n* **Richte [To-Dos](http://de.habitica.wikia.com/wiki/To-Dos) ein:** Füge einmalige oder seltene Aufgaben einzeln in der Spalte \"To-Dos\" hinzu. Wenn Du auf diese Aufgabe klickst, kannst Du die Aufgabe anpassen und zum Beispiel ein Fälligkeitsdatum oder eine Checkliste hinzufügen.\n* **Richte [Tägliche Aufgaben](http://de.habitica.wikia.com/wiki/T%C3%A4gliche_Aufgaben) ein:** Füge Aufgaben die täglich, oder an einem bestimmten Tag in der Woche, im Monat, oder im Jahr anfallen in der Spalte \"Tägliche Aufgaben\" hinzu. Klicke auf die Aufgabe um anzupassen an welchen Wochentagen sie fällig sind. Alternativ kannst Du auch eine periodische Fälligkeit einstellen, z.B. alle 3 Tage. \n* **Richte [Gewohnheiten](http://de.habitica.wikia.com/wiki/Gewohnheiten) ein:** Füge Gewohnheiten in der Spalte \"Gewohnheiten\" hinzu. Du kannst einstellen, ob es sich um eine gute Gewohnheit :heavy_plus_sign: oder eine schlechte Angewohnheit :heavy_minus_sign: handelt.\n* **Richte [Belohnungen](http://de.habitica.wikia.com/wiki/Belohnungen) ein:** Zusätzlich zu den Belohnungen die das Spiel Dir gibt, kannst Du in der Spalte \"Belohnungen\" eigene Aktivitäten oder Vergnügen eintragen, die Dich motivieren. Es ist wichtig, dass Du Dir auch hin und wieder eine Pause oder etwas Luxus gönnst! \n* Falls Du Anregungen brauchst welche Aufgaben Du hinzufügen solltest, schau auf die Wiki-Seiten unter [Beispiele für Gewohnheiten](http://de.habitica.wikia.com/wiki/Beispiele_f%C3%BCr_Gewohnheiten), [Beispiele für tägliche Aufgaben](http://de.habitica.wikia.com/wiki/Beispiele_f%C3%BCr_t%C3%A4gliche_Aufgaben), [Beispiele für To-Dos](http://de.habitica.wikia.com/wiki/Beispiele_f%C3%BCr_To-Dos), und [Beispiele für Belohnungen](http://de.habitica.wikia.com/wiki/Beispiele_f%C3%BCr_Gewohnheiten).", - "step2": "Schritt 2: Sammel Punkte indem du im wirklichen Leben Dinge erledigst", + "step2": "Schritt 2: Sammel Punkte indem Du im wirklichen Leben Dinge erledigst", "webStep2Text": "Fange nun damit an, Ziele von Deiner Liste anzugehen! Indem Du Aufgaben erledigst und in Habitica abhakst, erhältst Du [Erfahrung](http://de.habitica.wikia.com/wiki/Erfahrungspunkte), die Dich Level aufsteigen lässt, und [Gold](http://de.habitica.wikia.com/wiki/Goldpunkte), das es Dir ermöglicht, Belohnungen zu erwerben. Wenn Du schlechten Gewohnheiten verfällst oder Tägliche Aufgaben verpasst, verlierst Du [Lebenspunkte](http://de.habitica.wikia.com/wiki/Lebenspunkte). Auf diese Weise dienen die Habitica Erfahrungs- und Lebenspunkt-Leiste als unterhaltsame Anzeige des Fortschritts hin zu Deinen Zielen. Dein echtes Leben wird sich sichtbar verbessern, während Dein Charakter im Spiel vorankommt.", - "step3": "Schritt 3: Entdecke Habitica und passe es deinen Bedürfnissen an", - "webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your tasks with [tags](http://habitica.wikia.com/wiki/Tags) (edit a task to add them).\n * Customize your [avatar](http://habitica.wikia.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](http://habitica.wikia.com/wiki/Equipment) under Rewards or from the [Shops](/shops/market), and change it under [Inventory > Equipment](/inventory/equipment).\n * Connect with other users via the [Tavern](http://habitica.wikia.com/wiki/Tavern).\n * Starting at Level 3, hatch [Pets](http://habitica.wikia.com/wiki/Pets) by collecting [eggs](http://habitica.wikia.com/wiki/Eggs) and [hatching potions](http://habitica.wikia.com/wiki/Hatching_Potions). [Feed](http://habitica.wikia.com/wiki/Food) them to create [Mounts](http://habitica.wikia.com/wiki/Mounts).\n * At level 10: Choose a particular [class](http://habitica.wikia.com/wiki/Class_System) and then use class-specific [skills](http://habitica.wikia.com/wiki/Skills) (levels 11 to 14).\n * Form a party with your friends (by clicking [Party](/party) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [quests](http://habitica.wikia.com/wiki/Quests) (you will be given a quest at level 15).", + "step3": "Schritt 3: Entdecke Habitica und passe es Deinen Bedürfnissen an", + "webStep3Text": "Wenn Du mit den Grundlagen vertraut bist, kannst Du mit diesen raffinierten Funktionen noch mehr mit aus Habitica herausholen:\n* Verwalte Deine Aufgaben mit [Tags](http://de.habitica.wikia.com/wiki/Tags) (Bearbeite eine Aufgabe, um diese hinzuzufügen).\n* Passe Deinen [Avatar](http://de.habitica.wikia.com/wiki/Avatar) an (klicke das Benutzer-Icon oben rechts an).\n* Kaufe Dir [Ausrüstung](http://de.habitica.wikia.com/wiki/Ausr%C3%BCstung) unter Belohnungen oder in den [Shops](/shops/market) und ändere diese unter [Inventar > Ausrüstung](/inventory/equipment).\n* Setz Dich mit anderen im [Gasthaus](http://habitica.wikia.com/wiki/Tavern) in Verbindung.\n* Brüte ab Level 3 [Haustiere](http://de.habitica.wikia.com/wiki/Haustiere) aus, indem Du [Eier](http://de.habitica.wikia.com/wiki/Eier) und [Schlüpfelixiere](http://de.habitica.wikia.com/wiki/Schl%C3%BCpfelixiere) sammelst. [Füttere](http://de.habitica.wikia.com/wiki/Futter) sie um sie zu [Reittieren](http://de.habitica.wikia.com/wiki/Reittiere) heranwachsen zu lassen.\n* Ab Level 10: Wähle eine spezielle [Klasse](http://de.habitica.wikia.com/wiki/Klassen) und benutze deren spezifische [Fähigkeiten](http://de.habitica.wikia.com/wiki/F%C3%A4higkeiten) (ab Level 11 bis 14).\n* Gründe eine Gruppe mit Deinen Freunden unter [Gruppe](/party) in der Navigationsleiste um verantwortungsbewusst zu bleiben und Quest-Schriftrollen zu verdienen.\n* Bekämpfe Monster und sammle Objekte für [Quests](http://de.habitica.wikia.com/wiki/Quests) (Du erhältst eine erste Quest in Level 15 geschenkt).", - "overviewQuestions": "Du hast Fragen? Schau doch einmal in die [FAQ](https://habitica.com/static/faq/)! Wenn Du Deine Frage hier nicht findest, kannst du in der [Habitica-Help-Gilde](https://habitica.com/#/options/groups/guilds/5481ccf3-5d2d-48a9-a871-70a7380cee5a) nach Hilfe fragen. \n\nViel Glück mit Deinen Aufgaben!" + "overviewQuestions": "Du hast Fragen? Schau doch einmal in die [FAQ](https://habitica.com/static/faq/)! Wenn Du Deine Frage hier nicht findest, kannst Du in der [Habitica-Help-Gilde](https://habitica.com/#/options/groups/guilds/5481ccf3-5d2d-48a9-a871-70a7380cee5a) nach Hilfe fragen. \n\nViel Glück mit Deinen Aufgaben!" } diff --git a/website/common/locales/de/pets.json b/website/common/locales/de/pets.json index 7b49503523..73dc595f5c 100644 --- a/website/common/locales/de/pets.json +++ b/website/common/locales/de/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "Königlicher purpurfarbener Greif", "phoenix": "Phönix", "magicalBee": "Magische Biene", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "Hoffnungsfroher Hippogreif", + "hopefulHippogriffMount": "Hoffnungsfroher Hippogreif", "royalPurpleJackalope": "Königlicher purpurfarbener Wolpertinger", "invisibleAether": "Unsichtbarer Äther", "rarePetPop1": "Klicke auf den goldenen Pfotenabdruck, um zu sehen, wie Du diese seltenen Haustiere erhalten kannst, indem Du bei Habitica mitwirkst!", @@ -83,7 +83,7 @@ "petNotOwned": "Du besitzt dieses Haustier nicht.", "mountNotOwned": "Du besitzt dieses Reittier nicht.", "earnedCompanion": "Durch all Deine Produktivität hast Du einen neuen Begleiter erhalten. Füttere ihn damit er wächst!", - "feedPet": "Feed <%= text %> to your <%= name %>?", + "feedPet": "<%= text %> an <%= name %> verfüttern?", "useSaddle": "Einen magischen Sattel auf <%= pet %> anwenden?", "raisedPet": "Du hast ein <%= pet %> aufgezogen!", "earnedSteed": "Durch das Erfüllen Deiner Aufgaben hast Du ein treues Reittier verdient!", @@ -91,18 +91,18 @@ "rideLater": "Später reiten", "petName": "<%= potion(locale) %> <%= egg(locale) %>", "mountName": "<%= potion(locale) %> <%= mount(locale) %>", - "keyToPets": "Key to the Pet Kennels", - "keyToPetsDesc": "Release all standard Pets so you can collect them again. (Quest Pets and rare Pets are not affected.)", - "keyToMounts": "Key to the Mount Kennels", - "keyToMountsDesc": "Release all standard Mounts so you can collect them again. (Quest Mounts and rare Mounts are not affected.)", - "keyToBoth": "Master Keys to the Kennels", - "keyToBothDesc": "Release all standard Pets and Mounts so you can collect them again. (Quest Pets/Mounts and rare Pets/Mounts are not affected.)", - "releasePetsConfirm": "Are you sure you want to release your standard Pets?", - "releasePetsSuccess": "Your standard Pets have been released!", - "releaseMountsConfirm": "Are you sure you want to release your standard Mounts?", - "releaseMountsSuccess": "Your standard Mounts have been released!", - "releaseBothConfirm": "Are you sure you want to release your standard Pets and Mounts?", - "releaseBothSuccess": "Your standard Pets and Mounts have been released!", + "keyToPets": "Schlüssel zu den Haustier-Zwingern", + "keyToPetsDesc": "Lässt alle Standard-Haustiere frei, so dass Du sie erneut sammeln kannst. (Quest- und seltene Haustiere sind nicht betroffen.)", + "keyToMounts": "Schlüssel zu den Reittier-Zwingern", + "keyToMountsDesc": "Lässt alle Standard-Reittiere frei, so dass Du sie erneut sammeln kannst. (Quest- und seltene Reittiere sind nicht betroffen.)", + "keyToBoth": "Hauptschlüssel zu den Zwingern", + "keyToBothDesc": "Lässt alle Standard-Haustiere und -Reittiere frei, so dass Du sie erneut sammeln kannst. (Quest- und seltene Haus- oder Reittiere sind nicht betroffen.)", + "releasePetsConfirm": "Bist Du sicher, dass Du Deine Standard-Haustiere freilassen möchtest?", + "releasePetsSuccess": "Deine Standard-Haustiere wurden freigelassen!", + "releaseMountsConfirm": "Bist Du sicher, dass Du Deine Standard-Reittiere freilassen möchtest?", + "releaseMountsSuccess": "Deine Standard-Reittiere wurden freigelassen!", + "releaseBothConfirm": "Bist Du sicher, dass Du Deine Standard-Haustiere und -Reittiere freilassen möchtest?", + "releaseBothSuccess": "Deine Standard-Haustiere und -Reittiere wurden freigelassen!", "petKeyName": "Schlüssel zu den Zwingern", "petKeyPop": "Lasse Deine Haustiere auf eigene Faust Habitica erkunden. Lasse sie frei, sodass sie ihr eigenes Abenteuer beginnen können und stelle Dich der Herausforderung \"Meister aller Bestien\" erneut!", "petKeyBegin": "Schlüssel zu den Zwingern: Stelle Dich <%= title %> erneut!", @@ -138,5 +138,5 @@ "dragThisPotion": "Ziehe dieses <%= potionName %> zu einem Ei und brüte ein neues Haustier aus!", "clickOnEggToHatch": "Klicke auf ein Ei um Dein <%= potionName %> Schlüpfelixier zu nutzen und ein neues Haustier auszubrüten!", "hatchDialogText": "Gieße Dein <%= potionName %> Schlüpfelixier auf Dein <%= eggName %>-Ei und es wird ein <%= petName %> daraus schlüpfen.", - "clickOnPotionToHatch": "Click on a hatching potion to use it on your <%= eggName %> and hatch a new pet!" + "clickOnPotionToHatch": "Klicke auf ein Schlüpfelixier, um es über Dein <%= eggName %> zu gießen und ein neues Haustier schlüpfen zu lassen!" } \ No newline at end of file diff --git a/website/common/locales/de/quests.json b/website/common/locales/de/quests.json index 949357d15e..fcf39db74f 100644 --- a/website/common/locales/de/quests.json +++ b/website/common/locales/de/quests.json @@ -21,11 +21,11 @@ "dropQuestCongrats": "Gratulation zum Erwerb dieser Questschriftrolle! Du kannst nun Deine Gruppe dazu einladen die Quest zu starten oder Du kommst irgendwann darauf zurück unter Inventar > Quests.", "questSend": "Indem Du auf \"Einladen\" klickst sendest Du eine Einladung an Deine Gruppenmitglieder. Sobald alle Mitglieder diese angenommen oder abgelehnt haben beginnt die Quest. Der Status ist unter Soziales > Gruppe zu finden.", "questSendBroken": "Indem Du auf \"Einladen\" klickst, sendest Du eine Einladung an Deine Gruppenmitglieder ... Sobald alle Mitglieder diese angenommen oder abgelehnt haben beginnt die Quest ... Der Status ist unter Soziales > Gruppe zu finden ...", - "inviteParty": "Lade Gruppe zum Quest ein", + "inviteParty": "Lade Gruppe zur Quest ein", "questInvitation": "Quest-Einladung:", "questInvitationTitle": "Quest-Einladung", - "questInvitationInfo": "Einladung zum Quest <%= quest %>", - "invitedToQuest": "Du wurdest zum Quest <%= quest %> eingeladen", + "questInvitationInfo": "Einladung zur Quest <%= quest %>", + "invitedToQuest": "Du wurdest zur Quest <%= quest %> eingeladen", "askLater": "Später fragen", "questLater": "Quest später starten", "buyQuest": "Quest kaufen", diff --git a/website/common/locales/de/questscontent.json b/website/common/locales/de/questscontent.json index f58709c58a..62bd3f4ff2 100644 --- a/website/common/locales/de/questscontent.json +++ b/website/common/locales/de/questscontent.json @@ -553,27 +553,30 @@ "winterQuestsText": "\"Winter\" Quest-Paket", "winterQuestsNotes": "Beinhaltet 'Wildernder Weihnachtswichtel', 'Finde das Jungtier' und 'Der Federvieh-Frost'. Verfügbar bis zum 31. Dezember.", "questPterodactylText": "Der Pterror-Dactylus", - "questPterodactylNotes": "Du machst einen Spaziergang entlang der friedlichen Stoistillen Klippen, als ein böses Kreischen die Luft zerreißt. Du drehst Dich um, siehst eine schreckliche Kreatur auf Dich zufliegen und wirst von einem mächtigen Schrecken überwältigt. Als Du Dich zur Flucht wendest, packt Dich @Lilith of Alfheim. \"Keine Panik! Es ist nur ein Pterror-dactylus.\"

@Procyon P nickt. \"Sie nisten in der Nähe, aber sie fühlen sich angezogen vom Geruch negativer Gewohnheiten und unerledigter Dailies.\"

Keine Sorge\", sagt @Katy133. \"Wir müssen nur besonders produktiv sein, um es zu besiegen!\" Du bist erfüllt von einem erneuerten Sinn für Zielstrebigkeit und wendest Dich Deinem Feind zu.", - "questPterodactylCompletion": "Mit einem letzten Kreischen stürzt der Pterror-Dactylus über die Klippe. Du rennst nach vorn, um zu sehen, wie er über die entfernten Steppen hinwegfliegt. \"Puh, ich bin froh, dass das vorbei ist\", sagst du. \"Ich auch\", antwortet @GeraldThePixel. \"Aber seht doch! Er hat ein paar Eier für uns zurückgelassen.\" @Edge gibt Dir drei Eier, und Du gelobst, sie in Gelassenheit aufzuziehen, umgeben von positiven Gewohnheiten und blauen Dailies.", + "questPterodactylNotes": "Du machst einen Spaziergang entlang der friedlichen Stoïstillen Klippen, als ein böses Kreischen die Luft zerreißt. Du drehst Dich um, siehst eine schreckliche Kreatur auf Dich zufliegen und wirst von einem mächtigen Schrecken überwältigt. Als Du Dich zur Flucht wendest, packt Dich @Lilith of Alfheim. \"Keine Panik! Es ist nur ein Pterror-Dactylus.\"

@Procyon P nickt. \"Sie nisten in der Nähe, aber sie fühlen sich angezogen vom Geruch negativer Gewohnheiten und unerledigter Dailies.\"

Keine Sorge\", sagt @Katy133. \"Wir müssen nur besonders produktiv sein, um ihn zu besiegen!\" Du bist erfüllt von einem erneuerten Sinn für Zielstrebigkeit und wendest Dich Deinem Feind zu.", + "questPterodactylCompletion": "Mit einem letzten Kreischen stürzt der Pterror-Dactylus über die Klippe. Du rennst nach vorn, um zu sehen, wie er über die entfernten Steppen hinwegfliegt. \"Puh, ich bin froh, dass das vorbei ist\", sagst Du. \"Ich auch\", antwortet @GeraldThePixel. \"Aber seht doch! Er hat ein paar Eier für uns zurückgelassen.\" @Edge gibt Dir drei Eier, und Du gelobst, sie in friedlicher Ruhe aufzuziehen, umgeben von positiven Gewohnheiten und blauen Tagesaufgaben.", "questPterodactylBoss": "Pterror-Dactylus", "questPterodactylDropPterodactylEgg": "Pterodactylus (Ei)", "questPterodactylUnlockText": "Ermöglicht den Kauf von Pterodactyluseiern auf dem Marktplatz", "questBadgerText": "Stop Badgering Me!", "questBadgerNotes": "Ah, winter in the Taskwoods. The softly falling snow, the branches sparkling with frost, the Flourishing Fairies… still not snoozing?

“Why are they still awake?” cries @LilithofAlfheim. “If they don't hibernate soon, they'll never have the energy for planting season.”

As you and @Willow the Witty hurry to investigate, a furry head pops up from the ground. Before you can yell, “It’s the Badgering Bother!” it’s back in its burrow—but not before snatching up the Fairies' “Hibernate” To-Dos and dropping a giant list of pesky tasks in their place!

“No wonder the fairies aren't resting, if they're constantly being badgered like that!” @plumilla says. Can you chase off this beast and save the Taskwood’s harvest this year?", "questBadgerCompletion": "You finally drive away the the Badgering Bother and hurry into its burrow. At the end of a tunnel, you find its hoard of the faeries’ “Hibernate” To-Dos. The den is otherwise abandoned, except for three eggs that look ready to hatch.", - "questBadgerBoss": "The Badgering Bother", + "questBadgerBoss": "Der Bedrängende Bösewicht", "questBadgerDropBadgerEgg": "Dachs (Ei)", "questBadgerUnlockText": "Ermöglicht den Kauf von Dachseiern auf dem Marktplatz", "questDysheartenerText": "Der Entmutiger", "questDysheartenerNotes": "Es ist Valentinstag, die Sonne geht gerade auf, als plötzlich ein erschütternder Krach die Luft zerreißt. Ein kränkliches rosa Licht durchdringt die Gebäude, und Ziegel zerbrechen, als sich ein tiefer Riss auf Habit City's Hauptstraße auftut. Ein überirdisches Kreischen ertönt durch die Luft und lässt die Fenster zerspringen, während sich eine ungeschlachte Form aus der klaffenden Erde erhebt.

Mandibeln schnappen, der Panzer glitzert; Bein um Bein entfaltet sich in der Luft. Die Menge beginnt zu schreien, als die insektoide Kreatur aufsteht und sich als schrecklichste aller Kreaturen zu erkennen gibt: der furchterregende Entmutiger höchstselbst. Er heult erwartungsvoll und stürzt vor, um an den Hoffnungen hart arbeitender Habiticaner zu nagen. Mit jedem scharrenden Kratzen seiner stacheligen Vorderbeine fühlst Du, wie sich Dein Herz in der Brust vor Verzweiflung weiter zusammenzieht.

“Fasst Euch alle ein Herz!” ruft Lemoness. “Er denkt vielleicht, dass wir leichte Ziele sind, weil so viele von uns entmutigende Neujahrsvorsätze haben, aber er wird feststellen, dass Habiticaner wissen, wie man an seinen Zielen festhält!”

AnnDeLune hebt ihren Stab. “Lasst uns unsere Aufgaben angehen und dieses Monster erledigen!”", - "questDysheartenerCompletion": "The Dysheartener is DEFEATED!

Together, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”

Glowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.

The crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.

Our newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.

Beffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”

Crooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", - "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", + "questDysheartenerCompletion": "Der Entmutiger wurde BESIEGT!

Gemeinsam holen alle in Habitica zu einem letzten Schlag mit ihren Aufgaben aus, und der Entmutiger weicht mit einem bestürzten Kreischen zurück. “Stimmt etwas nicht, Entmutiger?” ruft AnnDeLune mit funkelnden Augen. “Fühlst Du Dich entmutigt?”

Glühend pinke Risse zeigen sich auf dem Panzer des Entmutigers, und er zerbricht mit einer verpuffenden rosa Rauchwolke. Eine Flut von köstlichen Süßigkeiten regnet auf alle hernieder, während sich im ganzen Land ein erneuertes Gefühl von Kraft und Entschlossenheit ausbreitet.

Die Menge jubelt wild, Umarmungen werden ausgetauscht, und die Haustiere kauen glücklich auf ihren verspäteten Valentinsleckerli. Plötzlich liegt Gesang in der Luft, ein fröhlicher Chor ertönt, und funkelnde Silhouetten ziehen über den Himmel.

Unser neu-gewonnener Optimismus hat eine Herde Hippogreifen angelockt! Die anmutigen Kreaturen setzen auf dem Boden auf, sträuben interessiert ihre Federn und tänzeln auf der Stelle. “Wie es aussieht, haben wir neue Freunde gefunden, die uns helfen, nicht zu verzagen, selbst wenn unsere Aufgaben noch so beängstigend sind”, sagt Lemoness.

Beffymaroo hat bereits ihre Arme voll mit gefiederten Plüschbällen. “Vielleicht helfen sie uns, die zerstörten Gebiete Habitica's wieder aufzubauen!”

Summend und singend ziehen die Hippogreifen voran, während alle Habiticaner zusammenarbeiten, um unsere geliebte Heimat wieder aufzubauen.", + "questDysheartenerCompletionChat": "`Der Entmutiger wurde BESIEGT!'`\n\nGemeinsam holen alle in Habitica zu einem letzten Schlag mit ihren Aufgaben aus, und der Entmutiger weicht mit einem bestürzten Kreischen zurück. “Stimmt etwas nicht, Entmutiger?” ruft AnnDeLune mit funkelnden Augen. “Fühlst Du Dich entmutigt?”\n\nGlühend pinke Risse zeigen sich auf dem Panzer des Entmutigers, und er zerbricht mit einer verpuffenden rosa Rauchwolke. Eine Flut von köstlichen Süßigkeiten regnet auf alle hernieder, während sich im ganzen Land ein erneuertes Gefühl von Kraft und Entschlossenheit ausbreitet.\n\nDie Menge jubelt wild, Umarmungen werden ausgetauscht, und die Haustiere kauen glücklich auf ihren verspäteten Valentinsleckerli. Plötzlich liegt Gesang in der Luft, ein fröhlicher Chor ertönt, und funkelnde Silhouetten ziehen über den Himmel.\n\nUnser neu-gewonnener Optimismus hat eine Herde Hippogreifen angelockt! Die anmutigen Kreaturen setzen auf dem Boden auf, sträuben interessiert ihre Federn und tänzeln auf der Stelle. “Wie es aussieht, haben wir neue Freunde gefunden, die uns helfen, nicht zu verzagen, selbst wenn unsere Aufgaben noch so beängstigend sind”, sagt Lemoness.\n\nBeffymaroo hat bereits ihre Arme voll mit gefiederten Plüschbällen. “Vielleicht helfen sie uns, die zerstörten Gebiete Habitica's wieder aufzubauen!”\n\nSummend und singend ziehen die Hippogreifen voran, während alle Habiticaner zusammenarbeiten, um unsere geliebte Heimat wieder aufzubauen.", "questDysheartenerBossRageTitle": "Niederschmetternder Herzschmerz", "questDysheartenerBossRageDescription": "Die Anzeige für den Raserei-Angriff füllt sich, wenn Habiticaner ihre Tagesaufgaben nicht abhaken. Sobald sie gefüllt ist, wird der Entmutiger seine Niederschmetternde Herzschmerz-Attacke über einem von Habitica's Ladenbesitzern entfesseln, also strengt Euch an und erledigt Eure Aufgaben!", "questDysheartenerBossRageSeasonal": "`Der Entmutiger entfesselt NIEDERSCHMETTERNDEN HERZSCHMERZ!`\n\nOh nein! Nachdem er sich an unseren unerledigten Tagesaufgaben gelabt hat, hat der Entmutiger genügend Stärke gesammelt, um seine Niederschmetternde Herzschmerz-Attacke einzusetzen. Mit einem schrillen Aufschrei treffen seine stacheligen Vorderbeine den Pavillon, unter dem der Jahreszeitenmarkt liegt! Die markerschütternde Explosion aus Magie lässt das Holz zersplittern, und die Jahreszeitenzauberin wird bei dem Anblick von Trauer überwältigt.\n\nRasch, lasst uns unsere Tagesaufgaben erledigen, damit das Biest kein weiteres Mal zuschlagen kann!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "Am 21. Februar war unsere geschätzte Leslie, die Jahreszeitenzauberin, am Boden zerstört, als der Entmutiger den Jahreszeitenmarkt zerstörte. Schnell, erledigt Eure Aufgaben, um das Monster zu bekämpfen und beim Wiederaufbau zu helfen!", "questDysheartenerBossRageMarket": "`Der Entmutiger entfesselt NIEDERSCHMETTERNDEN HERZSCHMERZ!`\n\nHilfe! Nachdem er sich an unseren unerledigten Tagesaufgaben gelabt hat, lässt der Entmutiger eine weitere Niederschmetternde Herzschmerz-Attacke los, die die Wände des Markts zerbersten lässt und ihn dem Erboden gleich macht! Unter den herabfallenden Steinen weint Alex der Händler um seine von der Zerstörung betroffenen Waren.\n\nWir dürfen nicht zulassen, dass dies noch einmal passiert! Sorgt dafür, dass alle Eure Tagesaufgaben erledigt werden, bevor der Entmutiger zu seinem letzten Schlag ansetzt.", "questDysheartenerBossRageQuests": "`Der Entmutiger entfesselt NIEDERSCHMETTERNDEN HERZSCHMERZ!`\n\nAaaah! Wir haben schon wieder nicht alle Tagesaufgaben erledigt, und der Entmutiger hat genügend Energie für einen letzten Schlag gegen unsere geliebten Ladenbesitzer gesammelt. Die Landschaft um Ian den Questmeister wurde von seiner Niederschmetternden Herzschmerz-Attacke förmlich zerrissen, und Ian bis ins Mark erschüttert von dem schrecklichen Anblick. Wir sind so nah dran, dieses Monster zu besiegen... Beeilt Euch! Gebt jetzt nicht auf!", "questDysheartenerDropHippogriffPet": "Hoffnungsfroher Hippogreif (Haustier)", "questDysheartenerDropHippogriffMount": "Hoffnungsfroher Hippogreif (Reittier)", - "dysheartenerArtCredit": "Artwork by @AnnDeLune" + "dysheartenerArtCredit": "Artwork von @AnnDeLune" } \ No newline at end of file diff --git a/website/common/locales/de/subscriber.json b/website/common/locales/de/subscriber.json index 90c0b35373..81ba06b487 100644 --- a/website/common/locales/de/subscriber.json +++ b/website/common/locales/de/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Teppichreiter-Set", "mysterySet201712": "Kerzenzauberer-Set", "mysterySet201801": "Frostkobold-Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk-Standard-Set", "mysterySet301405": "Steampunk-Zubehör-Set", "mysterySet301703": "Pfauen-Steampunk-Set", diff --git a/website/common/locales/de/tasks.json b/website/common/locales/de/tasks.json index 9579f45de3..4b762d2a17 100644 --- a/website/common/locales/de/tasks.json +++ b/website/common/locales/de/tasks.json @@ -40,14 +40,14 @@ "taskAliasPlaceholder": "Dein-Aufgaben-Alias", "taskAliasPopoverWarning": "WARNUNG: Änderungen dieses Werts werden jegliche 3rd Party-Integrationen zerstören, die sich auf den Aufgaben-Alias beziehen.", "difficulty": "Schwierigkeit", - "difficultyHelp": "Difficulty describes how challenging a Habit, Daily, or To-Do is for you to complete. A higher difficulty results in greater rewards when a Task is completed, but also greater damage when a Daily is missed or a negative Habit is clicked.", + "difficultyHelp": "Die Schwierigkeit gibt an, wie herausfordernd eine Gewohnheit, Tagesaufgabe oder ein To-Do für Dich zu erledigen ist. Eine höhere Schwierigkeit resultiert in größeren Belohnungen, wenn eine Aufgabe abgeschlossen wird, aber auch in größerem Schaden, wenn eine Tagesaufgabe unerledigt bleibt oder eine negative Gewohnheit geklickt wird.", "trivial": "Trivial", "easy": "Einfach", "medium": "Mittel", "hard": "Schwer", "attributes": "Attribute", - "attributeAllocation": "Stat Allocation", - "attributeAllocationHelp": "Stat allocation is an option that provides methods for Habitica to automatically assign an earned Stat Point to a Stat immediately upon level-up.

You can set your Automatic Allocation method to Task Based in the Stats section of your profile.", + "attributeAllocation": "Attributsverteilung", + "attributeAllocationHelp": "Attributsverteilung ist eine Option, die es Habitica ermöglicht, einen erhaltenen Attributspunkt sofort beim Stufenanstieg automatisch zuzuweisen.

Du kannst die Automatische Verteilung in Deinem Profil im Abschnitt Werte auf Taskbasiert setzen.", "progress": "Fortschritt", "daily": "Tägliche Aufgabe", "dailies": "Tägliche Aufgaben", @@ -58,7 +58,7 @@ "repeat": "Wiederholen", "repeats": "Wiederholungen", "repeatEvery": "Wiederhole alle", - "repeatOn": "Repeat On", + "repeatOn": "Wiederhole am", "repeatHelpTitle": "Wie oft soll diese Aufgabe wiederholt werden?", "dailyRepeatHelpContent": "Diese Aufgabe wird alle X Tage fällig werden. Du kannst diesen Wert unten bestimmen.", "weeklyRepeatHelpContent": "Diese Aufgabe wird an den unten hervorgehobenen Tagen fällig werden. Klicke auf einen Tag um ihn zu aktivieren/deaktivieren.", @@ -110,9 +110,9 @@ "streakSingular": "Perfektionist", "streakSingularText": "Hat eine 21-tägige Strähne bei einer täglichen Aufgabe erreicht", "perfectName": "<%= count %> perfekte Tage", - "perfectText": "Completed all active Dailies on <%= count %> days. With this achievement you get a +level/2 buff to all Stats for the next day. Levels greater than 100 don't have any additional effects on buffs.", + "perfectText": "Hat alle aktiven Tagesaufgaben an <%= count %> Tagen erledigt. Mit diesem Erfolg erhältst Du einen Bonus von +Level/2 auf alle Attribute für den nächsten Tag. Alle Level über 100 haben keine zusätzliche Auswirkung auf die Attribute. ", "perfectSingular": "Perfekt(e) Tag(e)", - "perfectSingularText": "Completed all active Dailies in one day. With this achievement you get a +level/2 buff to all Stats for the next day. Levels greater than 100 don't have any additional effects on buffs.", + "perfectSingularText": "Hat alle aktiven Tagesaufgaben an einem Tag erledigt. Mit diesem Erfolg erhältst Du einen Bonus von +Level/2 auf alle Attribute für den nächsten Tag. Alle Level über 100 haben keine zusätzliche Auswirkung auf die Attribute. ", "streakerAchievement": "Du hast den Erfolg \"Perfektionist\" erlangt! Die 21-Tages-Marke ist ein Meilenstein für das Bilden von Gewohnheiten. Du erhältst diesen Erfolg alle 21 Tage neu (gestapelt), auch für dieselbe tägliche Aufgabe.", "fortifyName": "Verstärkungstrank", "fortifyPop": "Setzt alle Aufgaben auf den Anfangswert (gelb) zurück und füllt Deine Lebenspunkte wieder auf.", @@ -120,7 +120,7 @@ "fortifyText": "Stärken setzt alle Deine Aufgaben außer Wettbewerbs-Aufgaben auf einen neutralen Status (gelb) zurück, so als ob Du sie gerade erstellt hättest, und füllt Deine Lebenspunkte wieder ganz auf. Das ist toll wenn all die roten Aufgaben Dir das Leben zu schwer machen, oder all die blauen Aufgaben das Spiel zu einfach erscheinen lassen. Wenn ein Neuanfang gerade den größten Motivationsschub darstellt, gib ein paar Edelsteine aus und gönn' Dir eine Atempause!", "confirmFortify": "Bist Du sicher?", "fortifyComplete": "Verstärkung abgeschlossen!", - "deleteTask": "Delete this Task", + "deleteTask": "Diese Aufgabe löschen", "sureDelete": "Möchtest Du diese Aufgabe wirklich löschen?", "streakCoins": "Strähnenbonus!", "taskToTop": "Nach oben", @@ -141,7 +141,7 @@ "toDoHelp3": "To-Dos mit der Kontrollliste in kleinere Teilaufgaben zu unterteilen macht sie weniger beängstigend, und wird Deine Punkte erhöhen!", "toDoHelp4": "Zur Inspiration kannst Du Dir diese Beispiele von To-Dos durchsehen!", "rewardHelp1": "Die Ausrüstung, die Du für Deinen Avatar kaufst, ist unter <%= linkStart %>Inventar > Ausrüstung<%= linkEnd %> gelagert.", - "rewardHelp2": "Equipment affects your Stats (<%= linkStart %>Avatar > Stats<%= linkEnd %>).", + "rewardHelp2": "Ausrüstungsgegenstände beeinflussen Deine Attribute (<%= linkStart %>Avatar > Werte<%= linkEnd %>).", "rewardHelp3": "Während Welt-Events wird hier Spezialausrüstung erscheinen.", "rewardHelp4": "Scheue Dich nicht davor eigene Belohnungen hinzuzufügen! Sieh Dir einige Beispielbelohnungen durch.", "clickForHelp": "Klicke hier für Hilfe", diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index 17be223d46..05d20914c3 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -665,6 +665,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -1064,6 +1066,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Basic Top Hat", @@ -1332,6 +1336,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/en/groups.json b/website/common/locales/en/groups.json index e98f66076a..64f9a3401d 100644 --- a/website/common/locales/en/groups.json +++ b/website/common/locales/en/groups.json @@ -222,11 +222,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party. ", "userWithIDNotFound": "User with id \"<%= userId %>\" not found.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -429,5 +429,6 @@ "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } diff --git a/website/common/locales/en/limited.json b/website/common/locales/en/limited.json index 1d68545b6c..52785e0b94 100644 --- a/website/common/locales/en/limited.json +++ b/website/common/locales/en/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until October 31... I guess you should to stock up now, or you'll have to wait... and wait... and wait... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Rogue)", diff --git a/website/common/locales/en/loadingScreenTips.json b/website/common/locales/en/loadingScreenTips.json index ec50ad2ee1..cbbffb7501 100644 --- a/website/common/locales/en/loadingScreenTips.json +++ b/website/common/locales/en/loadingScreenTips.json @@ -12,7 +12,7 @@ "tip10": "You can win gems by competing in Challenges. New ones are added every day!", "tip11": "Having more than four Party members increases accountability!", "tip12": "Add checklists to your To-Dos to multiply your rewards!", - "tip13": "Click “Filters” on your task page to make an unwieldy task list very manageable!", + "tip13": "Click “Tags” on your task page to make an unwieldy task list very manageable!", "tip14": "You can add headers or inspirational quotes to your list as Habits with no (+/-).", "tip15": "Complete all the Masterclasser Quest-lines to learn about Habitica’s secret lore.", "tip16": "Click the link to the Data Display Tool in the footer for valuable insights on your progress.", diff --git a/website/common/locales/en/questsContent.json b/website/common/locales/en/questsContent.json index 74354df408..02921a7a71 100644 --- a/website/common/locales/en/questsContent.json +++ b/website/common/locales/en/questsContent.json @@ -662,7 +662,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/en/subscriber.json b/website/common/locales/en/subscriber.json index 368e1ffe9e..b080ea816b 100644 --- a/website/common/locales/en/subscriber.json +++ b/website/common/locales/en/subscriber.json @@ -140,6 +140,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/en/tasks.json b/website/common/locales/en/tasks.json index 0e7b7fda6e..df45b1b9aa 100644 --- a/website/common/locales/en/tasks.json +++ b/website/common/locales/en/tasks.json @@ -149,6 +149,8 @@ "taskAliasAlreadyUsed": "Task alias already used on another task.", "taskNotFound": "Task not found.", "invalidTaskType": "Task type must be one of \"habit\", \"daily\", \"todo\", \"reward\".", + "invalidTasksType": "Task type must be one of \"habits\", \"dailys\", \"todos\", \"rewards\".", + "invalidTasksTypeExtra": "Task type must be one of \"habits\", \"dailys\", \"todos\", \"rewards\", \"completedTodos\".", "cantDeleteChallengeTasks": "A task belonging to a challenge can't be deleted.", "checklistOnlyDailyTodo": "Checklists are supported only on Dailies and To-Dos", "checklistItemNotFound": "No checklist item was found with given id.", diff --git a/website/common/locales/en@pirate/character.json b/website/common/locales/en@pirate/character.json index aea4c17c83..a47e7c07d0 100644 --- a/website/common/locales/en@pirate/character.json +++ b/website/common/locales/en@pirate/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Class Bonus", "battleGear": "Battle Gear", + "gear": "Gear", "battleGearText": "This be th' gear ye wear into battle; it affects numbers when interactin' with ye tasks.", "autoEquipBattleGear": "Auto-equip new gear", "costume": "Costume", diff --git a/website/common/locales/en@pirate/faq.json b/website/common/locales/en@pirate/faq.json index b1cd7f763e..3b52506f0e 100644 --- a/website/common/locales/en@pirate/faq.json +++ b/website/common/locales/en@pirate/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "How c'n I play Habitica wit' my mates?", "iosFaqAnswer5": "Th' best way is t' invite them t' a Crew with ye! Crews can go on adventures, battle monsters, an' cast skills t' support each other. Go to Menu > Crew an' click \"Create New Crew\" if ye don't already have a Crew. Then tap on th' Members list, an' tap Invite in th' upper right-hand corner t' invite yer mates by enterin' their User ID (a string o' numbers an' letters that they can find under Settings > Account Details on th' app, an' Settings > API on th' website). On th' website, ye can also invite mates via email, which we will add t' the app in a future update.\n\nOn th' website, ye an' yer mates can also join Ships, which be public chat rooms. Ships will be added t' th' app in a future update!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "How do I get a Pet or Mount?", "iosFaqAnswer6": "At level 3, ye will unlock th' Drop System. Every time ye complete a task, ye have a random chance at receivin' an egg, a hatchin' potion, or a piece o' food. They will be stored in Menu > Items.\n\n T' hatch a Pet, ye'll be needin' an egg an' a hatchin' potion. Tap on th' egg t' determine the species ye want t' hatch, an' select \"Hatch Egg.\" Then choose a hatchin' potion t' determine its color! Go to Menu > Pets t' equip yer new Pet t' yer avatar by clickin' on it. \n\n Ye can also grow yer Pets into Mounts by feedin' them under Menu > Pets. Tap on a Pet, an' then select \"Feed Pet\"! Ye'll have t' feed a pet many times before it becomes a Mount, but if ye can figure out its favorite food, it will grow more quickly. Use trial an' error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once ye have a Mount, go t' Menu > Mounts an' tap on it t' equip it t' yer avatar.\n\n Ye can also get eggs for Quest Pets by completin' certain Quests. (See below t' learn more about Quests.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/en@pirate/gear.json b/website/common/locales/en@pirate/gear.json index b34e8c317f..2820763015 100644 --- a/website/common/locales/en@pirate/gear.json +++ b/website/common/locales/en@pirate/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper an' dashing, wot! Don't benefit ye. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat fer th' finest o' gentlefolk! January 3015 Subscriber Item. Don't benefit ye.", "headMystery301405Text": "Basic Top Hat", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time be on yer side wit' this towering clock shield! Don't benefit ye. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/en@pirate/generic.json b/website/common/locales/en@pirate/generic.json index af462c4535..bdcaba31d8 100644 --- a/website/common/locales/en@pirate/generic.json +++ b/website/common/locales/en@pirate/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/en@pirate/groups.json b/website/common/locales/en@pirate/groups.json index b17624d742..391cbc9dad 100644 --- a/website/common/locales/en@pirate/groups.json +++ b/website/common/locales/en@pirate/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Crew Ahead", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "User with id \"<%= userId %>\" not found.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/en@pirate/limited.json b/website/common/locales/en@pirate/limited.json index 36fe3d05ad..9309f40bf4 100644 --- a/website/common/locales/en@pirate/limited.json +++ b/website/common/locales/en@pirate/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh.... Welcome t' th' Seasonal Shop... We be stockin' autumn Seasonal Edition goodies, 'r somethin'... Everything here will be available t' purchase durin' th' Fall Festival even' each year, but we only be open 'til October 31... I guess ye should be stockin' up now, or ye'll be havin' t' wait... an' wait... an' wait... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Scallywag)", diff --git a/website/common/locales/en@pirate/questscontent.json b/website/common/locales/en@pirate/questscontent.json index 906a9b37fa..3d5a36d9f9 100644 --- a/website/common/locales/en@pirate/questscontent.json +++ b/website/common/locales/en@pirate/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/en@pirate/subscriber.json b/website/common/locales/en@pirate/subscriber.json index a5012535b1..e46b69329f 100644 --- a/website/common/locales/en@pirate/subscriber.json +++ b/website/common/locales/en@pirate/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/en_GB/character.json b/website/common/locales/en_GB/character.json index a9890a81c2..952ae44d34 100644 --- a/website/common/locales/en_GB/character.json +++ b/website/common/locales/en_GB/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Class Bonus", "battleGear": "Battle Gear", + "gear": "Gear", "battleGearText": "This is the gear you wear into battle; it affects numbers when interacting with your tasks.", "autoEquipBattleGear": "Auto-equip new gear", "costume": "Costume", diff --git a/website/common/locales/en_GB/faq.json b/website/common/locales/en_GB/faq.json index 349af90401..ea1ee3a15b 100644 --- a/website/common/locales/en_GB/faq.json +++ b/website/common/locales/en_GB/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "How do I play Habitica with my friends?", "iosFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to Menu > Party and click \"Create New Party\" if you don't already have a Party. Then tap on the Members list, and tap Invite in the upper right-hand corner to invite your friends by entering their User ID (a string of numbers and letters that they can find under Settings > Account Details on the app, and Settings > API on the website). On the website, you can also invite friends via email, which we will add to the app in a future update.\n\nOn the website, you and your friends can also join Guilds, which are public chat rooms. Guilds will be added to the app in a future update!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "How do I get a Pet or Mount?", "iosFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch Egg.\" Then choose a hatching potion to determine its colour! Go to Menu > Pets to equip your new Pet to your avatar by clicking on it. \n\n You can also grow your Pets into Mounts by feeding them under Menu > Pets. Tap on a Pet, and then select \"Feed Pet\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favourite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once you have a Mount, go to Menu > Mounts and tap on it to equip it to your avatar.\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its colour! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\". (Your avatar doesn't update to reflect the change.) \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favourite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\". (Your avatar doesn't update to reflect the change.)\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/en_GB/gear.json b/website/common/locales/en_GB/gear.json index 51b40bb942..7749055645 100644 --- a/website/common/locales/en_GB/gear.json +++ b/website/common/locales/en_GB/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Basic Top Hat", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/en_GB/generic.json b/website/common/locales/en_GB/generic.json index 0b4377ba2d..66bcb65578 100644 --- a/website/common/locales/en_GB/generic.json +++ b/website/common/locales/en_GB/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/en_GB/groups.json b/website/common/locales/en_GB/groups.json index d889d067b5..775f9d3855 100644 --- a/website/common/locales/en_GB/groups.json +++ b/website/common/locales/en_GB/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Party On", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user ID in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private.", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "User with ID \"<%= userId %>\" not found.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/en_GB/limited.json b/website/common/locales/en_GB/limited.json index a38d6afc86..2903b233ae 100644 --- a/website/common/locales/en_GB/limited.json +++ b/website/common/locales/en_GB/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until 31 October... I guess you should to stock up now, or you'll have to wait... and wait... and wait... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Rogue)", diff --git a/website/common/locales/en_GB/questscontent.json b/website/common/locales/en_GB/questscontent.json index 0c9ef7e019..c6e4d57cec 100644 --- a/website/common/locales/en_GB/questscontent.json +++ b/website/common/locales/en_GB/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/en_GB/subscriber.json b/website/common/locales/en_GB/subscriber.json index 6ac9eded4f..71578869e5 100644 --- a/website/common/locales/en_GB/subscriber.json +++ b/website/common/locales/en_GB/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/es/character.json b/website/common/locales/es/character.json index 0b5801c36f..8dd612a375 100644 --- a/website/common/locales/es/character.json +++ b/website/common/locales/es/character.json @@ -64,6 +64,7 @@ "classBonusText": "Su clase (Guerrero, si no has desbloqueado o seleccionado otra clase) aprovecha mejor su propio equipamiento mejor que el equipamiento de las otras clases. El equipamiento que lleves puesto y corresponda a tu clase actual aumentará en un 50 % los puntos al atributo que aporte. ", "classEquipBonus": "Bonus de clase", "battleGear": "Equipo de batalla", + "gear": "Gear", "battleGearText": "Este es el equipo que llevarás en batalla; los puntos que otorguen se tendrán en cuenta cuando interactúes con tus tareas.", "autoEquipBattleGear": "Ponerse automáticamente las piezas de equipamiento nuevas", "costume": "Disfraz", diff --git a/website/common/locales/es/faq.json b/website/common/locales/es/faq.json index bcf307a400..0f68e61753 100644 --- a/website/common/locales/es/faq.json +++ b/website/common/locales/es/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "¿Cómo puedo jugar a Habitica con mis amigos?", "iosFaqAnswer5": "¡La mejor manera es invitarles a un Grupo contigo! Los Grupos pueden iniciar misiones, luchar contra monstruos y lanzar hechizos para apoyaros unos a otros. Ve a Menu > Grupos y haz clic en \"Crear un Nuevo Grupo\" si no tienes un Grupo. Luego pincha en la Lista de Miembros y elige Invitar en la esquina superior derecha para invitar a tus amigos introduciendo su Número de Usuario (una cadena de números y letras que ellos pueden encontrar bajo Ajustes > Detalles de la cuenta en la app, y en Ajustes > API en la web). En la web también puedes invitar a tus amigos vía email, que añadiremos a la app en una futura actualización.\n\nEn la web, tú y tus amigos podéis tambien uniros a Gremios, que son Salas de Chat públicas. ¡Los Gremios se añadirán a la app en futuras actualizaciones!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "¿Cómo puedo encontrar una mascota o una montura?", "iosFaqAnswer6": "En nivel 3, ganas accesso a . (Todos los jugadores comienzan como Guerreros por defecto). Cada Clase tiene distintas opciones de equipamiento, distintas habilidades que pueden usar a partir del nivel 11, y distintas ventajas. Los guerreros pueden hacerle daño fácilmente a los Jefes, resistir más daño de sus tareas, y ayudar a que su Equipo se haga más fuerte. Los magos también pueden hacerle mucho daño a los Jefes, y subir rápidamente de nivel y restaurar la maná de su equipo. Los Pícaros son los que más oro ganan y más botines encuentran, y pueden ayudar a que su equipo también lo haga. Finalmente, los Sanadores pueden curarse a ellos mismos y a su equipo. \n", "androidFaqAnswer6": "En nivel 3, ganas acceso al Sistema de Botín. Cada vez que completes una tarea, tendrás la oportunidad aleatoria de recibir un huevo, una poción de eclosión, o un pedazo de alimento. Éstos serán guardados en Inventario > Mercado.\n\nPara obtener una mascota, necesitarás un huevo y una poción de eclosión. Haz clic en el huevo para determinar la especie que quieres obtener, y selecciona \"Eclosiona con poción.\" ¡Luego elige una poción de eclosión para definir su color! Ve a Inventario > Mascotas y haz clic en ella para equiparla.\n\nTambién puedes hacer que tus Mascotas crezcan hasta convertirse en Monturas alimentándolas desde Inventario [> Mascotas]. ¡Haz clic en una Mascota y luego selecciona un alimento del menú a la derecha! Tendrás que alimentar a una mascota muchas veces para que pueda convertirse en Montura, pero si descubres cuál es su comida favorita, crecerá más rápido. Utiliza el método de ensayo y error, o [ve los spoilers aquí](http://habitica.wikia.com/wiki/Food#Food_Preferences). Una vez que tengas una Montura, ve a Inventario > Monturas y haz clic en ella para equiparla. \n\nAdemás puedes obtener huevos de Mascotas de Misión al completar ciertas Misiones. (Lee abajo para saber más sobre Misiones.)", diff --git a/website/common/locales/es/gear.json b/website/common/locales/es/gear.json index 4ab36fe78a..e793f07fc4 100644 --- a/website/common/locales/es/gear.json +++ b/website/common/locales/es/gear.json @@ -81,7 +81,7 @@ "weaponSpecial0Text": "Espada de Almas Oscuras", "weaponSpecial0Notes": "Se da un banquete con la vida de sus enemigos para alimentar sus golpes endiablados. Aumenta Fuerza por <%= str %>.", "weaponSpecial1Text": "Espada de cristal", - "weaponSpecial1Notes": "Its glittering facets tell the tale of a hero. Increases all Stats by <%= attrs %>.", + "weaponSpecial1Notes": "Sus brillantes facetas cuentan la historia de un héroe. Aumenta todos los Atributos en <%= attrs %>", "weaponSpecial2Text": "La Vara del Dragon de Stephen Weber", "weaponSpecial2Notes": "¡Siente la potencia del dragón desde su interior! Aumenta Fuerza y Percepción por <%= attrs %> cada una.", "weaponSpecial3Text": "Lucero del Alba Machaca Hitos de Mustaine", @@ -112,7 +112,7 @@ "weaponSpecialFencingFoilNotes": "Si alguien se atreve a poner en duda tu honor, ¡estarás preparado con este excepcional florete! Aumenta la Fuerza en <%= str %>.", "weaponSpecialTachiText": "Tachi", "weaponSpecialTachiNotes": "¡Esta espada ligera y curva harán tiras tus tareas a las cintas! Aumenta Fuerza por <%=str %>.", - "weaponSpecialAetherCrystalsText": "Aether Crystals", + "weaponSpecialAetherCrystalsText": "Cristales de Éter", "weaponSpecialAetherCrystalsNotes": "Estos brazaletes y cristales pertenecieron una vez a la mismísima Lost Masterclasser. Incrementa todos los atributos en <%= attrs %>.", "weaponSpecialYetiText": "Lanza domadora de Yetis", "weaponSpecialYetiNotes": "Esta lanza permite que el usuario comande a cualquier yeti. Incrementa Fuerza en <%= str %>. Edición Limitada Equipo de Invierno de 2013-2014", @@ -248,7 +248,7 @@ "weaponSpecialWinter2018WarriorNotes": "The sparkly appearance of this bright weapon will dazzle your enemies as you swing it! Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", "weaponSpecialWinter2018MageText": "Holiday Confetti", "weaponSpecialWinter2018MageNotes": "Magic--and glitter--is in the air! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", - "weaponSpecialWinter2018HealerText": "Mistletoe Wand", + "weaponSpecialWinter2018HealerText": "Varita de Muérdago", "weaponSpecialWinter2018HealerNotes": "This mistletoe ball is sure to enchant and delight passersby! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", "weaponMystery201411Text": "Horca de Banquete", "weaponMystery201411Notes": "Clávasela a tus enemigos o ataca tus comidas favoritas - ¡esta horca versátil vale para todo! No confiere ningún beneficio. Artículo de suscriptor de noviembre 2014.", @@ -536,19 +536,19 @@ "armorSpecialSummer2017HealerNotes": "¡Esta prenda de escamas plateadas transforma a su usuario en un verdadero Sanador Marino! Aumenta la Constitución en <%= con %>. Equipo de Edición Limitada Verano 2017.", "armorSpecialFall2017RogueText": "Pumpkin Patch Robes", "armorSpecialFall2017RogueNotes": "Need to hide out? Crouch among the Jack o' Lanterns and these robes will conceal you! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", - "armorSpecialFall2017WarriorText": "Strong and Sweet Armor", + "armorSpecialFall2017WarriorText": "Fuerte y Dulce Armadura", "armorSpecialFall2017WarriorNotes": "This armor will protect you like a delicious candy shell. Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.", - "armorSpecialFall2017MageText": "Masquerade Robes", + "armorSpecialFall2017MageText": "Toga de Baile de Disfraces", "armorSpecialFall2017MageNotes": "What masquerade ensemble would be complete without dramatic and sweeping robes? Increases Intelligence by <%= int %>. Limited Edition 2017 Autumn Gear.", - "armorSpecialFall2017HealerText": "Haunted House Armor", + "armorSpecialFall2017HealerText": "Armadura de Casa Encantada", "armorSpecialFall2017HealerNotes": "Your heart is an open door. And your shoulders are roofing tiles! Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.", - "armorSpecialWinter2018RogueText": "Reindeer Costume", + "armorSpecialWinter2018RogueText": "Disfraz de Reno", "armorSpecialWinter2018RogueNotes": "You look so cute and fuzzy, who could suspect you are after holiday loot? Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", - "armorSpecialWinter2018WarriorText": "Wrapping Paper Armor", + "armorSpecialWinter2018WarriorText": "Armadura de Papel de Regalo", "armorSpecialWinter2018WarriorNotes": "Don't let the papery feel of this armor fool you. It's nearly impossible to rip! Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "armorSpecialWinter2018MageText": "Sparkly Tuxedo", "armorSpecialWinter2018MageNotes": "The ultimate in magical formalwear. Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", - "armorSpecialWinter2018HealerText": "Mistletoe Robes", + "armorSpecialWinter2018HealerText": "Ropaje de Muérdago", "armorSpecialWinter2018HealerNotes": "These robes are woven with spells for extra holiday joy. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "armorMystery201402Text": "Túnica de Mensajero", "armorMystery201402Notes": "Reluciente y fuerte, esta túnica tiene muchos bolsillos para llevar cartas. No proporciona ningún beneficio. Artículo de suscriptor de febrero 2014.", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Traje Steampunk", "armorMystery301404Notes": "¡Sofisticado y elegante! No otorga ningún beneficio. Artículo de suscriptor de febrero 3015.", "armorMystery301703Text": "Traje de Pavo Real Steampunk", @@ -683,8 +685,8 @@ "armorArmoireYellowPartyDressText": "Vestido de Fiesta Amarillo", "armorArmoireYellowPartyDressNotes": "Tú eres perceptivo, listo y muy fashion! Aumenta Percepción, Fuerza e Inteligencia en <%= attrs %> cada uno. Armario encantado: conjunto Cinta Amarilla par el Pelo (Artículo 2 de 2).", "armorArmoireFarrierOutfitText": "Farrier Outfit", - "armorArmoireFarrierOutfitNotes": "These sturdy work clothes can stand up to the messiest Stable. Increases Intelligence, Constitution, and Perception by <%= attrs %> each. Enchanted Armoire: Farrier Set (Item 2 of 3).", - "armorArmoireCandlestickMakerOutfitText": "Candlestick Maker Outfit", + "armorArmoireFarrierOutfitNotes": "Estas resistentes ropas de trabajo pueden soportar el Establo más sucio. Aumenta la Inteligencia, Constitución y Percepción <%= attrs %> cada una. Armario Encantado: Conjunto de Herrero (Objeto 2 de 3)", + "armorArmoireCandlestickMakerOutfitText": "Traje de Creador de Candelabros", "armorArmoireCandlestickMakerOutfitNotes": "This sturdy set of clothes will protect you from hot wax spills as you ply your craft! Increases Constitution by <%= con %>. Enchanted Armoire: Candlestick Maker Set (Item 1 of 3).", "armorArmoireWovenRobesText": "Woven Robes", "armorArmoireWovenRobesNotes": "Display your weaving work proudly by wearing this colorful robe! Increases Constitution by <%= con %> and Intelligence by <%= int %>. Enchanted Armoire: Weaver Set (Item 1 of 3).", @@ -692,9 +694,9 @@ "armorArmoireLamplightersGreatcoatNotes": "This heavy woolen coat can stand up to the harshest wintry night! Increases Perception by <%= per %>.", "armorArmoireCoachDriverLiveryText": "Coach Driver's Livery", "armorArmoireCoachDriverLiveryNotes": "This heavy overcoat will protect you from the weather as you drive. Plus it looks pretty snazzy, too! Increases Strength by <%= str %>. Enchanted Armoire: Coach Driver Set (Item 1 of 3).", - "armorArmoireRobeOfDiamondsText": "Robe of Diamonds", - "armorArmoireRobeOfDiamondsNotes": "These royal robes not only make you appear noble, they allow you to see the nobility within others. Increases Perception by <%= per %>. Enchanted Armoire: King of Diamonds Set (Item 1 of 3).", - "headgear": "helm", + "armorArmoireRobeOfDiamondsText": "Ropaje de Diamantes", + "armorArmoireRobeOfDiamondsNotes": "Estos ropajes reales, no solo te hacen parecer nobles: te permiten ver la nobleza en otras personas. Aumenta la Percepción en <%= per %>. Armario Encantado: Conjunto de Rey de DIamantes. (Objeto 1 de 3).", + "headgear": "casco", "headgearCapitalized": "Equipo de cabeza", "headBase0Text": "No Headgear", "headBase0Notes": "Sin equipo de cabeza.", @@ -772,8 +774,8 @@ "headSpecialKabutoNotes": "¡Este yelmo es precioso y funcional! Tus enemigos se distraerán contemplándolo. Aumenta la Inteligencia en <%= int %>.", "headSpecialNamingDay2017Text": "Yelmo de Grifo Morado Real", "headSpecialNamingDay2017Notes": "¡Feliz Día del Nombramiento! Luce este fiero y plumado yelmo mientras celebras Habitica. No proporciona ningún beneficio.", - "headSpecialTurkeyHelmBaseText": "Turkey Helm", - "headSpecialTurkeyHelmBaseNotes": "Your Turkey Day look will be complete when you don this beaked helm! Confers no benefit.", + "headSpecialTurkeyHelmBaseText": "Casco de Pavo", + "headSpecialTurkeyHelmBaseNotes": "¡Tu conjunto del Día del Pavo estará completo cuando te pongas este picudo casco! Sin beneficio.", "headSpecialNyeText": "Sombrero Absurdo de Fiesta", "headSpecialNyeNotes": "¡Has recibido un Sombrero Absurdo de Fiesta! ¡Llévalo con orgullo mientras celebras el Año Nuevo! No proporciona ningún beneficio.", "headSpecialYetiText": "Casco de domador de Yetis", @@ -902,9 +904,9 @@ "headSpecialSummer2017MageNotes": "Este sombre está compuesto enteramente por un giratorio torbellino invertido. Aumenta la Percepción en <%= per %>. Equipo de Edición Limitada Verano 2017.", "headSpecialSummer2017HealerText": "Corona de Criaturas Marinas", "headSpecialSummer2017HealerNotes": "Este yelmo está hecho de amistosas criaturas marinas que estás descansando temporalmente sobre tu cabeza, dándote sabios consejos. Aumenta la Inteligencia en <%= int %>. Equipo de Edición Limitada Verano 2017.", - "headSpecialFall2017RogueText": "Jack-o-Lantern Helm", - "headSpecialFall2017RogueNotes": "Ready for treats? Time to don this festive, glowing helm! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", - "headSpecialFall2017WarriorText": "Candy Corn Helm", + "headSpecialFall2017RogueText": "Casco de Calabaza", + "headSpecialFall2017RogueNotes": "¿Preparado para tratos? ¡Hora de ponerse este festivo y brillante casco! Aumenta la Percepción en <%= per %>. Edición Limitada 2017 del Equipamiento de Otoño", + "headSpecialFall2017WarriorText": "Casco de Golosinas de Maíz.", "headSpecialFall2017WarriorNotes": "This helm might look like a treat, but wayward tasks won't find it so sweet! Increases Strength by <%= str %>. Limited Edition 2017 Autumn Gear.", "headSpecialFall2017MageText": "Masquerade Helm", "headSpecialFall2017MageNotes": "When you appear in this feathery hat, everyone will be left guessing the identity of the magical stranger in the room! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Sombrero de copa sofisticado", "headMystery301404Notes": "¡Un sofisticado sombrero de copa solo para los más refinados caballeros! No otorga ningún beneficio. Artículo de Suscriptor de Enero del 3015", "headMystery301405Text": "Sombrero de copa básico", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Este escudo escabroso de roca fundida te protege de los Malos Hábitos pero no quemará tus manos. Sin beneficio. Agosto 2017 artículo del suscriptor.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Escudo Reloj", "shieldMystery301405Notes": "¡El tiempo está de tu parte con este imponente escudo reloj! No confiere ningún beneficio. Equipo de suscriptor Junio 3015.", "shieldMystery301704Text": "Abanico vibrante", diff --git a/website/common/locales/es/generic.json b/website/common/locales/es/generic.json index 72a988b856..ce3a62991f 100644 --- a/website/common/locales/es/generic.json +++ b/website/common/locales/es/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Tema Airu", "audioTheme_beatscribeNesTheme": "Tema Beatscribe's NES", "audioTheme_arashiTheme": "Tema Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "Tema MAFL", diff --git a/website/common/locales/es/groups.json b/website/common/locales/es/groups.json index 367f513854..f10a59c763 100644 --- a/website/common/locales/es/groups.json +++ b/website/common/locales/es/groups.json @@ -202,7 +202,6 @@ "partyOnName": "¡Toma grupo!", "partyUpText": "¡Se unió a un grupo con otra persona! Pasadlo bien luchando contra monstruos y ayudándoos mutuamente.", "partyOnText": "¡Se unió a un grupo de al menos cuatro personas! Disfrutad de una mayor responsabilidad al juntaros para vencer a vuestros enemigos.", - "largeGroupNote": "Atención: ¡Este Gremio es ahora muy grande para sustentar notificaciones! Asegúrate de revisarlo cada día para ver los mensajes nuevos.", "groupIdRequired": "\"groupId\" debe ser un UUID válido", "groupNotFound": "El grupo no se encuentra o no tienes acceso a él.", "groupTypesRequired": "Debes proporcionar una cadena de consulta \"type\" válida.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Falta el ID del usuario en la invitación", "inviteMustNotBeEmpty": "La invitación no puede estar vacia.", "partyMustbePrivate": "Los grupos deben ser privados", - "userAlreadyInGroup": "El usuario ya se encuentra en ese grupo.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "No puedes invitarte a ti mismo a un grupo.", - "userAlreadyInvitedToGroup": "El usuario ya ha sido invitado a ese grupo.", - "userAlreadyPendingInvitation": "El usuario ya tiene una invitación pendiente.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "No se pudo encontrar al usuario con la id \"<%= userId %>\".", "userHasNoLocalRegistration": "El usuario no tiene un registro local (nombre de usuario, correo electrónico y contraseña)", "uuidsMustBeAnArray": "Las invitaciones por ID de usuario deben ser una matriz.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/es/inventory.json b/website/common/locales/es/inventory.json index f9730a68bd..f4eb14986c 100644 --- a/website/common/locales/es/inventory.json +++ b/website/common/locales/es/inventory.json @@ -1,8 +1,8 @@ { - "noItemsAvailableForType": "You have no <%= type %>.", - "foodItemType": "Food", - "eggsItemType": "Eggs", - "hatchingPotionsItemType": "Hatching Potions", - "specialItemType": "Special items", - "lockedItem": "Locked Item" + "noItemsAvailableForType": "No tienes <%= type %>.", + "foodItemType": "Comida", + "eggsItemType": "Huevos", + "hatchingPotionsItemType": "Pociones de Eclosión", + "specialItemType": "Objetos especiales", + "lockedItem": "Objeto Bloqueado" } diff --git a/website/common/locales/es/limited.json b/website/common/locales/es/limited.json index ed07e1a1fc..89abda991c 100644 --- a/website/common/locales/es/limited.json +++ b/website/common/locales/es/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "¡¡Feliz Festival de Otoño!! ¿Te gustaría comprar algunos artículos raros? ¡Solo estarán disponibles hasta el 31 de octubre!", "seasonalShopWinterText": "¡¡Feliz Invierno Wonderland!! ¿Te gustaría comprar algunos artículos raros? ¡Solo estarán disponibles hasta el 31 de enero!", "seasonalShopFallTextBroken": "Ah... Te damos la bienvenida a la tienda de temporada... Los artículos que ofrecemos aquí son los de la edición especial de temporada de otoño, o algo así... Puedes adquirir todo esto durante el evento Festival de Otoño de cada año, pero solo abrimos hasta el 31 de octubre... Si no compras estas cosas ahora, tendrás que esperar... y esperar... y esperar... *Ay*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Si has comprado alguno de estos equipos en el pasado pero ahora no lo tienes, puedes volver a comprarlo en la columna Recompensas. Al principio, solamente podrás comprar los artículos de la clase que tengas en ese momento (la predeterminada es Guerrero), pero no temas, puedes conseguir los artículos de las demás clases si cambias de clase.", "candycaneSet": "Bastón de Caramelo (Mago)", "skiSet": "Ski-asesino (Ladrón)", diff --git a/website/common/locales/es/loadingscreentips.json b/website/common/locales/es/loadingscreentips.json index a333f50f8f..cda904259c 100644 --- a/website/common/locales/es/loadingscreentips.json +++ b/website/common/locales/es/loadingscreentips.json @@ -14,7 +14,7 @@ "tip12": "¡Añade listas a tus Tareas Pendientes para multiplicar tus recompensas!", "tip13": "¡Pulsa sobre \"filtros\" en tu página de tareas para hacer más manejable tu lista!", "tip14": "Puedes añadir títulos de sección o frases inspiradoras a tu lista: añádelos como hábitos y quítales los signos + y -.", - "tip15": "Complete all the Masterclasser Quest-lines to learn about Habitica’s secret lore.", + "tip15": "Completar todas las líneas de misión de Maestro de Clase para aprender la historia secreta de Habitica.", "tip16": "Pulsa sobre la herramienta de monitorización de datos en la zona inferior de la página para descubrir valiosa información sobre tu progreso.", "tip17": "Usa las aplicaciones móvil para establecer recordatorios para tus tareas.", "tip18": "Los hábitos que son solo positivos o solo negativos, con el tiempo, tienden a volver a ser de color amarillo.", @@ -28,11 +28,11 @@ "tip26": "Una flecha a la derecha del nombre de alguien significa que actualmente tiene sus atributos potenciados.", "tip27": "¿Hiciste una tarea Diaria ayer pero olvidaste completarla? ¡No te preocupes! Con Registrar Actividad de Ayer, tendrás la oportunidad de marcar lo que hiciste justo antes de empezar tu nuevo día.", "tip28": "Elige una hora personalizada para comenzar tu día en Icono de Usuario > Ajustes y controlar así cuándo se reinician tus tareas.", - "tip29": "Complete all your Dailies to get a Perfect Day Buff that increases your Stats!", + "tip29": "¡Completa todas tus Diarias para conseguir un Apoyo de Día Perfecto que aumente tus Atributos!", "tip30": "Puedes invitar a otras personas a los gremios, no solo a grupos.", "tip31": "Echa un vistazo a las listas pre-hechas del gremio \"Library of Tasks and Challenges\" para ver ejemplos de tareas.", - "tip32": "Lots of Habitica’s code, art, and writing is made by volunteer contributors! Head to the Aspiring Legends Guild to help.", - "tip33": "Check out The Bulletin Board Guild for news about Guilds, Challenges, and other player-created events - and announce your own there!", - "tip34": "Occasionally re-evaluate your tasks to make sure they’re up-to-date!", - "tip35": "Users who are part of a Group Plan gain the ability to assign tasks to other users in that Group for extra task management and accountability." + "tip32": "¡Una gran parte de la codificación, arte e historias de Habitica están hechos por contribuidores voluntarios! Dirígete al Gremio de los Aspirantes a Leyenda para ayudar.", + "tip33": "Echa un vistazo al Gremio Bulletin Board para encontrar noticias sobre Gremios, Retos y otros eventos creados por jugadores - ¡y anuncia el tuyo allí!", + "tip34": "¡Reevalúa tus tareas de vez en cuando para asegurarte de que estás al día!", + "tip35": "Los usuarios que son parte de un Plan de Grupo, ganan la posibilidad de asignar tareas a otros usuarios en ese Grupo para mejorar la gestión de tareas y mantenerse al día más fácilmente." } diff --git a/website/common/locales/es/messages.json b/website/common/locales/es/messages.json index f112b3e0aa..002a168aa3 100644 --- a/website/common/locales/es/messages.json +++ b/website/common/locales/es/messages.json @@ -9,8 +9,8 @@ "messageCannotFeedPet": "No se puede alimentar a esta mascota.", "messageAlreadyMount": "Ya tienes esa montura. Intenta alimentar a otra mascota.", "messageEvolve": "Has dominado a <%= egg %>, ¡vamos a dar una vuelta!", - "messageLikesFood": "<%= egg %> really likes <%= foodText %>!", - "messageDontEnjoyFood": "<%= egg %> eats <%= foodText %> but doesn't seem to enjoy it.", + "messageLikesFood": "¡A <%= egg %> le gusta mucho<%= foodText %>!", + "messageDontEnjoyFood": "<%= egg %> se come <%= foodText %> pero no parece que lo disfrute.", "messageBought": "Has comprado <%= itemText %>", "messageEquipped": "<%= itemText %> equipado.", "messageUnEquipped": "Te has quitado <%= itemText %>.", @@ -21,7 +21,7 @@ "messageNotEnoughGold": "No tienes suficiente Oro", "messageTwoHandedEquip": "Para empuñar <%= twoHandedText %> se necesitan dos manos, así que te has quitado <%= offHandedText %>.", "messageTwoHandedUnequip": "Para empuñar <%= twoHandedText %> se necesitan dos manos, así que te has quitado ese objeto al ponerte <%= offHandedText %>.", - "messageDropFood": "You've found <%= dropText %>!", + "messageDropFood": "¡Has encontrado <%= dropText %>!", "messageDropEgg": "¡Has encontrado un huevo de <%= dropText %>!", "messageDropPotion": "¡Has encontrado una poción de eclosión de <%= dropText %>!", "messageDropQuest": "¡Has encontrado una misión!", @@ -33,7 +33,7 @@ "messageHealthAlreadyMax": "Ya tienes el máximo de salud.", "messageHealthAlreadyMin": "¡Oh no! Ya has perdido completamente tu salud, por lo que es demasiado tarde para comprar una poción, pero no te preocupes - ¡puedes resucitar!", "armoireEquipment": "<%= image %> Has encontrado un objeto de equipamiento raro en el armario: <%= dropText %>! ¡Genial!", - "armoireFood": "<%= image %> You rummage in the Armoire and find <%= dropText %>. What's that doing in here?", + "armoireFood": "<%= image %> Rebuscas en el Armario y encuentras <%= dropText %>. ¿Qué está haciendo aquí?", "armoireExp": "Luchas con el Ropero y ganas Experiencia. ¡Toma eso!", "messageInsufficientGems": "No hay suficientes gemas!", "messageAuthPasswordMustMatch": "Las contraseñas no coinciden.", @@ -53,12 +53,12 @@ "messageGroupChatFlagAlreadyReported": "Has reportado este mensaje", "messageGroupChatNotFound": "¡Mensaje no encontrado!", "messageGroupChatAdminClearFlagCount": "¡Sólo un administrador puede borrar la cuenta!", - "messageCannotFlagSystemMessages": "You cannot flag a system message. If you need to report a violation of the Community Guidelines related to this message, please email a screenshot and explanation to Lemoness at <%= communityManagerEmail %>.", + "messageCannotFlagSystemMessages": "No puedes reportar un mensaje de sistema. Si necesitas reportar una violación de las Normas de la Comunidad relacionadas con este mensaje, por favor manda un email con una captura de pantalla y una explicación a Lemoness a <%= communityManagerEmail %>.", "messageGroupChatSpam": "¡Oops, parece que estas escribiendo demasiados mensajes! Por favor, espera un minuto y vuelve a intentarlo. El Chat de la Taberna solo puede procesar 200 mensajes a la vez, por ello, Habitica recomienda escribir mensajes más largos y razonados, al igual que respuestas combinadas. No puedo esperar a leer lo que tienes que decir :) .", "messageUserOperationProtected": "la ruta <%= operation %> no se guardó porque es una ruta protegida.", "messageUserOperationNotFound": "<%= operation %> no encontrado", "messageNotificationNotFound": "Notificación no encontrada.", "notificationsRequired": "Se requieren ids de notificación.", - "unallocatedStatsPoints": "You have <%= points %> unallocated Stat Points", - "beginningOfConversation": "This is the beginning of your conversation with <%= userName %>. Remember to be kind, respectful, and follow the Community Guidelines!" + "unallocatedStatsPoints": "Tienes <%= points %> Puntos de Estadísticas sin asignar", + "beginningOfConversation": "Este es el principio de tu conversación con <%= userName %>. ¡Recuerda ser amable, respetuoso y seguir las Normas de la Comunidad!" } \ No newline at end of file diff --git a/website/common/locales/es/overview.json b/website/common/locales/es/overview.json index a38fca6cec..5e5efd54f7 100644 --- a/website/common/locales/es/overview.json +++ b/website/common/locales/es/overview.json @@ -8,7 +8,7 @@ "webStep2Text": "Ahora, ¡comienza a enfrentar tus metas de la lista! Al cumplir tareas y tildarlas en Habitica, ganarás puntos de experiencia (PE), que te ayuda a subir de nivel, así como monedas de oro (GP) que te permitirán comprar Recompensas. Si recaes en nalos hábitos o fallas en cumplir tus Diarias, perderás puntos de salud (HP). De esa manera, las barras de Experiencia y de Salud en Habitica sirven como indicador divertido de tu desarrollo hacia tus metas. Empezarás a ver tu vida real mejorando mientras que tu personaje en el juego avanza.", "step3": "Paso 3: Personaliza y explora Habitica", - "webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your tasks with [tags](http://habitica.wikia.com/wiki/Tags) (edit a task to add them).\n * Customize your [avatar](http://habitica.wikia.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](http://habitica.wikia.com/wiki/Equipment) under Rewards or from the [Shops](/shops/market), and change it under [Inventory > Equipment](/inventory/equipment).\n * Connect with other users via the [Tavern](http://habitica.wikia.com/wiki/Tavern).\n * Starting at Level 3, hatch [Pets](http://habitica.wikia.com/wiki/Pets) by collecting [eggs](http://habitica.wikia.com/wiki/Eggs) and [hatching potions](http://habitica.wikia.com/wiki/Hatching_Potions). [Feed](http://habitica.wikia.com/wiki/Food) them to create [Mounts](http://habitica.wikia.com/wiki/Mounts).\n * At level 10: Choose a particular [class](http://habitica.wikia.com/wiki/Class_System) and then use class-specific [skills](http://habitica.wikia.com/wiki/Skills) (levels 11 to 14).\n * Form a party with your friends (by clicking [Party](/party) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [quests](http://habitica.wikia.com/wiki/Quests) (you will be given a quest at level 15).", + "webStep3Text": "Una vez estés familiarizado con los básicos, puedes sacar más partido de Habitica con estas fantásticas opciones:\n* Organiza tus tareas con [etiquetas](http://habitica.wikia.com/wiki/Tags) (edita una tarea para añadirla)\n* Personaliza tu [personaje](http://habitica.wikia.com/wiki/Avatar) haciendo click en el icono de usuario en la esquina superior derecha.\n* Compra tu [Equipamiento](http://habitica.wikia.com/wiki/Equipment) en la columna de Recompensas o de las [Tiendas](/shops/market), y cámbialo debajo de [Inventario>Equipamiento](/inventory/equipment).\n* Conecta con otros usuarios mediante la [Taberna](http://habitica.wikia.com/wiki/Tavern).\n* A partir del Nivel 3, eclosiona [Mascotas](http://habitica.wikia.com/wiki/Pets) recogiendo [huevos](http://habitica.wikia.com/wiki/Eggs) y [pociones de eclosión](http://habitica.wikia.com/wiki/Hatching_Potions). [Aliméntalos](http://habitica.wikia.com/wiki/Food) para crear [Monturas](http://habitica.wikia.com/wiki/Mounts).\n* En el nivel 10: Elige una [clase](http://habitica.wikia.com/wiki/Class_System) en concreto y usa las [habilidades](http://habitica.wikia.com/wiki/Skills) específicas de tu Clase (niveles 11 a 14).\n* Forma un grupo con tus amigos (haciendo click en [Grupo](/party) en la barra de navegación) para mantener la cuenta de tus tareas y ganar un Pergamino de misión.\n* Vence a los monstruos y colecciona objetos con [misiones](http://habitica.wikia.com/wiki/Quests) (se te dará una misión en el nivel 15).", - "overviewQuestions": "Have questions? Check out the [FAQ](/static/faq/)! If your question isn't mentioned there, you can ask for further help in the [Habitica Help guild](/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a).\n\nGood luck with your tasks!" + "overviewQuestions": "¿Tienes preguntas? ¡Echa un vistazo a las [FAQ](/static/faq/)! Si tu pregunta no aparece mencionada, puedes pedir más ayuda en el [Gremio de Principiantes](/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a).\n\n¡Buena suerte con tus tareas!" } diff --git a/website/common/locales/es/quests.json b/website/common/locales/es/quests.json index bd451061c5..60af084342 100644 --- a/website/common/locales/es/quests.json +++ b/website/common/locales/es/quests.json @@ -6,7 +6,7 @@ "questsForSale": "Misiones a la venta", "petQuests": "Misiones de mascotas y monturas", "unlockableQuests": "Misiones desbloqueables", - "goldQuests": "Masterclasser Quest Lines", + "goldQuests": "Sagas de Maestro de Clase", "questDetails": "Detalles de la Misión", "questDetailsTitle": "Detalles de misión", "questDescription": "Las misiones permiten a los jugadores comprometerse con objetivos del juego a largo plazo con los miembros de su grupo.", @@ -79,7 +79,7 @@ "mustLvlQuest": "¡Necesitas ser nivel <%= level %> para comprar esta misión!", "mustInviteFriend": "Para conseguir esta misión, invita a un amigo a tu grupo. ¿Quieres invitar a alguien ahora?", "unlockByQuesting": "Para desbloquear esta misión, completa primero <%= title %>.", - "questConfirm": "Are you sure? Only <%= questmembers %> of your <%= totalmembers %> party members have joined this quest! Quests start automatically when all players have joined or rejected the invitation.", + "questConfirm": "¿Estás seguro? ¡Solo <%= questmembers %> de los <%= totalmembers %> miembros de tu grupo se han unido a esta misión! Las misiones empiezan automáticamente cuando todos los jugadores se han unido o han rechazado la invitación.", "sureCancel": "¿Estás seguro que quieres cancelar esta misión? Todas las invitaciones aceptadas se perderán. El dueño de la misión se quedará con el pergamino usado.", "sureAbort": "¿Estás seguro que quieres abandonar esta misión? Abortará para todos los componentes del grupo y todo progreso se perderá. El pergamino de la misión volverá a su dueño.", "doubleSureAbort": "¿Estás totalmente seguro? ¡Asegurate de que no te vayan a odiar para siempre!", @@ -114,16 +114,16 @@ "questNotPending": "No hay misión que empezar.", "questOrGroupLeaderOnlyStartQuest": "Sólo el líder de grupo o misión puede forzar empezar la misión.", "createAccountReward": "Crear cuenta", - "loginIncentiveQuest": "To unlock this quest, check in to Habitica on <%= count %> different days!", + "loginIncentiveQuest": "¡Para desbloquear esta misión, entra en Habitica durante <%= count %> días distintos!", "loginIncentiveQuestObtained": "Has conseguido esta misión por haber entrado en Habitica <%= count %> días distintos.", "loginReward": "Días que has entrado: <%= count %>", "createAccountQuest": "Recibiste esta misión al registrarte en Habitica. Si se apunta un amigo tuyo, conseguirá otra.", "questBundles": "Packs de Misiones en Descuento", "buyQuestBundle": "Compra Packs de Misiones ", "noQuestToStart": "¿No encuentras una misión con la que empezar? ¡Prueba a buscar nuevas en la Tienda de Misiones del Mercados!", - "pendingDamage": "<%= damage %> pending damage", - "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health", - "rageAttack": "Rage Attack:", - "bossRage": "<%= currentRage %> / <%= maxRage %> Rage", - "rageStrikes": "Rage Strikes" + "pendingDamage": "<%= damage %> daño pendiente", + "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Salud", + "rageAttack": "Ataque de Ira:", + "bossRage": "<%= currentRage %> / <%= maxRage %> Ira", + "rageStrikes": "Golpes de Ira" } \ No newline at end of file diff --git a/website/common/locales/es/questscontent.json b/website/common/locales/es/questscontent.json index 0321d92fbf..796c1e2cbd 100644 --- a/website/common/locales/es/questscontent.json +++ b/website/common/locales/es/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/es/rebirth.json b/website/common/locales/es/rebirth.json index f822331a4e..a21f918634 100644 --- a/website/common/locales/es/rebirth.json +++ b/website/common/locales/es/rebirth.json @@ -21,7 +21,7 @@ "rebirthOrb": "Usó una Esfera de Renacimiento para comenzar de nuevo después de alcanzar el Nivel <%= level %>.", "rebirthOrb100": "Usó una Esfera de Renacimiento para comenzar de nuevo después de alcanzar el Nivel 100 o superior.", "rebirthOrbNoLevel": "Usó una Esfera de Renacimiento para comenzar de nuevo.", - "rebirthPop": "Instantly restart your character as a Level 1 Warrior while retaining achievements, collectibles, and equipment. Your tasks and their history will remain but they will be reset to yellow. Your streaks will be removed except from challenge tasks. Your Gold, Experience, Mana, and the effects of all Skills will be removed. All of this will take effect immediately. For more information, see the wiki's Orb of Rebirth page.", + "rebirthPop": "Reinicia instantáneamente tu personaje como un Guerrero de Nivel 1, manteniendo logros, colecciones y equipamiento. Tus tareas y su historial se mantendrán, pero volverán a ser amarillas. Tus rachas desaparecerán excepto para las tareas de los desafíos. Tu Oro, Experiencia, Maná y los efectos de todas tus habilidades desaparecerán. Todo esto tendrá efecto inmediato. Para más información, mirar la página de Orbe de Renacimiento de la wiki.", "rebirthName": "Esfera de Renacimiento", "reborn": "Renacido, nivel máximo <%= reLevel %>", "confirmReborn": "¿Está seguro?", diff --git a/website/common/locales/es/settings.json b/website/common/locales/es/settings.json index 6ad1557a00..b97ebea1f7 100644 --- a/website/common/locales/es/settings.json +++ b/website/common/locales/es/settings.json @@ -63,15 +63,15 @@ "newUsername": "Nuevo Nombre de Usuario", "dangerZone": "Zona Peligrosa", "resetText1": "¡PELIGRO! Eso resetea muchas partes de tu cuenta. Esto es altamente desalentador, pero algunas personas lo encuentran útil al principio después de jugar durante un tiempo.", - "resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.", + "resetText2": "Perderás todos tus niveles, Oro y puntos de Experiencia. Todas tus tareas (excepto las de los desafíos) serán eliminadas permanentemente y tú perderás todo su historia. Perderás todo tu equipamiento, pero podrás comprarlo de nuevo, incluyendo todo el equipamiento de edición limitada o los objetos Misterio de suscriptor que ya posees (necesitarás estar en la clase correcta para comprar de nuevo Equipo específico de esa clase). Mantendrás tu actual clase y tus mascotas y monturas. Quizá prefieras utilizar un Orbe de Renacimiento en su lugar, que es una opción mucho más segura que mantendrá tus tareas y equipamiento.", "deleteLocalAccountText": "¿Seguro? Tu cuenta se eliminará para siempre y nunca podrá recuperarse. Si más tarde quieres volver a usar Habitica, tendrás que crear una nueva cuenta. No se te reembolsarán las gemas que tengas ni las que hayas gastado. Si estás totalmente seguro, escribe tu contraseña en el siguiente cuadro de texto.", "deleteSocialAccountText": "¿Estás seguro? ¡Esto eliminará tu cuenta para siempre, y nunca podrá ser restaurada! Necesitarás crear una nueva cuenta para usar Habitica de nuevo. Las Gemas depositadas o gastadas no serán reembolsadas. Si estás absolutamente seguro, escriba \"<%= magicWord %>\" en el cuadro de texto de abajo.", "API": "API", "APIv3": "API v. 3", "APIText": "Copie esto para usarlo en aplicaciones de terceros. Sin embargo, pensá en tu API Token como una contraseña, no la compartas en público. En ocasiones se te solicitará tu ID de Usuario, pero nunca publiques tu API Token donde otros puedan verla, incluyendo Github.", "APIToken": "API Token (esto es una contraseña - mira la advertencia de arriba!)", - "showAPIToken": "Show API Token", - "hideAPIToken": "Hide API Token", + "showAPIToken": "Enseñar la ficha API ", + "hideAPIToken": "Esconder la ficha API", "APITokenWarning": "Si necesitas un nuevo API Token (e.g. si accidentalmente has compartido el tuyo), envía un email a <%= hrefTechAssistanceEmail %> con tu Número de Usuario y API Token actual. Una vez sea restablecido tu nuevo API Token, tendrás que volver a autorizar cualquier dispositivo cerrando la sesión pasada en la web y la aplicación móvil e ingresando el nuevo Token en cualquier dispositivo en el que uses Habitica.", "thirdPartyApps": "Aplicaciones de terceros", "dataToolDesc": "Una página que te muestra determinada información de tu cuenta de Habitica, como estadísticas sobre tus tareas, tu equipo o tus habilidades.", @@ -180,7 +180,7 @@ "consecutiveMonths": "Meses consecutivos:", "gemCapExtra": "Extra del tope de gemas:", "mysticHourglasses": "Relojes de Arena Místicos:", - "mysticHourglassesTooltip": "Mystic Hourglasses", + "mysticHourglassesTooltip": "Relojes de Arena Místicos", "paypal": "PayPal", "amazonPayments": "Pagos con Amazon", "timezone": "Zona horaria", diff --git a/website/common/locales/es/subscriber.json b/website/common/locales/es/subscriber.json index 4f0dbecac7..40cb83662b 100644 --- a/website/common/locales/es/subscriber.json +++ b/website/common/locales/es/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Set de Jinete de Alfombra Mágica", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "El Conjunto Steampunk", "mysterySet301405": "Accesorios Steampunk", "mysterySet301703": "Conjunto de Pavo real Steampunk", diff --git a/website/common/locales/es/tasks.json b/website/common/locales/es/tasks.json index 3383332e02..c01a10bc7f 100644 --- a/website/common/locales/es/tasks.json +++ b/website/common/locales/es/tasks.json @@ -40,14 +40,14 @@ "taskAliasPlaceholder": "tu-alias-de-Tarea-aquí", "taskAliasPopoverWarning": "ADVERTENCIA: Cambiar este valor impedirá la integración con programas de terceros que utilizan alias de Tareas.", "difficulty": "Dificultad", - "difficultyHelp": "Difficulty describes how challenging a Habit, Daily, or To-Do is for you to complete. A higher difficulty results in greater rewards when a Task is completed, but also greater damage when a Daily is missed or a negative Habit is clicked.", + "difficultyHelp": "La Dificultad describe lo complicado de completar que es un Hábito, Tarea Diaria o Pendiente. Una mayor dificultad otorga mayores recompensas cuando una Tarea es completada, pero también mayor daño cuando te saltas una Tarea o haces click en un Hábito negativo.", "trivial": "Trivial", "easy": "Fácil", "medium": "Intermedia", "hard": "Difícil", "attributes": "Atributos", "attributeAllocation": "Asignación de atributos", - "attributeAllocationHelp": "Stat allocation is an option that provides methods for Habitica to automatically assign an earned Stat Point to a Stat immediately upon level-up.

You can set your Automatic Allocation method to Task Based in the Stats section of your profile.", + "attributeAllocationHelp": "La asignación de estadísticas es una opción que ofrece métodos para que Habitica asigne automáticamente los Puntos de Estadística a una Estadística inmediatamente después de subir de nivel.

Puedes configurar tu método de Asignación Automática, de forma que esté Basado en Tareas en la sección de Estadísticas de tu perfil.", "progress": "Progreso", "daily": "Tarea diaria", "dailies": "Tareas diarias", @@ -110,9 +110,9 @@ "streakSingular": "En racha", "streakSingularText": "Ha realizado una racha de 21 días en tareas Diarias", "perfectName": "<%= count %> Días Perfectos", - "perfectText": "Completed all active Dailies on <%= count %> days. With this achievement you get a +level/2 buff to all Stats for the next day. Levels greater than 100 don't have any additional effects on buffs.", + "perfectText": "Has completado todas tus Tareas Diarias durante <%= count %> días. Con este logro, consigues +nivel/2 de apoyo a todas tus Estadísticas para el siguiente día. En niveles superiores a 100, el apoyo no tiene efectos adicionales.", "perfectSingular": "Día perfecto", - "perfectSingularText": "Completed all active Dailies in one day. With this achievement you get a +level/2 buff to all Stats for the next day. Levels greater than 100 don't have any additional effects on buffs.", + "perfectSingularText": "Has completado todas tus Tareas Diarias un día. Con este logro, consifues +nivel/2 de apoyo a todas las Estadísticas para el siguiente día. Niveles superiores a 100 no tienen efectos adicionales en los apoyos.", "streakerAchievement": "¡Has obtenido el logro \"En racha\"! La marca de 21 días marca un hito en la formación de hábitos. ¡Puedes continuar acumulando este logro por cada 21 días adicionales en Diarias u otras!", "fortifyName": "Poción de Fortalecimiento.", "fortifyPop": "Devuelve todas sus tareas a un valor neutral (amarillo), y recupera toda la salud perdida.", @@ -141,7 +141,7 @@ "toDoHelp3": "Descomponiendo una Tarea Pendiente en una lista de elementos más pequeños dará menos miedo, ¡y aumentará tus puntos!", "toDoHelp4": "Para inspirarte, ¡echa un vistazo a estas Tareas Pendientes de ejemplo!", "rewardHelp1": "El equipamiento que compras para tu personaje se guarda en <%= linkStart %>Inventario > Equipamiento<%= linkEnd %>.", - "rewardHelp2": "Equipment affects your Stats (<%= linkStart %>Avatar > Stats<%= linkEnd %>).", + "rewardHelp2": "El equipamiento afecta a tus Estadísticas (<%= linkStart %>Avatar > Estadísticas<%= linkEnd %>).", "rewardHelp3": "El equipamiento especial aparecerá aquí durante los Eventos Mundiales.", "rewardHelp4": "¡No tengas miedo de establecer Recompensas personalizadas! Encuentra algunos ejemplos aquí.", "clickForHelp": "Haz click para obtener ayuda", @@ -172,9 +172,9 @@ "habitCounterDown": "Contador negativo (Se reinicia cada <%= frequency %>)", "taskRequiresApproval": "La tarea debe ser aprobada antes de que la completes. La aprobación ya ha sido pedida.", "taskApprovalHasBeenRequested": "La aprobacion ha sido enviada", - "taskApprovalWasNotRequested": "Only a task waiting for approval can be marked as needing more work", + "taskApprovalWasNotRequested": "Solo una tarea que espera aprobación puede ser marcada como 'necesita más trabajo'", "approvals": "Aprobaciones", - "approvalRequired": "Needs Approval", + "approvalRequired": "Necesita Aprobación", "repeatZero": "(tarea) Diaria nunca se debe", "repeatType": "Repite tipo", "repeatTypeHelpTitle": "¿Qué tipo de repetición es esta?", @@ -209,5 +209,5 @@ "yesterDailiesDescription": "Si esta opción es aplicada, Habitica te preguntará si de verdad querías dejar la Tarea Diaria sin marcar antes de calcular y aplicar el daño a tu personaje. Esto puede protegerte de daño no intencionado.", "repeatDayError": "Por favor, asegúrate de que seleccionas al menos un día de la semana.", "searchTasks": "Buscar títulos y descripciones...", - "sessionOutdated": "Your session is outdated. Please refresh or sync." + "sessionOutdated": "Tu sesión no está sincronizada. Por favor, refresca o sincroniza." } \ No newline at end of file diff --git a/website/common/locales/es_419/achievements.json b/website/common/locales/es_419/achievements.json index 6b8b3a2716..7567c4b3be 100644 --- a/website/common/locales/es_419/achievements.json +++ b/website/common/locales/es_419/achievements.json @@ -4,5 +4,5 @@ "levelup": "¡Por realizar tus metas de la vida real, has subido de nivel y te has curado por completo!", "reachedLevel": "Has alcanzado el nivel <%= level %>", "achievementLostMasterclasser": "Completista de Misiones: Serie Maestro de Clases", - "achievementLostMasterclasserText": "¡Completó todas las dieciséis misiones de la Serie Maestro de Clases y resolvió el misterio de el Maestro de Clases perdido!" + "achievementLostMasterclasserText": "¡Completó todas las dieciséis misiones de la Serie Maestro de Clases y resolvió el misterio del Maestro de Clases perdido!" } diff --git a/website/common/locales/es_419/backgrounds.json b/website/common/locales/es_419/backgrounds.json index c83a0324f5..05b2c36721 100644 --- a/website/common/locales/es_419/backgrounds.json +++ b/website/common/locales/es_419/backgrounds.json @@ -167,12 +167,12 @@ "backgroundRainbowsEndNotes": "Descubre oro al final del arco iris.", "backgrounds052016": "CONJUNTO 24: Lanzado en mayo 2016", "backgroundBeehiveText": "Colmena", - "backgroundBeehiveNotes": "Zumba y Baila en una Colmena", + "backgroundBeehiveNotes": "Zumba y baila en una Colmena", "backgroundGazeboText": "Gazebo", "backgroundGazeboNotes": "Combate un Gazebo", - "backgroundTreeRootsText": "Raices de Árbol", - "backgroundTreeRootsNotes": "Explora las Raices de Árbol", - "backgrounds062016": "Conjunto 25: Lanzado en junio del 2016", + "backgroundTreeRootsText": "Raíces de Árbol", + "backgroundTreeRootsNotes": "Explora las Raíces de Árbol", + "backgrounds062016": "CONJUNTO 25: Lanzado en junio 2016", "backgroundLighthouseShoreText": "Costa del Faro", "backgroundLighthouseShoreNotes": "Camina en la Costa del Faro", "backgroundLilypadText": "Nenúfar", @@ -183,31 +183,31 @@ "backgroundAquariumText": "Acuario", "backgroundAquariumNotes": "Muévete en un acuario.", "backgroundDeepSeaText": "Mar profundo", - "backgroundDeepSeaNotes": "Sumérgete al Mar Profundo", + "backgroundDeepSeaNotes": "Sumérgete en el Mar Profundo", "backgroundDilatoryCastleText": "Castillo de Tardanza", "backgroundDilatoryCastleNotes": "Nada por el Castillo de Tardanza.", - "backgrounds082016": "CONJUNTO 27: Lanzado en agosto del 2016", + "backgrounds082016": "CONJUNTO 27: Lanzado en agosto 2016", "backgroundIdyllicCabinText": "Cabaña Idílica", "backgroundIdyllicCabinNotes": "Retírate a una Cabaña Idílica.", - "backgroundMountainPyramidText": "Piramide de Montaña", - "backgroundMountainPyramidNotes": "Escala los muchos escalones de una Piramide de Montaña.", + "backgroundMountainPyramidText": "Pirámide de Montaña", + "backgroundMountainPyramidNotes": "Escala los muchos escalones de una Pirámide de Montaña.", "backgroundStormyShipText": "Barco Tormentoso.", "backgroundStormyShipNotes": "Mantente firme contra viento y marea a bordo de un Barco Tormentoso.", - "backgrounds092016": "CONJUNTO 28: Lanzado en septiembre del 2016", + "backgrounds092016": "CONJUNTO 28: Lanzado en septiembre 2016", "backgroundCornfieldsText": "Maizales", - "backgroundCornfieldsNotes": "Disfruta un lindo día en los Maizales", + "backgroundCornfieldsNotes": "Disfruta un lindo día en los Maizales.", "backgroundFarmhouseText": "Granja", - "backgroundFarmhouseNotes": "Saluda los animales en tu camino a la Granja.", + "backgroundFarmhouseNotes": "Saluda a los animales en tu camino a la Granja.", "backgroundOrchardText": "Huerta", - "backgroundOrchardNotes": "Recoge fruta madura en una Huerta", - "backgrounds102016": "CONJUNTO 29: Lanzado en octubre del 2016", + "backgroundOrchardNotes": "Recoge fruta madura en una Huerta.", + "backgrounds102016": "CONJUNTO 29: Lanzado en octubre 2016", "backgroundSpiderWebText": "Telaraña", "backgroundSpiderWebNotes": "Queda atrapado en una Telaraña.", "backgroundStrangeSewersText": "Extrañas Alcantarillas", - "backgroundStrangeSewersNotes": "Deslízate por las Extrañas Alcantarillas", + "backgroundStrangeSewersNotes": "Deslízate por las Extrañas Alcantarillas.", "backgroundRainyCityText": "Ciudad Lluviosa", "backgroundRainyCityNotes": "Chapotea a través de una Ciudad Lluviosa.", - "backgrounds112016": "CONJUNTO 30: Lanzado en noviembre del 2016", + "backgrounds112016": "CONJUNTO 30: Lanzado en noviembre 2016", "backgroundMidnightCloudsText": "Nubes de Medianoche", "backgroundMidnightCloudsNotes": "Vuela a través de las Nubes de Medianoche.", "backgroundStormyRooftopsText": "Tejados Tormentosos", @@ -216,17 +216,17 @@ "backgroundWindyAutumnNotes": "Persigue hojas durante un Otoño Ventoso.", "incentiveBackgrounds": "Conjunto de Fondos Simples", "backgroundVioletText": "Violeta", - "backgroundVioletNotes": "Un fondo violeta vibrante.", + "backgroundVioletNotes": "Un vibrante fondo violeta.", "backgroundBlueText": "Azul", - "backgroundBlueNotes": "Un fondo azul atrevido.", + "backgroundBlueNotes": "Un fondo azul básico.", "backgroundGreenText": "Verde", - "backgroundGreenNotes": "Un fondo verde vetusto.", - "backgroundPurpleText": "Morado", - "backgroundPurpleNotes": "Un fondo morado moderno.", + "backgroundGreenNotes": "Un gran fondo verde.", + "backgroundPurpleText": "Púrpura", + "backgroundPurpleNotes": "Un agradable fondo púrpura.", "backgroundRedText": "Rojo", "backgroundRedNotes": "Un fondo rojo radiante.", "backgroundYellowText": "Amarillo", - "backgroundYellowNotes": "Un fondo amarillo adorable.", + "backgroundYellowNotes": "Un delicioso fondo amarillo.", "backgrounds122016": "CONJUNTO 31: Lanzado en diciembre 2016", "backgroundShimmeringIcePrismText": "Prismas de Hielo Resplandeciente", "backgroundShimmeringIcePrismNotes": "Baila a través de los Prismas de Hielo Resplandeciente.", @@ -238,7 +238,7 @@ "backgroundBlizzardText": "Tormenta de Nieve", "backgroundBlizzardNotes": "Desafía una feroz Tormenta de Nieve.", "backgroundSparklingSnowflakeText": "Brillante Copo de Nieve", - "backgroundSparklingSnowflakeNotes": "Deslizate en un Brillante Copo de Nieve.", + "backgroundSparklingSnowflakeNotes": "Deslízate en un Brillante Copo de Nieve.", "backgroundStoikalmVolcanoesText": "Volcanes Stoïkalm", "backgroundStoikalmVolcanoesNotes": "Explora los Volcanes Stoïkalm.", "backgrounds022017": "CONJUNTO 33: Lanzado en Febrero 2017", @@ -253,18 +253,18 @@ "backgroundMagicBeanstalkNotes": "Ascender un Tallo de Frijoles Mágicos.", "backgroundMeanderingCaveText": "Cueva Serpenteante.", "backgroundMeanderingCaveNotes": "Explora la Cueva Serpenteante.", - "backgroundMistiflyingCircusText": "Circo Volador Perplégico", - "backgroundMistiflyingCircusNotes": "Pasea en el Circo Volador Perplégico.", + "backgroundMistiflyingCircusText": "Circo Volador Desconcertante", + "backgroundMistiflyingCircusNotes": "Pasea en el Circo Volador Desconcertante.", "backgrounds042017": "CONJUNTO 35: Lanzado en abril 2017", "backgroundBugCoveredLogText": "Tronco Cubierto de Insectos", - "backgroundBugCoveredLogNotes": "Investiga un Tronco Cubierto de Insectos", + "backgroundBugCoveredLogNotes": "Investiga un Tronco Cubierto de Insectos.", "backgroundGiantBirdhouseText": "Pajarera Gigante", - "backgroundGiantBirdhouseNotes": "Percha en una Pajarera Gigante", + "backgroundGiantBirdhouseNotes": "Pósate en una Pajarera Gigante.", "backgroundMistShroudedMountainText": "Montaña Cubierta de Niebla", "backgroundMistShroudedMountainNotes": "Llega a la cumbre de una Montaña Cubierta de Niebla.", "backgrounds052017": "CONJUNTO 36: Lanzado en Mayo 2017", - "backgroundGuardianStatuesText": "Estatuas Guardianes", - "backgroundGuardianStatuesNotes": "Mantén la guardia frente a Estatuas Guardianes.", + "backgroundGuardianStatuesText": "Estatuas Guardianas", + "backgroundGuardianStatuesNotes": "Mantén la guardia frente a las Estatuas Guardianas.", "backgroundHabitCityStreetsText": "Calles de la Ciudad del Hábito", "backgroundHabitCityStreetsNotes": "Explora las calles de la Ciudad del Hábito.", "backgroundOnATreeBranchText": "Sobre la Rama de un Árbol", @@ -278,11 +278,11 @@ "backgroundSandcastleNotes": "Reina sobre un Castillo de Arena.", "backgrounds072017": "CONJUNTO 38: Lanzado en julio 2017", "backgroundGiantSeashellText": "Concha Marina Gigante", - "backgroundGiantSeashellNotes": "Descansa en una Concha Marina Gigante", + "backgroundGiantSeashellNotes": "Descansa en una Concha Marina Gigante.", "backgroundKelpForestText": "Bosque de Algas", "backgroundKelpForestNotes": "Nada a través de un Bosque de Algas.", "backgroundMidnightLakeText": "Lago de Medianoche", - "backgroundMidnightLakeNotes": "Descansa cerca a un Lago de Medianoche.", + "backgroundMidnightLakeNotes": "Descansa cerca de un Lago de Medianoche.", "backgrounds082017": "CONJUNTO 39: Lanzado en Agosto 2017", "backgroundBackOfGiantBeastText": "Lomo de una Bestia Gigante", "backgroundBackOfGiantBeastNotes": "Monta en el Lomo de una Bestia Gigante.", diff --git a/website/common/locales/es_419/character.json b/website/common/locales/es_419/character.json index a2091828a9..25c137606f 100644 --- a/website/common/locales/es_419/character.json +++ b/website/common/locales/es_419/character.json @@ -64,6 +64,7 @@ "classBonusText": "Tu clase (Guerrero, si no has desbloqueado y seleccionado otra clase) usa su propio equipamento de manera más eficaz que el de otras clases. El equipamento de tu clase actual da un 50% más de puntos al atributo al que bonifica.", "classEquipBonus": "Bonus de clase", "battleGear": "Equipamiento de combate", + "gear": "Gear", "battleGearText": "Este es el equipamiento que usas en combate, afecta los resultados cuando interactúas con tus tareas.", "autoEquipBattleGear": "Auto-equipar nuevos objetos", "costume": "Disfraz", diff --git a/website/common/locales/es_419/communityguidelines.json b/website/common/locales/es_419/communityguidelines.json index d30c52b8c5..d56ca6cdbd 100644 --- a/website/common/locales/es_419/communityguidelines.json +++ b/website/common/locales/es_419/communityguidelines.json @@ -1,6 +1,6 @@ { "iAcceptCommunityGuidelines": "Acepto cumplir con las Normas de la comunidad", - "tavernCommunityGuidelinesPlaceholder": "Un amistoso recordatorio: este es un chat para todas las edades, así que ¡por favor mantén el contenido y el lenguaje apropiado! Consulta las Normas de la Comunidad debajo si tienes preguntas.", + "tavernCommunityGuidelinesPlaceholder": "Un amistoso recordatorio: este es un chat para todas las edades, así que ¡por favor mantén el contenido y el lenguaje apropiado! Consulta las Normas de la Comunidad en la barra lateral si tienes preguntas.", "commGuideHeadingWelcome": "¡Bienvenido a Habitica!", "commGuidePara001": "¡Saludos aventurero! Bienvenido a Habitica, la tierra de productividad, vida saludable, y el ataque ocasional de un grifo. Tenemos una alegre comunidad llena de gente servicial brindando apoyo el uno al otro en su camino a la autosuperación.", "commGuidePara002": "Para ayudar a mantener a todos seguros, felices, y productivos en la comunidad, nosotros tenemos algunas pautas. Las hemos diseñado cuidadosamente para hacerlas lo más amigables y fáciles de leer. Por favor toma el tiempo de leerlas.", @@ -90,7 +90,7 @@ "commGuideList04H": "Asegurarte de que el contenido de la wiki es relevante para todo el sitio de Habitica y que no corresponde a un gremio o equipo particular (dicha información puede ser trasladada a los foros)", "commGuidePara049": "Las siguientes personas son los administradores actuales de la wiki:", "commGuidePara049A": "Los siguientes moderadores pueden hacer ediciones de emergencias cuando se necesite un Moderador y los administradores que figuran arriba no estén disponibles:", - "commGuidePara018": "Wiki Administrators Emeritus are:", + "commGuidePara018": "Los Wiki Administradores Emérito:", "commGuideHeadingInfractionsEtc": "Infracciones, Consecuencias y Restauración", "commGuideHeadingInfractions": "Infracciones", "commGuidePara050": "Abrumadoramente, los Habiticanos se ayudan los unos a los otros, son respetuosos y trabajan para que toda la comunidad sea divertida y amigable. Sin embargo, una vez cada muerte de obispo, algo que un Habiticano hace puede violar una de las pautas mencionadas. Cuando esto ocurra, los Mods actuarán de la manera que crean necesaria para mantener a Habitica segura y agradable para todos.", diff --git a/website/common/locales/es_419/content.json b/website/common/locales/es_419/content.json index ebf553490f..924da976b6 100644 --- a/website/common/locales/es_419/content.json +++ b/website/common/locales/es_419/content.json @@ -61,7 +61,7 @@ "questEggRoosterAdjective": "un engreído", "questEggSpiderText": "Araña", "questEggSpiderMountText": "Araña", - "questEggSpiderAdjective": "an artistic", + "questEggSpiderAdjective": "Un artístico", "questEggOwlText": "Búho", "questEggOwlMountText": "Búho", "questEggOwlAdjective": "un sabio", @@ -155,17 +155,17 @@ "questEggNudibranchText": "Nudibranquia", "questEggNudibranchMountText": "Nudibranquia", "questEggNudibranchAdjective": "una interesante", - "questEggHippoText": "Hippo", - "questEggHippoMountText": "Hippo", + "questEggHippoText": "Hipo", + "questEggHippoMountText": "Hipo", "questEggHippoAdjective": "un feliz", "questEggYarnText": "Hilo", "questEggYarnMountText": "Alfombra voladora", "questEggYarnAdjective": "woolen", "questEggPterodactylText": "Pterodactyl", "questEggPterodactylMountText": "Pterodactyl", - "questEggPterodactylAdjective": "trusting", - "questEggBadgerText": "Badger", - "questEggBadgerMountText": "Badger", + "questEggPterodactylAdjective": "Confiable", + "questEggBadgerText": "Tejón", + "questEggBadgerMountText": "Tejón", "questEggBadgerAdjective": "bustling", "eggNotes": "Encuentra una poción de eclosión para verter sobre este huevo y se convertirá en <%= eggAdjective(locale) %> <%= eggText(locale) %>.", "hatchingPotionBase": "Básico", diff --git a/website/common/locales/es_419/faq.json b/website/common/locales/es_419/faq.json index 409966f74c..21f33dc05f 100644 --- a/website/common/locales/es_419/faq.json +++ b/website/common/locales/es_419/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "¿Cómo juego en Habitica con mis amigos?", "iosFaqAnswer5": "¡La mejor manera es invitar a tus amigos a formar un Equipo contigo! Los Equipos pueden completar misiones, pelear contra monstruos y utilizar habilidades para apoyarse entre todos. Ve a Menú > Equipo y haz clic en \"Crear nuevo Equipo\" si todavía no formas parte de uno. Luego ve a la lista de Miembros y haz clic en Invitar en la esquina superior derecha para invitar a tus amigos ingresando sus ID de usuario (una secuencia de números y letras que pueden encontrar en Ajustes > Detalles de Cuenta en la app, o Ajustes > API en el sitio web). En el sitio web también puedes invitar amigos vía correo electrónico, lo cual incorporaremos a la app en futuras actualizaciones.\n\nEn el sitio web, tú y tus amigos también pueden unirse a Gremios, que son salas de chat públicas. ¡Los Gremios serán incorporados a la app en una actualización futura!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "¿Cómo consigo una mascota o una montura?", "iosFaqAnswer6": "En el nivel 3 desbloquearás el Sistema de Botines. Cada vez que completes una tarea, tendrás una chance aleatoria de recibir un huevo, una poción de eclosión o un alimento. Éstos serán guardados en Menú > Ítems.\n\nPara obtener una mascota necesitarás un huevo y una poción de eclosión. Haz clic en el huevo para determinar la especie que quieres obtener, y selecciona \"Eclosionar Huevo\". ¡Luego elige una poción de eclosión para definir su color! Ve a Menú > Mascotas y haz clic en tu nueva Mascota para equiparla.\n\nTambién puedes hacer que tus Mascotas crezcan hasta convertirse en Monturas alimentándolas desde Menú > Mascotas. ¡Cliquea en una Mascota y luego selecciona \"Alimentar Mascota\"! Tendrás que alimentar a una mascota muchas veces para que pueda convertirse en Montura, pero si descubres cuál es su comida favorita, crecerá más rápido. Utiliza el método de ensayo y error, o [ve los spoilers aquí](http://habitica.wikia.com/wiki/Food#Food_Preferences). Una vez que tengas una Montura, ve a Menú > Monturas y haz clic en ella para equiparla.\n\nAdemás puedes obtener huevos de Mascotas de Misión al completar ciertas Misiones. (Lee abajo para saber más sobre Misiones.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/es_419/front.json b/website/common/locales/es_419/front.json index bba7d8b813..d7770bfa4b 100644 --- a/website/common/locales/es_419/front.json +++ b/website/common/locales/es_419/front.json @@ -145,7 +145,7 @@ "pkAnswer1": "If you’ve ever invested time in leveling up a character in a game, it’s hard not to wonder how great your life would be if you put all of that effort into improving your real-life self instead of your avatar. We starting building Habitica to address that question.
Habitica officially launched with a Kickstarter in 2013, and the idea really took off. Since then, it’s grown into a huge project, supported by our awesome open-source volunteers and our generous users.", "pkQuestion2": "¿Por qué funciona Habitica?", "pkAnswer2": "Forming a new habit is hard because people really need that obvious, instant reward. For example, it’s tough to start flossing, because even though our dentist tells us that it's healthier in the long run, in the immediate moment it just makes your gums hurt.
Habitica's gamification adds a sense of instant gratification to everyday objectives by rewarding a tough task with experience, gold… and maybe even a random prize, like a dragon egg! This helps keep people motivated even when the task itself doesn't have an intrinsic reward, and we've seen people turn their lives around as a result. You can check out success stories here: https://habitversary.tumblr.com", - "pkQuestion3": "Why did you add social features?", + "pkQuestion3": "¿Por que agregaron características sociales?", "pkAnswer3": "Social pressure is a huge motivating factor for a lot of people, so we knew that we wanted to have a strong community that would hold each other accountable for their goals and cheer for their successes. Luckily, one of the things that multiplayer video games do best is foster a sense of community among their users! Habitica’s community structure borrows from these types of games; you can form a small Party of close friends, but you can also join a larger, shared-interest groups known as a Guild. Although some users choose to play solo, most decide to form a support network that encourages social accountability through features such as Quests, where Party members pool their productivity to battle monsters together.", "pkQuestion4": "Why does skipping tasks remove your avatar’s health?", "pkAnswer4": "If you skip one of your daily goals, your avatar will lose health the following day. This serves as an important motivating factor to encourage people to follow through with their goals because people really hate hurting their little avatar! Plus, the social accountability is critical for a lot of people: if you’re fighting a monster with your friends, skipping your tasks hurts their avatars, too.", @@ -287,7 +287,7 @@ "invalidLoginCredentialsLong": "Uh-oh - your email address / login name or password is incorrect.\n- Make sure they are typed correctly. Your login name and password are case-sensitive.\n- You may have signed up with Facebook or Google-sign-in, not email so double-check by trying them.\n- If you forgot your password, click \"Forgot Password\".", "invalidCredentials": "No hay ninguna cuenta que use esas credenciales.", "accountSuspended": "Esta cuenta ha sido suspendida, por favor contacta a <%= communityManagerEmail %> con tu ID de usuario \"<%= userId %>\" para recibir asistencia. ", - "unsupportedNetwork": "This network is not currently supported.", + "unsupportedNetwork": "Esta red no es suportada por el momento.", "cantDetachSocial": "Account lacks another authentication method; can't detach this authentication method.", "onlySocialAttachLocal": "Autenticación local solo puede ser añadida a una cuenta social.", "invalidReqParams": "Parametros pedidos invalidos.", @@ -314,9 +314,9 @@ "aboutHabitica": "Habitica is a free habit-building and productivity app that treats your real life like a game. With in-game rewards and punishments to motivate you and a strong social network to inspire you, Habitica can help you achieve your goals to become healthy, hard-working, and happy.", "trackYourGoals": "Track Your Habits and Goals", "trackYourGoalsDesc": "Stay accountable by tracking and managing your Habits, Daily goals, and To-Do list with Habitica’s easy-to-use mobile apps and web interface.", - "earnRewards": "Earn Rewards for Your Goals", + "earnRewards": "Recibe Recompensas por tus Metas.", "earnRewardsDesc": "Check off tasks to level up your Avatar and unlock in-game features such as battle armor, mysterious pets, magic skills, and even quests!", - "battleMonsters": "Battle Monsters with Friends", + "battleMonsters": "Lucha contra Monstruos junto a tus Amigos", "battleMonstersDesc": "Fight monsters with other Habiticans! Use the Gold that you earn to buy in-game or custom rewards, like watching an episode of your favorite TV show.", "playersUseToImprove": "Players Use Habitica to Improve", "healthAndFitness": "Health and Fitness", @@ -325,13 +325,13 @@ "schoolAndWorkDesc": "Sea que estés preparando un reporte para tu Profesor o para tu Jefe, es fácil llevar el seguimiento de tu progreso mientras afrontas tus tareas mas difíciles.", "muchmuchMore": "Y ¡mucho, mucho más!", "muchmuchMoreDesc": "Our fully customizable task list means that you can shape Habitica to fit your personal goals. Work on creative projects, emphasize self-care, or pursue a different dream -- it's all up to you.", - "levelUpAnywhere": "Level Up Anywhere", + "levelUpAnywhere": "Sube de Nivel en Cualquier Lugar", "levelUpAnywhereDesc": "Our mobile apps make it simple to keep track of your tasks on-the-go. Accomplish your goals with a single tap, no matter where you are.", "joinMany": "Join over 2,000,000 people having fun while accomplishing their goals!", - "joinToday": "Join Habitica Today", + "joinToday": "Únete hoy a Habitica", "signup": "Sign Up", "getStarted": "Get Started", "mobileApps": "Aplicaciones Móviles", - "learnMore": "Learn More", + "learnMore": "Aprende Más", "useMobileApps": "Habitica no esta optimizada para navegadores móviles. Te recomendamos descargar una de nuestras aplicaciones para celular." } \ No newline at end of file diff --git a/website/common/locales/es_419/gear.json b/website/common/locales/es_419/gear.json index 8c39b209a5..e9814a02b0 100644 --- a/website/common/locales/es_419/gear.json +++ b/website/common/locales/es_419/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Traje Steampunk", "armorMystery301404Notes": "¡Sofisticado y elegante! No otorga ningún beneficio. Artículo de Suscriptor de Febrero 3015.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Galera Elegante", "headMystery301404Notes": "¡Una galera elegante para los señores más sofisticados! Artículo de Suscriptor de Enero 3015. No otorga ningún beneficio.", "headMystery301405Text": "Galera Básica", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Escudo Reloj", "shieldMystery301405Notes": "¡El tiempo está de tu lado con este imponente escudo reloj! No otorga ningún beneficio. Artículo de Suscriptor de Junio 3015.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/es_419/generic.json b/website/common/locales/es_419/generic.json index f53b97c53c..a86a346cf4 100644 --- a/website/common/locales/es_419/generic.json +++ b/website/common/locales/es_419/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Tema de Airu", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/es_419/groups.json b/website/common/locales/es_419/groups.json index 7cdc35feb5..cef196e927 100644 --- a/website/common/locales/es_419/groups.json +++ b/website/common/locales/es_419/groups.json @@ -4,7 +4,7 @@ "innCheckOut": "Dejar la posada", "innCheckIn": "Descansar en la posada", "innText": "¡Estas descansando en la Posada! Mientras estés en la sesión, tus diarias no te harán daño al final del día, pero aun así se renovaran cada día. Advertencia: Si estas participando en una pelea contra un Jefe, el Jefe aun te hará daño por las tareas faltantes de los miembros del Grupo, ¡A menos que también estén descansando en la Posada! Ademas, tu propio daño hacia el Jefe (O los objetos recolectados) no serán aplicados hasta que salgas de la Posada.", - "innTextBroken": "You're resting in the Inn, I guess... While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day... If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies... unless they are also in the Inn... Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn... so tired...", + "innTextBroken": "Has entrado a descansar en la Posada, supongo... Mientras permanezcas aquí tus Diarias no te dañarán al finalizar el día, pero sí se renovarán cada día... Si estás participando en una Misión contra un Jefe, las Diarias incompletas de tus compañeros de equipo te seguirán haciendo daño... a menos que ellos también estén descansando en la Posada... Además, tú no dañarás al jefe (ni obtendrás los objetos recolectados) hasta que no hayas salido de la Posada... estoy tan cansado...", "helpfulLinks": "Enlaces Útiles", "communityGuidelinesLink": "Normas de la Comunidad", "lookingForGroup": "Publicaciones buscando un Grupo (Party Wanted)", @@ -62,8 +62,8 @@ "partyLoading3": "Tu Grupo se esta reuniendo. Por favor espera...", "partyLoading4": "Tu Grupo se esta materializando. Por favor espera...", "systemMessage": "Mensaje Sistemico.", - "newMsgGuild": "<%= name %> has new posts", - "newMsgParty": "Your Party, <%= name %>, has new posts", + "newMsgGuild": "<%= name %> tiene nuevos anuncios", + "newMsgParty": "Tu Grupo, <%= name %>, tiene nuevos anuncios", "chat": "Chat", "sendChat": "Enviar Chat", "toolTipMsg": "Recuperar mensajes recientes", @@ -194,15 +194,14 @@ "wantToStartParty": "¿Quieres iniciar un Grupo?", "exclusiveQuestScroll": "Inviting a friend to your Party will grant you an exclusive Quest Scroll to battle the Basi-List together!", "nameYourParty": "¡Nombra tu nuevo Grupo!", - "partyEmpty": "You're the only one in your Party. Invite your friends!", - "partyChatEmpty": "Your Party chat is empty! Type a message in the box above to start chatting.", + "partyEmpty": "Eres el único en tu Grupo. ¡Invista a tus amigos!", + "partyChatEmpty": "¡El chat de tu Grupo está vacío! Escribe un mensaje en el recuadro de arriba para empezar a conversar.", "guildChatEmpty": "¡El chat de este gremio está vacío! Escribe un mensaje en el recuadro de arriba para empezar a conversar.", "requestAcceptGuidelines": "If you would like to post messages in the Tavern or any Party or Guild chat, please first read our <%= linkStart %>Community Guidelines<%= linkEnd %> and then click the button below to indicate that you accept them.", "partyUpName": "Equipados", "partyOnName": "Equipazo", "partyUpText": "¡Te uniste a un Grupo con otra persona! Diviértete luchando contra monstruos y apoyándose el uno al otro.", "partyOnText": "¡Te uniste a un Grupo con al menos 4 personas! Disfruta tu responsabilidad aumentada ¡a la vez que te unes con tus amigos para vencer sus enemigos!", - "largeGroupNote": "Nota: Este Gremio es muy grande y ya no soporta notificaciones. Asegúrese de revisar de nuevo todos los días para ver los mensajes nuevos.", "groupIdRequired": "\"groupId\" debe ser un UUID válido", "groupNotFound": "Grupo no encontrado o no tienes acceso.", "groupTypesRequired": "Debes ingresar una cadena de caracteres \"type\" valida.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Falta el ID de usuario en la invitación", "inviteMustNotBeEmpty": "La invitación no debe estar vacía", "partyMustbePrivate": "Partidos tienen que ser privados.", - "userAlreadyInGroup": "Usuario ya esta en ese grupo.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "No puedes invitarte a ti mismo a un grupo.", - "userAlreadyInvitedToGroup": "Usuario ya fue invitado a ese grupo.", - "userAlreadyPendingInvitation": "Usuario ya tiene una invitación pendiente.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Usuario, con el id \"<%= userId %>\" no encontrado.", "userHasNoLocalRegistration": "Usuario no tiene un registro local (Nombre de usuario, correo, contraseña)", "uuidsMustBeAnArray": "Las invitaciónes de ID de usuarios deben ser un array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "El Líder se ha cambiado", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/es_419/limited.json b/website/common/locales/es_419/limited.json index d789dbb0bf..8972813edc 100644 --- a/website/common/locales/es_419/limited.json +++ b/website/common/locales/es_419/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Ah... Bienvenido a la Tienda Estacional... Nos estamos abasteciendo de bienes de Edición Estacional de otoño, o algo así... Todo aquí estará disponible para comprar durante el evento Festival de Otoño cada año, pero la tienda sólo está abierta hasta el 31 de octubre... Supongo que deberías asegurarte de abastecerte ahora, o tendrás que esperar... y esperar... y esperar... *ahh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Si compraste alguno de estos equipamientos en el pasado pero actualmente no lo tienes puedes volver a comprarlo en la columna de recompensas. Inicialmente solo podrás comprar los ítems para tu clase actual (Guerrero por defecto), pero no te preocupes, los otros ítems de clases específicas estarán disponibles al cambiarte a esta clase.", "candycaneSet": "Bastón de Caramelo (Mago)", "skiSet": "Esquia-sesino (Pícaro)", diff --git a/website/common/locales/es_419/npc.json b/website/common/locales/es_419/npc.json index f05023e68d..2cab14942e 100644 --- a/website/common/locales/es_419/npc.json +++ b/website/common/locales/es_419/npc.json @@ -31,8 +31,8 @@ "danielText2": "Aviso: Si estás participando en una misión contra un jefe, ¡el jefe seguirá haciéndote daño si tus compañeros de equipo no completan sus Diarias! Además, el daño que tú le hagas al Jefe (o los objetos que hayas recolectado) no se aplicará hasta que salgas de la Posada.", "danielTextBroken": "Bienvenido a la Taberna... Supongo... Si necesitas descansar, te instalaré en la Posada... Mientras estés registrado, tus Diarias no te harán daño al final del día, pero aún así puedes tildarlas... Si tienes la energía...", "danielText2Broken": "Oh... Si estás participando en una misión contra un jefe, el jefe seguirá dañándote por las Diarias que tus compañeros de equipo no completen... Además, el daño que tú le causes al Jefe (o los objetos recolectados) no será aplicado hasta que salgas de la Posada...", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "Evento Jefe Global", + "worldBossDescription": "Descripción del Jefe Global", "alexander": "Alexander el Comerciante", "welcomeMarket": "¡Bienvenidos al Mercado! ¡Compra huevos difíciles de encontrar y pociones! ¡Vende tus extras! ¡Encarga servicios útiles! Ven a ver lo que tenemos para ofrecer.", "welcomeMarketMobile": "¡Bienvenido al Mercado! ¡Compra huevos y pociones difíciles de encontrar! Ven a ver lo que tenemos para ofrecer.", @@ -96,9 +96,9 @@ "alreadyUnlocked": "El conjunto ya se ha desbloqueado por completo. ", "alreadyUnlockedPart": "El conjunto se ha desbloqueado parcialmente. ", "USD": "(USD)", - "newStuff": "New Stuff by Bailey", - "newBaileyUpdate": "New Bailey Update!", - "tellMeLater": "Tell Me Later", + "newStuff": "Cosas nuevas, por Bailey", + "newBaileyUpdate": "¡Nueva Actualización de Bailey!", + "tellMeLater": "Dímelo mas tarde", "dismissAlert": "Descartar este alerta", "donateText1": "Añade 20 Gemas a tu cuenta. Las gemas se usan para comprar objetos especiales en el juego, como camisas y peinados.", "donateText2": "Ayuda a respaldar a Habitica", @@ -111,9 +111,9 @@ "paymentMethods": "Comprar usando", "classGear": "Equipamiento de Clase", "classGearText": "¡Felicitaciones por haber escogido una clase! He añadido tu nueva arma básica a tu inventario. ¡Écha una mirada abajo para equiparla!", - "classStats": "These are your class's Stats; they affect the game-play. Each time you level up, you get one Point to allocate to a particular Stat. Hover over each Stat for more information.", + "classStats": "Éstas son las estadísticas de tu clase; afectan el estilo de juego. Cada vez que subes de nivel, obtienes un punto para asignarle a alguna estadística en particular. Coloca el cursor sobre cada estadística para más información.", "autoAllocate": "Asignación automática", - "autoAllocateText": "If 'Automatic Allocation' is selected, your avatar gains Stats automatically based on your tasks' Stats, which you can find in TASK > Edit > Advanced Settings > Stat Allocation. Eg, if you hit the gym often, and your 'Gym' Daily is set to 'Strength', you'll gain Strength automatically.", + "autoAllocateText": "Si marcas 'Asignación Automática', tu avatar aumenta las estadisticas automáticamente basado en los atributos de tus Tareas, las cuales puedes encontrar en TAREA > Editar > Avanzado > Atributos. Por ejemplo, si vas seguido al gimnasio y tu Diaria 'Gimnasio' está asignada al atributo 'Fuerza', ganarás Fuerza automáticamente.", "spells": "Habilidades", "spellsText": "Ahora puedes desbloquear habilidades específicas a una clase. Verás la primera en el nivel 11. Tu maná se repondrá a 10 puntos por día, más 1 punto por cada Pendiente completado.", "skillsTitle": "Habilidades", @@ -139,7 +139,7 @@ "tourHallPage": "Bienvenido al Salón de los Héroes, donde los colaboradores del código abierto de Habitica son honrados. Ya sea a través de código, arte, música, escritura o solamente ayudando, ellos han ganado gemas, equipamiento exclusivo y prestigiosos títulos. ¡Tú también puedes contribuir a Habitica!", "tourPetsPage": "¡Este es el Establo! Al llegar al nivel 3 podrás recolectar huevos de mascota y pociones de nacimiento mientras vas completando tareas. Cuando hagas nacer una mascota, ¡aparecerá aquí! Haz clic en la imagen de una mascota para agregarla a tu avatar. ¡Aliméntala con comida que encuentres después del nivel 3 y crecerán a ser poderosos animales de montura!", "tourMountsPage": "Tu mascota va a aparecer acá una vez que la hayas alimentado suficiente para pasar a ser una montura. ¡Cliquea en una montura para montarla!", - "tourEquipmentPage": "This is where your Equipment is stored! Your Battle Gear affects your Stats. If you want to show different Equipment on your avatar without changing your Stats, click \"Enable Costume.\"", + "tourEquipmentPage": "¡Aquí es donde se guarda tu equipamiento! Tu Equipamiento de Batalla afecta tus estadísticas. Si quieres lucir un equipamiento distinto sin afectar tus estadísticas, utiliza la opción \"Usar disfraz\".", "equipmentAlreadyOwned": "Ya posees esa pieza de equipamiento. ", "tourOkay": "¡Okay!", "tourAwesome": "¡Genial!", diff --git a/website/common/locales/es_419/questscontent.json b/website/common/locales/es_419/questscontent.json index e534dfbc78..78b886234a 100644 --- a/website/common/locales/es_419/questscontent.json +++ b/website/common/locales/es_419/questscontent.json @@ -360,7 +360,7 @@ "questBeetleBoss": "ERROR CRÍTICO", "questBeetleDropBeetleEgg": "Escarabajo (Huevo)", "questBeetleUnlockText": "Desbloquea huevos de escarabajo adquiribles en el Mercado", - "questGroupTaskwoodsTerror": "Terror in the Taskwoods", + "questGroupTaskwoodsTerror": "Terror en Bosquetarea", "questTaskwoodsTerror1Text": "Terror in the Taskwoods, Part 1: The Blaze in the Taskwoods", "questTaskwoodsTerror1Notes": "You have never seen the Joyful Reaper so agitated. The ruler of the Flourishing Fields lands her skeleton gryphon mount right in the middle of Productivity Plaza and shouts without dismounting. \"Lovely Habiticans, we need your help! Something is starting fires in the Taskwoods, and we still haven't fully recovered from our battle against Burnout. If it's not halted, the flames could engulf all of our wild orchards and berry bushes!\"

You quickly volunteer, and hasten to the Taskwoods. As you creep into Habitica’s biggest fruit-bearing forest, you suddenly hear clanking and cracking voices from far ahead, and catch the faint smell of smoke. Soon enough, a horde of cackling, flaming skull-creatures flies by you, biting off branches and setting the treetops on fire!", "questTaskwoodsTerror1Completion": "With the help of the Joyful Reaper and the renowned pyromancer @Beffymaroo, you manage to drive back the swarm. In a show of solidarity, Beffymaroo offers you her Pyromancer's Turban as you move deeper into the forest.", @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`¡The Dysheartener usa SHATTERING HEARTBREAK!`\n\n¡Oh no! Después de deleitarnos con nuestras Diarias deshechos, el Dysheartener ha ganado la fuerza para desatar su ataque Shattering Heartbreak. Con un agudo chillido, baja sus espinosas patas delanteras sobre la glorieta que alberga la Tienda de temporada. El estallido de magia conmociona la madera, y la hechicera de temporada es abatida por la pena al verla.\n\n¡Rápidamente, sigamos haciendo nuestras Diarias para que la bestia no vuelva a atacar!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/es_419/spells.json b/website/common/locales/es_419/spells.json index dd3e3b82d2..78ac0eb920 100644 --- a/website/common/locales/es_419/spells.json +++ b/website/common/locales/es_419/spells.json @@ -1,6 +1,6 @@ { "spellWizardFireballText": "Explosión de Llamas", - "spellWizardFireballNotes": "You summon XP and deal fiery damage to Bosses! (Based on: INT)", + "spellWizardFireballNotes": "¡Invocas PX y dañas flamantemente a los Jefes! (Basado en: INT)", "spellWizardMPHealText": "Corriente Etérea", "spellWizardMPHealNotes": "Sacrificas maná para que el resto de tu Equipo gane PM! (Basado en : INT)", "spellWizardEarthText": "Terremoto", diff --git a/website/common/locales/es_419/subscriber.json b/website/common/locales/es_419/subscriber.json index 98c3dbfd5c..ed4a1cfa16 100644 --- a/website/common/locales/es_419/subscriber.json +++ b/website/common/locales/es_419/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Conjunto Steampunk Estándar ", "mysterySet301405": "Conjunto de Accesorios Steampunk", "mysterySet301703": "Conjunto Pavo Real Steampunk", diff --git a/website/common/locales/fr/character.json b/website/common/locales/fr/character.json index 7891f00148..3714a91cf6 100644 --- a/website/common/locales/fr/character.json +++ b/website/common/locales/fr/character.json @@ -64,6 +64,7 @@ "classBonusText": "Votre classe (Guerrier, si vous n'avez pas débloqué ou sélectionné d'autre classe) utilise mieux son équipement spécifique que celui d'autres classes. Le bonus d'attribut conféré par l'équipement spécifique à votre classe actuelle est augmenté de 50%.", "classEquipBonus": "Bonus de classe", "battleGear": "Tenue de combat", + "gear": "Gear", "battleGearText": "Voici l'équipement que vous portez au combat ; il affecte les chiffres obtenus lorsque vous interagissez avec vos tâches.", "autoEquipBattleGear": "Équiper automatiquement le nouvel équipement", "costume": "Costume", @@ -76,7 +77,7 @@ "costumeDisabled": "Vous avez désactivé l'utilisation du costume.", "gearAchievement": "Vous avez gagné le succès \"Armé jusqu'aux dents\" pour avoir atteint le niveau maximal de l'ensemble d'équipement de votre classe ! Vous avez acquis les ensembles complets suivants:", "moreGearAchievements": "Pour obtenir plus de badges d'équipement ultime, changez de classe sur Paramètres > Site et achetez l'équipement de votre nouvelle classe !", - "armoireUnlocked": "Pour plus d'équipement, regardez dans l'armoire enchantée !. Cliquez sur la récompense Armoire enchantée pour une chance aléatoire d'obtenir une pièce d'équipement spéciale ! Cela peut aussi vous donner de l'expérience ou de la nourriture.", + "armoireUnlocked": "Pour plus d'équipement, regardez dans l'armoire enchantée !. Cliquez sur la récompense \"Armoire enchantée\" pour une chance aléatoire d'obtenir une pièce d'équipement spéciale ! Cela peut aussi vous donner de l'expérience ou de la nourriture.", "ultimGearName": "S'armer jusqu'aux dents – <%= ultClass %>", "ultimGearText": "S'équiper avec les meilleures armes et les meilleures armures pour la classe <%= ultClass %>. ", "level": "Niveau", diff --git a/website/common/locales/fr/content.json b/website/common/locales/fr/content.json index 0d761a5562..229128d0bb 100644 --- a/website/common/locales/fr/content.json +++ b/website/common/locales/fr/content.json @@ -206,8 +206,8 @@ "foodStrawberryThe": "la fraise", "foodStrawberryA": "une fraise", "foodChocolate": "Tablette de chocolat", - "foodChocolateThe": "la barre de chocolat", - "foodChocolateA": "une barre de chocolat", + "foodChocolateThe": "la tablette de chocolat", + "foodChocolateA": "une tablette de chocolat", "foodFish": "Sardine", "foodFishThe": "la sardine", "foodFishA": "une sardine", diff --git a/website/common/locales/fr/faq.json b/website/common/locales/fr/faq.json index 03ef0da441..b77b2afac2 100644 --- a/website/common/locales/fr/faq.json +++ b/website/common/locales/fr/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Il y a plusieurs choses qui peuvent vous causer des dégâts. D'abord, si vous laissez des quotidiennes incomplètes pendant la nuit, elles vous causeront des dégâts. Ensuite, si vous réalisez une mauvaise habitude, elle vous causera des dégâts. Enfin, si vous et votre équipe affrontez un boss, et qu'un de vos compagnons n'a pas réalisé toutes ses tâches quotidiennes, le boss vous attaquera. La meilleure façon de guérir est de gagner un niveau, ce qui vous rendra toute votre santé. Vous pouvez aussi acheter une potion de santé avec de l'or à partir de la colonne Récompenses. De plus, au delà du niveau 10, vous pouvez choisir de devenir un Guérisseur, et ainsi développer des compétences de guérison. Si vous avez un Guérisseur dans votre équipe, il peut aussi vous guérir. Apprenez-en plus en cliquant sur \"Équipe\" dans la barre de navigation.", "faqQuestion5": "Comment jouer à Habitica avec mes amis ?", "iosFaqAnswer5": "Le meilleur moyen est de les inviter dans une équipe avec vous. Les équipes peuvent partir en quêtes, combattre des monstres et lancer des sorts pour s’entraider. Si vous n'avez pas encore d'équipe, allez dans Social > Équipe et cliquez sur « Créer une nouvelle équipe », puis cliquez sur la liste de membres et finalement cliquez sur Inviter dans le coin supérieur droit pour inviter vos amis en inscrivant leur ID d'utilisateur (une chaîne de nombres et de lettres que vous pouvez trouver sous Paramètres > Détails du compte, dans l'application, ou sous Paramètres > API sur le site Web). Sur le site web, vous pouvez également inviter des amis par courriel. Cette option sera ajoutée à l'application lors d'une mise à jour ultérieure.\n\nSur le site web, vos amis et vous pouvez aussi rejoindre des guildes, qui sont des salons de discussion publics. Les guildes seront ajoutées à l'application lors d'une mise à jour ultérieure !", - "androidFaqAnswer5": "Le meilleur moyen est de les inviter dans une équipe avec vous ! Les équipes peuvent partir en quête, combattre des monstres et utiliser leurs compétences pour s’entraider. Allez sur le [site](https://habitica.com/) pour en créer une si vous n'avez pas déjà d'équipe. Vous et vos amis pouvez aussi rejoindre des guildes (Social > Guildes). Les guildes sont des salons de discussion autour d'un intérêt partagé, ou à la poursuite d'un même but, et peuvent être publiques ou privées. Vous pouvez rejoindre autant de guildes que vous le souhaitez, mais seulement une équipe.\n\nPour des infos plus détaillées, consultez les pages du wiki sur les [équipes](http://fr.habitica.wikia.com/wiki/%C3%89quipe) et les [guildes](http://fr.habitica.wikia.com/wiki/Guildes).", - "webFaqAnswer5": "Le meilleur moyen est de les inviter dans une équipe avec vous, en cliquant sur Équipe dans la barre de navigation ! Les équipes peuvent partir en quêtes, combattre des monstres, et utiliser leurs compétences pour s'entraider. Vous et vos amis pouvez aussi rejoindre des guildes (cliquez sur Guildes dans la barre de navigation). Les guildes sont des salons de discussion autour d'un intérêt partagé, ou à la poursuite d'un même but, et peuvent être publiques ou privées. Vous pouvez joindre autant de guildes que vous voulez, mais seulement une équipe. Pour des informations plus précises, lisez sur le wiki les pages à propos des [équipes](http://fr.habitica.wikia.com/wiki/%C3%89quipe) et des [guildes](http://fr.habitica.wikia.com/wiki/Guildes).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Comment obtenir des familiers ou des montures ?", "iosFaqAnswer6": "A partir du niveau 3, vous débloquerez le système de butin. Chaque fois que vous réaliserez une tâche, vous aurez une chance aléatoire de recevoir un œuf, une potion d'éclosion, ou un morceau de nourriture. Ils seront stockés dans Menu > Objets.\n\nPour faire éclore un familier, vous aurez besoin d'un œuf et d'une potion d'éclosion. Sélectionnez l’œuf pour déterminer l'espèce que vous voulez faire éclore, et choisissez \"Faire éclore l'Œuf.\" Puis choisissez la potion d'éclosion pour déterminer sa couleur ! Allez dans Menu > Familiers pour équiper votre nouveau familier en cliquant dessus.\n\nVous pouvez aussi faire grandir vos familiers en montures en les nourrissant dans Menu > Familiers, et en sélectionnant \"Nourrir le Familier\" ! Vous devrez nourrir un familier plusieurs fois avant qu'il ne devienne une Monture, mais si vous devinez sa nourriture préférée, il grandira plus vite. Faites des essais, ou [lisez les spoilers ici](http://fr.habitica.wikia.com/wiki/Nourriture#Pr.C3.A9f.C3.A9rences_alimentaires). Une fois que vous avez obtenu une monture, allez dans Menu > Montures et sélectionnez la pour l'équiper.\n\nVous pouvez aussi gagner des œufs de familiers de quête, en accomplissant certaines quêtes. (Voir ci-dessous pour en apprendre plus sur les quêtes.)", "androidFaqAnswer6": "Au niveau 3, vous débloquerez le système de butin. Chaque fois que vous complétez une tâche, vous avez une chance aléatoire de recevoir un œuf, une potion d'éclosion, ou un morceau de nourriture. Ils seront stockés dans Menu > Objets.\n\nPour faire éclore un familier, il vous faudra un œuf et une potion d'éclosion. Sélectionnez l'œuf pour déterminer l'espèce que vous voulez faire éclore, et choisissez \"Faire éclore avec une potion.\" Puis choisissez une potion d'éclosion pour déterminer sa couleur. Pour équiper votre nouveau Familier, allez dans Menu > Écurie > Familiers, sélectionnez une espèce, cliquez sur le familier désiré, et sélectionnez \"Utiliser\" (votre avatar ne se mettra pas à jour automatiquement).\n\nVous pouvez aussi transformer votre familier en monture en le nourrissant dans Menu > Écurie [ > Familiers]. Sélectionnez un familier et choisissez \"Nourrir\" ! Vous devrez le nourrir plusieurs fois avant qu'il ne devienne une monture, mais si vous devinez sa nourriture favorite, il grandira plus vite. Vous pouvez essayer de le deviner, ou [voir la réponse ici](http://fr.habitica.wikia.com/wiki/Pr.C3.A9f.C3.A9rences_alimentaires). Pour équiper votre monture, sélectionnez une espère, choisissez la monture souhaitée, et sélectionnez \"Utiliser\" (votre avatar ne se mettra pas à jour automatiquement).\n\nVous pouvez aussi obtenir des œufs pour des familiers de quête en réalisant certaines quêtes. (voir ci-dessous pour en savoir plus sur les quêtes.) ", diff --git a/website/common/locales/fr/gear.json b/website/common/locales/fr/gear.json index 12e61cea69..73635a49a2 100644 --- a/website/common/locales/fr/gear.json +++ b/website/common/locales/fr/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "Ces vêtements de tricot vous garderont au chaud alors que vous voyagez dans les airs. N'apporte aucun bonus. Équipement d'abonné·e de novembre 2017.", "armorMystery201712Text": "Armure du bougiemancien", "armorMystery201712Notes": "La chaleur et la lumière générées par cette armure magique réchaufferont votre cœur mais ne brûleront jamais votre peau ! N'apporte aucun bonus. Équipement d'abonné·e de Décembre 2017.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Tenue steampunk", "armorMystery301404Notes": "Pimpant et fringuant ! N'apporte aucun bonus. Équipement d'abonné·e de février 3015.", "armorMystery301703Text": "Toge du paon steampunk", @@ -984,6 +986,8 @@ "headMystery201710Notes": "Ce heaume vous rend intimidant... Mais il ne rendra pas service à votre perception de la profondeur ! N'apporte aucun bonus. Équipement d'abonné·e d'octobre 2017.", "headMystery201712Text": "Couronne du bougiemancien", "headMystery201712Notes": "Cette couronne vous apportera de la lumière et de la chaleur même dans la nuit d'hiver la plus sombre. N'apporte aucun bonus. Équipement d'abonné·e de Décembre 2017.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Haut-de-forme fantaisiste", "headMystery301404Notes": "Un couvre-chef fantaisiste pour les gens de bonne famille les plus élégants ! N'apporte aucun bonus. Équipement d'abonné·e de janvier 3015.", "headMystery301405Text": "Haut-de-forme classique", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Ce bouclier robuste en roche fondue vous protège contre les mauvaises habitudes, mais ne roussira pas vos mains. N'apporte aucun bonus. Équipement d'abonné•e d'août 2017.", "shieldMystery201709Text": "Manuel de sorcellerie", "shieldMystery201709Notes": "Ce livre vous guidera dans vos essais de sorcellerie.\nN'apporte aucun bonus. Équipement d'abonné·e de septembre 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Bouclier-horloge", "shieldMystery301405Notes": "Le temps est de vote côté avec cet imposant bouclier horloge ! N'apporte aucun bonus. Équipement d'abonné·e de juin 3015.", "shieldMystery301704Text": "Ventilateur tourbillonnant", diff --git a/website/common/locales/fr/generic.json b/website/common/locales/fr/generic.json index 9178cd5d04..a2f98d29ec 100644 --- a/website/common/locales/fr/generic.json +++ b/website/common/locales/fr/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Thème d'Airu", "audioTheme_beatscribeNesTheme": "Thème NES de Beatscribe", "audioTheme_arashiTheme": "Thème d'Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Thème de Lunasol", "audioTheme_spacePenguinTheme": "Thème de SpacePenguin", "audioTheme_maflTheme": "Thème MAFL", diff --git a/website/common/locales/fr/groups.json b/website/common/locales/fr/groups.json index bdf719025c..606f8e1c81 100644 --- a/website/common/locales/fr/groups.json +++ b/website/common/locales/fr/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Une équipe festive", "partyUpText": "A rejoint une équipe avec une autre personne ! Amusez-vous à affronter des monstres, unis dans la bataille.", "partyOnText": "A rejoint une équipe d'au moins quatre personnes ! Profitez de votre sens accru des responsabilités, tandis que vous et vos amis vous unissez pour vaincre vos adversaires !", - "largeGroupNote": "Remarque : cette guilde est désormais trop grande pour soutenir les notifications ! Assurez-vous de revenir tous les jours pour consulter les nouveaux messages.", "groupIdRequired": "\"groupId\" doit être un UUID valide", "groupNotFound": "Groupe introuvable ou vous n'y avez pas accès.", "groupTypesRequired": "Vous devez fournir une requête \"type\" valide.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "L'ID d'utilisateur est manquante dans l'invitation.", "inviteMustNotBeEmpty": "L'invitation ne doit pas être vide.", "partyMustbePrivate": "Les équipes doivent être privées", - "userAlreadyInGroup": "Utilisateur déjà dans cette équipe.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Vous ne pouvez vous inviter vous-même dans un groupe.", - "userAlreadyInvitedToGroup": "Utilisateur déjà invité à joindre cette équipe.", - "userAlreadyPendingInvitation": "Utilisateur déjà en cours d'invitation.", - "userAlreadyInAParty": "Utilisateur déjà dans une équipe.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Utilisateur avec l'ID \"<%= userId %>\" non trouvé.", "userHasNoLocalRegistration": "L'utilisateur n'a pas un enregistrement local (nom d'utilisateur, courriel, mot de passe).", "uuidsMustBeAnArray": "Les ID utilisateurs des invitations doivent être un tableau.", @@ -417,11 +416,13 @@ "managerAdded": "Gestionnaire ajouté avec succès", "managerRemoved": "Gestionnaire retiré avec succès", "leaderChanged": "Le responsable a été changé", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "Qu'est-ce qu'un boss mondial ?", "worldBossDesc": "Un boss mondial est un événement spécial qui rassemble la communauté Habitica autour d'un combat commun, face à un puissant monstre que l'on peut battre grâce à ses tâches ! Tous les utilisateurs d'Habitica sont récompensés lors de la victoire, y compris ceux qui se reposaient à l'Auberge ou qui n'ont pas utilisé Habitica de toute la durée de la quête.", "worldBossLink": "Découvrez-en plus sur les anciens boss mondiaux d'Habitica sur le wiki.", "worldBossBullet1": "Accomplissez vos tâches pour affaiblir le boss mondial", "worldBossBullet2": "Le boss mondial ne vous infligera pas de dégâts en cas de tâches inachevées, mais sa barre de rage se remplira. Quand cette barre est pleine, le boss attaque un des marchands d'Habitica !", "worldBossBullet3": "Vous pouvez poursuivre des quêtes de boss standards, les dommages seront infligés aux deux.", - "worldBossBullet4": "Consultez régulièrement la taverne pour voir les niveaux de santé et de rage du boss mondial." + "worldBossBullet4": "Consultez régulièrement la taverne pour voir les niveaux de santé et de rage du boss mondial.", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/fr/inventory.json b/website/common/locales/fr/inventory.json index 5a946e1376..6cd6ede753 100644 --- a/website/common/locales/fr/inventory.json +++ b/website/common/locales/fr/inventory.json @@ -1,8 +1,8 @@ { - "noItemsAvailableForType": "Vous n'avez pas de <%= type %>.", - "foodItemType": "nourriture", - "eggsItemType": "œufs", - "hatchingPotionsItemType": "potions d'éclosion", - "specialItemType": "objets spéciaux", - "lockedItem": "objets verrouillés" + "noItemsAvailableForType": "Vous n'avez pas <%= type %>.", + "foodItemType": "de nourriture", + "eggsItemType": "d'œufs", + "hatchingPotionsItemType": "de potions d'éclosion", + "specialItemType": "d'objets spéciaux", + "lockedItem": "d'objets verrouillés" } diff --git a/website/common/locales/fr/limited.json b/website/common/locales/fr/limited.json index 747c53cf30..5545427da3 100644 --- a/website/common/locales/fr/limited.json +++ b/website/common/locales/fr/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Joyeux festival d'automne ! Voulez-vous acheter quelques objets rares ? Ils ne seront disponibles que jusqu'au 31 octobre !", "seasonalShopWinterText": "Joyeuse fantaisie hivernale ! Voulez-vous acheter quelques objets rares ? Ils ne seront disponibles que jusqu'au 31 janvier !", "seasonalShopFallTextBroken": "Oh... Bienvenue à la boutique saisonnière... Nous avons actuellement reçu les nouveautés Édition Saisonnière d'automne, ou quelque chose du genre... Tout l'équipement est disponible à l'achat pendant le Festival d'Automne chaque année, mais nous ne sommes ouverts que jusqu'au 31 octobre... alors je suppose que vous devriez faire le stock dès maintenant, ou vous devrez attendre... et attendre... et attendre... *soupir*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Si vous avez acheté de l'équipement par le passé mais ne le possédez plus, vous pouvez le racheter dans la colonne des Récompenses. Initialement, vous ne pourrez acheter que les objets de votre classe actuelle (Guerrier par défaut), mais ne craignez rien, les autres objets spécifiques à une classe deviendront disponibles si vous changez pour cette classe.", "candycaneSet": "Sucre d'orge (Mage)", "skiSet": "Ski-sassin (Voleur)", diff --git a/website/common/locales/fr/messages.json b/website/common/locales/fr/messages.json index 8c817b75ba..8e5c4a1760 100644 --- a/website/common/locales/fr/messages.json +++ b/website/common/locales/fr/messages.json @@ -9,19 +9,19 @@ "messageCannotFeedPet": "Vous ne pouvez pas nourrir ce familier.", "messageAlreadyMount": "Vous avez déjà cette monture. Essayez de nourrir un autre familier.", "messageEvolve": "Votre <%= egg %> a grandi, baladez-vous dessus !", - "messageLikesFood": "Votre <%= egg %> apprécie vraiment votre <%= foodText %> !", - "messageDontEnjoyFood": "Votre <%= egg %> essaye votre <%= foodText %>, mais n'a pas l'air d'aimer ça.", + "messageLikesFood": "Votre <%= egg %> apprécie vraiment <%= foodText %> !", + "messageDontEnjoyFood": "Votre <%= egg %> goûte votre <%= foodText %>, mais n'a pas l'air d'aimer ça.", "messageBought": "Vous avez acheté : <%= itemText %>.", "messageEquipped": "Vous portez : <%= itemText %>.", "messageUnEquipped": "Vous enlevez : <%= itemText %>.", - "messageMissingEggPotion": "Il vous manque au choix cet œuf ou cette potion.", + "messageMissingEggPotion": "Il vous manque cet œuf ou cette potion.", "messageInvalidEggPotionCombo": "Vous ne pouvez pas faire éclore un œuf de quête avec des potions d'éclosion magiques. Essayez avec un œuf différent.", "messageAlreadyPet": "Vous avez déjà ce familier. Essayez de faire éclore une combinaison différente !", "messageHatched": "Votre œuf a éclos ! Allez voir à l’écurie pour équiper votre familier.", "messageNotEnoughGold": "Pas assez d'Or", "messageTwoHandedEquip": "Manier ceci demande deux mains : <%= twoHandedText %>. Vous ne portez donc plus ceci : <%= offHandedText %>.", "messageTwoHandedUnequip": "Manier ceci demande deux mains : <%= twoHandedText %>. Vous ne le portez donc plus car vous vous avez saisi ceci : <%= offHandedText %>.", - "messageDropFood": "Vous avez trouvé une <%= dropText %> !", + "messageDropFood": "Vous avez trouvé <%= dropText %> !", "messageDropEgg": "Vous avez trouvé un œuf de <%= dropText %> !", "messageDropPotion": "Vous avez trouvé une potion d'éclosion <%= dropText %> !", "messageDropQuest": "Vous avez trouvé une quête !", @@ -33,7 +33,7 @@ "messageHealthAlreadyMax": "Votre santé est déjà à son maximum.", "messageHealthAlreadyMin": "Ho non ! Votre santé est déjà tombée au plus bas et il est trop tard pour acheter une potion de santé ! Mais pas de panique... vous pouvez revivre !", "armoireEquipment": "<%= image %> Vous avez trouvé une pièce d'équipement rare dans l'armoire : <%= dropText %> ! Génial !", - "armoireFood": "<%= image %> Vous farfouillez dans l'Armoire et trouvez une <%= dropText %>. Qu'est-ce que ça fait là ?", + "armoireFood": "<%= image %> Vous farfouillez dans l'armoire et trouvez une <%= dropText %>. Qu'est-ce que ça fait là ?", "armoireExp": "Vous luttez contre l'armoire et gagnez de l'expérience. Prends ça !", "messageInsufficientGems": "Pas assez de gemmes!", "messageAuthPasswordMustMatch": ":password et :confirmPassword ne correspondent pas", diff --git a/website/common/locales/fr/questscontent.json b/website/common/locales/fr/questscontent.json index 5d8d6908a4..b5ac20545c 100644 --- a/website/common/locales/fr/questscontent.json +++ b/website/common/locales/fr/questscontent.json @@ -564,15 +564,18 @@ "questBadgerBoss": "Le Blaireau", "questBadgerDropBadgerEgg": "Blaireau (Œuf)", "questBadgerUnlockText": "Débloque l'achat d’œufs de blaireau au marché", - "questDysheartenerText": "Le Décœurageant", - "questDysheartenerNotes": "The sun is rising on Valentine’s Day when a shocking crash splinters the air. A blaze of sickly pink light lances through all the buildings, and bricks crumble as a deep crack rips through Habit City’s main street. An unearthly shrieking rises through the air, shattering windows as a hulking form slithers forth from the gaping earth.

Mandibles snap and a carapace glitters; legs upon legs unfurl in the air. The crowd begins to scream as the insectoid creature rears up, revealing itself to be none other than that cruelest of creatures: the fearsome Dysheartener itself. It howls in anticipation and lunges forward, hungering to gnaw on the hopes of hard-working Habiticans. With each rasping scrape of its spiny forelegs, you feel a vise of despair tightening in your chest.

“Take heart, everyone!” Lemoness shouts. “It probably thinks that we’re easy targets because so many of us have daunting New Year’s Resolutions, but it’s about to discover that Habiticans know how to stick to their goals!”

AnnDeLune raises her staff. “Let’s tackle our tasks and take this monster down!”", + "questDysheartenerText": "La Décœurageante", + "questDysheartenerNotes": "Le soleil se lève sur la Saint-Valentin, quand un fracas épouvantable déchire l'air. Un flamboiement de lumière d'un rose écœurant perfore les bâtiments, et les briques se désagrègent alors qu'une crevasse profonde se propage dans la grande rue d'Habitiville. Un cri fantasmagorique et strident s'élève dans les airs et les vitres volent en éclats, tandis qu'une silhouette massive émerge du sol éventré.

Des mandibules claquent et une carapace étincelle ; des pattes se déploient l'une après l'autre dans l'air. La foule commence à hurler alors que l'insectoïde se cabre, prouvant à tous qu'il n'est autre que la plus cruelle des créatures : la terrible Décœurageante elle-même. Elle hurle d'excitation et se jette en avant, affamée à l'idée de croquer les rêves d'Habiticiens travailleurs. Chaque grincement de ses pattes épineuses griffant le sol resserre un étau de désespoir sur votre poitrine.

« Haut les cœurs ! », s'écrie Lemoness. « Elle voit sans doute en nous des cibles faciles quand tant d'entre nous sont paralysés face à leurs résolutions du Nouvel an, mais elle va bientôt découvrir que les Habiticiens savent rester fidèles à leurs objectifs ! »

AnnDeLune brandit son bâton. « Affrontons nos tâches et abattons ce monstre ! »", "questDysheartenerCompletion": "The Dysheartener is DEFEATED!

Together, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”

Glowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.

The crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.

Our newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.

Beffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”

Crooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Coup de cœur fracassant", - "questDysheartenerBossRageDescription": "La barre de rage se remplit quand les Habiticiens et les Habiticiennes n'accomplissent pas leurs quotidiennes. Si elle se remplit complètement, le Décœurageant lancera son coup de cœur fracassant sur l'un des marchands d'Habitica, alors assurez-vous d'accomplir vos tâches !", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", - "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", - "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", + "questDysheartenerBossRageDescription": "La barre de rage se remplit quand les Habiticiens et les Habiticiennes n'accomplissent pas leurs quotidiennes. Si cette barre se remplit complètement, la Décœurageante lancera son coup de cœur fracassant sur l'un des marchands d'Habitica, alors assurez-vous d'accomplir vos tâches !", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", + "questDysheartenerBossRageMarket": "`La Décœurageante lance COUP DE CŒUR FRACASSANT`\n\nÀ l'aide ! Après s'être régalée de nos tâches abandonnées, la Décœurageante balance un nouveau Coup de cœur fracassant, explosant les murs et le sol du marché ! Tandis qu'il pleut des pierres et des briques, Alex le marchand pleure ses marchandises détruites, éprouvé par la destruction.\n\nOn ne peut pas laisser une chose pareille se reproduire ! Faites attention à bien accomplir toutes vos tâches pour empêcher la Décœurageante de lancer sa dernière attaque.", + "questDysheartenerBossRageQuests": "`La Décœurageante lance COUP DE CŒUR FRACASSANT`\n\nHaaa ! Nous avons une nouvelle fois abandonné nos tâches, et la Décœurageante a rassemblé l'énergie suffisante à une dernière attaque contre nos tenanciers préférés. Tous les champs environnant Ian le maître des quêtes sont dévastés par ce Coup de cœur fracassant, et Ian est profondément atteint par cette vision d'horreur. Nous sommes si proches de la victoire face à cette créature... Allons ! Ne nous relâchons pas !", "questDysheartenerDropHippogriffPet": "Hippogriffe optimiste (Familier)", "questDysheartenerDropHippogriffMount": "Hippogriffe optimiste (Monture)", "dysheartenerArtCredit": "Illustration par @AnnDeLune" diff --git a/website/common/locales/fr/subscriber.json b/website/common/locales/fr/subscriber.json index 69091f9a6f..0e03604c3a 100644 --- a/website/common/locales/fr/subscriber.json +++ b/website/common/locales/fr/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Ensemble du Chevaucheur de tapis", "mysterySet201712": "Ensemble du bougiemancien", "mysterySet201801": "Ensemble de la fée de givre", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Ensemble steampunk de base", "mysterySet301405": "Ensemble d'accessoires steampunks", "mysterySet301703": "Ensemble du paon steampunk", diff --git a/website/common/locales/he/character.json b/website/common/locales/he/character.json index 2bc67fff85..cc05611d36 100644 --- a/website/common/locales/he/character.json +++ b/website/common/locales/he/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "תוסף מקצוע", "battleGear": "ציוד לחימה", + "gear": "Gear", "battleGearText": "זהו הציוד שאתה נושא עמך אל הקרב! הציוד משפיע על ערכי התכונות שלך כשאתה מבצע משימות.", "autoEquipBattleGear": "הצטייד בציוד חדש אוטומטית", "costume": "תחפושת", diff --git a/website/common/locales/he/faq.json b/website/common/locales/he/faq.json index f9ed8573f4..d1a92b4fb9 100644 --- a/website/common/locales/he/faq.json +++ b/website/common/locales/he/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "איך אנחנו יכולים לשחק בהאביטיקה עם חברים שלנו?", "iosFaqAnswer5": "הדרך הטובה ביותר היא להזמין אותם לחבורה יחד איתכם! חבורות יכולות לצאת להרפתקאות, להילחם במפלצות, ולהשתמש במיומנויות כדי לתמיכה הדדית. עברו לתפריט > חבורה ולחצו על \"צרו חבורה חדשה\" אם אין לכם כבר חבורה. לאחר מכן הקישו על רשימת החברים, והקישו ״הזמן״ בפינה הימנית עליונה כדי להזמין את החברים שלכם על ידי הזנת זיהוי המשתמש שלהם (מחרוזת של מספרים ואותיות שהם יכולים למצוא תחת הגדרות > פרטי חשבון על האפליקציה, והגדרות > API באתר האינטרנט). באתר האינטרנט, אתם גם יכולים להזמין חברים באמצעות דואר אלקטרוני, אשר נוסיף לאפליקציה בעדכון עתידי.\n\nבאתר, אתם וחבריכם יכולים גם להצטרף לגילדות, שהן חדרי צ'אט ציבוריים. גילדות יתווספו לאפליקציה בעדכון עתידי!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "איך אני משיג חיית מחמד או חיית רכיבה?", "iosFaqAnswer6": "בדרגה 3, תפתחו את מערכת הנפילות. בכל פעם שאתם משלימים משימה, יהיה לכם סיכוי אקראי לקבל ביצה, שיקוי בקיעה, או פיסת מזון. הם יאוחסנו תחת תפריט > מלאי ציוד.\n\nכדי להבקיע חיות מחמד, תצטרכו ביצה ושיקוי בקיעה. הקישו על הביצה כדי לקבוע את סוג החיה שאתם רוצים להבקיע. לאחר מכן בחרו את שיקוי הבקיעה כדי לקבוע את צבעה! עברו אל תפריט > חיות מחמד כדי לצייד את הדמות שלכם עם חיית המחמד החדשה על ידי לחיצה עליה.\n\nאתם גם יכולים לגדל חיות מחמד לחיות רכיבה על ידי האכלה שלהן תחת תפריט > חיות מחמד. הקישו על אוכל שאיתו תרצו להאכיל, ולאחר מכן בחרו את החיה שאותה תרצו להאכיל! תצטרכו להאכיל חיית מחמד פעמים רבות לפני שהיא תהפוך להיות חיית רכיבה, אבל אם אתם יכולים להבין את האוכל האהוב עליה, היא תגדל מהר יותר. השתמשו בניסוי וטעייה, או [ראו ספוילרים כאן] (http://habitica.wikia.com/wiki/Food#Food_Preferences). ברגע שיש לכם חיית רכיבה, עברו אל תפריט > חיות רכיבה והקישו על חיה כדי לצייד את הדמות שלכם.\n\nאתם גם יכולים לקבל ביצים לחיות מחמד מהרפתקאות על ידי השלמת הרפתקאות מסוימות. (ראה למטה כדי ללמוד עוד על הרפתקאות.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/he/gear.json b/website/common/locales/he/gear.json index f555eec3ed..63089931d5 100644 --- a/website/common/locales/he/gear.json +++ b/website/common/locales/he/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "חליפת סטימפאנק", "armorMystery301404Notes": "נאה ונמרץ, אה! לא מקנה ייתרון. פברואר 3015, חפץ מנויים.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "כובע ראש מפואר", "headMystery301404Notes": "כובע ראש מפואר למכובד שבג׳נטלמנים! ינואר 3015, חפץ מנויים. לא מקנה ייתרון.", "headMystery301405Text": "כובע ראש בסיסי", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "מגן שעון", "shieldMystery301405Notes": "הזמן הוא לצידך עם מגן השעון המתנשא! לא מקנה ייתרון. יוני 3015, חפץ מנויים.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/he/generic.json b/website/common/locales/he/generic.json index 16a423408a..21b9f3f371 100644 --- a/website/common/locales/he/generic.json +++ b/website/common/locales/he/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/he/groups.json b/website/common/locales/he/groups.json index 6ad047f862..7d6b7585f1 100644 --- a/website/common/locales/he/groups.json +++ b/website/common/locales/he/groups.json @@ -202,7 +202,6 @@ "partyOnName": "מסיבה", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "הערה: הגילדה הזו כעת גדולה מדי בשביל לתמוך בהתראות. הקפידו לבקר מדי יום כדי לראות הודעות חדשות.", "groupIdRequired": "\"groupId\" חייב להיות UUID - זהות משתמש ייחודי - תקף", "groupNotFound": "קבוצה לא נמצאה או שאין לכם גישה.", "groupTypesRequired": "חובה לספק שורת שאילתא \"type\" תקפה.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "חבורות חייבות להיות חסויות", - "userAlreadyInGroup": "המשתמש/ת כבר חלק מהקבוצה הזו.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "אתם לא יכולים להזמין את עצמכם לקבוצה.", - "userAlreadyInvitedToGroup": "המשתמש/ת כבר הוזמנ/ה לקבוצה הזו.", - "userAlreadyPendingInvitation": "למשתמש/ת כבר נשלחה הזמנה שמחכה לאישור.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "משתמש/ת עם מספר זהות \"<%= userId %>\" לא נמצא/ה.", "userHasNoLocalRegistration": "למשתמש/ת אין רישום מקומי (שם משתמש, אימייל, סיסמה).", "uuidsMustBeAnArray": "הזמנות של מספר זהות משתמש/ת חייבות להיות מערך.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/he/limited.json b/website/common/locales/he/limited.json index 8f4e34ad71..178c585602 100644 --- a/website/common/locales/he/limited.json +++ b/website/common/locales/he/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "אה.... ברוכים הבאים לחנות העונתית... אנחנו אוגרים מהדורה עונתית סתווית של טובין, או משהו... כל מה שפה יהיה מוצע למכירה במהלך אירוע פסטיבל השלכת בכל שנה, אבל אנחנו פתוחים רק עד ה 31 באוקטובר... אני מתאר לעצמי שכדאי שתאגרו עכשיו, או שתאלצו להמתין... ולהמתין... ולהמתין... *הםםם*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "סוכרייה על מקל הליכה (מכשף)", "skiSet": "מתנקש-סקי (נוכל)", diff --git a/website/common/locales/he/questscontent.json b/website/common/locales/he/questscontent.json index 085d8c3e5b..ba814ab567 100644 --- a/website/common/locales/he/questscontent.json +++ b/website/common/locales/he/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/he/subscriber.json b/website/common/locales/he/subscriber.json index 2ca6b62ca5..ecd5e6aa21 100644 --- a/website/common/locales/he/subscriber.json +++ b/website/common/locales/he/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "סט סטימפאנק רגיל", "mysterySet301405": "סט סטימפאנק אקססוריז", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/hu/character.json b/website/common/locales/hu/character.json index 2172d690ca..f07f9fea22 100644 --- a/website/common/locales/hu/character.json +++ b/website/common/locales/hu/character.json @@ -64,6 +64,7 @@ "classBonusText": "A kasztod (harcos, ha még nem oldottál fel, vagy választottál ki másik kasztot) a saját kasztjához tartozó felszereléseket hatékonyabban használja, mint más kasztokhot tartozó felszereléseket. Ha a jelenlegi kasztodnak megfelelő felszerelést használsz, akkor az általa biztosított tulajdonság bónuszok 50%-kal nőnek.", "classEquipBonus": "Kaszt bónusz", "battleGear": "Harci felszerelés", + "gear": "Gear", "battleGearText": "Ez az a felszerelés, amit a csatákban viselsz; hatással van az értékekre, amikor a feladataidat teljesíted.", "autoEquipBattleGear": "Új felszerelés automatikus hordása", "costume": "Jelmez", diff --git a/website/common/locales/hu/communityguidelines.json b/website/common/locales/hu/communityguidelines.json index cc668d235a..f7ea563ba0 100644 --- a/website/common/locales/hu/communityguidelines.json +++ b/website/common/locales/hu/communityguidelines.json @@ -3,40 +3,40 @@ "tavernCommunityGuidelinesPlaceholder": "Baráti emlékeztető: ez itt egy korhatármentes csevegőszoba, ezért arra kérünk, hogy ennek megfelelő tartalmat és nyelvezetet használj! Lásd a Közösségi irányelveket az oldalsávon, ha ezzel kapcsolatban kérdésed van.", "commGuideHeadingWelcome": "Üdvözlünk Habiticában!", "commGuidePara001": "Isten hozott, kalandor! Üdvözlünk Habiticában, a produktivitás, egészséges élet és a néhanapján tomboló griffmadár földjén. Ez egy vidám közösség telis-tele segítőkész emberekkel, akik támogatják egymást az önfejlesztés útján.", - "commGuidePara002": "Létrehoztunk néhány szabályt arra, hogy a közösségünkben mindenki biztonságban, boldog és hatékony lehessen. Kiemelt figyelemmel hoztuk ezeket létre, hogy a lehető legbarátságosabb és olvashatóbb legyen. Kérjük szánj rá időt és olvasd el.", + "commGuidePara002": "Létrehoztunk néhány szabályt arra, hogy a közösségünkben mindenki biztonságban, boldog és hatékony lehessen. Kiemelt figyelemmel hoztuk ezeket létre, hogy a lehető legbarátságosabb és könnyen megérthető legyen. Kérjük szánj rá időt és olvasd el.", "commGuidePara003": "Ezek a szabályok minden olyan közösségi oldalra vonatkoznak, amiket használunk, beleértve (nem feltétlenül ezekre korlátozva) Trello, GitHub, Transifex, és a Wikia (ismertebb nevén wiki). Néha, előre nem látható események történhetnek, mint például egy újabb konfliktus vagy egy gonosz nekromanta. Amennyiben ez megtörténik, akkor a moderátorok módosíthatják a szabályokat, hogy a közösséget biztonságban tartsák az újabb fenyegetésektől. Ne aggódj: amennyiben a szabályok változnak, Bailey egy közleményben értesíteni fog.", "commGuidePara004": "Készíts elő a pennát és papiruszt, és kezdhetjük is!", "commGuideHeadingBeing": "Habitica lakójának lenni", "commGuidePara005": "Habitica elsősorban egy önfejlesztésnek szentelt weboldal. Ennek eredményeképpen, volt szerencsénk összehozni az egyik legszívélyesebb, legkedvesebb, legudvariasabb és legsegítőkészebb közösséget az interneten. Habitica lakóit sok jó tulajdonság jellemzi. Néhány a leggyakoribbak és leginkább figyelemre méltóak a közül:", "commGuideList01A": "Jótét lélek. Sok felhasználó szánja az idejét olyanokra, akik nemrég csatlakoztak a közösséghez. \"Habitica Help\" céhet pontosan arra a célra alapították, hogy válaszoljon minden felmerülő kérdésre. Ha úgy érzed, hogy tudsz másoknak segíteni, ne habozz!", "commGuideList01B": "Szorgalmas hozzáállás. Habitica lakói keményen dolgoznak hogy javítsák az életüket, de ezen felül folyamatosan segítenek építeni és fejleszteni az oldalt. Ez egy nyílt forrású projekt, ezért mindannyian azon dolgozunk, hogy ezt az oldalt a lehető legjobb hellyé tegyük.", - "commGuideList01C": "Támogató Viselkedés. Habitica lakói örülnek egymás győzelmének és segítik egymást a nehezebb időkben. Erőt adunk a másiknak, egymásra támaszkodunk és egymástól tanulunk. A csoportokban ezt tesszük a varázslatainkkal; a társalgó szobákban pedig a kedves és támogató szavainkkal.", - "commGuideList01D": "Tisztelettudás. Mindannyian másmilyen hátérrel és különböző tudással rendelkezünk, valamint sok dologban más a véleményünk. Ez része a közösségünknek, és ez ami olyan csodálatossá teszi! A Habitica lakói tisztelik és ünneplik ezeket a különbségeket. Lógj velünk, és hamarosan az élet minden területéről barátokat fogsz szerezni.", - "commGuideHeadingMeet": "Ismerd meg a stábtagjainkat és a moderátorainkat!", - "commGuidePara006": "Van néhány fáradhatatlan lovag a Habiticán, akik egyesítik erejüket a stábtagokkal, hogy a közösség nyugodt, elégedett és trollmentes legyen. Mindegyiküknek megvan a saját hatóköre, de néha megjelenthetnek másik közösségi téren is. A Stáb és a Modok többnyire ezeket a hivatalos bejelentéseket a következő szavakkal vezetik be: „Mod Talk” vagy „Mod Hat On”; magyarul: „Moderátori beszéd\" vagy „Moderátori sapka fel”.", - "commGuidePara007": "A Stáb címkéje lila, koronával. A rangjuk \"Hősies\".", - "commGuidePara008": "A moderátorok címkéje sötétkék, csillagokkal. A rangjuk \"Őrző\". Az egyedüli kivetél Bailey, aki egy NJK, címkéje fekete-zöld csillaggal megjelölve.", + "commGuideList01C": "Támogató viselkedés. Habitica lakói örülnek egymás győzelmének és segítik egymást a nehezebb időkben. Erőt adunk a másiknak, egymásra támaszkodunk és egymástól tanulunk. A csapatokban ezt tesszük a varázslatainkkal; a társalgó szobákban pedig a kedves és támogató szavainkkal.", + "commGuideList01D": "Tisztelettudás. Mindannyian másmilyen hátérrel és különböző tudással rendelkezünk, valamint sok dologban más a véleményünk. Ez része a közösségünknek, és ez az ami olyan csodálatossá teszi! A Habitica lakói tisztelik és ünneplik ezeket a különbségeket. Lógj velünk, és hamarosan az élet minden területéről barátokat fogsz szerezni.", + "commGuideHeadingMeet": "Ismerd meg a munkatársainkat és a moderátorainkat!", + "commGuidePara006": "Van néhány fáradhatatlan lovag a Habiticán, akik egyesítik erejüket munkatársainkkal, hogy a közösség nyugodt, elégedett és trollmentes legyen. Mindegyiküknek megvan a saját hatóköre, de néha megjelenthetnek másik közösségi téren is. A Stáb és a Modok többnyire ezeket a hivatalos bejelentéseket a következő szavakkal vezetik be: „Mod Talk” vagy „Mod Hat On”.", + "commGuidePara007": "A munkatársaink neve lila, koronával ellátva. A rangjuk \"Hősies\".", + "commGuidePara008": "A moderátorok címkéje sötétkék, csillagokkal ellátva. A rangjuk \"Őrző\". Az egyedüli kivetél Bailey, aki egy NJK, címkéje fekete-zöld, csillaggal ellátva.", "commGuidePara009": "A jelenlegi Stáb Tagok (balról jobbra):", "commGuideAKA": "<%= habitName %> azaz <%= realName %>", - "commGuideOnTrello": "<%=trelloName %> a Trellón", - "commGuideOnGitHub": "<%=gitHubName %> a GitHubon", - "commGuidePara010": "Egy-két moderátor segíti a Stáb Tagjait. Őket gondosan választottuk ki, ezért adjátok meg nekik a megfelelő tiszteletet és hallgassatok a tanácsaikra.", + "commGuideOnTrello": "<%= trelloName %> a Trello-n", + "commGuideOnGitHub": "<%= gitHubName %> a GitHubon", + "commGuidePara010": "Egy-két moderátor segíti munkatársainkat. Őket gondosan választottuk ki, ezért adjátok meg nekik a megfelelő tiszteletet és hallgassatok a tanácsaikra.", "commGuidePara011": "A jelenlegi Moderátorok (balról jobbra):", "commGuidePara011a": "Fogadó chaten", - "commGuidePara011b": "Githubon/Wikian", - "commGuidePara011c": "Wikian", + "commGuidePara011b": "Githubon/Wikia-n", + "commGuidePara011c": "Wikia-n", "commGuidePara011d": "GitHubon", "commGuidePara012": "Ha bármi megjegyzésed vagy észrevételed van egy bizonyos moderátor munkájával kapcsolatban, küldj üzenetet Lemoness-nek (<%= hrefCommunityManagerEmail %>).", - "commGuidePara013": "Egy ilyen nagy közösségben mint a Habitica, a felhasználok jönnek mennek, és néha a moderátoroknak is le kell tenniük nemes köpenyüket és pihenniük. Ők a Moderators Emeritus-ok, azaz a Nyugalmazott Moderátorok. Nekik mar nincs meg a Moderátori hatalmuk, de tiszteljük őket továbbra is az elvégzett munkájukért!", - "commGuidePara014": "Nyugalmazott Moderátorok:", + "commGuidePara013": "Egy ilyen nagy közösségben mint a Habitica, a felhasználok jönnek mennek, és néha a moderátoroknak is le kell tenniük nemes köpenyüket és pihenniük. Ők a Moderators Emeritus-ok, azaz a Nyugalmazott moderátorok. Nekik már nincs moderátori hatalmuk, de tiszteljük őket továbbra is az elvégzett munkájukért!", + "commGuidePara014": "Nyugalmazott moderátorok:", "commGuideHeadingPublicSpaces": "Nyilvános helyek Habitica-n", - "commGuidePara015": "Habitica két közösségi térrel rendelkezik: egy nyilvános és egy magán közösséggel. A nyilvánosba tartozik a Fogadó, a nyitott céhek, GitHub, Trello és a Wiki. A magánba tartozóak a zárt céhek, csapatbéli beszélgetések, és a privát üzenetek másoknak. Minden nyilvánosan megjelenő karakter névnek meg kell felelnie A nyilvános irányelveknek. A megjelenítendő neved megváltoztatásához használd a Felhasználó > Profil oldalon a \"Szerkeszt\" gombot.", - "commGuidePara016": "Amikor a Habitica nyilvános helyein mozogsz, akkor be kell tartanod néhány egyszerű szabályt, hogy mindenki biztonságban és boldogan érezhesse magát. Ez könnyű kell, hogy legyen olyan kalandoroknak, mint Neked!", - "commGuidePara017": "Tiszteljétek egymást. Légy udvarias, kedves, barátságos és segítőkész. Ne feledd: Habitica lakói mindenfelől érkeztek és nagyon eltérő tapasztalatokkal rendelkeznek. Ez az a plusz, amitől a Habitica annyira menő. Egy közösséget építeni annyit jelent, hogy tiszteljük és ünnepeljük a különbözőségeinket és hasonlóságunkat. Íme néhány egyszerű tanács, hogy tiszteljük egymást:", + "commGuidePara015": "Habitica két közösségi térrel rendelkezik: egy nyilvános és egy magán közösséggel. A nyilvánosba tartozik a Fogadó, a nyitott céhek, GitHub, Trello és a Wiki. A magánba tartozóak a zárt céhek, csapaton belüli beszélgetések, és a privát üzenetek. Minden nyilvános névnek meg kell felelnie a nyilvános helyek irányelveinek. A megjelenítendő neved megváltoztatásához használd a Felhasználói ikon > Profil oldalon a \"Szerkeszt\" gombot.", + "commGuidePara016": "Amikor a Habitica nyilvános helyein mozogsz, akkor be kell tartanod néhány egyszerű szabályt, hogy mindenki biztonságban és boldognak érezhesse magát. Ez könnyű kell hogy legyen olyan kalandoroknak mint te!", + "commGuidePara017": "Tiszteljétek egymást. Légy udvarias, kedves, barátságos és segítőkész. Ne feledd: Habitica lakói mindenfelől érkeztek és nagyon eltérő tapasztalatokkal rendelkeznek. Ez az ami a Habitica-t annyira menővé teszi! Egy közösséget építeni annyit jelent, hogy tiszteljük és ünnepeljük a különbségeinket és hasonlóságainkat. Íme néhány egyszerű tanács arra hogyan tiszteljük egymást:", "commGuideList02A": "Tartsd be az összes Általános Szerződési Feltételt.", "commGuideList02B": "Ne posztolj olyan kepéket vagy szöveget, amik erőszakosak, fenyegetőek, vagy szexuális tartalmúak, vagy bárki vagy bármilyen csoport elleni diszkriminációt, fanatizmust, rasszizmust, szexizmust, gyűlöletet, zaklatást, támadást támogatja. Meg viccként se! Gyalázkodást és a kijelentéseket is beleértve. A humorérzékünk nem egyforma, így neked lehet hogy valami vicces, de ez másnak bántó lehet. A Napi Feladataidat támadd, ne másokat.", "commGuideList02C": "A megfogalmazások bármilyen korú lakónak feleljenek meg. Habitica sok fiatal lakója használja az oldalt. Ne ártsunk az ártatlanoknak, és ne hátráltassunk egy lakost sem a célja elérésében.", - "commGuideList02D": "Kerüld a káromkodást Ide tartoznak a vallási fogadalmak is, amik egyébként máshol elfogadottak - mi mindannyian számos kulturális és vallási háttérből származó emberek vagyunk, és szeretnénk, hogy mindenki jól érezze magát eme közösségben. Ha valaki a stábból azt üzeni neked, hogy ez a kifejezés nem megengedett a Habitica felületén - még ha nem is sértőnek szántad,- az véglegesnek kell tekinteni. Továbbá a gyalázkodások súlyos következményt vonnak maguk után, mivel megszegik a Szolgáltatási Feltételeket.", + "commGuideList02D": "Kerüld a káromkodást Ide tartoznak a vallási kijelentések is, amik máshol elfogadottak - felhasználóink között számos kulturális és vallási háttérből származó emberek van és szeretnénk, hogy mindenki jól érezze magát ebben a közösségben. Ha egy munkatársunk vagy moderátor felhívja a figyelmedet, hogy ez a kifejezés nem megengedett a Habitica felületén, még ha nem is sértőnek szántad, ezt véglegesnek kell tekinteni. Továbbá a gyalázkodások súlyos következményt vonnak maguk után, mivel megszegik a Szolgáltatási feltételeket.", "commGuideList02E": "Avoid extended discussions of divisive topics outside of the Back Corner. If you feel that someone has said something rude or hurtful, do not engage them. A single, polite comment, such as \"That joke makes me feel uncomfortable,\" is fine, but being harsh or unkind in response to harsh or unkind comments heightens tensions and makes Habitica a more negative space. Kindness and politeness helps others understand where you are coming from.", "commGuideList02F": "Comply immediately with any Mod request to cease a discussion or move it to the Back Corner. Last words, parting shots and conclusive zingers should all be delivered (courteously) at your \"table\" in the Back Corner, if allowed.", "commGuideList02G": "Adj magadnak időt gondolkodni, mint sem haragból válaszolni ha valaki azt mondja neked, rosszul esett neki, amit mondtál neki vagy tettel vele. Nagy bátorság és erő kell ahhoz, hogy őszintén tudjunk bocsánatot kerni valakitől. Ha úgy érzed, hogy nem a megfelelő módon válaszoltak neked, akkor vedd fel a kapcsolatot egy moderátorral, ahelyett hogy a nyilvánosság előtt szidjatok egymást.", diff --git a/website/common/locales/hu/faq.json b/website/common/locales/hu/faq.json index e87314b8da..75b29bd404 100644 --- a/website/common/locales/hu/faq.json +++ b/website/common/locales/hu/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Hogyan tudom a Habiticát a barátaimmal játszani?", "iosFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to Menu > Party and click \"Create New Party\" if you don't already have a Party. Then tap on the Members list, and tap Invite in the upper right-hand corner to invite your friends by entering their User ID (a string of numbers and letters that they can find under Settings > Account Details on the app, and Settings > API on the website). On the website, you can also invite friends via email, which we will add to the app in a future update.\n\nOn the website, you and your friends can also join Guilds, which are public chat rooms. Guilds will be added to the app in a future update!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Hogyan szerezhetek háziállatot, vagy hátast?", "iosFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch Egg.\" Then choose a hatching potion to determine its color! Go to Menu > Pets to equip your new Pet to your avatar by clicking on it. \n\n You can also grow your Pets into Mounts by feeding them under Menu > Pets. Tap on a Pet, and then select \"Feed Pet\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once you have a Mount, go to Menu > Mounts and tap on it to equip it to your avatar.\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/hu/gear.json b/website/common/locales/hu/gear.json index 0481d1a541..1c7a8a2b1c 100644 --- a/website/common/locales/hu/gear.json +++ b/website/common/locales/hu/gear.json @@ -185,7 +185,7 @@ "weaponSpecialWinter2016MageText": "Varázslatos snowboard", "weaponSpecialWinter2016MageNotes": "A mozdulataid annyira királyak hogy nem lehet más csak varázslat! Növeli az intelligenciádat <%= int %> ponttal és az észlelésedet <%= per %> ponttal. Limitált kiadású 2015-2016-os téli felszerelés.", "weaponSpecialWinter2016HealerText": "Konfetti ágyú", - "weaponSpecialWinter2016HealerNotes": "JUHÚÚÚÚÚÚÚÚÚÚÚÚ!!!!!!! BOLDOG KARÁCSONYT MINDENKINEK!!!!!!!! Növeli az intelligenciádat <%= int %> ponttal. Limitált kiadású 2015-2016-os téli felszerelés.", + "weaponSpecialWinter2016HealerNotes": "JUHÚÚÚÚÚÚÚÚÚÚÚÚ!!!!!!! BOLDOG TÉLI CSODAORSZÁGOT!!!!!!!! Növeli az intelligenciádat <%= int %> ponttal. Limitált kiadású 2015-2016-os téli felszerelés.", "weaponSpecialSpring2016RogueText": "Tüzes bola", "weaponSpecialSpring2016RogueNotes": "Elsajátítottad a labdát, a bunkót és a kést. A következő lépés a tüzes zsonglőrködés! Juhú! Növeli az erődet <%= str %> ponttal. Limitált kiadású 2016-os tavaszi felszerelés.", "weaponSpecialSpring2016WarriorText": "Sajtkalapács", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "Ez a kényelmes szett melegen tart miközben az égen repkedsz! Nem változtat a tulajdonságaidon. 2017 novemberi előfizetői tárgy.", "armorMystery201712Text": "Gyertyaidéző páncél", "armorMystery201712Notes": "A meleg és a fény amit ez a mágikus páncél sugároz ki magából felmelegíti a szívedet, de sosem égeti meg a bőrödet! Nem változtat a tulajdonságaidon. 2017 decemberi előfizetői tárgy.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk öltözet", "armorMystery301404Notes": "Jól vasalt és lenyűgöző, ugye! Nem változtat a tulajdonságaidon. 3015 februári előfizetői tárgy.", "armorMystery301703Text": "Steampunk páva köntös", @@ -984,6 +986,8 @@ "headMystery201710Notes": "Ettől a sisaktól félelmetesnek látszol... de a távolságészlelésben nem sokat segít! Nem változtat a tulajdonságaidon. 2017 októberi előfizetői tárgy.", "headMystery201712Text": "Gyertyaidéző korona", "headMystery201712Notes": "Ez a korona fényt és melegéséget sugároz, még a legsötétebb téli éjszakákon is. Nem változtat a tulajdonságaidon. 2017 decemberi előfizetői tárgy.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Elegáns cilinder", "headMystery301404Notes": "Egy elegáns cilinder a legelőkelőbb úriembereknek! Nem változtat a tulajdonságaidon. 3015 januári előfizetői tárgy. ", "headMystery301405Text": "Egyszerű cilinder", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Ez a lávából készült robusztus pajzs megvéd a rossz szokásoktól, de nem égeti meg a kezedet. Nem változtat a tulajdonságaidon. 2017 augustusi előfizetői tárgy.", "shieldMystery201709Text": "Varázsló kézikönyv", "shieldMystery201709Notes": "Ez a könyv segítséget nyújt a varázslás elkezdéséhez. Nem változtat a tulajdonságaidon. 2017 szeptemberi előfizetői tárgy.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Óra pajzs", "shieldMystery301405Notes": "Az idő veled van, ha ezt a tornyosuló óra pajzsot viseled! Nem változtat a tulajdonságaidon. 3015 júniusi előfizetői tárgy.", "shieldMystery301704Text": "Rebbenő legyező", diff --git a/website/common/locales/hu/generic.json b/website/common/locales/hu/generic.json index d9e6e66546..e24a849e63 100644 --- a/website/common/locales/hu/generic.json +++ b/website/common/locales/hu/generic.json @@ -105,7 +105,7 @@ "habiticaDaySingularText": "Részt vettél a Habitica névnapján! Köszönjük, hogy ilyen fantasztikus felhasználó vagy.", "habiticaDayPluralText": "Részt vettél a <%= count %> Habitica névnapon! Köszönjük, hogy ilyen fantasztikus felhasználó vagy.", "achievementDilatory": "A halogatók megváltója", - "achievementDilatoryText": "Segített legyőzni a Halogató rémületes sárkányát a 2014 nyári csobbanóbulin!", + "achievementDilatoryText": "Segített legyőzni a Halogató rémületes sárkányát a 2014-es nyári csobbanás alatt!", "costumeContest": "Jelmezverseny résztvevője", "costumeContestText": "Részt vett a Habitoween jelmez versenyen. Nézz meg még több szuper jelentkezőt a blog.habitrpg.com oldalon!", "costumeContestTextPlural": "Részt vett <%= count %> Habitoween jelmez versenyen. Nézz meg még több szuper jelentkezőt a blog.habitrpg.com oldalon!", @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu témája", "audioTheme_beatscribeNesTheme": "Beatscribe NES témája", "audioTheme_arashiTheme": "Arashi témája", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol témája", "audioTheme_spacePenguinTheme": "SpacePenguin témája", "audioTheme_maflTheme": "MAFL témája", @@ -165,7 +166,7 @@ "achievementBurnout": "Virágzó mezők megmentője", "achievementBurnoutText": "Segített legyőzni a Kiégést és visszaszerezte a kifárasztott szellemeket a 2015-ös őszi fesztivál alatt!", "achievementBewilder": "Mistiflying megmentője", - "achievementBewilderText": "Segített legyőzni a Zűrzavart a 2016-os tavaszi fesztivál alatt!", + "achievementBewilderText": "Segített legyőzni a Zűrzavart a 2016-os tavaszi mulatozás alatt!", "checkOutProgress": "Fejlődésem megtekintése a Habiticán!", "cards": "Üdvözlőlapok", "sentCardToUser": "Üdvözlőlapot küldtél <%= profileName %> felhasználónak", diff --git a/website/common/locales/hu/groups.json b/website/common/locales/hu/groups.json index 31bc5dabfb..9a3b039faa 100644 --- a/website/common/locales/hu/groups.json +++ b/website/common/locales/hu/groups.json @@ -15,7 +15,7 @@ "askQuestionGuild": "Tegyél fel egy kérdést (Habitica Help céh)", "contributing": "Közreműködés", "faq": "GYIK", - "lfgPosts": "Csoportot kereső bejegyzések (Csapat kell)", + "lfgPosts": "Csapat keresése (Party kereső) posztok", "tutorial": "Ismertető", "glossary": "Szójegyzék", "wiki": "Wiki", @@ -105,16 +105,16 @@ "yesRemove": "Igen, távolítsd el őket", "foreverAlone": "Nem lájkolhatod a saját üzenetedet. Ne legyél ilyen.", "sortDateJoinedAsc": "Legkorábbi csatlakozás dátuma", - "sortDateJoinedDesc": "Latest Date Joined", - "sortLoginAsc": "Earliest Login", - "sortLoginDesc": "Latest Login", - "sortLevelAsc": "Lowest Level", - "sortLevelDesc": "Highest Level", - "sortNameAsc": "Name (A - Z)", - "sortNameDesc": "Name (Z - A)", - "sortTierAsc": "Lowest Tier", - "sortTierDesc": "Highest Tier", - "confirmGuild": "Létre hozol egy céhet 4 drágakőért?", + "sortDateJoinedDesc": "Legkésőbbi csatlakozás dátuma", + "sortLoginAsc": "Legújabb bejelentkezés", + "sortLoginDesc": "Legrégebbi bejelentkezés", + "sortLevelAsc": "Legalacsonyabb játékos szint", + "sortLevelDesc": "Legmagasabb játékos szint", + "sortNameAsc": "Név (A - Z)", + "sortNameDesc": "Név (Z - A)", + "sortTierAsc": "Legalacsonyabb szint", + "sortTierDesc": "Legmagasabb szint", + "confirmGuild": "Létrehozol egy céhet 4 drágakőért?", "leaveGroupCha": "Csoport kihívások elhagyása és...", "confirm": "Megerősítés", "leaveGroup": "Céh elhagyása", @@ -123,11 +123,11 @@ "sendPM": "Küldj egy privát üzenetet", "send": "Küldés", "messageSentAlert": "Üzenet elküldve", - "pmHeading": "Privát üzenet <%= name %> felhasználónak", + "pmHeading": "Privát üzenet küldése <%= name %> felhasználónak", "pmsMarkedRead": "A privát üzeneteid olvasottnak lettek jelölve", "possessiveParty": "<%= name %> csapata", "clearAll": "Összes üzenet törlése", - "confirmDeleteAllMessages": "Biztos hogy ki akarod törölni az üzeneteidet? A többi felhasználó még mindig látni fogja az üzeneteket, amiket küldtél nekik.", + "confirmDeleteAllMessages": "Biztos hogy ki akarod törölni az összes üzenetedet? A többi felhasználó továbbra is látni fogja az üzeneteket, amiket küldtél.", "optOutPopover": "Nem szereted a privát üzeneteket? Kattints, hogy teljesen kiszállj belőle", "block": "Letiltás", "unblock": "Letiltás feloldása", @@ -135,161 +135,160 @@ "inbox": "Bejövő üzenetek", "messageRequired": "Üzenet szükséges.", "toUserIDRequired": "Felhasználói azonosító szükséges", - "gemAmountRequired": "Drágakő szükséges.", + "gemAmountRequired": "Drágakő szükséges", "notAuthorizedToSendMessageToThisUser": "Nem tudsz üzenetet küldeni ennek a játékosnak, mivel letiltották a bejövő üzeneteket.", "privateMessageGiftGemsMessage": "Szia <%= receiverName %>, <%= senderName %> küldött neked <%= gemAmount %> drágakövet!", "privateMessageGiftSubscriptionMessage": "<%= numberOfMonths %> hónap előfizetés!", - "cannotSendGemsToYourself": "Nem tudsz magadnak drégakövet küldeni. Helyette próbáld ki az előfizetés opciót.", + "cannotSendGemsToYourself": "Nem tudsz magadnak drágakövet küldeni. Helyette próbáld ki az előfizetés opciót.", "badAmountOfGemsToSend": "A mennyiségnek 1 és aközött kell lennie amennyi drágakővel rendelkezel.", - "report": "Report", - "abuseFlag": "Jelentsd a Közösségi Irányelvek megsértését", - "abuseFlagModalHeading": "Jelented <%= name %>-t a megsértésért?", - "abuseFlagModalBody": "Are you sure you want to report this post? You should ONLY report a post that violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Inappropriately reporting a post is a violation of the Community Guidelines and may give you an infraction. Appropriate reasons to flag a post include but are not limited to:

", + "report": "Jelentés", + "abuseFlag": "Jelentsd a közösségi irányelvek megsértését", + "abuseFlagModalHeading": "Jelented <%= name %>-t megsértésért?", + "abuseFlagModalBody": "Biztos hogy jelenteni akarod ezt a bejegyzést? CSAK olyat jelents be, ami megsérti a <%= firstLinkStart %>Közösségi irányelveket<%= linkEnd %> és/vagy <%= secondLinkStart %>Felhasználási feltételeket<%= linkEnd %>. Nem helyénvaló jelentés a közösségi irányelvek megszegését jelenti, ami következményekkel járhat. Ez vonatkozik, de nem korlátozott a következőkre:

", "abuseFlagModalButton": "Szabályok megsértésének jelentése", - "abuseReported": "Köszönjük ennek a megsértésnek a jelentését, értesítettük a moderátorokat.", + "abuseReported": "Köszönjük ennek a megsértésnek a jelentését. Értesítettük a moderátorokat.", "abuseAlreadyReported": "Már jelentetted ezt az üzenetet.", - "needsText": "Kérlek, írj egy üzenetet.", + "needsText": "Kérlek, írj be egy üzenetet.", "needsTextPlaceholder": "Ide írd az üzeneted.", "copyMessageAsToDo": "Üzenet másolása tennivalóként", - "copyAsTodo": "Copy as To-Do", + "copyAsTodo": "Másolás tennivalóként", "messageAddedAsToDo": "Üzenet másolva tennivalóként.", - "messageWroteIn": "<%= user %> írt a <%= group %>", - "msgPreviewHeading": "Üzenet Előnézet", + "messageWroteIn": "<%= user %> írt a <%= group %> nevű csoportba", + "msgPreviewHeading": "Üzenet előnézet", "leaderOnlyChallenges": "Csak csapatvezetők hozhatnak létre kihívásokat.", - "sendGift": "Küldj ajándékot", + "sendGift": "Ajándék küldése", "inviteFriends": "Barátok meghívása", - "partyMembersInfo": "Your Party currently has <%= memberCount %> members and <%= invitationCount %> pending invitations. The limit of members in a Party is <%= limitMembers %>. Invitations above this limit cannot be sent.", + "partyMembersInfo": "A csapatodnak jelenleg <%= memberCount %> tagja van és <%= invitationCount %> meghívás van függőben. Egy csapatban maximum <%= limitMembers %> tag lehet. Ennél több meghívó nem küldhető.", "inviteByEmail": "Meghívás e-mail-en keresztül", - "inviteByEmailExplanation": "If a friend joins Habitica via your email, they'll automatically be invited to your Party!", - "inviteMembersHowTo": "Invite people via a valid email or 36-digit User ID. If an email isn't registered yet, we'll invite them to join Habitica.", + "inviteByEmailExplanation": "Ha valaki a te meghívásodon keresztül csatlakozik a Habitica-hoz akkor automatikusan meghívást kap a csapatodhoz.", + "inviteMembersHowTo": "Hívj meg valakit e-mail címen keresztül vagy a 36 számjegyű felhasználó azonosítón keresztül. Ha az email cím még nincs regisztrálva a Habitica-n, akkor egy meghívót küldünk az oldalra.", "inviteFriendsNow": "Barátok meghívása most", "inviteFriendsLater": "Barátok meghívása később", - "inviteAlertInfo": "Ha már vannak barátaid akik a Habitica-t használják, hívd meg őket a ennek Felhasználói azonosító -nak a segítségével.", + "inviteAlertInfo": "Ha már vannak barátaid akik a Habitica-t használják, hívd meg őket a ennek Felhasználói azonosítónak a segítségével.", "inviteExistUser": "Létező felhasználó meghívása", - "byColon": "By:", + "byColon": "Feladó:", "inviteNewUsers": "Új felhasználó meghívása", "sendInvitations": "Meghívások elküldése", "invitationsSent": "Meghívások elküldve!", "invitationSent": "Meghívás elküldve!", - "invitedFriend": "Barát meghívása", - "invitedFriendText": "Ez a felhasználó meghívott egy barátot ( vagy barátokat) aki csatlakozott hozzá a kalandozásban!", - "inviteAlertInfo2": "Vagy oszd meg ezt az üzenetet (másolás/beillesztés):", - "inviteLimitReached": "You have already sent the maximum number of email invitations. We have a limit to prevent spamming, however if you would like more, please contact us at <%= techAssistanceEmail %> and we'll be happy to discuss it!", + "invitedFriend": "Meghívott egy barátot", + "invitedFriendText": "Ez a felhasználó meghívott egy (vagy több) barátot aki csatlakozott hozzá a kalandozásban!", + "inviteAlertInfo2": "Vagy oszd meg ezt a linket (másolás/beillesztés):", + "inviteLimitReached": "Már elküldted a megengedett számú meghívókat. Ez a korlátozás azért van érvényben, hogy elkerüljük a spamozást, de ha szükséged lenne több meghívóra, lépj kapcsolatba velünk a következő e-mail címen keresztül<%= techAssistanceEmail %> és ezt szívesen megbeszéljük!", "sendGiftHeading": "Ajándék küldése <%= name %> felhasználónak", "sendGiftGemsBalance": "<%= number %> drágakő", - "sendGiftCost": "Végösszes: $<%= cost %> USD", + "sendGiftCost": "Végösszeg: $<%= cost %> USD", "sendGiftFromBalance": "Egyenleg", "sendGiftPurchase": "Vásárlás", "sendGiftMessagePlaceholder": "Személyes üzenet (opcionális)", - "sendGiftSubscription": "<%= months %> hónap: $<%= price %> USD", - "gemGiftsAreOptional": "Habitica soha nem fog kötelezni hogy egy másik játékosnak drágakövet küldjél. Aki drágakövekért könyörög az megsérti a Közösségi irányelveket, és ilyen esetben jelenteni szükséges <%= hrefTechAssistanceEmail %>-nek.", - "battleWithFriends": "Küzdj meg szörnyetegekkel a barátaid segítségével", + "sendGiftSubscription": "<%= months %> hónap: $<%= price %> (USD)", + "gemGiftsAreOptional": "A Habitica soha nem fog kötelezni hogy egy másik játékosnak drágakövet küldjél. Aki másoktól drágakövet kéreget az megsérti a Közösségi irányelveket, és ilyen esetben jelenteni szükséges <%= hrefTechAssistanceEmail %> e-mail címen keresztül.", + "battleWithFriends": "Küzdj meg szörnyekkel a barátaid segítségével", "startPartyWithFriends": "Hozz létre egy csapatot a batátaiddal!", "startAParty": "Hozz létre egy csapatot", - "addToParty": "Add someone to your Party", - "likePost": "Kattints ide ha tetszik ez az üzenet!", - "partyExplanation1": "Kalandozz a Habtica-n a barátaiddal, hgy segítsétek egymást!", + "addToParty": "Adj hozzá valakit a csapatodhoz", + "likePost": "Kattints ide ha tetszik ez a bejegyzés!", + "partyExplanation1": "Kalandozz a Habtica-n a barátaiddal, hogy segítsétek egymást!", "partyExplanation2": "Küzdj meg szörnyekkel és hozz létre kihívásokat!", "partyExplanation3": "Hívd meg a barátaidat hogy szerezz egy küldetés tekercset!", - "wantToStartParty": "Do you want to start a Party?", - "exclusiveQuestScroll": "Inviting a friend to your Party will grant you an exclusive Quest Scroll to battle the Basi-List together!", - "nameYourParty": "Name your new Party!", - "partyEmpty": "You're the only one in your Party. Invite your friends!", - "partyChatEmpty": "Your Party chat is empty! Type a message in the box above to start chatting.", + "wantToStartParty": "Szeretnél létrehozni egy csapatot?", + "exclusiveQuestScroll": "Egy barát meghívása a csapatodba egy exkluzív küldetés tekercsben részesít, hogy együtt megküzdhessetek a Bazi-listával!", + "nameYourParty": "Nevezd el az új csapatodat!", + "partyEmpty": "Te vagy az egyetlen tagja a csapatodnak. Hívd meg a barátaidat!", + "partyChatEmpty": "A csapatod üzenőfala üres! Írj egy üzenetet és kezdj csevegni.", "guildChatEmpty": "Ennek a céhnek az üzenőfala üres! Írj egy üzenetet és kezdj csevegni.", - "requestAcceptGuidelines": "If you would like to post messages in the Tavern or any Party or Guild chat, please first read our <%= linkStart %>Community Guidelines<%= linkEnd %> and then click the button below to indicate that you accept them.", + "requestAcceptGuidelines": "Ha szeretnél a fogadóban, csapatban vagy céhben bejegyzést írni, először kérlek olvasd el a <%= linkStart %> Közösségi irányelveket<%= linkEnd %> és utána kattints a lenti gombra amivel elfogadod a szabályokat.", "partyUpName": "Party Up", "partyOnName": "Party On", "partyUpText": "Caatlakoztál egy csapathoz aminek már van egy tagja! Jó szórakozást a szörnyekkel való harchoz valamint egymás támogatásához.", "partyOnText": "Csatlakoztál egy csapathoz aminek már van legalább négy tagja! Élvezd a fokozott felelősséget, miközben együtt harcoltok az ellenségeitekkel szemben!", - "largeGroupNote": "Megjegyzés: Ez a céh túl nagy létszámú hogy értesítéseket küldjön! Ne felejtsd el minden nap meglátogatni hogy megnézd az új üzeneteket.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Csapat nem elérhető vagy nincs hozzáféhetőséged.", - "groupTypesRequired": "You must supply a valid \"type\" query string.", - "questLeaderCannotLeaveGroup": "You cannot leave your Party when you have started a quest. Abort the quest first.", - "cannotLeaveWhileActiveQuest": "You cannot leave Party during an active quest. Please leave the quest first.", + "groupTypesRequired": "Valós query string adatot kell megadnod.", + "questLeaderCannotLeaveGroup": "Nem léphetsz ki a csapatodból ha már elkezdtél egy küldetést. Először szakítsd meg a küldetést. ", + "cannotLeaveWhileActiveQuest": "Nem léphetsz ki a csoportból miközben részt veszel egy aktív küldetésben. Először lépj ki a küldetésből.", "onlyLeaderCanRemoveMember": "Csak a csapat vezetője távolíthat el egy tagot a csapatból.", - "cannotRemoveCurrentLeader": "Nem távolíthatod el a csoport vezetőjét. Eléőször nevezz ki egy új vezetőt.", - "memberCannotRemoveYourself": "Nem távolíthatod el magad a csapatból!", + "cannotRemoveCurrentLeader": "Nem távolíthatod el a csoport vezetőjét. Először nevezz ki egy új vezetőt.", + "memberCannotRemoveYourself": "Nem távolíthatod el magad a csoportból!", "groupMemberNotFound": "Felhasználó nem található a csoport tagjai között", "mustBeGroupMember": "A csoport tagjai közé kell tartoznod.", - "keepOrRemoveAll": "req.query.keep must be either \"keep-all\" or \"remove-all\"", - "keepOrRemove": "req.query.keep must be either \"keep\" or \"remove\"", - "canOnlyInviteEmailUuid": "Csak uuids-n vagy email-en keresztül tudsz meghívást küldeni.", + "keepOrRemoveAll": "A req.query.keep-nek, vagy \"keep-all\" vagy \"remove-all\"-nak kell lennie.", + "keepOrRemove": "A req.query.keep-nek, vagy \"keep\" vagy \"remove\"-nak kell lennie.", + "canOnlyInviteEmailUuid": "Csak felhasználó azonosítón vagy email-en keresztül tudsz meghívást küldeni.", "inviteMissingEmail": "Hiányzó email cím a meghívóban.", "inviteMissingUuid": "Hiányzó felhasználói azonosító a meghívóban.", "inviteMustNotBeEmpty": "A meghívó nem lehet üres.", "partyMustbePrivate": "A csapatnak privátnak kell lennie", - "userAlreadyInGroup": "Ez a felhasználó már a csapatba tartozik.", - "cannotInviteSelfToGroup": "Nem hívhatod meg magadat a csoportba.", - "userAlreadyInvitedToGroup": "Ezt a felhasználót már meghívtad a csoportba.", - "userAlreadyPendingInvitation": "Ez a felhasználó már meg lett hívva.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", + "cannotInviteSelfToGroup": "Nem hívhatod meg magadat egy csoportba.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Ez a felhasználó a \"<%= userId %>\" azonosítóval nem található.", "userHasNoLocalRegistration": "Ez a felhasználó nincsen regisztrálva (felhasználónév, e-mail, jelszó).", - "uuidsMustBeAnArray": "User ID invites must be an array.", - "emailsMustBeAnArray": "Email address invites must be an array.", - "canOnlyInviteMaxInvites": "You can only invite \"<%= maxInvites %>\" at a time", - "partyExceedsMembersLimit": "Party size is limited to <%= maxMembersParty %> members", + "uuidsMustBeAnArray": "A felhasználói azonosítón keresztüli meghívásnak tömbnek kell lennie.", + "emailsMustBeAnArray": "E-mail címen keresztüli meghívásnak tömbnek kell lennie.", + "canOnlyInviteMaxInvites": "Egyszerre csak \"<%= maxInvites %>\" meghívót lehet küldeni", + "partyExceedsMembersLimit": "Tagok száma limitált <%= maxMembersParty %> felhasználóra", "onlyCreatorOrAdminCanDeleteChat": "Nincs felhatalmazásod hogy töröld ezt az üzenetet!", - "onlyGroupLeaderCanEditTasks": "Not authorized to manage tasks!", - "onlyGroupTasksCanBeAssigned": "Only group tasks can be assigned", - "assignedTo": "Assigned To", - "assignedToUser": "Assigned to <%= userName %>", - "assignedToMembers": "Assigned to <%= userCount %> members", - "assignedToYouAndMembers": "Assigned to you and <%= userCount %> members", - "youAreAssigned": "You are assigned to this task", - "taskIsUnassigned": "This task is unassigned", - "confirmClaim": "Are you sure you want to claim this task?", - "confirmUnClaim": "Are you sure you want to unclaim this task?", - "confirmApproval": "Are you sure you want to approve this task?", - "confirmNeedsWork": "Are you sure you want to mark this task as needing work?", - "userRequestsApproval": "<%= userName %> requests approval", - "userCountRequestsApproval": "<%= userCount %> request approval", - "youAreRequestingApproval": "You are requesting approval", - "chatPrivilegesRevoked": "Your chat privileges have been revoked.", - "newChatMessagePlainNotification": "Új üzenet a <%= groupName %> csapatban <%= authorName %> felhasználótól. Kattints ide a chat megnyitásához!", - "newChatMessageTitle": "Új üzenet a <%= groupName %>", + "onlyGroupLeaderCanEditTasks": "Nincs felhatalmazásod feladatok szerkesztéséhez.", + "onlyGroupTasksCanBeAssigned": "Csak a csoportba tartozó feladatok hozzárendelhetőek.", + "assignedTo": "Hozzárendelve", + "assignedToUser": "Hozzárendelve <%= userName %> felhasználóhoz", + "assignedToMembers": "Hozzárendelve <%= userCount %> taghoz", + "assignedToYouAndMembers": "Hozzárendelve magadhoz és <%= userCount %> másik taghoz", + "youAreAssigned": "Hozzá vagy rendelve ehhez a feladathoz", + "taskIsUnassigned": "Ez a feladat nincs senkihez hozzárendelve", + "confirmClaim": "Biztos hogy igényt tartasz erre a feladtra?", + "confirmUnClaim": "Biztos hogy nem tartasz igényt erre a feladatra?", + "confirmApproval": "Biztos hogy ezt a feladatot elfogadod?", + "confirmNeedsWork": "Biztos hogy be akarod jelölni hogy ezen a feladaton még dolgozni kell?", + "userRequestsApproval": "<%= userName %> felhasználó jóváhagyást kér", + "userCountRequestsApproval": "<%= userCount %> jóváhagyás kérése", + "youAreRequestingApproval": "Jóváhagyást kértél", + "chatPrivilegesRevoked": "Üzenetküldési kiváltságaid visszavonásra kerültek.", + "newChatMessagePlainNotification": "Új üzenet a <%= groupName %> nevű csoportban<%= authorName %> felhasználótól. Kattints ide a chat megnyitásához!", + "newChatMessageTitle": "Új üzenet a <%= groupName %> nevű csoportban", "exportInbox": "Üzenetek exportálása", "exportInboxPopoverTitle": "Üzenetek exportálása HTML-ként", - "exportInboxPopoverBody": "HTML allows easy reading of messages in a browser. For a machine-readable format, use Data > Export Data", + "exportInboxPopoverBody": "HTML lehetővé teszi az üzenetek könnyebb olvasását a böngészőben. Géppel olvasható formátumhoz, használd az Adatok > Adatok exportálása fület.", "to": "Címzett:", "from": "Feladó:", "desktopNotificationsText": "We need your permission to enable desktop notifications for new messages in party chat! Follow your browser's instructions to turn them on.

You'll receive these notifications only while you have Habitica open. If you decide you don't like them, they can be disabled in your browser's settings.

This box will close automatically when a decision is made.", - "confirmAddTag": "Do you want to assign this task to \"<%= tag %>\"?", - "confirmRemoveTag": "Do you really want to remove \"<%= tag %>\"?", - "groupHomeTitle": "Home", - "assignTask": "Assign Task", - "claim": "Claim", - "removeClaim": "Remove Claim", - "onlyGroupLeaderCanManageSubscription": "Only the group leader can manage the group's subscription", - "yourTaskHasBeenApproved": "Your task <%= taskText %> has been approved.", - "taskNeedsWork": "<%= managerName %> marked <%= taskText %> as needing additional work.", - "userHasRequestedTaskApproval": "<%= user %> requests approval for <%= taskName %>", - "approve": "Approve", - "approveTask": "Approve Task", - "needsWork": "Needs Work", - "viewRequests": "View Requests", - "approvalTitle": "<%= userName %> has completed <%= type %>: \"<%= text %>\"", - "confirmTaskApproval": "Do you want to reward <%= username %> for completing this task?", - "groupSubscriptionPrice": "$9 every month + $3 a month for every additional group member", - "groupAdditionalUserCost": "+$3.00/month/user", - "groupBenefitsTitle": "How a group plan can help you", - "groupBenefitsDescription": "We've just launched the beta version of our group plans! Upgrading to a group plan unlocks some unique features to optimize the social side of Habitica.", - "groupBenefitOneTitle": "Create a shared task list", - "groupBenefitOneDescription": "Set up a shared task list for the group that everyone can easily view and edit.", - "groupBenefitTwoTitle": "Assign tasks to group members", - "groupBenefitTwoDescription": "Want a coworker to answer a critical email? Need your roommate to pick up the groceries? Just assign them the tasks you create, and they'll automatically appear in that person's task dashboard.", - "groupBenefitThreeTitle": "Claim a task that you are working on", - "groupBenefitThreeDescription": "Stake your claim on any group task with a simple click. Make it clear what everybody is working on!", - "groupBenefitFourTitle": "Mark tasks that require special approval", - "groupBenefitFourDescription": "Need to verify that a task really did get done before that user gets their rewards? Just adjust the approval settings for added control.", - "groupBenefitFiveTitle": "Chat privately with your group", - "groupBenefitFiveDescription": "Stay in the loop about important decisions in our easy-to-use chatroom!", - "groupBenefitSixTitle": "Get a free subscription", - "groupBenefitSixDescription": "Get full subscription benefits, including exclusive monthly items and the ability to buy gems with gold! (If you're already a subscriber, your old subscription will be cancelled but your consecutive subscription benefits such as monthly hourglasses will remain.)", - "groupBenefitSevenTitle": "Get a brand-new exclusive Jackalope Mount", - "groupBenefitEightTitle": "Add Group Managers to help manage tasks", + "confirmAddTag": "Szeretnéd hozzárendelni ezt a feladatot a \"<%= tag %>\" címkéhez?", + "confirmRemoveTag": "Szeretnéd eltávolítani \"<%= tag %>\" címkét?", + "groupHomeTitle": "Főoldal", + "assignTask": "Feladat hozzárendelése", + "claim": "Igénylés", + "removeClaim": "Igénylés eltávolítás", + "onlyGroupLeaderCanManageSubscription": "Csak a csoportvezető kezelheti a csoport előfizetését", + "yourTaskHasBeenApproved": "A <%= taskText %> feladatod elfogadásra került.", + "taskNeedsWork": "<%= managerName %> bejelölte a <%= taskText %> feladatot további munkára.", + "userHasRequestedTaskApproval": "<%= user %> jóváhagyást kért a <%= taskName %> feladatra. ", + "approve": "Elfogadás", + "approveTask": "Feladat elfogadása", + "needsWork": "További munka szükséges", + "viewRequests": "Kérelmek megtekintése", + "approvalTitle": "<%= userName %> elvégezte <%= type %>: \"<%= text %>\"", + "confirmTaskApproval": "Meg akarod <%= username %> felhasználót jutalmazni ennek a feladatnak az elvégzéséért?", + "groupSubscriptionPrice": "Havonta $9 + $3 minden további tagért", + "groupAdditionalUserCost": "+$3.00/hónap/felhasználó", + "groupBenefitsTitle": "Hogyan tud neked segíteni egy csoportos terv", + "groupBenefitsDescription": "Elindítottuk a csoportos terv béta verzióját! Csoportos tervre való előfizetés új egyedi szolgáltatásokat tesz elérhetővé ami optimalizálja a Habitica társasági oldalát.", + "groupBenefitOneTitle": "Megosztott feladatlista létrehozása", + "groupBenefitOneDescription": "Hozz létre egy megosztott feladatlistát amit a csoport összes tagja könnyen meg tud tekinteni és szerkeszteni.", + "groupBenefitTwoTitle": "Rendelj feladatokat a csoport tagjaihoz", + "groupBenefitTwoDescription": "Szeretnéd hogy az egyik munkatársad válaszoljon egy fontos e-mail-re? Szeretnéd hogy a szobatársad vásároljon be? Rendeld a feladathoz a kiválasztott felhasználót, és ezután a feladat automatikusan megjelenik a felhasználó listájában.", + "groupBenefitThreeTitle": "Tarts igényt egy feladatra amin éppen dolgozol", + "groupBenefitThreeDescription": "Jelents be igényedet erre a feladatra egy egyszerű kattintással. Tedd nyilvánvalóvá ki milyen faladatok dolgozik!", + "groupBenefitFourTitle": "Jelöld be azokat a feladatokat amik speciális jóváhagyást igényelnek.", + "groupBenefitFourDescription": "Meg kell bizonyosodnod róla hogy ez a felhasználó tényleg elvégezte a feladatát mielőtt megjutalmaznád? Állíts be fokozott ellenőrzést az elfogadási beállításokhoz.", + "groupBenefitFiveTitle": "Folytass privát beszélgetést a csoportoddal", + "groupBenefitFiveDescription": "Maradj képben a fontos döntésekről az könnyen használható üzenőfal segítségével!", + "groupBenefitSixTitle": "Szerezz ingyen előfizetést", + "groupBenefitSixDescription": "Tegyél szert az előfizetés összes előnyére, beleértve az exkluzív havi tárgyak valamint a képesség hogy drágaköveket vásárolhatsz aranyért! (Ha már van előfiztetésed, akkor ez az előfizetés letiltásra kerül, de olyan havi előnyök mint a misztikus homokóra megmarad.)", + "groupBenefitSevenTitle": "Szerezd meg az új exkluzív szarvasnyúl hátast", + "groupBenefitEightTitle": "Csoportvezető hozzáadása feladatok kezeléséhez", "groupBenefitEightDescription": "Want to share your group's responsibilities? Promote people to Group Managers to help the Leader add, assign, and approve tasks!", "groupBenefitMessageLimitTitle": "Increase message limit", "groupBenefitMessageLimitDescription": "Your message limit is doubled to house up to 400 messages at a time!", @@ -300,7 +299,7 @@ "enterprisePlansDescription": "Looking for a larger install with custom needs? See if our enterprise plans are right for you.", "familyPlansButton": "Sign Up for Family Plan Mailing List", "familyPlansDescription": "Want a cozier solution to manage your household? Family Plans are coming soon!", - "createAGroup": "Create a Group", + "createAGroup": "Csoport létrehozása", "getAGroupPlanToday": "Get a Group Plan Today", "assignFieldPlaceholder": "Type a group member's profile name", "cannotDeleteActiveGroup": "You cannot remove a group with an active subscription", @@ -309,7 +308,7 @@ "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", - "approvalRequested": "Approval Requested", + "approvalRequested": "Jóváhagyás kérése", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", "claimedBy": "Claimed by: <%= claimingUsers %>", @@ -336,17 +335,17 @@ "addTaskToGroupPlan": "Create", "leaderMarker": "- Leader", "managerMarker": "- Manager", - "joinedGuild": "Joined a Guild", + "joinedGuild": "Csatlakoztál egy céhhez", "joinedGuildText": "Ventured into the social side of Habitica by joining a Guild!", - "badAmountOfGemsToPurchase": "Amount must be at least 1.", + "badAmountOfGemsToPurchase": "Az értéknek legalább 1-nek kell lennie", "groupPolicyCannotGetGems": "The policy of one group you're part of prevents its members from obtaining gems.", - "viewParty": "View Party", + "viewParty": "Csapat megtekintése", "newGuildPlaceholder": "Enter your guild's name.", "guildMembers": "Guild Members", - "guildBank": "Guild Bank", + "guildBank": "Céhbank", "chatPlaceholder": "Type your message to Guild members here", "partyChatPlaceholder": "Type your message to Party members here", - "fetchRecentMessages": "Fetch Recent Messages", + "fetchRecentMessages": "Üzenetek frissítése", "like": "Like", "liked": "Liked", "joinGuild": "Join Guild", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/hu/limited.json b/website/common/locales/hu/limited.json index 684aeec302..6ed5405c61 100644 --- a/website/common/locales/hu/limited.json +++ b/website/common/locales/hu/limited.json @@ -29,11 +29,12 @@ "seasonalShopClosedTitle": "<%= linkStart %>Leslie<%= linkEnd %>", "seasonalShopTitle": "<%= linkStart %>Szezonális varázslónő<%= linkEnd %>", "seasonalShopClosedText": "A szezonális bolt jelenleg zárva van!! Csak a Habitica négy nagy gálája közben van nyitva.", - "seasonalShopText": "Szeretnél venni néhány ritka tárgyat? Ezek csak április 30-ig lesznek elérhetőek.", - "seasonalShopSummerText": "Szeretnél venni néhány ritka tárgyat? ezek a tárgyak csak július 31-ig lesznek elérhetőek.", - "seasonalShopFallText": "Szeretnél venni néhány ritka tárgyat? ezek a tárgyak csak október 31-ig lesznek elérhetőek.", - "seasonalShopWinterText": "Szeretnél venni néhány ritka tárgyat? ezek a tárgyak csak január 31-ig lesznek elérhetőek.", + "seasonalShopText": "Boldog Tavaszi Mulatozást! Szeretnél venni néhány ritka tárgyat? Ezek csak április 30-ig lesznek elérhetőek.", + "seasonalShopSummerText": "Boldog Nyári Csobbanást!! Szeretnél venni néhány ritka tárgyat? Ezek a tárgyak csak július 31-ig lesznek elérhetőek.", + "seasonalShopFallText": "Boldog Őszi Fesztivált! Szeretnél venni néhány ritka tárgyat? Ezek a tárgyak csak október 31-ig lesznek elérhetőek.", + "seasonalShopWinterText": "Boldog Téli Csodaországot!! Szeretnél venni néhány ritka tárgyat? Ezek a tárgyak csak január 31-ig lesznek elérhetőek.", "seasonalShopFallTextBroken": "Oh... Üdvözöllek az szezonális boltban... Őszi szezonális áruink sorakoznak itt, vagy mi... Minden amit itt látsz megvásárolható lesz az őszi fesztivál ideje alatt minden évben, de csupán október 31-ig vagyunk nyitva...Szerintem menny biztosra és szerezz meg mindent amire szükséged van, vagy várnod kell még... várnod kell... és várnod... *huh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Ha a múltban megvetted ezeknek a felszereléseknek bármelyikét de jelenleg nem vagy a birtokában, újra megvásárolhatod a jutalmak közül. Kezdetben csak azokat a tárgyakat tudod megvenni, ami az aktuális kasztodhoz tartozik (alapesetben harcos), de ne aggódj a többi kaszt-specifikus tárgy is elérhetővé válik ha átváltasz a megfelelő kasztra.", "candycaneSet": "Cukorbot (mágus)", "skiSet": "Sí-gyilkos (tolvaj)", diff --git a/website/common/locales/hu/questscontent.json b/website/common/locales/hu/questscontent.json index 524f9074bb..30116027c2 100644 --- a/website/common/locales/hu/questscontent.json +++ b/website/common/locales/hu/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/hu/subscriber.json b/website/common/locales/hu/subscriber.json index 9bc29786f0..1114be54b7 100644 --- a/website/common/locales/hu/subscriber.json +++ b/website/common/locales/hu/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Alap steampunk szett", "mysterySet301405": "Steampunk kiegészítő szett", "mysterySet301703": "Steampunk páva szett", diff --git a/website/common/locales/id/character.json b/website/common/locales/id/character.json index 7994a17932..b570003008 100644 --- a/website/common/locales/id/character.json +++ b/website/common/locales/id/character.json @@ -64,6 +64,7 @@ "classBonusText": "Pekerjaanmu (Warrior, jika kamu belum membuka atau memilih pekerjaan lain) akan lebih efektif jika menggunakan perlengkapan pekerjaannya, dibanding menggunakan perlengkapan pekerjaan lain. Perlengkapan yang digunakan sesuai pekerjaanmu mendapat tambahan atribut sebesar 50%.", "classEquipBonus": "Bonus Pekerjaan", "battleGear": "Perlengkapan Perang", + "gear": "Gear", "battleGearText": "Ini adalah perlengkapan yang kamu kenakan di dalam pertarungan; ia memengaruhi nilai ketika berinteraksi dengan tugas-tugasmu.", "autoEquipBattleGear": "Gunakan perlengkapan baru secara otomatis", "costume": "Kostum", diff --git a/website/common/locales/id/faq.json b/website/common/locales/id/faq.json index a423af6959..a6450d6842 100644 --- a/website/common/locales/id/faq.json +++ b/website/common/locales/id/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Ada beberapa hal yang dapat membuatmu menerima damage. Pertama, jika kamu meninggalkan Keseharian tidak terselesaikan dan tidak mencentangnya pada tampilan yang muncul keesokan paginya, Keseharian itu akan memberimu damage. Kedua, jika kamu melakukan Kebiasaan buruk, itu akan memberimu damage. Terakhir, jika kamu sedang bertarung melawan Boss dengan party-mu dan salah satu anggota party-mu tidak menyelesaikan semua Kesehariannya, Boss itu akan menyerangmu. Cara utama untuk menyembuhkan diri adalah dengan naik level, yang akan mengembalikan semua Nyawa-mu. Kamu juga dapat membeli Ramuan Kesehatan dengan Koin Emas dari kolom Hadiah. Plus, di level 10 atau lebih, kamu bisa memilih untuk menjadi Healer, dan kamu akan belajar kemampuan penyembuhan. Healer lain juga bisa menyembuhkanmu jika kamu berada dalam satu Party dengan mereka. Belajar lebih lanjut dengan menekan \"Party\" di panel navigasi.", "faqQuestion5": "Bagaimana cara bermain Habitica dengan teman-teman?", "iosFaqAnswer5": "Cara terbaik adalah dengan mengundang mereka masuk ke dalam party-mu! Party bisa bersama-sama mengikuti misi, memerangi monster, dan merapal mantra untuk membantu satu sama lain. Pergi ke Menu > Party dan klik \"Buat Party Baru\" jika kamu belum memiliki party. Sentuh pada daftar member, dan sentuh Undang di pojok kanan atas untuk mengundang temanmu dengan mengetikkan User ID mereka (baris nomor dan angka yang bisa ditemukan di Pengaturan > Detail Akun di aplikasi, dan Pengaturan > API di website). Di website, kamu bisa juga mengundang teman lewat email, yang akan kami tambakan di aplikasi pada pembaharuan berikutnya.\n\nDi website, kamu dan teman-temanmu juga bisa bergabung dalam Guild, yang merupakan ruang obrolan publik. Guild akan ditambahkan ke app pada update berikutnya!", - "androidFaqAnswer5": "Cara terbaik adalah dengan mengundang mereka masuk ke dalam Party-mu! Party bisa bersama-sama melakukan misi, memerangi monster, dan merapal mantra untuk membantu satu sama lain. Pergi ke [situs](https://habitica.com/) untuk membuat sebuah Party jika kamu belum punya. Kamu juga bisa bergabung dalam Guild bersama-sama (Sosial > Guild). Guild merupakan ruang obrolan yang terfokus pada topik tertentu atau tujuan yang umum, dapat bersifat publik maupun pribadi. Kamu bisa bergabung dengan sebanyak mungkin Guild yang kamu mau, tetapi hanya boleh bergabung dalam satu Party.\n\nUntuk info lebih lanjut, cek halaman wiki di [Party](http://habitrpg.wikia.com/wiki/Party) dan [Guild](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "Cara terbaik adalah dengan mengundang mereka masuk ke Party-mu dengan menekan \"Party\" di bar navigasi! Party bisa melakukan misi bersama-sama, melawan monster, dan merapal mantra untuk membantu satu sama lain. Kamu juga bisa bergabung dalam Guild bersama-sama (klik Guild di bar navigasi). Guild adalah ruang obrolan yang terfokus pada topik tertentu atau tujuan yang umum, dapat bersifat publik maupun privat. Kamu bisa bergabung dengan sebanyak mungkin Guild yang kamu mau, tetapi hanya satu Party. Untuk info lebih lanjut, cek laman wiki tentang [Party] (http://habitrpg.wikia.com/wiki/Party) dan [Guild](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Bagaimana caraku mendapatkan Peliharaan atau Tunggangan?", "iosFaqAnswer6": "Pada level 3, kamu akan mendapatkan fitur sistem hadiah. Setiap kamu menyelesaikan suatu tugas, kamu mendapat kesempatan acak untuk mendapatkan telur, ramuan penetas, atau sepotong makanan. Mereka tersimpan dalam Menu > Item.\n\nUntuk menetaskan peliharaan, kamu akan membutuhkan telur dan ramuan penetas. Klik pada telur untuk menentukan spesies yang ingin amu tetaskan, dan pilih \"Tetaskan Telur.\" Kemudian pilih ramuan penetas untuk menentukan jenisnya! Buka Menu > Peliharaan untuk menambahkan Peliharaan barumu pada avatar dengan klik pada gambar.\n\nKamu juga dapat membesarkan Peliharaan menjad Tunggangan dengan memberi mereka makan pada Menu > Peliharaan. Klik pada peliharaan dan klik \"Beri Makan Peliharaan\"! Kamu harus banyak memberi makan agar peliharaan dapat menjadi Tunggangan, tapi jika kamu sudah hafal makanan kesukaan tiap jenisnya, pertumbuhannya akan lebih cepat. Coba-coba sendiri atau [lihat contekan di sini](http://habitica.wikia.com/wiki/Food#Food_Preferences). Ketika kamu sudah mendapatkan Tunggangan, buka Menu > Tunggangan dan klik gambar utuk memberikannya pada avatarmu.\n\nKamu juga mendapatkan telur dari Sayembara Peliharaan dengan mengikuti Misi tertentu. (Lihat dibawah untuk mempelajari lebih lanjut mengenai Misi.)", "androidFaqAnswer6": "Pada level 3, kamu akan membuka Sistem Drop. Setiap kali kamu menyelesaikan sebuah tugas, kamu mempunyai peluang mendapat sebuah telur, ramuan penetas, atau makanan. Ini akan disimpan di Menu > Item.\n\nUntuk menetaskan seekor Peliharaan, kamu perlu sebuah telur dan satu ramuan penetas. Klik sebuah telur untuk menentukan spesies yang mau kamu tetaskan, dan pilih \"Tetaskan dengan ramuan.\" Lalu pilih sebuah ramuan penetas untuk menentukan warnanya! Untuk menggunakan Peliharaan barumu, pergi ke Menu > Istal > Peliharaan, pilih satu spesies, klik Peliharaan yang diinginkan, dan pilih \"Gunakan\"(Avatarmu tidak menunjukkan perubahannya).\n\nKamu juga bisa membesarkan Peliharaanmu menjadi Tunggangan dengan memberinya makanan di Menu > Istal [ > Peliharaan ]. Klik seekor Peliharaan, lalu pilih \"Beri Makan\"! Kamu harus memberinya makan berkali-kali sebelum dia berubah menjadi Tunggangan, tapi jika kamu bisa mengetahui makanan kesukaannya, dia akan bertumbuh lebih cepat. Beruji cobalah, atau [lihat contekannya di sini](http://habitica.wikia.com/wiki/Food#Food_Preferences). Untuk menggunakan Tungganganmu, pergi ke Menu > Istal > Tunggangan, pilih satu spesies, klik Tunggangan yang diinginkan, dan pilih \"Gunakan\"(Avatarmu tidak menunjukkan perubahannya).\n\nKamu juga bisa mendapat telur dari Peliharaan Misi dengan menyelesaikan Misi tertentu. (Lihat di bawah untuk belajar lebih lanjut tentang Misi.)", diff --git a/website/common/locales/id/gear.json b/website/common/locales/id/gear.json index 88bd6c5677..eb46170044 100644 --- a/website/common/locales/id/gear.json +++ b/website/common/locales/id/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "Setelan sweter nyaman ini akan menjagamu tetap hangat sewaktu kamu berkendara di langit! Tidak menambah status apapun. Item Pelanggan November 2017.", "armorMystery201712Text": "Baju Zirah Candlemancer", "armorMystery201712Notes": "Panas dan cahaya yang dihasilkan baju zirah ajaib ini akan menghangatkan hatimu tapi tidak pernah membakar kulitmu! Tidak menambah status apapun. Item Pelanggan Desember 2017.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Baju Steampunk", "armorMystery301404Notes": "Necis dan keren, iya lah! Tidak menambah status apapun. Item Pelanggan Februari 3015.", "armorMystery301703Text": "Gaun Merak Steampunk", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Mahkota Candlemancer", "headMystery201712Notes": "Mahkota ini membawa cahaya dan kehangatan bahkan ke malam musim dingin tergelap. Tidak menambah status apapun. Item Pelanggan Desember 2017.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Topi Fancy", "headMystery301404Notes": "Topi paling cocok untuk gentleman! Item pelanggan Januari 3015. Tidak menambah status apapun.", "headMystery301405Text": "Topi Biasa", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Perisai kasar dari lelehan batu ini melindungimu dari Kebiasaan buruk tapi tidak akan membakar tanganmu. Tidak menambah status apapun. Item Pelanggan Agustus 2017.", "shieldMystery201709Text": "Buku Panduan Sihir", "shieldMystery201709Notes": "Buku ini akan membimbingmu melalui pembelajaran dinimu tentang sihir. Tidak menambah status apapun. Item Pelanggan September 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Perisai Jam", "shieldMystery301405Notes": "Waktu ada di pihakmu, dengan memakai perisai menara jam ini! Tidak menambah status apapun. Item Pelanggan Juni 3015.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/id/generic.json b/website/common/locales/id/generic.json index c5fd939bea..2552b7a68c 100644 --- a/website/common/locales/id/generic.json +++ b/website/common/locales/id/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Tema Airu", "audioTheme_beatscribeNesTheme": "Tema NES Beatscribe", "audioTheme_arashiTheme": "Tema Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Tema Lunasol", "audioTheme_spacePenguinTheme": "Tema SpacePenguin", "audioTheme_maflTheme": "Tema MAFL", diff --git a/website/common/locales/id/groups.json b/website/common/locales/id/groups.json index e47306062b..2833cffe9b 100644 --- a/website/common/locales/id/groups.json +++ b/website/common/locales/id/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Terus Berpesta", "partyUpText": "Telah bergabung dalam Party dengan orang lain! Bersenang-senanglah melawan monster dan saling mendukung satu sama lain.", "partyOnText": "Telah bergabung dalam Party dengan paling tidak empat anggota! Nikmati peningkatan rasa tanggung jawab seiring persatuanmu dengan teman-teman dalam membasmi musuh-musuh kalian!", - "largeGroupNote": "Catatan: Guild ini sekarang terlalu besar untuk menampung notifikasi! Pastikan kamu datang ke sini setiap hari untuk melihat pesan-pesan baru.", "groupIdRequired": "\"groupId\" harus merupakan UUID yang valid", "groupNotFound": "Grup tidak ditemukan atau kamu tidak memiliki akses.", "groupTypesRequired": "Anda harus menyediakan query string \"type\" yang valid.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "User id belum ditulis", "inviteMustNotBeEmpty": "Undangan tidak boleh kosong.", "partyMustbePrivate": "Party harus privat", - "userAlreadyInGroup": "Pengguna telah berada dalam grup tersebut.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Kamu tidak bisa mengundang dirimu sendiri ke dalam grup.", - "userAlreadyInvitedToGroup": "Pengguna telah diundang dalam grup tersebut.", - "userAlreadyPendingInvitation": "Pengguna telah memiliki undangan yang tertunda.", - "userAlreadyInAParty": "Pengguna telah berada dalam Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Pengguna dengan id \"<%= userId %>\" tidak ditemukan.", "userHasNoLocalRegistration": "Pengguna tidak memiliki registrasi lokal (nama pengguna, email, kata sandi).", "uuidsMustBeAnArray": "Undangan ID pengguna harus berupa array.", @@ -417,11 +416,13 @@ "managerAdded": "Manajer berhasil ditambahkan", "managerRemoved": "Manajer berhasil dikeluarkan", "leaderChanged": "Pemimpin telah diganti", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/id/limited.json b/website/common/locales/id/limited.json index bee15dc888..c2c4e32999 100644 --- a/website/common/locales/id/limited.json +++ b/website/common/locales/id/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Apakah kamu mau membeli barang-barang langka bernuansa musim gugur? Hanya tersedia hingga 31 October!", "seasonalShopWinterText": "Happy Winter Wonderlang!! Apakah kamu mau membeli barang-barang langka bernuansa musim dingin? Tersedia hingga 31 Januari!", "seasonalShopFallTextBroken": "Oh... Selamat datang di Toko Musiman... Saat ini kami menyediakan barang-barang Edisi Musim Gugur atau apalah... Semua yang ada disini bisa dibeli selama perayaan Festival Musim Gugur setiap tahun, tapi kami hanya buka sampai 31 Oktober... jadi kurasa kamu harus beli sekarang juga, atau kamu harus menunggu... dan menunggu... dan menunggu... *hela nafas*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Kalau dulu kamu pernah membeli perlengkapan ini tapi saat ini tidak memilikinya, kamu bisa membelinya lagi di Kolom Hadiah. Awalnya, kamu cuma bisa membeli item untuk pekerjaanmu saat ini (standarnya Prajurit), tapi jangan khawatir, item spesifik tiap pekerjaan akan tersedia saat kamu memilih pekerjaan tersebut.", "candycaneSet": "Tongkat Permen (Penyihir)", "skiSet": "Ski-sassin (Pencuri)", diff --git a/website/common/locales/id/questscontent.json b/website/common/locales/id/questscontent.json index 3dbcaab757..e455cb79e9 100644 --- a/website/common/locales/id/questscontent.json +++ b/website/common/locales/id/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/id/subscriber.json b/website/common/locales/id/subscriber.json index 4ce5f267a6..583d8c94ac 100644 --- a/website/common/locales/id/subscriber.json +++ b/website/common/locales/id/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Set Pengendara Karpet", "mysterySet201712": "Set Candlemancer", "mysterySet201801": "Set Peri Musim Dingin", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Set Steampunk Standard", "mysterySet301405": "Set Aksesoris Steampunk", "mysterySet301703": "Set Merak Steampunk", diff --git a/website/common/locales/it/challenge.json b/website/common/locales/it/challenge.json index 3e03a08838..9d14927b3a 100644 --- a/website/common/locales/it/challenge.json +++ b/website/common/locales/it/challenge.json @@ -6,8 +6,8 @@ "keepIt": "Tienila", "removeIt": "Rimuovila", "brokenChallenge": "Collegamento ad una sfida mancante: questa attività era parte di una sfida, ma la sfida (o il gruppo) è stata cancellata. Cosa fare con le attività rimaste?", - "keepThem": "Keep Tasks", - "removeThem": "Remove Tasks", + "keepThem": "Tieni attività", + "removeThem": "Rimuovi attività", "challengeCompleted": "Questa sfida è stata completata, il vincitore è <%= user %>! Cosa fare con le attività rimaste?", "unsubChallenge": "Collegamento ad una sfida mancante: questa attività era parte di una sfida, ma ti sei ritirato. Cosa fare con le attività rimaste?", "challengeWinner": "Ha vinto le seguenti sfide:", @@ -29,7 +29,7 @@ "either": "Entrambi", "createChallenge": "Crea sfida", "createChallengeAddTasks": "Aggiungi attività sfida", - "createChallengeCloneTasks": "Clone Challenge Tasks", + "createChallengeCloneTasks": "Clona attività Sfida", "addTaskToChallenge": "Aggiungi attività", "discard": "Annulla", "challengeTitle": "Titolo sfida", @@ -101,7 +101,7 @@ "addTask": "Aggiungi attività", "editChallenge": "Modifica sfida", "challengeDescription": "Descrizione sfida", - "selectChallengeWinnersDescription": "Select a winner from the Challenge participants", + "selectChallengeWinnersDescription": "Scegli un vincitore tra i partecipanti della Sfida", "awardWinners": "Award Winner", "doYouWantedToDeleteChallenge": "Vuoi eliminare questa sfida?", "deleteChallenge": "Elimina sfida", diff --git a/website/common/locales/it/character.json b/website/common/locales/it/character.json index cd3fc36519..6230ce4866 100644 --- a/website/common/locales/it/character.json +++ b/website/common/locales/it/character.json @@ -64,6 +64,7 @@ "classBonusText": "La tua classe (Guerriero, se non ne hai sbloccata o scelta un'altra) sfrutta il suo equipaggiamento più efficientemente di quello delle altre classi. Gli oggetti equipaggiati adatti alla tua classe danno alle tue Statistiche un bonus del 50% maggiore.", "classEquipBonus": "Bonus classe", "battleGear": "Assetto di battaglia", + "gear": "Gear", "battleGearText": "Questo è l'equipaggiamento che indossi in battaglia, esso modifica alcuni valori quando interagisci con le tue attività.", "autoEquipBattleGear": "Equipaggia automaticamente nuovi oggetti", "costume": "Costume", diff --git a/website/common/locales/it/faq.json b/website/common/locales/it/faq.json index 043d1a7c88..0c7b478d26 100644 --- a/website/common/locales/it/faq.json +++ b/website/common/locales/it/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Ci sono numerose cose che possono danneggiarti. Per prima cosa, se lasci delle Dailies non fatte durante la notte e non le segni come completate nella schermata che compare la mattina successiva, queste Dailies non completate ti danneggeranno. Per seconda cosa, se segni una Abitudine negativa, questo ti danneggerà. Infine, se sei in una Battaglia contro un Boss con la tua squadra e un tuo compagno di squadra non completa tutte le sue Dailies, il Boss ti attaccherà. Il principale modo per curarti è passare di livello, evento che ti fa recuperare tutta la tua Salute. Puoi anche comprare una Pozione Salute con l'Oro dalla colonna delle Ricompense. In più, dal livello 10 in poi, puoi scegliere di diventare un Guaritore, e poi imparerai delle abilità di guarigione. Anche altri Guaritori possono guarirti se sei in Squadra con loro. Scopri di più selezionando \"Squadra\" nella barra di navigazione.", "faqQuestion5": "Come faccio per giocare in Habitica con i miei amici?", "iosFaqAnswer5": "Il miglior modo é invitarli in un Gruppo con te! I Gruppi possono intraprendere missioni, sconfiggere mostri, e usare abilità per sopportarsi l'un l'altro. Vai su Menu > Gruppo e clicca \"Crea Nuovo Gruppo\" se non ne hai ancora uno. Dopodiché tocca la lista dei Membri, e tocca Invita nell'angolo in alto a destra per invitare i tuoi amici inserendo il loro ID Utente (una serie di numeri e lettere che possono trovare sotto Impostazioni > Dettagli Account sull'app, e sotto Impostazioni > API sul sito). Sul sito, puoi anche invitare i tuoi amici via email, che aggiungeremo all'applicazione in un aggiornamento futuro.\n\nSul sito, tu e i tuoi amici potete anche unirvi a una Gilda, che sono chat room pubbliche. Le Gilde saranno aggiunte all'app in un aggiornamento futuro!", - "androidFaqAnswer5": "Il modo migliore è quello di invitarli a fare Squadra con te! Le Squadre possono andare in missioni, combattere mostri e usare abilità per aiutarsi a vicenda. Vai alla [pagina web] (https://habitica.com/) per creare una Squadra se già non ne hai una. Potete anche unirvi a delle Gilde insieme (guarda Social > Gilde). Le Gilde sono chat room the si concentrano su interessi comuni o per perseguire un obiettivo comune, e possono essere pubbliche o private. Puoi unirti a quante Gilde vuoi, ma puoi essere in una sola squadra.\n\nPer informazioni più dettagliate, dai un'occhiata alle pagine wiki sulle [Squadre](http://habitrpg.wikia.com/wiki/Party) e sulle [Gilde](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "Il modo migliore è quello di invitarli a fare Squadra con te cliccando su \"Squadra\" nella barra di navigazione! Le Squadre possono andare in missioni, combattere mostri e usare abilità per aiutarsi a vicenda. Potete anche unirvi a delle Gilde insieme (clicca su \"Gilde\" nella barra di navigazione). Le Gilde sono chat room the si concentrano su interessi comuni o per perseguire un obiettivo comune, e possono essere pubbliche o private. Puoi unirti a quante Gilde vuoi, ma puoi essere in una sola squadra. Per informazioni più dettagliate, dai un'occhiata alle pagine wiki sulle [Squadre](http://habitrpg.wikia.com/wiki/Party) e sulle [Gilde](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Come ottengo un Animale o una Cavalcatura?", "iosFaqAnswer6": "Dopo il livello 3 sbloccherai il Sistema di Drop. Ogni volta che completi un'attività avrai una possibilità di vincere un Uovo, una Pozione di schiusura o del Cibo. Questi verranno archiviati in Menù > Inventario.\n\nPer far nascere un Animale avrai bisogno di un Uovo e di una Pozione di schiusura. Premi sull'uovo per scegliere la specie che vuoi far schiudere, e seleziona quindi la Pozione di Schiusura per determinare il colore! Torna su Menù > Animali per equipaggiare il tuo nuovo animale al tuo Avatar premendoci sopra.\n\nPuoi anche far evolvere i tuoi Animali in Cavalcature cibandoli in Menù > Animali. Clicca sul Cibo nel riquadro a destra \"Cibo e Selle\", quindi seleziona l'Animale. Dovrai alimentare l'Animale diverse volte prima di farlo diventare una Cavalcatura, ma se riesci a trovare il suo cibo preferito crescerà molto più in fretta. Fai diverse prove o [Spoiler qui](http://habitica.wikia.com/wiki/Food#Food_Preferences). Una volta che hai una Cavalcatura, vai in Menù > Cavalcature e selezionala per equipaggiarla al tuo avatar.\n\nPotrai inoltre ricevere Uova dalle Missioni Animali completandole.(Vedi sotto per saperne di più sulle Missioni)", "androidFaqAnswer6": "Dopo il livello 3 sbloccherai il Sistema di Drop. Ogni volta che completi un'attività avrai una possibilità di ricevere un Uovo, una Pozione di schiusura o del Cibo, che verranno immagazzinati in Menu > Inventario.\n\nPer far nascere un Animale avrai bisogno di un Uovo e di una Pozione di schiusura. Premi sull'uovo per scegliere la specie che vuoi far schiudere e seleziona \"Schiudi con pozione\". Scegli quindi la Pozione di schiusura per determinare il colore! Per equipaggiare il tuo nuovo animale vai su Menu > Scuderia > Animali, scegli una specie, clicca sull'animale desiderato e seleziona \"Usa\" (il tuo avatar non si aggiorna per mostrare il cambiamento).\n\nPuoi far crescere i tuoi Animali fino a farli diventare Cavalcature dandogli da mangiare su Menù > Scuderia [> Animali]. Clicca su un Animale e seleziona \"Dai da mangiare\"! Dovrai nutrire il tuo Animale diverse volte prima di farlo diventare una Cavalcatura, ma se riesci a trovare il suo cibo preferito crescerà molto più in fretta. Puoi andare a tentativi o [leggere questa pagina per trovare le combinazioni migliori (Spoiler!)](http://habitica.wikia.com/wiki/Food#Food_Preferences). Per equipaggiare la tua Cavalcatura, va su Menu > Scuderia > Cavalcature, scegli una specie, clicca sulla Cavalcatura desiderata e seleziona \"Usa\" (il tuo avatar non si aggiorna per mostrare il cambiamento).\n\nPotrai inoltre ricevere Uova per Animali delle missioni completando certe Missioni. (Vedi sotto per saperne di più sulle Missioni)", diff --git a/website/common/locales/it/gear.json b/website/common/locales/it/gear.json index c177cd48d2..bcdd0be4c6 100644 --- a/website/common/locales/it/gear.json +++ b/website/common/locales/it/gear.json @@ -112,7 +112,7 @@ "weaponSpecialFencingFoilNotes": "Se mai qualcuno osasse mettere in dubbio il tuo onore, sarai pronto con questo raffinato fioretto. Aumenta la Forza di <%= str %>.", "weaponSpecialTachiText": "Tachi", "weaponSpecialTachiNotes": "Questa leggera spada curva farà a brandelli le tue attività! Aumenta la Forza di <%= str %>.", - "weaponSpecialAetherCrystalsText": "Aether Crystals", + "weaponSpecialAetherCrystalsText": "Cristalli Eterei", "weaponSpecialAetherCrystalsNotes": "These bracers and crystals once belonged to the Lost Masterclasser herself. Increases all Stats by <%= attrs %>.", "weaponSpecialYetiText": "Lancia dell'Addestra-Yeti", "weaponSpecialYetiNotes": "Questa lancia ti permette di domare gli yeti! Aumenta la Forza di <%= str %>. Edizione limitata, inverno 2013-2014.", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Completo Steampunk", "armorMystery301404Notes": "Raffinato, a dir poco impeccabile! Non conferisce alcun bonus. Oggetto per abbonati, febbraio 3015.", "armorMystery301703Text": "Vestito da Pavone Steampunk", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Cilindro Elegante", "headMystery301404Notes": "Un cilindro per i più fini gentiluomini! Oggetto per abbonati, gennaio 3015. Non conferisce alcun bonus.", "headMystery301405Text": "Cilindro Base", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Questo vigoroso scudo di roccia fusa ti protegge dalle cattive Abitudini ma non ti brucerà le mani. Non conferisce alcun beneficio. Oggetto per abbonati, agosto 2017.", "shieldMystery201709Text": "Manuale di Stregoneria", "shieldMystery201709Notes": "Questo libro ti guiderà durante i tuoi tentativi nell'arte della stregoneria. Non conferisce alcun beneficio. Oggetto per abbonati, settembre 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Scudo Orologio", "shieldMystery301405Notes": "Con questo scudo il tempo sarà sempre dalla tua parte! Non conferisce alcun bonus. Oggetto per abbonati, giugno 3015.", "shieldMystery301704Text": "Ventaglio Svolazzante", @@ -1310,7 +1316,7 @@ "backSpecialTakeThisNotes": "These wings were earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", "backSpecialSnowdriftVeilText": "Velo Innevato", "backSpecialSnowdriftVeilNotes": "Questo velo semitrasparente ti fa sembrare avvolto da un elegante turbine di neve! Non conferisce alcun bonus.", - "backSpecialAetherCloakText": "Aether Cloak", + "backSpecialAetherCloakText": "Mantello Etereo", "backSpecialAetherCloakNotes": "This cloak once belonged to the Lost Masterclasser herself. Increases Perception by <%= per %>.", "backSpecialTurkeyTailBaseText": "Turkey Tail", "backSpecialTurkeyTailBaseNotes": "Wear your noble Turkey Tail with pride while you celebrate! Confers no benefit.", @@ -1326,8 +1332,8 @@ "bodySpecialWonderconBlackNotes": "Un seducente collare d'ebano! Edizione speciale da convegno.", "bodySpecialTakeThisText": "Spallacci Take This", "bodySpecialTakeThisNotes": "These pauldrons were earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", - "bodySpecialAetherAmuletText": "Aether Amulet", - "bodySpecialAetherAmuletNotes": "This amulet has a mysterious history. Increases Constitution and Strength by <%= attrs %> each.", + "bodySpecialAetherAmuletText": "Amuleto Etereo", + "bodySpecialAetherAmuletNotes": "Questo amuleto ha una storia misteriosa. Aumenta la Costituzione e la Forza di <%= attrs %> ciascuno.", "bodySpecialSummerMageText": "Mantellina Luccicante", "bodySpecialSummerMageNotes": "Non c'è acqua dolce o salata che possa ossidare questa mantellina metallica. Non conferisce alcun bonus. Edizione limitata, estate 2014.", "bodySpecialSummerHealerText": "Collare Corallo", @@ -1436,8 +1442,8 @@ "eyewearSpecialWhiteTopFrameNotes": "Occhiali con una montatura bianca sopra alle lenti. Non conferisce alcun bonus.", "eyewearSpecialYellowTopFrameText": "Occhiali Classici Gialli", "eyewearSpecialYellowTopFrameNotes": "Occhiali con una montatura gialla sopra alle lenti. Non conferisce alcun bonus.", - "eyewearSpecialAetherMaskText": "Aether Mask", - "eyewearSpecialAetherMaskNotes": "This mask has a mysterious history. Increases Intelligence by <%= int %>.", + "eyewearSpecialAetherMaskText": "Maschera Eterea", + "eyewearSpecialAetherMaskNotes": "Questa maschera ha una storia misteriosa. Aumenta l'Intelligenza di <%= int %>.", "eyewearSpecialSummerRogueText": "Benda Furfantesca", "eyewearSpecialSummerRogueNotes": "La benda per i furfanti con stile! Non conferisce alcun bonus. Edizione limitata, estate 2014.", "eyewearSpecialSummerWarriorText": "Benda Affascinante", diff --git a/website/common/locales/it/generic.json b/website/common/locales/it/generic.json index 32d6667d75..239c6eff64 100644 --- a/website/common/locales/it/generic.json +++ b/website/common/locales/it/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Tema di Airu", "audioTheme_beatscribeNesTheme": "Tema NES di Beatscribe", "audioTheme_arashiTheme": "Tema di Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Tema Lunasol", "audioTheme_spacePenguinTheme": "Tema di SpacePenguin", "audioTheme_maflTheme": "Tema MAFL", diff --git a/website/common/locales/it/groups.json b/website/common/locales/it/groups.json index 086bb83e87..8115d4567f 100644 --- a/website/common/locales/it/groups.json +++ b/website/common/locales/it/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Party On", "partyUpText": "Ti sei unito ad una Squadra con un'altra persona! Divertitevi a combattere mostri e a sostenervi a vicenda.", "partyOnText": "Ti sei unito ad una Squadra con almeno quattro persone! Goditi la tua maggiore responsabilità mentre ti unisci ai tuoi compagni per sconfiggere i vostri nemici!", - "largeGroupNote": "Nota: questa Gilda è troppo grande per supportare le notifiche! Assicurati di tornare ogni giorno per leggere i nuovi messaggi.", "groupIdRequired": "\"groupId\" deve essere un UUID valido.", "groupNotFound": "Gruppo sconosciuto, oppure non hai i permessi di accesso.", "groupTypesRequired": "Devi fornire una richiesta \"type\" valida.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "ID utente mancante nell'invito.", "inviteMustNotBeEmpty": "L'invito non può essere vuoto.", "partyMustbePrivate": "Le squadre devono essere private", - "userAlreadyInGroup": "Utente già parte di quel gruppo.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Non puoi auto-invitarti in un gruppo.", - "userAlreadyInvitedToGroup": "Utente già invitato in quel gruppo.", - "userAlreadyPendingInvitation": "L'utente è già stato invitato.", - "userAlreadyInAParty": "Utente già membro di una Squadra.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Utente con id \"<%= userId %>\" non trovato.", "userHasNoLocalRegistration": "L'utente non ha una registrazione locale (nome utente, e-mail, password).", "uuidsMustBeAnArray": "ID Utente deve essere un vettore", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "Cos'è un Boss Mondiale?", "worldBossDesc": "Un Boss Mondiale è un evento speciale che unisce tutta la community di Habitica per sconfiggere un potente mostro con le loro attività! Tutti gli utenti di Habitica riceveranno le ricompense della vittoria, anche coloro che sono rimasti a riposare nella Locanda o che non hanno usato Habitica per l'intera durata della missione.", "worldBossLink": "Leggi di più sui precedenti Boss Mondiali di Habitica sulla Wiki.", "worldBossBullet1": "Completa le tue attività per danneggiare il Boss Mondiale", "worldBossBullet2": "Il Boss Mondiale non ti danneggerà per le attività non completate, ma la sua Furia aumenterà. Se la barra della Furia si riempie, il Boss attaccherà uno dei negozianti di Habitica!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Controlla regolarmente la Taverna per vedere i progressi con il Boss Mondiale e gli attacchi Furia." + "worldBossBullet4": "Controlla regolarmente la Taverna per vedere i progressi con il Boss Mondiale e gli attacchi Furia.", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/it/limited.json b/website/common/locales/it/limited.json index bb8bc8b2e4..ca02bd9a56 100644 --- a/website/common/locales/it/limited.json +++ b/website/common/locales/it/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Buon Fall Festival!! Vuoi comprare degli oggetti rari? Saranno disponibili solo fino al 31 ottobre!", "seasonalShopWinterText": "Buon Winter Wonderland!! Vuoi comprare degli oggetti rari? Saranno disponibili solo fino al 31 gennaio!", "seasonalShopFallTextBroken": "Oh... Benvenuto nel Negozio Stagionale... Abbiamo in vendita oggetti dell'Edizione Stagionale autunnale, o qualcosa del genere... Tutto quello che vedi qui sarà disponibile per l'acquisto durante l'evento \"Fall Festival\" di ogni anno, ma siamo aperti sono fino al 31 ottobre... Penso che dovresti rifornirti ora altrimenti dovrai aspettare... e aspettare... e aspettare... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Se hai comprato questo equipaggiamento in passato ma attualmente non lo possiedi, potrai riacquistarlo dalla colonna delle Ricompense. All'inizio potrai comprare solo gli oggetti per la tua classe attuale (Guerriero, se non l'hai ancora scelta/cambiata), ma niente paura, gli altri oggetti specifici per le varie classi diventeranno disponibili se ti converti a quella classe.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Rogue)", diff --git a/website/common/locales/it/questscontent.json b/website/common/locales/it/questscontent.json index 0d54509e4b..d7abd72ffb 100644 --- a/website/common/locales/it/questscontent.json +++ b/website/common/locales/it/questscontent.json @@ -520,7 +520,7 @@ "questLostMasterclasser2Notes": "The Joyful Reaper drums her bony fingers on some of the books that you brought. “Oh, dear,” the Master of Healers says. “There is a malevolent life essence at work. I might have guessed, considering the attacks by reanimated skulls during each incident.” Her assistant @tricksy.fox brings in a chest, and you are startled to see the contents that @beffymaroo unloads: the very same objects once used by this mysterious Tzina to possess people.

“I’m going to use resonant healing magic to try to make this creature manifest,” the Joyful Reaper says, reminding you that the skeleton is a somewhat unconventional Healer. “You’ll need to read the revealed information quickly, in case it breaks loose.”

As she concentrates, a twisting mist begins to siphon from the books and twine around the objects. Quickly, you flip through the pages, trying to read the new lines of text that are writhing into view. You catch only a few snippets: “Sands of the Timewastes” — “the Great Disaster” —“split into four”— “permanently corrupted”— before a single name catches your eye: Zinnya.

Abruptly, the pages wrench free from your fingers and shred themselves as a howling creature explodes into being, coalescing around the possessed objects.

“It’s an a’Voidant!” the Joyful Reaper shouts, throwing up a protection spell. “They’re ancient creatures of confusion and obscurity. If this Tzina can control one, she must have a frightening command over life magic. Quickly, attack it before it escapes back into the books!”

", "questLostMasterclasser2Completion": "The a’Voidant succumbs at last, and you share the snippets that you read.

“None of those references sound familiar, even for someone as old as I,” the Joyful Reaper says. “Except… the Timewastes are a distant desert at the most hostile edge of Habitica. Portals often fail nearby, but swift mounts could get you there in no time. Lady Glaciate will be glad to assist.” Her voice grows amused. “Which means that the enamored Master of Rogues will undoubtedly tag along.” She hands you the glimmering mask. “Perhaps you should try to track the lingering magic in these items to its source. I’ll go harvest some sustenance for your journey.”", "questLostMasterclasser2Boss": "The a'Voidant", - "questLostMasterclasser2DropEyewear": "Aether Mask (Eyewear)", + "questLostMasterclasser2DropEyewear": "Maschera Eterea (occhiali)", "questLostMasterclasser3Text": "The Mystery of the Masterclassers, Part 3: City in the Sands", "questLostMasterclasser3Notes": "As night unfurls over the scorching sands of the Timewastes, your guides @AnnDeLune, @Kiwibot, and @Katy133 lead you forward. Some bleached pillars poke from the shadowed dunes, and as you approach them, a strange skittering sound echoes across the seemingly-abandoned expanse.

“Invisible creatures!” says the April Fool, clearly covetous. “Oho! Just imagine the possibilities. This must be the work of a truly stealthy Rogue.”

“A Rogue who could be watching us,” says Lady Glaciate, dismounting and raising her spear. “If there’s a head-on attack, try not to irritate our opponent. I don’t want a repeat of the volcano incident.”

He beams at her. “But it was one of your most resplendent rescues.”

To your surprise, Lady Glaciate turns very pink at the compliment. She hastily stomps away to examine the ruins.

“Looks like the wreck of an ancient city,” says @AnnDeLune. “I wonder what…”

Before she can finish her sentence, a portal roars open in the sky. Wasn’t that magic supposed to be nearly impossible here? The hoofbeats of the invisible animals thunder as they flee in panic, and you steady yourself against the onslaught of shrieking skulls that flood the skies.", "questLostMasterclasser3Completion": "The April Fool surprises the final skull with a spray of sand, and it blunders backwards into Lady Glaciate, who smashes it expertly. As you catch your breath and look up, you see a single flash of someone’s silhouette moving on the other side of the closing portal. Thinking quickly, you snatch up the amulet from the chest of previously-possessed items, and sure enough, it’s drawn towards the unseen person. Ignoring the shouts of alarm from Lady Glaciate and the April Fool, you leap through the portal just as it snaps shut, plummeting into an inky swath of nothingness.", @@ -528,7 +528,7 @@ "questLostMasterclasser3RageTitle": "Swarm Respawn", "questLostMasterclasser3RageDescription": "Swarm Respawn: This bar fills when you don't complete your Dailies. When it is full, the Void Skull Swarm will heal 30% of its remaining health!", "questLostMasterclasser3RageEffect": "`Void Skull Swarm uses SWARM RESPAWN!`\n\nEmboldened by their victories, more skulls scream down from the heavens, bolstering the swarm!", - "questLostMasterclasser3DropBodyAccessory": "Aether Amulet (Body Accessory)", + "questLostMasterclasser3DropBodyAccessory": "Amuleto Etereo (accessorio corpo)", "questLostMasterclasser3DropBasePotion": "Base Hatching Potion", "questLostMasterclasser3DropGoldenPotion": "Golden Hatching Potion", "questLostMasterclasser3DropPinkPotion": "Cotton Candy Pink Hatching Potion", @@ -541,9 +541,9 @@ "questLostMasterclasser4RageTitle": "Siphoning Void", "questLostMasterclasser4RageDescription": "Siphoning Void: This bar fills when you don't complete your Dailies. When it is full, Anti'zinnya will remove the party's Mana!", "questLostMasterclasser4RageEffect": "`Anti'zinnya uses SIPHONING VOID!` In a twisted inversion of the Ethereal Surge spell, you feel your magic drain away into the darkness!", - "questLostMasterclasser4DropBackAccessory": "Aether Cloak (Back Accessory)", - "questLostMasterclasser4DropWeapon": "Aether Crystals (Two-Handed Weapon)", - "questLostMasterclasser4DropMount": "Invisible Aether Mount", + "questLostMasterclasser4DropBackAccessory": "Mantello Etereo (access. schiena)", + "questLostMasterclasser4DropWeapon": "Cristalli Eterei (arma a due mani)", + "questLostMasterclasser4DropMount": "Cavalcatura Eterea Invisibile", "questYarnText": "A Tangled Yarn", "questYarnNotes": "It’s such a pleasant day that you decide to take a walk through the Taskan Countryside. As you pass by its famous yarn shop, a piercing scream startles the birds into flight and scatters the butterflies into hiding. You run towards the source and see @Arcosine running up the path towards you. Behind him, a horrifying creature consisting of yarn, pins, and knitting needles is clicking and clacking ever closer.

The shopkeepers race after him, and @stefalupagus grabs your arm, out of breath. \"Looks like all of his unfinished projects\" gasp gasp \"have transformed the yarn from our Yarn Shop\" gasp gasp \"into a tangled mass of Yarnghetti!\"

\"Sometimes, life gets in the way and a project is abandoned, becoming ever more tangled and confused,\" says @khdarkwolf. \"The confusion can even spread to other projects, until there are so many half-finished works running around that no one gets anything done!\"

It’s time to make a choice: complete your stalled projects… or decide to unravel them for good. Either way, you'll have to increase your productivity quickly before the Dread Yarnghetti spreads confusion and discord to the rest of Habitica!", "questYarnCompletion": "With a feeble swipe of a pin-riddled appendage and a weak roar, the Dread Yarnghetti finally unravels into a pile of yarn balls.

\"Take care of this yarn,\" shopkeeper @JinjooHat says, handing them to you. \"If you feed them and care for them properly, they'll grow into new and exciting projects that just might make your heart take flight…\"", @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "L'indicatore dell'Attacco Furia si riempie quando gli abitanti di Habitica non completano le proprie Daily. Se si riempie, il Dysheartener rilascerà il suo attacco Dirompente Spezzacuori su uno dei negozianti di Habitica, quindi assicurati di completare le tue attività!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/it/subscriber.json b/website/common/locales/it/subscriber.json index 920271a4a5..0fd76c934f 100644 --- a/website/common/locales/it/subscriber.json +++ b/website/common/locales/it/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Set steampunk standard", "mysterySet301405": "Set accessori steampunk", "mysterySet301703": "Set Pavone Steampunk", diff --git a/website/common/locales/ja/challenge.json b/website/common/locales/ja/challenge.json index f4ed35a239..bf4f66b43d 100644 --- a/website/common/locales/ja/challenge.json +++ b/website/common/locales/ja/challenge.json @@ -96,8 +96,8 @@ "challengeDescription1": "チャレンジはプレイヤー同士で競争し、一連の関連したタスクを完了させることによって賞品を獲得するコミュニティのイベントです。", "challengeDescription2": "閲覧した公共のチャレンジや自分で作ったチャレンジに基づいた、おすすめのチャレンジを見つけましょう。", "createdBy": "作成者", - "joinChallenge": "チャレンジに参加する", - "leaveChallenge": "チャレンジを止める", + "joinChallenge": "チャレンジに参加する", + "leaveChallenge": "チャレンジを止める", "addTask": "タスクを追加", "editChallenge": "チャレンジを編集", "challengeDescription": "チャレンジの説明", diff --git a/website/common/locales/ja/character.json b/website/common/locales/ja/character.json index cbcda3d65a..befee0713f 100644 --- a/website/common/locales/ja/character.json +++ b/website/common/locales/ja/character.json @@ -64,14 +64,15 @@ "classBonusText": "戦士クラスは、ほかのクラスより、武器・防具などのアイテムをずっとうまく使えます。戦士クラスは、装備品から得られる能力値のボーナスが50%増しになります。 (クラスをアンロックしていないか、別のクラスを選んでいない場合は、戦士クラスです)", "classEquipBonus": "クラスボーナス", "battleGear": "武装", + "gear": "Gear", "battleGearText": "こちらは、戦いのときに身に着けるアイテムです。タスクを達成したときに得られる数値に影響します。", "autoEquipBattleGear": "新しい装備品を自動装備する", "costume": "衣装", "costumeText": "装備中のアイテムより、ほかのアイテムの方が見た目だけがいい場合、「衣装に使う」にチェックを入れてください。身に着けている武装の上に、見た目の衣装としてはおる感じです。", "useCostume": "衣装を使用する", "useCostumeInfo1": "「衣装を使用する」を選択すると、武装の能力値に影響を与えずに、アイテムをアバターに着せることができます!つまり、左側でステータスポイントの高いアイテムを装備し、右側でアバターの見た目を変更することができるということです。", - "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your Stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", - "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", + "useCostumeInfo2": "「衣装を使用する」をクリックすると、アバターは初期状態に戻ったように見えますが...心配ありません! 左側を見ると、武装はちゃんと装備されていることがわかります。では、さっそく着飾ってみましょう! 右側のタブでは何を装備しても能力値は変わらず、見た目だけをカッコよくできます。違うセットの装備を合わせたり、ペット、乗騎、背景とコーディネートしたりして、いろんな組み合わせを試してみましょう。

質問がありますか? Wikiの 衣装のページ をご覧ください。えっ、完璧な衣装ができた? Costume Carnival guild(仮装カーニバルギルド)で紹介するか、キャンプ場で自慢してください!", + "costumePopoverText": "「衣装を使用する」を選択すると、武装の能力値に影響を与えずに、アイテムをアバターに着せることができます! つまり、もっとも効果の高いアイテムを装備しながらも、あなたのアバターは自由にオシャレができるということです。", "autoEquipPopoverText": "購入した装備を自動的に身につけたい場合は、このオプションを選択してください。", "costumeDisabled": "衣装を無効にしました。", "gearAchievement": "もっとも上位のクラス装備セットを入手し、「究極のアイテム」の実績を解除しました! あなたは以下の完全なセットを手に入れています: ", @@ -98,11 +99,11 @@ "allocatePerPop": "知覚にポイントを加える", "allocateInt": "知能のポイント:", "allocateIntPop": "知能にポイントを加える", - "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", + "noMoreAllocate": "レベル100に到達したので、これ以上能力値は増えません。レベルアップを続けることもできますし、市場で無料で手に入る「転生のオーブ」をつかって、レベル1 から新しい冒険を始めることもできます。", "stats": "データ", "achievs": "実績", "strength": "力", - "strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.", + "strText": "力は「会心の一撃」が出る確率と、それがもたらすゴールド、経験値、アイテムドロップの上昇率を上げます。さらに、ボスモンスターに与えるダメージも増えます。", "constitution": "体質", "conText": "体質の値が高いと、悪い習慣を行ったり、日課を果たせなかったときに受けるダメージを減らします。", "perception": "知覚", @@ -115,7 +116,7 @@ "allocatedPointsText": "ステータスポイントを獲得し、割りあてられました。キャラクター育成の項目からポイントを割りあてましょう。", "allocated": "割り当て済み", "buffs": "勢い( 能力値ボーナス )", - "buffsText": "Temporary Stat bonuses from abilities and achievements. These wear off at the end of your day. The abilities you've unlocked appear in the Rewards list of your Tasks page.", + "buffsText": "特殊な能力や実績から得られる一時的な能力値ボーナスです。これらは一日の終わりに消失します。獲得済みの特殊能力はタスクページのごほうびリストから確認できます。", "characterBuild": "キャラクターの育成", "class": "クラス", "experience": "経験値", @@ -125,11 +126,11 @@ "mage": "魔道士", "wizard": "魔道士", "mystery": "ミステリー", - "changeClass": "Change Class, Refund Stat Points", + "changeClass": "クラスの変更、能力値ポイントを割り当て前に戻す", "lvl10ChangeClass": "クラスを変えるには、レベル10以上にならないといけません。", "changeClassConfirmCost": "3ジェムを使用してクラスを変更します。よろしいですか?", "invalidClass": "クラスは無効です。「warrior」、「rogue」、「wizard」、「healer」のどれかを指定してください。", - "levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.", + "levelPopover": "レベルが1上がるごとに、任意の能力に割り振れるポイントを 1点獲得します。割り当ては手動で行うほかに、「自動割り当て」設定でおまかせにすることもできます。", "unallocated": "未振り分けのステータスポイント", "haveUnallocated": "未振り分けのステータスポイントが<%= points %>あります", "autoAllocation": "自動割り当て", @@ -139,9 +140,9 @@ "classAllocation": "クラスに基づいてポイントを割りあてる", "classAllocationPop": "あなたのクラスにとって重要なステータスに多く値を割り振る", "taskAllocation": "タスク活動に基づいてポイントを割りあてる", - "taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.", + "taskAllocationPop": "あなたが達成したタスクの分類にもとづき、力、知能、体質、知覚にポイントを割り当てます。", "distributePoints": "未割り当てのポイントをふりわける", - "distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.", + "distributePointsPop": "選択した方法にもとづいて、割り当て前の能力値ポイントを全て振り分けます。", "warriorText": "戦士はタスクを完了したときに、「会心の一撃」が出やすく、その効果も高い。「会心の一撃」が出ると、ゴールド、経験値、アイテムドロップの確率にボーナスがつきます。また、戦士はボスに大きなダメージを与えます。予測できない一攫千金タイプの報酬でやる気が出る、もしくはボス クエストで活躍したいなら、戦士でプレーしましょう!", "wizardText": "魔道士は学習スピードが速く、他のクラスよりも多く経験値を得てレベルが早く上がります。また、特殊能力を使うためのマナを大量に得ます。Habiticaの戦略ゲーム的な側面を楽しみたいなら、あるいはレベルアップと追加要素をアンロックしていくのがあなたにとって強い動機付けになるならば、魔道士を選びましょう!", "mageText": "魔道士は他のクラスよりも速く経験値を獲得してレベルアップしていきます。特殊スキルを使ってマナを多く獲得することもできます。Habiticaの戦術的側面を楽しみたい、あるいはレベルアップしてもっと進んだ機能を使うことへのモチベーションが高いなら、魔道士を選んでプレイしましょう。", @@ -161,7 +162,7 @@ "respawn": "生き返った!", "youDied": "あなたは死にました!", "dieText": "レベルが1下がり、すべてのゴールドといくつかの装備品を失ってしまいました。Habitica の民よ、復活せよ! 悪い習慣をひかえ、日課をこなすことに気を配り、つまずいても体力回復の薬を使って、死の手が届かぬよう、もちこたえましょう!", - "sureReset": "Are you sure? This will reset your character's class and allocated Stat Points (you'll get them all back to re-allocate), and costs 3 Gems.", + "sureReset": "本当によろしいですか? キャラクターのクラスと割り当て済みの能力値ポイントをリセットします(ポイントは全て割り当て前の状態に戻ります)。リセットには3 ジェムが必要です。", "purchaseFor": "<%= cost %> ジェムで購入しますか?", "purchaseForHourglasses": "神秘の砂時計を<%= cost %>つ使ってこのアイテムを購入しますか?", "notEnoughMana": "マナが足りません。", @@ -199,7 +200,7 @@ "int": "知能", "showQuickAllocation": "割り当てを表示", "hideQuickAllocation": "割り当てを非表示", - "quickAllocationLevelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options found in User Icon > Stats.", + "quickAllocationLevelPopover": "レベルが1上がるごとに、能力値のどれかに割り当てられるポイントを1獲得します。割り当ては手動で行うほかに、ユーザーアイコン > 設定の「自動割り当て」設定でシステムに任せることもできます。", "invalidAttribute": "\"<%= attr %>\" は有効なパラメータではありません。", "notEnoughAttrPoints": "割り当てるポイントが足りません", "style": "体型", diff --git a/website/common/locales/ja/content.json b/website/common/locales/ja/content.json index 38dceb4972..2b123b7bf6 100644 --- a/website/common/locales/ja/content.json +++ b/website/common/locales/ja/content.json @@ -194,95 +194,95 @@ "hatchingPotionNotes": "これをたまごにかけると、<%= potText(locale) %> ペットが生まれます。", "premiumPotionAddlNotes": "クエスト ペットのたまごには使えません。", "foodMeat": "肉", - "foodMeatThe": "the Meat", - "foodMeatA": "Meat", + "foodMeatThe": "肉", + "foodMeatA": "肉", "foodMilk": "ミルク", - "foodMilkThe": "the Milk", - "foodMilkA": "Milk", + "foodMilkThe": "ミルク", + "foodMilkA": "ミルク", "foodPotatoe": "じゃがいも", - "foodPotatoeThe": "the Potato", - "foodPotatoeA": "a Potato", + "foodPotatoeThe": "じゃがいも", + "foodPotatoeA": "じゃがいも", "foodStrawberry": "いちご", - "foodStrawberryThe": "the Strawberry", - "foodStrawberryA": "a Strawberry", + "foodStrawberryThe": "いちご", + "foodStrawberryA": "いちご", "foodChocolate": "チョコレート", - "foodChocolateThe": "the Chocolate", - "foodChocolateA": "Chocolate", + "foodChocolateThe": "チョコレート", + "foodChocolateA": "チョコレート", "foodFish": "魚", - "foodFishThe": "the Fish", - "foodFishA": "a Fish", + "foodFishThe": "魚", + "foodFishA": "魚", "foodRottenMeat": "腐った肉", - "foodRottenMeatThe": "the Rotten Meat", - "foodRottenMeatA": "Rotten Meat", + "foodRottenMeatThe": "腐った肉", + "foodRottenMeatA": "腐った肉", "foodCottonCandyPink": "ピンクの綿菓子", - "foodCottonCandyPinkThe": "the Pink Cotton Candy", - "foodCottonCandyPinkA": "Pink Cotton Candy", + "foodCottonCandyPinkThe": "ピンクの綿菓子", + "foodCottonCandyPinkA": "ピンクの綿菓子", "foodCottonCandyBlue": "水色の綿菓子", - "foodCottonCandyBlueThe": "the Blue Cotton Candy", - "foodCottonCandyBlueA": "Blue Cotton Candy", + "foodCottonCandyBlueThe": "水色の綿菓子", + "foodCottonCandyBlueA": "水色の綿菓子", "foodHoney": "はちみつ", - "foodHoneyThe": "the Honey", - "foodHoneyA": "Honey", + "foodHoneyThe": "はちみつ", + "foodHoneyA": "はちみつ", "foodCakeSkeleton": "骨のケーキ", - "foodCakeSkeletonThe": "the Bare Bones Cake", - "foodCakeSkeletonA": "a Bare Bones Cake", + "foodCakeSkeletonThe": "骨のケーキ", + "foodCakeSkeletonA": "骨のケーキ", "foodCakeBase": "基本のケーキ", - "foodCakeBaseThe": "the Basic Cake", - "foodCakeBaseA": "a Basic Cake", + "foodCakeBaseThe": "基本のケーキ", + "foodCakeBaseA": "基本のケーキ", "foodCakeCottonCandyBlue": "水色のケーキ", - "foodCakeCottonCandyBlueThe": "the Candy Blue Cake", - "foodCakeCottonCandyBlueA": "a Candy Blue Cake", + "foodCakeCottonCandyBlueThe": "水色のケーキ", + "foodCakeCottonCandyBlueA": "水色のケーキ", "foodCakeCottonCandyPink": "ピンク色のケーキ", - "foodCakeCottonCandyPinkThe": "the Candy Pink Cake", - "foodCakeCottonCandyPinkA": "a Candy Pink Cake", + "foodCakeCottonCandyPinkThe": "ピンク色のケーキ", + "foodCakeCottonCandyPinkA": "ピンク色のケーキ", "foodCakeShade": "チョコレートケーキ", - "foodCakeShadeThe": "the Chocolate Cake", - "foodCakeShadeA": "a Chocolate Cake", + "foodCakeShadeThe": "チョコレートケーキ", + "foodCakeShadeA": "チョコレートケーキ", "foodCakeWhite": "クリームケーキ", - "foodCakeWhiteThe": "the Cream Cake", - "foodCakeWhiteA": "a Cream Cake", + "foodCakeWhiteThe": "クリームケーキ", + "foodCakeWhiteA": "クリームケーキ", "foodCakeGolden": "はちみつケーキ", - "foodCakeGoldenThe": "the Honey Cake", - "foodCakeGoldenA": "a Honey Cake", + "foodCakeGoldenThe": "はちみつケーキ", + "foodCakeGoldenA": "はちみつケーキ", "foodCakeZombie": "腐ったケーキ", - "foodCakeZombieThe": "the Rotten Cake", - "foodCakeZombieA": "a Rotten Cake", + "foodCakeZombieThe": "腐ったケーキ", + "foodCakeZombieA": "腐ったケーキ", "foodCakeDesert": "砂のケーキ", - "foodCakeDesertThe": "the Sand Cake", - "foodCakeDesertA": "a Sand Cake", + "foodCakeDesertThe": "砂のケーキ", + "foodCakeDesertA": "砂のケーキ", "foodCakeRed": "いちごケーキ", - "foodCakeRedThe": "the Strawberry Cake", - "foodCakeRedA": "a Strawberry Cake", + "foodCakeRedThe": "いちごケーキ", + "foodCakeRedA": "いちごケーキ", "foodCandySkeleton": "骨のキャンディー", - "foodCandySkeletonThe": "the Bare Bones Candy", - "foodCandySkeletonA": "Bare Bones Candy", + "foodCandySkeletonThe": "骨のキャンディー", + "foodCandySkeletonA": "骨のキャンディー", "foodCandyBase": "基本のキャンディー", - "foodCandyBaseThe": "the Basic Candy", - "foodCandyBaseA": "Basic Candy", + "foodCandyBaseThe": "基本のキャンディー", + "foodCandyBaseA": "基本のキャンディー", "foodCandyCottonCandyBlue": "水色のキャンディー", - "foodCandyCottonCandyBlueThe": "the Sour Blue Candy", - "foodCandyCottonCandyBlueA": "Sour Blue Candy", + "foodCandyCottonCandyBlueThe": "水色のキャンディー", + "foodCandyCottonCandyBlueA": "水色のキャンディー", "foodCandyCottonCandyPink": "ピンクのキャンディー", - "foodCandyCottonCandyPinkThe": "the Sour Pink Candy", - "foodCandyCottonCandyPinkA": "Sour Pink Candy", + "foodCandyCottonCandyPinkThe": "ピンクのキャンディー", + "foodCandyCottonCandyPinkA": "ピンクのキャンディー", "foodCandyShade": "チョコレートキャンディー", - "foodCandyShadeThe": "the Chocolate Candy", - "foodCandyShadeA": "Chocolate Candy", + "foodCandyShadeThe": "チョコレートキャンディー", + "foodCandyShadeA": "チョコレートキャンディー", "foodCandyWhite": "バニラキャンディー", - "foodCandyWhiteThe": "the Vanilla Candy", - "foodCandyWhiteA": "Vanilla Candy", + "foodCandyWhiteThe": "バニラキャンディー", + "foodCandyWhiteA": "バニラキャンディー", "foodCandyGolden": "はちみつキャンディー", - "foodCandyGoldenThe": "the Honey Candy", - "foodCandyGoldenA": "Honey Candy", + "foodCandyGoldenThe": "はちみつキャンディー", + "foodCandyGoldenA": "はちみつキャンディー", "foodCandyZombie": "腐ったキャンディー", - "foodCandyZombieThe": "the Rotten Candy", - "foodCandyZombieA": "Rotten Candy", + "foodCandyZombieThe": "腐ったキャンディー", + "foodCandyZombieA": "腐ったキャンディー", "foodCandyDesert": "砂のキャンディー", - "foodCandyDesertThe": "the Sand Candy", - "foodCandyDesertA": "Sand Candy", + "foodCandyDesertThe": "砂のキャンディー", + "foodCandyDesertA": "砂のキャンディー", "foodCandyRed": "シナモンキャンディー", - "foodCandyRedThe": "the Cinnamon Candy", - "foodCandyRedA": "Cinnamon Candy", + "foodCandyRedThe": "シナモンキャンディー", + "foodCandyRedA": "シナモンキャンディー", "foodSaddleText": "くら", "foodSaddleNotes": "ペットの 1 匹をすぐに乗騎に成長させます。", "foodSaddleSellWarningNote": "ちょっと待って! これはとっても役に立つアイテムだよ! ペットにくらを使う方法は知ってるかな?", diff --git a/website/common/locales/ja/contrib.json b/website/common/locales/ja/contrib.json index ca874b56a3..3dce20cf6a 100644 --- a/website/common/locales/ja/contrib.json +++ b/website/common/locales/ja/contrib.json @@ -29,8 +29,8 @@ "heroicText": "英雄段位は Habitica のスタッフやスタッフレベルの貢献者です。あなたがこのタイトルを持っているということは、あなたはそれに任命されました (または雇われました!)。", "npcText": "NPC は Kickstarter で Habitica に資金提供していただいた最高段位です。あなたはサイトの機能で彼らのアバターを見つけることができます!", "modalContribAchievement": "貢献者になりました!", - "contribModal": "<%= name %>, you awesome person! You're now a tier <%= level %> contributor for helping Habitica.", - "contribLink": "See what prizes you've earned for your contribution!", + "contribModal": "<%= name %>、あなたは素晴らしい人です! Habiticaへのご支援を表し、<%= level %>段の貢献者とします。", + "contribLink": "どんな賞品が手に入ったか覗いてみよう!", "contribName": "貢献者", "contribText": "Habiticaにプログラム、ピクセルアート、音楽、文章、またはそれ以外の方法で貢献した証です。詳しく知るには、Aspiring Legends ギルドに参加してください!", "readMore": "続きを読む", diff --git a/website/common/locales/ja/faq.json b/website/common/locales/ja/faq.json index 97a13e2a39..691fa41422 100644 --- a/website/common/locales/ja/faq.json +++ b/website/common/locales/ja/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "ダメージを受け、体力が減るのにはいくつかの原因があります。1 つ目、日課をやらないまま夜を明かし、翌日の朝に表示される確認画面でもチェックをしなければダメージを受けます。2 つ目、悪い習慣をチェックすれば、ダメージを受けます。最後に、パーティーでのボス戦の途中で、パーティーの仲間のだれかが日課をやり残した場合、ボスがあなたを攻撃します。主な回復方法はレベルを上げることで、レベルが上がると体力は全回復します。また、「ごほうび」欄の「体力回復の薬」をゴールドで買っても回復できます。そして、レベル10以上になると、治療師になることができ、回復のスキルを覚えます。もしパーティーの仲間に治療師がいれば、回復してもらうことができます。詳しくはナビゲーションバーのパーティーをクリックしてください。", "faqQuestion5": "友達といっしょに Habitica をプレーするには?", "iosFaqAnswer5": "いちばんいいのは、あなたといっしょのパーティーに友達を誘うことです! パーティーでは、いっしょにクエストに参加して、いっしょにモンスターと戦い、お互いにスキルの魔法で助け合うことができます。もしあなたがまだパーティを組んでいないなら、メニュー > パーティー で、「新しいパーティを作る」をクリックしてください。その後、メンバーリストで、右上の「友達を招待する」ボタンをクリック、あなたの友達のユーザーID ( 設定 > アカウントの詳細 、Webサイト上では 設定 > API 確認できる英数文字列 ) を入力します。Webサイトから、友達にEmailを送って招待することもできます。アプリでの同様の機能は、将来の更新で追加する予定です。\n\nWebサイトでは、あなたと友達はギルドに参加することもできます。ギルドとは公開されたチャットルームです。アプリでのギルド機能は、将来の更新で追加する予定です!", - "androidFaqAnswer5": "いちばんいいのは、ナビゲーションバーの「パーティー」をクリックして、あなたといっしょのパーティーに友達を誘うことです! パーティーでは、いっしょにクエストに参加して、いっしょにモンスターと戦い、お互いにスキルを使って助け合うことができます。いっしょのギルドに入ることもできます(ナビゲーションバーの「ギルド」をクリック)。ギルドは共通の趣味を話題にしたり、共通のゴールを追求するためのチャットルームで、公開・非公開の設定ができます。ギルドは好きなだけ入ることができますが、パーティーは1つだけにしか参加できません。より詳しい情報は、Wikiページの、[パーティー]( http://ja.habitica.wikia.com/wiki/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC ) や[ギルド]( http://habitrpg.wikia.com/wiki/Guilds ) をご覧ください。", - "webFaqAnswer5": "いちばんいいのは、ナビゲーションバーの「パーティー」をクリックして、あなたといっしょのパーティーに友達を誘うことです! パーティーでは、いっしょにクエストに参加して、いっしょにモンスターと戦い、お互いにスキルを使って助け合うことができます。いっしょのギルドに入ることもできます(ナビゲーションバーの「ギルド」をクリック)。ギルドは共通の趣味を話題にしたり、共通のゴールを追求するためのチャットルームで、公開・非公開の設定ができます。ギルドは好きなだけ入ることができますが、パーティーは1つだけにしか参加できません。より詳しい情報は、Wikiページの、[パーティー]( http://ja.habitica.wikia.com/wiki/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC ) や[ギルド]( http://habitrpg.wikia.com/wiki/Guilds ) をご覧ください。", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "ペットや乗騎はどうやって手に入れるの?", "iosFaqAnswer6": "レベル3になると「落し物」システムがアンロックされます。あなたがタスクを達成するたびに、「たまご」や「たまごがえしの薬」、または「えさ」を手に入れるチャンスが与えられます。手に入れたアイテムはメニュー > 所持品 に保存されています。\n\n「たまご」からペットをかえすには、「たまご」と「たまごがえし」の薬が必要です。かえしたいペットの「たまご」をクリックすると、かえす「たまご」として選ばれます。次にペットの色にしたい「たまごがえしの薬」を選びます! メニュー > ペットでペットを選ぶと、アバターのそばにペットが表示されます。\n\nペットを育てて乗騎にすることもできます。メニュー > ペット でえさをやりましょう。ペットをタップすると「えさをやるペット」として選ばれます。ペットを乗騎にするにはたくさんのえさが必要ですが、お気に入りのえさだと、より早く成長します。いろいろ試してみてください、もしくは [ 楽しみがなくなるかもしれませんが ] ( http://ja.habitica.wikia.com/wiki/%E3%81%88%E3%81%95%E3%81%AE%E5%A5%BD%E3%81%BF ) を見てください。乗騎を手に入れたら、メニュー > 乗騎 で、あなたのアバターに表示できます。\n\nクエストによっては、達成することでクエスト ペットのたまごが手に入ります。(クエストについての詳しくは、以下をご覧ください)", "androidFaqAnswer6": "レベル3になると「落し物」システムがアンロックされます。あなたがタスクを達成するたびに、「たまご」や「たまごがえしの薬」、または「えさ」を手に入れるチャンスが与えられます。手に入れたアイテムはメニュー > 所持品 に保存されています。\n\n「たまご」からペットをかえすには、「たまご」と「たまごがえし」の薬が必要です。かえしたいペットのたまごをタップし、「たまごをかえす」を選びます。次にペットの色にしたい「たまごがえしの薬」を選びます! 新しいペットを連れる(アバターのそばに表示する)には、メニュー > 動物小屋 > ペットでお好みのペットを選び、「連れる」を選びます。(表示を反映するための更新はすぐに動きません。主導で画面を更新して反映してください)\n\nペットを育てて乗騎にすることもできます。メニュー > 動物小屋 [ > ペット] でえさをやりましょう。ペットをタップし、次に「えさ」を選びます。ペットを乗騎にするにはたくさんのえさが必要ですが、お気に入りのえさだと、より早く成長します。いろいろ試してみてください。もしくは [ ネタバレ ] ( http://ja.habitica.wikia.com/wiki/%E3%81%88%E3%81%95%E3%81%AE%E5%A5%BD%E3%81%BF ) を見てください。乗騎に乗るには、メニュー > 動物小屋 > 乗騎 で、お好みの乗騎を選び、「連れる」を選んでください。(ここでもすぐに画面更新はされません)\n\nクエストによっては、達成することでクエスト ペットのたまごが手に入ります。(クエストについての詳しくは、以下をご覧ください)", diff --git a/website/common/locales/ja/front.json b/website/common/locales/ja/front.json index bfd3177b22..c36f9c182e 100644 --- a/website/common/locales/ja/front.json +++ b/website/common/locales/ja/front.json @@ -86,7 +86,7 @@ "landingend": "まだ決心がつきませんか?", "landingend2": "See a more detailed list of [our features](/static/overview). Are you looking for a more private approach? Check out our [administrative packages](/static/plans), which are perfect for families, teachers, support groups, and businesses.", "landingp1": "市場にある多くの生産性向上ツールには、使いつづけようとするインセンティブがありません。\nHabitica はこの問題を、習慣づけを楽しくすることで解決しました! 自分自身の成功にはごほうびを、失敗にはペナルティーを...。Habitica は、日々の行動で目標を達成するためのやる気を提供します。", - "landingp2": "Whenever you reinforce a positive habit, complete a daily task, or take care of an old to-do, Habitica immediately rewards you with Experience points and Gold. As you gain experience, you can level up, increasing your Stats and unlocking more features, like classes and pets. Gold can be spent on in-game items that change your experience or personalized rewards you've created for motivation. When even the smallest successes provide you with an immediate reward, you're less likely to procrastinate.", + "landingp2": "あなたが良い習慣を続けている時や、日課を完了させた時、古くなったTo-Doを片付けたとき、Habiticaでは経験値とゴールドの報酬が即座に手に入ります。経験を積むとレベルアップすることができ、能力値を上昇させたり、クラスやペットなどの更なる機能をアンロックすることができます。ゴールドはちょっとした気分転換をもたらすゲーム内のアイテムや、あなた自身がモチベーション向上の為に設定した個人的な報酬と引き換えられます。ほんの小さな成功でもすぐに報酬が得られるため、あなたは物事を先延ばしにしづらくなります。", "landingp2header": "簡単に得られる喜び", "landingp3": "実生活で、悪い習慣にふけったり、やるべき仕事をやらなかったりすると、ゲーム内のキャラクターは体力を失います。体力が低くなりすぎると、ゲーム内で積み上げた実績の一部を失ってしまいます。Habitica はこのように現実世界での問題をすぐにゲーム内に反映させることで、悪い習慣や先延ばしぐせを起こさないように、お手伝いします。", "landingp3header": "結果", @@ -275,8 +275,8 @@ "emailTaken": "このメールアドレスは、すでに登録されています。", "newEmailRequired": "新しいメールアドレスがありません。", "usernameTaken": "そのログイン名は既に使われています。", - "usernameWrongLength": "Login Name must be between 1 and 20 characters long.", - "usernameBadCharacters": "Login Name must contain only letters a to z, numbers 0 to 9, hyphens, or underscores.", + "usernameWrongLength": "ログイン名は1-20文字以内の長さでなくてはなりません。", + "usernameBadCharacters": "ログイン名はa-z, 0-9, ハイフン、アンダーバーだけで構成されていなくてはなりません。", "passwordConfirmationMatch": "パスワードが不一致です。", "invalidLoginCredentials": "ユーザー名とパスワードのいずれかまたは両方が無効です。", "passwordResetPage": "パスワードをリセットする", @@ -298,7 +298,7 @@ "signUpWithSocial": "<%= social %>で登録する", "loginWithSocial": "<%= social %>でログインする", "confirmPassword": "新しいパスワードを確認する", - "usernameLimitations": "Login Name must be 1 to 20 characters long, containing only letters a to z, or numbers 0 to 9, or hyphens, or underscores.", + "usernameLimitations": "ログイン名は1-20文字以内の長さで、a-z, 0-9, ハイフン、アンダーバーだけで構成されていなくてはなりません。", "usernamePlaceholder": "例: HabitRabbit", "emailPlaceholder": "例: rabbit@example.com", "passwordPlaceholder": "例: ******************", diff --git a/website/common/locales/ja/gear.json b/website/common/locales/ja/gear.json index c9fd4c2ad2..b1d2cc1585 100644 --- a/website/common/locales/ja/gear.json +++ b/website/common/locales/ja/gear.json @@ -3,7 +3,7 @@ "equipmentType": "種類", "klass": "クラス", "groupBy": "<%= type %> でグループ分け", - "classBonus": "(This item matches your class, so it gets an additional 1.5 Stat multiplier.)", + "classBonus": "(このアイテムはあなたのクラス用なので、能力値のボーナスが1.5倍になります。)", "classArmor": "クラスのよろい", "featuredset": "目玉商品 <%= name %>", "mysterySets": "ミステリー セット", @@ -81,7 +81,7 @@ "weaponSpecial0Text": "邪悪な魂の刃", "weaponSpecial0Notes": "敵の生命をえさにした力で、邪悪な一撃とします。力が <%= str %> 上がります。", "weaponSpecial1Text": "水晶の刃", - "weaponSpecial1Notes": "Its glittering facets tell the tale of a hero. Increases all Stats by <%= attrs %>.", + "weaponSpecial1Notes": "きらめくカッティングが勇者の伝説を物語ります。すべての能力値が <%= attrs %> 上がります。", "weaponSpecial2Text": "ステファン・ウェバーの竜のシャフト", "weaponSpecial2Notes": "内なるドラゴンの波動の潜在力を感じさせます。力と知覚がそれぞれ <%= attrs %> 上がります。", "weaponSpecial3Text": "ムステインのマイルストーン・マッシュ・モーニングスター", @@ -89,7 +89,7 @@ "weaponSpecialCriticalText": "バグつぶしの重大ハンマー", "weaponSpecialCriticalNotes": "このチャンピオンは、多くの戦士が倒れた GitHub 上の重大バグを叩きのめしました。バグの骨から作られたこのハンマーは、強力な会心の一撃を与えます。力と知覚がそれぞれ <%= attrs %> 上がります。", "weaponSpecialTakeThisText": "Take This の剣", - "weaponSpecialTakeThisNotes": "This sword was earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", + "weaponSpecialTakeThisNotes": "この剣は、Take This 提供のチャレンジに参加することで手に入れることができます。おめでとう! すべての能力値が <%= attrs %> 上がります。", "weaponSpecialTridentOfCrashingTidesText": "荒波のトライデント", "weaponSpecialTridentOfCrashingTidesNotes": "魚に命令する能力がつきます。また、タスクに深い傷を与えます。知能が <%= int %> 上がります。", "weaponSpecialTaskwoodsLanternText": "タスクの森のランタン", @@ -113,13 +113,13 @@ "weaponSpecialTachiText": "サムライの太刀", "weaponSpecialTachiNotes": "この反りのある軽い刀は、あなたのタスクを細切れにしてしまうでしょう!力が<%= str %>上昇します。", "weaponSpecialAetherCrystalsText": "エーテルクリスタル", - "weaponSpecialAetherCrystalsNotes": "These bracers and crystals once belonged to the Lost Masterclasser herself. Increases all Stats by <%= attrs %>.", + "weaponSpecialAetherCrystalsNotes": "これらの籠手とクリスタルはかつて失われしクラス・マスター本人が所持していたものです。すべての能力値が <%= attrs %> 上がります。", "weaponSpecialYetiText": "雪男使いのやり", "weaponSpecialYetiNotes": "このやりを使えば、どんな雪男にも命令できます。力が <%= str %> 上がります。2013年-2014年冬の限定装備。", "weaponSpecialSkiText": "スノアイパーのポール", "weaponSpecialSkiNotes": "敵の大群を破壊することができる武器! また、とても素晴らしいパラレルターンをするのにも役立ちます。力が <%= str %> 上がります。2013年-2014年冬の限定装備。", "weaponSpecialCandycaneText": "キャンディー棒のつえ", - "weaponSpecialCandycaneNotes": "A powerful mage's staff. Powerfully DELICIOUS, we mean! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2013-2014 Winter Gear.", + "weaponSpecialCandycaneNotes": "強力な魔道士の杖ーつまり、とても美味しい杖!知能が<%= int %>、知覚が<%= per %>上がります。2013-2014冬の限定装備。", "weaponSpecialSnowflakeText": "雪の結晶のつえ", "weaponSpecialSnowflakeNotes": "このつえは無限のいやしの力で輝いています。知能が <%= int %> 上がります。2013年-2014年冬の限定装備。", "weaponSpecialSpringRogueText": "かぎづめ", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "この着心地の良いセーターはじゅうたんで空を飛んでいる間も暖かさを保ってくれます! 効果なし。2017年11月寄付会員アイテム。", "armorMystery201712Text": "ろうそく術士のよろい", "armorMystery201712Notes": "この魔法のよろいが生み出す光と熱はあなたの心を温めてくれますが、やけどすることはありません! 効果なし。2017年12月寄付会員アイテム。", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "スチームパンクスーツ", "armorMystery301404Notes": "なんて小粋で最先端! 効果なし。3015年2月寄付会員アイテム。", "armorMystery301703Text": "スチームパンクなクジャクのガウン", @@ -984,6 +986,8 @@ "headMystery201710Notes": "このヘルメットはあなたを威圧的に見せてくれます…でも、あなたの奥行き知覚能力には何の恩恵ももたらしません! 効果なし。2017年10月寄付会員アイテム。", "headMystery201712Text": "ろうそく術師の冠", "headMystery201712Notes": "一番暗い冬の夜でも、この冠が光とぬくもりをもたらしてくれます。効果なし。2017年12月寄付会員アイテム。", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "かわいいシルクハット", "headMystery301404Notes": "良家中の良家の方々のためのかわいいシルクハット! 3015年1月寄付会員アイテム。効果なし。", "headMystery301405Text": "ベーシックなシルクハット", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "この溶岩で作られた凸凹の盾は、あなたを悪い習慣から守ります。あなたの手が焦げる心配はありません。効果なし。2017年8月寄付会員アイテム。", "shieldMystery201709Text": "魔法術ハンドブック", "shieldMystery201709Notes": "この本は魔術という新たな分野へ足を踏み入れんとするあなたをナビゲートしてくれます。効果なし。2017年9月寄付会員アイテム。", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "時計の盾", "shieldMystery301405Notes": "このそびえ立つ時計の盾とともに時はあなたの側にある! 効果なし。3015年寄付会員アイテム。", "shieldMystery301704Text": "ひらひらの扇子", @@ -1417,7 +1423,7 @@ "headAccessoryMystery301405Text": "かぶるためのゴーグル", "headAccessoryMystery301405Notes": "「ゴーグルは目にかけるものだ」、「頭にのせるだけのゴーグルなんてだれも要らないぞ」ってヤツらはいうけど、ハハッ! 見せつけてやりましょう。効果なし。3015年8月寄付会員アイテム。", "headAccessoryArmoireComicalArrowText": "お笑いの矢", - "headAccessoryArmoireComicalArrowNotes": "This whimsical item doesn't provide a Stat boost, but it sure is good for a laugh! Confers no benefit. Enchanted Armoire: Independent Item.", + "headAccessoryArmoireComicalArrowNotes": "この妙なアイテムは何の能力も上げません。でも笑うことはいいことです!効果なし。ラッキー宝箱 : 個別のアイテム。", "eyewear": "アイウエア", "eyewearCapitalized": "アイウェア", "eyewearBase0Text": "アイウエアなし", @@ -1462,5 +1468,5 @@ "eyewearMystery301703Notes": "派手な仮面舞踏会や、身なりの良い群衆の中をひっそりと動くのに最適である。効果なし。3017年3月寄付会員アイテム。", "eyewearArmoirePlagueDoctorMaskText": "ペスト専門医のマスク", "eyewearArmoirePlagueDoctorMaskNotes": "「先延ばし」という名のペスト(伝染病)とたたかった医師が着けていた信頼のおけるマスク。効果なし。ラッキー宝箱 : ペスト専門医セット( 3 個中 2 個目のアイテム)。", - "twoHandedItem": "Two-handed item." + "twoHandedItem": "両手持ちのアイテムです。" } \ No newline at end of file diff --git a/website/common/locales/ja/generic.json b/website/common/locales/ja/generic.json index 0486f784cd..2922c564ac 100644 --- a/website/common/locales/ja/generic.json +++ b/website/common/locales/ja/generic.json @@ -64,7 +64,7 @@ "subscriberItemText": "毎月、寄付会員にはミステリー アイテムが贈られます。通常、月の終わりの1週間前ごろにお届けします。詳しくはWiki の「ミステリー アイテム」のページをご覧ください。", "all": "すべて", "none": "なし", - "more": "<%= count %> more", + "more": "あと <%= count %>", "and": "かつ", "loginSuccess": "ログインに成功しました!", "youSure": "本当によろしいですか?", @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu のテーマ", "audioTheme_beatscribeNesTheme": "Beatscribeのファミコン音源テーマ", "audioTheme_arashiTheme": "Arashiのテーマ", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasolのテーマ", "audioTheme_spacePenguinTheme": "SpacePenguinのテーマ", "audioTheme_maflTheme": "MAFL テーマ", @@ -168,8 +169,8 @@ "achievementBewilderText": "2016年春の元気なダンス イベントで、「まどわしのビ・ワイルダー」の打倒に協力しました!", "checkOutProgress": "Habiticaでの私の成長を見てください!", "cards": "カード", - "sentCardToUser": "You sent a card to <%= profileName %>", - "cardReceivedFrom": "<%= cardType %> from <%= userName %>", + "sentCardToUser": "<%= profileName %>にカードを送りました", + "cardReceivedFrom": "<%= userName %>からの<%= cardType %>", "cardReceived": "<%= card %>カードが届きました!", "greetingCard": "あいさつのカード", "greetingCardExplanation": "お二人とも、Kawaii 実績を解除しました!", @@ -263,7 +264,7 @@ "self_care": "セルフケア", "habitica_official": "Habitica 公式", "academics": "学術分野", - "advocacy_causes": "Advocacy + Causes", + "advocacy_causes": "主張・提言", "entertainment": "エンタメ", "finance": "ファイナンス", "health_fitness": "健康・フィットネス", @@ -273,14 +274,14 @@ "getting_organized": "整理整頓", "self_improvement": "自己啓発", "spirituality": "精神性", - "time_management": "Time-Management + Accountability", + "time_management": "時間管理・アカウンタビリティ", "recovery_support_groups": "回復・支援のためのグループ", - "dismissAll": "Dismiss All", + "dismissAll": "すべて閉じる", "messages": "メッセージ", "emptyMessagesLine1": "メッセージはありません", "emptyMessagesLine2": "メッセージを送って会話を始めましょう!", "userSentMessage": "<%= user %>からのメッセージが届きました。", - "letsgo": "Let's Go!", + "letsgo": "レッツゴー!", "selected": "選択中", "howManyToBuy": "いくつ買いますか?", "habiticaHasUpdated": "新しいバージョンがあります。ページを再読み込みして更新してください!" diff --git a/website/common/locales/ja/groups.json b/website/common/locales/ja/groups.json index dcbc308105..595e5ca0ca 100644 --- a/website/common/locales/ja/groups.json +++ b/website/common/locales/ja/groups.json @@ -3,7 +3,7 @@ "tavernChat": "キャンプ場", "innCheckOut": "ロッジをチェックアウト", "innCheckIn": "ロッジで休む", - "innText": "You're resting in the Inn! While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day. Be warned: If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies unless they are also in the Inn! Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn.", + "innText": "あなたはロッジで休んでいます! ロッジにチェックインしている間、一日の終わりに日課が未実施でもダメージを受けません、しかし日課は毎日リフレッシュされます。注意: もしあなたがボスクエストに参加しているのなら、あなたのパーティの仲間が日課をし損ねたとき、その仲間もロッジに泊まっていない限り、あなたはダメージを受けます! また、あなたのボスへのダメージ(または収集したアイテム)はロッジをチェックアウトするまで適用されません。", "innTextBroken": "You're resting in the Inn, I guess... While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day... If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies... unless they are also in the Inn... Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn... so tired...", "helpfulLinks": "便利なリンク集", "communityGuidelinesLink": "コミュニティー ガイドライン", @@ -38,32 +38,32 @@ "createAParty": "パーティーを作る", "updatedParty": "パーティの設定が更新されました。", "errorNotInParty": "パーティーに参加していません", - "noPartyText": "You are either not in a Party or your Party is taking a while to load. You can either create one and invite friends, or if you want to join an existing Party, have them enter your Unique User ID below and then come back here to look for the invitation:", - "LFG": "To advertise your new Party or find one to join, go to the <%= linkStart %>Party Wanted (Looking for Group)<%= linkEnd %> Guild.", - "wantExistingParty": "Want to join an existing Party? Go to the <%= linkStart %>Party Wanted Guild<%= linkEnd %> and post this User ID:", + "noPartyText": "パーティーに参加していないか、パーティーの読み込みに時間がかかっています。あなたは新しいパーティを作成して友達を招待することもできます。既存のパーティーに参加したい場合は、以下にあるあなたのユニークユーザーIDを相手に入力してもらったのち、ここに戻って来て招待状が届くのを待つとよいでしょう:", + "LFG": "新しく作ったパーティーを宣伝するときや、参加できるパーティーを探すときは、 <%= linkStart %> パーティ求む (グループを探す)<%= linkEnd %>ギルドへ行きましょう。", + "wantExistingParty": "すでにあるパーティーに加わりたいですか? <%= linkStart %>パーティー募集ギルド<%= linkEnd %>で、以下の User ID を投稿してみましょう:", "joinExistingParty": "すでにあるパーティーに参加する", - "needPartyToStartQuest": "Whoops! You need to create or join a Party before you can start a quest!", + "needPartyToStartQuest": "残念! クエストをはじめるにはパーティーに所属するか、新しいパーティーを作成してください!", "createGroupPlan": "作る", "create": "作る", "userId": "ユーザー ID", "invite": "招待する", "leave": "やめる", - "invitedToParty": "You were invited to join the Party <%= party %>", - "invitedToPrivateGuild": "You were invited to join the private Guild <%= guild %>", - "invitedToPublicGuild": "You were invited to join the Guild <%= guild %>", - "partyInvitationsText": "You have <%= numberInvites %> Party invitations! Choose wisely, because you can only be in one Party at a time.", - "joinPartyConfirmationText": "Are you sure you want to join the Party \"<%= partyName %>\"? You can only be in one Party at a time. If you join, all other Party invitations will be rejected.", + "invitedToParty": "パーティー「<%= party %>」に招待されました。", + "invitedToPrivateGuild": "<%= guild %> プライベートギルドに招待されました。", + "invitedToPublicGuild": "<%= guild %> ギルドに招待されました。", + "partyInvitationsText": "パーティーへの招待が <%= numberInvites %> 通届いています! パーティーは一度にひとつしか参加できないので、よく考えて選んでください。", + "joinPartyConfirmationText": "本当に「<%= partyName %>」に参加しますか? パーティーは一度にひとつしか参加できません。参加すると、他のすべてのパーティーの招待を辞退することになります。", "invitationAcceptedHeader": "招待が受けられました", "invitationAcceptedBody": "<%= username %> は、あなたからの <%= groupName %> への招待にこたえました。", "joinNewParty": "新しいパーティーに参加する", "declineInvitation": "招待を断る", - "partyLoading1": "Your Party is being summoned. Please wait...", - "partyLoading2": "Your Party is coming in from battle. Please wait...", - "partyLoading3": "Your Party is gathering. Please wait...", - "partyLoading4": "Your Party is materializing. Please wait...", + "partyLoading1": "パーティーを招集しています。お待ちください…", + "partyLoading2": "パーティーは戦闘から戻っているところです。お待ちください…", + "partyLoading3": "パーティーに集合をかけています。お待ちください…", + "partyLoading4": "パーティーを物質化しています。お待ちください…", "systemMessage": "システム メッセージ", - "newMsgGuild": "<%= name %> has new posts", - "newMsgParty": "Your Party, <%= name %>, has new posts", + "newMsgGuild": "<%= name %> に新しい投稿があります", + "newMsgParty": "あなたのパーティー、<%= name %> に新しい投稿があります", "chat": "チャット", "sendChat": "チャット送信", "toolTipMsg": "最新のメッセージを取得する", @@ -83,7 +83,7 @@ "assignLeader": "グループリーダー指定", "members": "メンバー", "memberList": "メンバーリスト", - "partyList": "Order for Party members in header", + "partyList": "ヘッダーに表示するパーティーメンバーの順番", "banTip": "メンバーを解雇", "moreMembers": "メンバー一覧", "invited": "招待された方", @@ -100,26 +100,26 @@ "guild": "ギルド", "guilds": "ギルド", "guildsLink": "ギルド", - "sureKick": "Do you really want to remove this member from the Party/Guild?", + "sureKick": "本当にパーティ/ギルドからこのメンバーを削除してよろしいですか?", "optionalMessage": "必須でないメッセージ", "yesRemove": "はい、削除してください。", "foreverAlone": "自作のメッセージの「いいね」はできません。そんな人にならないで。", - "sortDateJoinedAsc": "Earliest Date Joined", - "sortDateJoinedDesc": "Latest Date Joined", + "sortDateJoinedAsc": "加入日が古い", + "sortDateJoinedDesc": "加入日が新しい", "sortLoginAsc": "Earliest Login", "sortLoginDesc": "Latest Login", - "sortLevelAsc": "Lowest Level", - "sortLevelDesc": "Highest Level", - "sortNameAsc": "Name (A - Z)", - "sortNameDesc": "Name (Z - A)", - "sortTierAsc": "Lowest Tier", - "sortTierDesc": "Highest Tier", + "sortLevelAsc": "最小レベル", + "sortLevelDesc": "最大レベル", + "sortNameAsc": "名前(A -Z順)", + "sortNameDesc": "名前(Z -A順)", + "sortTierAsc": "最小段位", + "sortTierDesc": "最大段位", "confirmGuild": "ジェム4個でギルドを作成しますか?", "leaveGroupCha": "ギルドのチャレンジをやめて...", "confirm": "確認", - "leaveGroup": "Leave Guild", - "leavePartyCha": "Leave Party challenges and...", - "leaveParty": "Leave Party", + "leaveGroup": "ギルドを脱退", + "leavePartyCha": "このパーティーのチャレンジを脱退し、そして...", + "leaveParty": "パーティーを脱退", "sendPM": "プライベートメッセージを送信する", "send": "送信する", "messageSentAlert": "メッセージを送信しました", @@ -144,7 +144,7 @@ "report": "報告", "abuseFlag": "コミュニティガイドライン違反を報告する", "abuseFlagModalHeading": "<%= name %> を違反で報告しますか?", - "abuseFlagModalBody": "Are you sure you want to report this post? You should ONLY report a post that violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Inappropriately reporting a post is a violation of the Community Guidelines and may give you an infraction. Appropriate reasons to flag a post include but are not limited to:

", + "abuseFlagModalBody": "本当にこの投稿について報告しますか?  投稿の報告は、それが<%= firstLinkStart %>コミュニティー ガイドライン<%= linkEnd %>および<%= secondLinkStart %>利用規約<%= linkEnd %>のいずれかまたは両方に違反している場合に限定すべきです。不適切に報告することは、コミュニティ ー ガイドライン上の違反行為であり、あなたが違反者とみなされます。投稿を報告すべき適切な理由は以下の通りであり、またこれらに限定するものではありません :

", "abuseFlagModalButton": "違反を報告する", "abuseReported": "違反報告ありがとうございます。モデレータに通知されます。", "abuseAlreadyReported": "このメッセージは報告済みです。", @@ -158,9 +158,9 @@ "leaderOnlyChallenges": "グループリーダーだけがチャレンジを作成できます", "sendGift": "贈り物を送る", "inviteFriends": "友達を招待する", - "partyMembersInfo": "Your Party currently has <%= memberCount %> members and <%= invitationCount %> pending invitations. The limit of members in a Party is <%= limitMembers %>. Invitations above this limit cannot be sent.", + "partyMembersInfo": "現在、あなたのパーティは<%= memberCount %> 人のメンバーと、<%= invitationCount %> 件の保留された招待があります。パーティメンバーの人数の上限は<%= limitMembers %>人です。この上限を超えた招待は送信されません。", "inviteByEmail": "メールで招待する", - "inviteByEmailExplanation": "If a friend joins Habitica via your email, they'll automatically be invited to your Party!", + "inviteByEmailExplanation": "あなたのメールから友達が Habitica に参加した場合、自動的にあなたのパーティーに招待されます。", "inviteMembersHowTo": "Invite people via a valid email or 36-digit User ID. If an email isn't registered yet, we'll invite them to join Habitica.", "inviteFriendsNow": "すぐに友達を招待する", "inviteFriendsLater": "後で友達を招待する", @@ -186,28 +186,27 @@ "battleWithFriends": "フレンドと一緒にモンスターと戦う", "startPartyWithFriends": "友達といっしょにパーティーをつくりましょう!", "startAParty": "チームを作る", - "addToParty": "Add someone to your Party", + "addToParty": "パーティーメンバーを追加する", "likePost": "この投稿が気に入ったらクリックしてください!", "partyExplanation1": "Habitica を友達といっしょにプレーすると責任感が生まれます!", "partyExplanation2": "モンスターと戦い、チャレンジをつくりましょう!", "partyExplanation3": "友達を招待して、クエストの巻物をゲットしましょう!", - "wantToStartParty": "Do you want to start a Party?", - "exclusiveQuestScroll": "Inviting a friend to your Party will grant you an exclusive Quest Scroll to battle the Basi-List together!", - "nameYourParty": "Name your new Party!", - "partyEmpty": "You're the only one in your Party. Invite your friends!", - "partyChatEmpty": "Your Party chat is empty! Type a message in the box above to start chatting.", + "wantToStartParty": "新しくパーティーを作りますか?", + "exclusiveQuestScroll": "パーティーに友達を招待すると、ボスモンスター「バシ・リスト」と戦える限定クエストの巻物が贈られます!", + "nameYourParty": "新しいパーティーに名前をつけましょう!", + "partyEmpty": "パーティーのメンバーはあなただけです。友達を招待しましょう!", + "partyChatEmpty": "パーティー チャットがまっ白です! 上のボックスにメッセージを書いてチャットをはじめましょう。", "guildChatEmpty": "こちらのギルド チャットはまっ白です! 上のボックスにメッセージを書いてチャットをはじめましょう。", - "requestAcceptGuidelines": "If you would like to post messages in the Tavern or any Party or Guild chat, please first read our <%= linkStart %>Community Guidelines<%= linkEnd %> and then click the button below to indicate that you accept them.", + "requestAcceptGuidelines": "キャンプ場チャットやどこかのギルド チャットにメッセージを投稿したいと思ったら、まず<%= linkStart %>コミュニティ ガイドライン<%= linkEnd %>を読み、それを認めたうえで下のボタンを押してください。", "partyUpName": "パーティー参加", "partyOnName": "パーティーは続く", "partyUpText": "別の人のパーティーに参加しました! 楽しんで、モンスターと戦ってお互いを助け合いましょう。", "partyOnText": "4人以上のパーティーに参加しました! 責任感が強くなったことを楽しんで、自分自身の敵と戦うために友達と協力しましょう!", - "largeGroupNote": "注 : このギルドは巨大すぎて、通知ができません! ご自身で毎日チェックしてください。", "groupIdRequired": "\"groupId\" の UUID が無効です。", "groupNotFound": "グループが見つからなかったか、アクセスできません。", "groupTypesRequired": "有効な \"type\" のクエリー文字列を指定してください。", - "questLeaderCannotLeaveGroup": "You cannot leave your Party when you have started a quest. Abort the quest first.", - "cannotLeaveWhileActiveQuest": "You cannot leave Party during an active quest. Please leave the quest first.", + "questLeaderCannotLeaveGroup": "クエストを開始した人は、パーティーを抜けられません。まず、クエストを中止してください。", + "cannotLeaveWhileActiveQuest": "クエスト中は、パーティーを抜けられません。まず、クエストから抜けてください。", "onlyLeaderCanRemoveMember": "グループリーダーだけが、メンバーを削除できます!", "cannotRemoveCurrentLeader": "グループリーダーを削除することはできません。先に新しいリーダーを指定してください。", "memberCannotRemoveYourself": "自分自身を削除することはできません!", @@ -220,11 +219,11 @@ "inviteMissingUuid": "招待の送り先ユーザーIDが見つかりません", "inviteMustNotBeEmpty": "招待は空のままでは受け付けません。", "partyMustbePrivate": "パーティーは、プライベートでなくてはなりません。", - "userAlreadyInGroup": "ユーザーは、すでにグループにいます。", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "自分自身をグループに招待することはできません。", - "userAlreadyInvitedToGroup": "ユーザーは、すでにグループに招待されています。", - "userAlreadyPendingInvitation": "ユーザーは、すでに招待への返事を保留しています。", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "ID が「<%= userId %>」のユーザーは見つかりません。", "userHasNoLocalRegistration": "ユーザーはこのサーバーへの登録 ( ユーザー名、メールアドレス、パスワード ) がありません。", "uuidsMustBeAnArray": "ユーザーID を正確に入力してください。", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/ja/inventory.json b/website/common/locales/ja/inventory.json index f9730a68bd..7da5921412 100644 --- a/website/common/locales/ja/inventory.json +++ b/website/common/locales/ja/inventory.json @@ -1,8 +1,8 @@ { - "noItemsAvailableForType": "You have no <%= type %>.", - "foodItemType": "Food", - "eggsItemType": "Eggs", - "hatchingPotionsItemType": "Hatching Potions", - "specialItemType": "Special items", - "lockedItem": "Locked Item" + "noItemsAvailableForType": "<%= type %>を持っていません。", + "foodItemType": "えさ", + "eggsItemType": "たまご", + "hatchingPotionsItemType": "たまごがえしの薬", + "specialItemType": "特別なアイテム", + "lockedItem": "ロックされたアイテム" } diff --git a/website/common/locales/ja/limited.json b/website/common/locales/ja/limited.json index 37f128d4ff..70e66e3938 100644 --- a/website/common/locales/ja/limited.json +++ b/website/common/locales/ja/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "秋の収穫祭、万歳!! 今しか手に入らないレアなアイテムはいかがですか? 10月31日までの限定販売ですよ!", "seasonalShopWinterText": "冬のワンダーランド、万歳!! 今しか手に入らないレアなアイテムはいかがですか? 1月31日までの限定販売ですよ!", "seasonalShopFallTextBroken": "ああ......季節の店へよくぞお越しを...いまは秋の期間限定版グッズやなんかをとりそろえ...こちらはどれも、毎年の秋まつりイベント期間のみの商品で、当店は10月31日までの限定オープン...今すぐ買っておかないと、ずっと...ずっと...ずっと待つことになる...(ため息)", + "seasonalShopBrokenText": "私の大切なあずまやが!! 私のすてきな飾りつけが! ああ、ディスハートナーに何もかも壊されてしまいました……。(T_T) 私が季節の店を建て直せるように、キャンプ場であの怪物を仕留めるのを手伝ってください!", "seasonalShopRebirth": "この中の装備で、以前に買ったけれど、現在もっていないものは、「ごほうび」列でもう一度買うことができます。初期状態では、その時点でのクラス ( 標準では戦士 ) のアイテムしか買えませんが、ご心配なく。クラスを変更すれば、そのクラス用のアイテムを買えるようになります。", "candycaneSet": "キャンディー棒 (魔道士)", "skiSet": "スノアイパー(盗賊)", @@ -125,7 +126,7 @@ "dateEndOctober": "10月31日", "dateEndNovember": "11月30日", "dateEndJanuary": "1月31日", - "dateEndFebruary": "February 28", + "dateEndFebruary": "2月28日", "winterPromoGiftHeader": "寄付を誰かに贈って、無料で寄付会員になろう!", "winterPromoGiftDetails1": "1月12日までの間に限り、誰かに寄付会員の権利を贈ると、同じだけの期間分、無料で寄付会員になれます!", "winterPromoGiftDetails2": "もしあなたやギフトの相手がすでに寄付会員の権利を持っている場合、ギフトによる寄付権は、既存の寄付の期限が切れるかキャンセルされた後に有効になります。ご注意ください。皆様のサポートに感謝します! <3", diff --git a/website/common/locales/ja/messages.json b/website/common/locales/ja/messages.json index bef9b8549c..1eeb41f699 100644 --- a/website/common/locales/ja/messages.json +++ b/website/common/locales/ja/messages.json @@ -9,8 +9,8 @@ "messageCannotFeedPet": "このペットにはエサをあげられません", "messageAlreadyMount": "既にその乗騎は所持しています。他のペットにエサをあげてみましょう。", "messageEvolve": "<%= egg %> はあなたに懐きました。 一緒に出かけましょう!", - "messageLikesFood": "<%= egg %> really likes <%= foodText %>!", - "messageDontEnjoyFood": "<%= egg %> eats <%= foodText %> but doesn't seem to enjoy it.", + "messageLikesFood": "<%= egg %>は<%= foodText %>が大好きなようです!", + "messageDontEnjoyFood": "<%= egg %>は<%= foodText %>を食べましたが、あまり好きではないようです。", "messageBought": "<%= itemText %> を購入しました", "messageEquipped": "<%= itemText %>を装備しました", "messageUnEquipped": "<%= itemText %>を外しました。", @@ -21,7 +21,7 @@ "messageNotEnoughGold": "ゴールドが不足しています", "messageTwoHandedEquip": "<%= twoHandedText %>は両手を使って振り回すので、<%= offHandedText %>を装備から外しました。", "messageTwoHandedUnequip": "<%= offHandedText %>を装備したので、両手を使って振り回す<%= twoHandedText %>を装備から外しました。", - "messageDropFood": "You've found <%= dropText %>!", + "messageDropFood": "<%= dropText %>を見つけました!", "messageDropEgg": "<%= dropText %>のたまごを見つけました! ", "messageDropPotion": "<%= dropText %>「たまごがえしの薬」を見つけました! ", "messageDropQuest": "クエストを見つけました!", @@ -33,7 +33,7 @@ "messageHealthAlreadyMax": "体力はすでに最大です。", "messageHealthAlreadyMin": "ああ、なんてこと! すでに体力が尽きているので、今から体力回復の薬を買っても仕方ありません。でも心配しないでください ー あなたは復活できます!", "armoireEquipment": "<%= image %>宝箱に貴重な装備を見つけました : <%= dropText %>! 素晴らしい!", - "armoireFood": "<%= image %> You rummage in the Armoire and find <%= dropText %>. What's that doing in here?", + "armoireFood": "<%= image %>宝箱をあさって<%= dropText %>を見つけました。何でこんな所に?", "armoireExp": "宝箱と格闘して、経験値を得ました。どうぞっ!", "messageInsufficientGems": "ジェムが足りません!", "messageAuthPasswordMustMatch": ":password と :confirmPassword が一致していません。", @@ -59,6 +59,6 @@ "messageUserOperationNotFound": "<%= operation %> の操作は見つかりません", "messageNotificationNotFound": "通知はありません。", "notificationsRequired": "通知 ID が必要です。", - "unallocatedStatsPoints": "You have <%= points %> unallocated Stat Points", + "unallocatedStatsPoints": "<%= points %>ポイントが割り当てできます。", "beginningOfConversation": "<%= userName %>との会話の始まりです。相手に対して思いやりと敬意を持ち、コミュニティガイドラインを守ることを忘れないでください!" } \ No newline at end of file diff --git a/website/common/locales/ja/npc.json b/website/common/locales/ja/npc.json index cfb5b9369f..7f26beba23 100644 --- a/website/common/locales/ja/npc.json +++ b/website/common/locales/ja/npc.json @@ -11,7 +11,7 @@ "introTour": "Here we are! I've filled out some Tasks for you based on your interests, so you can get started right away. Click a Task to edit or add new Tasks to fit your routine!", "prev": "前へ", "next": "次へ", - "randomize": "Randomize", + "randomize": "ランダム化", "mattBoch": "Matt Boch", "mattShall": "<%= name %>、馬をお連れしましょうか? ペットに十分なエサを与えると乗騎となり、ここに現れます。さあ、またがりましょう!", "mattBochText1": "動物小屋にようこそ! 私の名前はMatt、猛獣使いだ。レベル3 から、「たまご」と「たまごがえしの薬」を使って、たまごからペットをかえすことができる。市場でペットをかえすと、ここに表示されるぞ! ペットの画像をクリックしてアバターに追加しよう。レベル 3 以降に見つかるえさをペットにやると、ペットはしっかりした乗騎へと育っていくんだ。", @@ -31,8 +31,8 @@ "danielText2": "注意 : ボス クエストに参加している間は、パーティーの仲間が日課をサボると、ボスはあなたを攻撃しダメージを受けます! また、あなたがボスに与えるはずのダメージ ( そして集められたはずのアイテム ) はロッジをチェックアウトするまで適用されません。", "danielTextBroken": "キャンプ場へようこそ...よろしければ...休息が必要なら、ロッジにお泊りください...チェックインしている間は、日課をやらずに1日を終えてもダメージを受けない。もちろん日課をやってもかまわない...もしエネルギーがあるのなら...", "danielText2Broken": "おや...ボス クエストに参加しているのなら、ボスはパーティーの仲間が日課をサボった分のダメージは与えてきますよ...また、あなたからボスへのダメージ(または、落としていくアイテム) は、ロッジに泊まっている間は発生しません...", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "ワールドボスイベント", + "worldBossDescription": "ワールドボス概要", "alexander": "Alexanderの店", "welcomeMarket": "マーケットへようこそ! そうそう見つからない「たまご」と「たまごがえしの薬」はいりませんか? 余ったアイテムを売ってください! 便利なサービスを受けてください! なんなりとお申しつけください。", "welcomeMarketMobile": "市場へようこそ! なかなか見つからない「たまご」や「たまごがえしの薬」はいかがですか? どうぞ見ていってください。", @@ -44,7 +44,7 @@ "yourBalance": "あなたの残高", "sell": "売る", "buyNow": "今すぐ買う", - "sortByNumber": "Number", + "sortByNumber": "数", "featuredItems": "注目アイテム!", "hideLocked": "ロックされたアイテムを隠す", "hidePinned": "ピン留めされたアイテムを隠す", diff --git a/website/common/locales/ja/pets.json b/website/common/locales/ja/pets.json index 67b1bd9a49..bab25860f2 100644 --- a/website/common/locales/ja/pets.json +++ b/website/common/locales/ja/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "青紫のグリフォン", "phoenix": "不死鳥", "magicalBee": "不思議なハチ", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "希望に満ちたヒッポグリフ", + "hopefulHippogriffMount": "希望に満ちたヒッポグリフ", "royalPurpleJackalope": "高貴な紫のジャッカロープ", "invisibleAether": "不可視のエーテル獣", "rarePetPop1": "金色の足跡をクリックすると、Habitica への貢献で、この貴重なペットを入手する詳しい方法がわかります!", @@ -83,7 +83,7 @@ "petNotOwned": "このペットをもっていません。", "mountNotOwned": "この乗騎をもっていません。", "earnedCompanion": "あなたの前向きな行動の一つひとつから、新しい仲間が生まれました。えさをやって成長させましょう!", - "feedPet": "Feed <%= text %> to your <%= name %>?", + "feedPet": "<%= name %>に<%= text %>をやりますか?", "useSaddle": "<%= pet %>にくらをおきますか?", "raisedPet": "<%= pet %>を育てた!", "earnedSteed": "多くのタスクを達成して、忠実な乗騎を手に入れた!", @@ -124,7 +124,7 @@ "welcomeStable": "動物小屋へようこそ!", "welcomeStableText": "私の名前はマット、猛獣使いだ。レベル3 から、「たまご」と「たまごがえしの薬」を使って、たまごからペットをかえすことができる。「所持品」からペットをかえすと、ここに表示されるぞ! ペットの画像をクリックしてアバターに追加しよう。レベル 3 以降に見つかるえさをペットにやると、ペットはしっかりした乗騎へと育っていくんだ。", "petLikeToEat": "ペットのえさの好みは?", - "petLikeToEatText": "ペットはあなたが何をあげても成長しますが、好みのえさをあげればより速く成長します。パターンを見つけるために試してみるか、こちらの答えをご覧ください。
http://ja.habitica.wikia.com/wiki/えさの好み", + "petLikeToEatText": "ペットはあなたが何をあげても成長しますが、好みのえさをあげればより速く成長します。パターンを見つけるために試してみるか、こちらの答えをご覧ください。
http://ja.habitica.wikia.com/wiki/えさの好み", "filterByStandard": "一般", "filterByMagicPotion": "魔法の薬", "filterByQuest": "クエスト", diff --git a/website/common/locales/ja/quests.json b/website/common/locales/ja/quests.json index b0aef000d6..730d9284db 100644 --- a/website/common/locales/ja/quests.json +++ b/website/common/locales/ja/quests.json @@ -121,9 +121,9 @@ "questBundles": "割引されたクエスト セット", "buyQuestBundle": "クエスト セットを買う", "noQuestToStart": "クエストを開始できませんか?新しいものがないか、クエストショップをチェックしてみましょう!", - "pendingDamage": "<%= damage %> pending damage", - "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health", - "rageAttack": "Rage Attack:", - "bossRage": "<%= currentRage %> / <%= maxRage %> Rage", - "rageStrikes": "Rage Strikes" + "pendingDamage": "<%= damage %> 保留中のダメージ", + "bossHealth": "体力 <%= currentHealth %> / <%= maxHealth %>", + "rageAttack": "怒り攻撃:", + "bossRage": "怒り <%= currentRage %> / <%= maxRage %>", + "rageStrikes": "怒りの一撃" } \ No newline at end of file diff --git a/website/common/locales/ja/questscontent.json b/website/common/locales/ja/questscontent.json index dc4f00fd4e..5a9bfa8ebe 100644 --- a/website/common/locales/ja/questscontent.json +++ b/website/common/locales/ja/questscontent.json @@ -564,16 +564,19 @@ "questBadgerBoss": "厄介者のおねグマ", "questBadgerDropBadgerEgg": "アナグマ( たまご )", "questBadgerUnlockText": "市場でのアナグマのたまご購入をアンロック", - "questDysheartenerText": "The Dysheartener", - "questDysheartenerNotes": "ぞっとするような衝撃音が空気を引き裂いたそのとき、バレンタインデーの朝日が昇るところでした。青ざめたピンク色に輝く炎がすべての建物を貫き、Habitシティの大通り一帯のレンガは深い亀裂を生じて砕けます。この世のものではないような叫び声が響き渡り、無様な姿をさらす割れガラスの山が地割れからすべり落ちていきます。

顎がカチカチ鳴り、甲羅はギラギラと輝き、重なった足が宙に広がります。その虫のような怪物が後ろ足で立ち上がり、この世で最もおぞましい、恐るべきDysheartenerそのものを目にして人々は悲鳴を上げ始めました。それは勤勉なHabiticanの希望を食いちぎらんと、期待に満ちた吠え声をあげて突進してきます。とげとげの足がこすれてきしむ音を聞くと、あなたは胸が絶望で締め上げられるような気持ちに囚われます。

「皆さん、気を強く持って!」Lemonessが叫びます。「きっと私たちが食べやすいエサだと思っているのでしょうね。多くの人々が新年の誓いをあきらめてしまったから。ですが、Habiticanが目標をやり遂げる力を持っていることを、これから思い知らせてやろうじゃないですか!」

AnnDeLuneは杖をかかげました。「さあみんなでタスクに取り組んで、この怪物を倒しましょう!」", - "questDysheartenerCompletion": "Dysheartenerを倒しました!

共に、Habiticaのすべての人が自分のタスクに最後の一撃を食らわせ、Dysheartenerは棹立ちになっておびえた声をあげます。「どうしました、Dysheartener?」 AnnDeLuneは目を光らせて呼びかけます。「怖気づいたのですか?」

ピンク色に発光する裂け目がDysheartenerの外殻に生じ、ピンク色の煙になって飛び散りました。活力と決意の新たな感覚が大地を吹き荒れ、心地よく甘い雨がにわかに皆の上に降り注ぎました。

人々は大いに歓声を上げ、遅くなったバレンタインのごちそうをしみじみと噛みしめるペットのように互いに抱き合うのでした。突然、楽しげなコーラスが空から降り注ぎ、キラキラしたシルエットが空を飛んでいきます。

新たに力を得た私たちの楽観主義が希望に満ちたヒッポグリフを呼び寄せたのです! この優雅な生き物は地上に降り立つと、その羽毛を興味深そうに逆立て、周囲を跳ね回っています。「どうやら私たちは新しい友を得たようですね。例え目標にくじけそうになっても、魂を高く保ってくれるような」Lemonessは言います。

Beffymaroo は既に両腕一杯にふわふわした毛玉を抱えています。「ダメージを受けた地域を再建するのに、彼らが助けになりそうですね!」

口ずさみながら、歌いながら、ヒッポグリフたちはすべてのHabiticanが共に働き、愛しの我が家を再建する際の道案内を務めるのです。", - "questDysheartenerCompletionChat": "`Dysheartenerを倒しました!`\n\n 共に、Habiticaのすべての人が自分のタスクに最後の一撃を食らわせ、Dysheartenerは棹立ちになっておびえた声をあげます。「どうしました、Dysheartener?」 AnnDeLuneは目を光らせて呼びかけます。「怖気づいたのですか?」\n\nピンク色に発光する裂け目がDysheartenerの外殻に生じ、ピンク色の煙になって飛び散りました。活力と決意の新たな感覚が大地を吹き荒れ、心地よく甘い雨がにわかに皆の上に降り注ぎました。\n\n人々は大いに歓声を上げ、遅くなったバレンタインのごちそうをしみじみと噛みしめるペットのように互いに抱き合うのでした。突然、楽しげなコーラスが空から降り注ぎ、キラキラしたシルエットが空を飛んでいきます。\n\n新たに力を得た私たちの楽観主義が希望に満ちたヒッポグリフを呼び寄せたのです! この優雅な生き物は地上に降り立つと、その羽毛を興味深そうに逆立て、周囲を跳ね回っています。「どうやら私たちは新しい友を得たようですね。例え目標にくじけそうになっても、魂を高く保ってくれるような」Lemonessは言います。\n\nBeffymaroo は既に両腕一杯にふわふわした毛玉を抱えています。「ダメージを受けた地域を再建するのに、彼らが助けになりそうですね!」\n\n口ずさみながら、歌いながら、ヒッポグリフたちはすべてのHabiticanが共に働き、愛しの我が家を再建する際の道案内を務めるのです。", + "questDysheartenerText": "心蝕のディスハートナー", + "questDysheartenerNotes": "バレンタインデーの朝日が昇ると同時に、ぞっとするような衝撃音が空気を引き裂きました。気味の悪いピンク色に輝く炎がすべての建物を貫き、Habitシティの大通りに深い亀裂が走ってレンガが崩れ落ちます。地面に開いた穴から巨大な体が持ち上がって、この世のものとは思えない叫び声を響かせ、周囲の建物のガラス窓が次々と割れていきます。

顎がカチカチ鳴り、甲殻はギラギラと輝き、重なった足が宙に広がります。その虫のような怪物、恐るべきディスハートナーが後ろ足で立ち上がり、これまで誰も見たこともないようなおぞましい姿を自ら晒すと共に、人々は悲鳴を上げ始めました。それは勤勉なHabiticaの民の希望を食いちぎらんと、期待に満ちた咆哮をあげて突進してきます。とげとげの足がこすれてきしむ音を聞くと、あなたは胸が絶望で締め上げられるような気持ちに囚われます。

「皆さん、気を強く持って!」Lemonessが叫びます。「きっと私たちが食べやすいエサだと思っているのでしょうね。多くの人々が、とても難しい新年の誓いを立ててしまったから。ですが、Habiticanが目標をやり遂げる力を持っていることを、これから思い知らせてやろうじゃないですか!」

AnnDeLuneは杖をかかげました。「さあみんなでタスクに取り組んで、この怪物を倒しましょう!」", + "questDysheartenerCompletion": "心蝕のディスハートナーを倒しました!

Habiticaのすべての人が力を合わせて自分のタスクに最後の一撃を食らわせ、ディスハートナーは棹立ちになっておびえた声をあげます。「どうしました、ディスハートナー?」 AnnDeLuneは目を光らせて呼びかけます。「まさか怖気づいたのですか?」

ピンク色に発光する裂け目がDysheartenerの外殻に生じ、ピンク色の煙になって飛び散りました。活力と決意の新たな感覚が大地を吹き荒れ、すてきなスイーツやお菓子の雨が皆の上に降り注ぎました。

人々は大いに歓声を上げて抱き合い、ペットたちはようやくありつけたバレンタインのごちそうを嬉しそうにほおばりました。突然、楽しげなコーラスが空から降り注ぎ、キラキラしたシルエットが空を飛んでいきます。

新たに力を得た私たちの楽観主義が希望に満ちたヒッポグリフを呼び寄せたのです! この優雅な生き物は地上に降り立つと、その羽毛を興味深そうに逆立て、周囲を跳ね回っています。「どうやら私たちは新しい友を得たようですね。例え目標にくじけそうになっても、魂を高く保ってくれるような」Lemonessは言います。

Beffymaroo は既に両腕一杯にふわふわした毛玉を抱えています。「ダメージを受けた地域を再建するのに、彼らが助けになりそうですね!」

愛しの我が家を再建すべく力を合わせるすべてのHabiticanのために、ヒッポグリフたちはおだやかに歌を口ずさみながら道案内を務めます。", + "questDysheartenerCompletionChat": "心蝕のディスハートナーを倒しました!\n\nHabiticaのすべての人が力を合わせて自分のタスクに最後の一撃を食らわせ、ディスハートナーは棹立ちになっておびえた声をあげます。「どうしました、ディスハートナー?」 AnnDeLuneは目を光らせて呼びかけます。「まさか怖気づいたのですか?」\n\nピンク色に発光する裂け目がDysheartenerの外殻に生じ、ピンク色の煙になって飛び散りました。活力と決意の新たな感覚が大地を吹き荒れ、すてきなスイーツやお菓子の雨が皆の上に降り注ぎました。\n\n人々は大いに歓声を上げて抱き合い、ペットたちはようやくありつけたバレンタインのごちそうを嬉しそうにほおばりました。突然、楽しげなコーラスが空から降り注ぎ、キラキラしたシルエットが空を飛んでいきます。\n\n新たに力を得た私たちの楽観主義が希望に満ちたヒッポグリフを呼び寄せたのです! この優雅な生き物は地上に降り立つと、その羽毛を興味深そうに逆立て、周囲を跳ね回っています。「どうやら私たちは新しい友を得たようですね。例え目標にくじけそうになっても、魂を高く保ってくれるような」Lemonessは言います。\n\nBeffymaroo は既に両腕一杯にふわふわした毛玉を抱えています。「ダメージを受けた地域を再建するのに、彼らが助けになりそうですね!」\n\n愛しの我が家を再建すべく力を合わせるすべてのHabiticanのために、ヒッポグリフたちはおだやかに歌を口ずさみながら道案内を務めます。", "questDysheartenerBossRageTitle": "強烈なハートブレイク", - "questDysheartenerBossRageDescription": "怒りゲージはHabiticanたちが日課を逃すとたまっていきます。ゲージが一杯になるとDysheartenerはその強烈なハートブレイクをHabiticaの店主一人に食らわせます。必ずタスクを実行しましょう!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener は強烈なハートブレイクを使った!`\n\nなんということでしょう! 私たちのやり残した日課をおいしそうに食べた後、 力を増したDysheartenerは強烈なハートブレイクの一撃をHabiticaへ見舞いました。鋭い叫び声とともにとげとげの前足が季節の店の入ったあずまやへ振りおろされます! 激しい魔法の爆発が木材を粉々にし、季節の魔女はそれを見て深い悲しみに襲われます。\n\n怪物の攻撃が再び起こらぬよう、速やかに日課を実行しましょう!", - "questDysheartenerBossRageMarket": "`Dysheartenerは強烈なハートブレイクを使った!`\n\n助けて! 未完了の日課をおいしく頂いたあと、Dysheartenerは更なる強烈なハートブレイクを市場の壁と床に食らわせました! がれきが降り注ぎ、商人のAlexは壊れてしまった商品を見て涙しています。\n\nこの悲劇をまた起こすわけにはいきません。Dysheartenerに最後の攻撃を使わせないよう、確実に日課を行いましょう。", - "questDysheartenerBossRageQuests": "`Dysheartenerは強烈なハートブレイクを使った!`\n\nああああ!! またもや私たちが日課を終わらせずに残してしまい、Dysheartenerは愛すべき店主たちに向けて放つ最後の一撃のエネルギーを溜めました。クエストマスターのIanがいる郊外は強烈なハートブレイクによってずたずたに破壊され、Ianは恐るべき光景に徹底的に打ちのめされてしまいます。怪物が倒れるときは近づいています……急いでください! 今は立ち止まらないで!", + "questDysheartenerBossRageDescription": "怒りゲージはHabiticanたちが日課を逃すとたまっていきます。ゲージが一杯になると心蝕のディスハートナーはその強烈なハートブレイクをHabiticaの店主一人に食らわせます。必ずタスクを実行しましょう!", + "questDysheartenerBossRageSeasonal": "`心蝕のディスハートナーは強烈なハートブレイクを使った!`\n\nなんということでしょう! 私たちのやり残した日課をおいしそうに食べた後、 力を増したディスハートナーは強烈なハートブレイクの一撃をHabiticaへ見舞いました。鋭い叫び声とともにとげとげの前足が季節の店の入ったあずまやへ振りおろされます! 激しい魔法の爆発が木材を粉々にし、季節の魔女はそれを見て深い悲しみに襲われています。\n\n怪物の攻撃が再び起こらぬよう、速やかに日課を実行しましょう!", + "seasonalShopRageStrikeHeader": "季節の店が襲撃を受けました!", + "seasonalShopRageStrikeLead": "Leslieは悲しみに打ちひしがれています!", + "seasonalShopRageStrikeRecap": "2月21日、ディスハートナーの攻撃で季節の店が破壊されたので、愛すべき季節の魔女Leslieは打ちのめされてしまいました。急いで! タスクを片付けてこの怪物を倒し、再建の手助けをするのです!", + "questDysheartenerBossRageMarket": "`心蝕のディスハートナーは強烈なハートブレイクを使った!`\n\n助けて! 未完了の日課をおいしく頂いたあと、ディスハートナーは更なる強烈なハートブレイクを市場の壁と床に食らわせました! がれきが降り注ぎ、商人のAlexは壊れてしまった商品を見て涙しています。\n\nこの悲劇をまた起こすわけにはいきません。ディスハートナーに最後の攻撃を使わせないよう、確実に日課を行いましょう。", + "questDysheartenerBossRageQuests": "`心蝕のディスハートナーは強烈なハートブレイクを使った!`\n\nああああ!! またもや私たちが日課を終わらせずに残してしまい、ディスハートナーは愛すべき店主たちに向けて放つ最後の一撃のエネルギーを溜めました。クエストマスターのIanがいる郊外は強烈なハートブレイクによってずたずたに破壊され、Ianは恐るべき光景に徹底的に打ちのめされています。怪物が倒れるときは近づいています……急ぎましょう! 止まっている暇はありません!", "questDysheartenerDropHippogriffPet": "希望に満ちたヒッポグリフ(ペット)", "questDysheartenerDropHippogriffMount": "希望に満ちたヒッポグリフ(乗騎)", - "dysheartenerArtCredit": "Artwork by @AnnDeLune" + "dysheartenerArtCredit": "イラスト作成:@AnnDeLune" } \ No newline at end of file diff --git a/website/common/locales/ja/settings.json b/website/common/locales/ja/settings.json index dc40a8bc18..1937f64406 100644 --- a/website/common/locales/ja/settings.json +++ b/website/common/locales/ja/settings.json @@ -45,7 +45,7 @@ "xml": "(XML)", "json": "(JSON)", "customDayStart": "日付更新の設定", - "sureChangeCustomDayStartTime": "Are you sure you want to change your Custom Day Start time? Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before then!", + "sureChangeCustomDayStartTime": "日付更新の時間を変更しますか? あなたの日課は<%= time %>以降に、初めてHabiticaを使ったタイミングで更新されます。それまでに日課を片付けておきましょう!", "changeCustomDayStart": "日付更新する時間を変更しますか?", "sureChangeCustomDayStart": "日付更新する時間を変更します。よろしいですか?", "customDayStartHasChanged": "日付更新時間が変更されました。", @@ -63,9 +63,9 @@ "newUsername": "新しいログイン名", "dangerZone": "危険地帯", "resetText1": "警告‼ この操作で、あなたのアカウントの多くの部分をリセットします。とてもがっかりすることです。しかし、お試しで短時間プレーした初心者ユーザーの一部には便利だと思われます。", - "resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.", + "resetText2": "すべてのレベル、ゴールド、経験値を失います。すべてのタスク ( チャレンジ関連のものを除く ) は完全に削除され、履歴データもすべて削除されます。すべての装備を失いますが、限定装備や寄付会員むけのミステリーアイテムを含め、現在あなたがもっている物はすべて買い戻すことができます(クラス固有の装備は、該当するクラスにならなくてはいけません)。現在のクラスと、ペットと乗騎は維持されます。「転生のオーブ」を使のはいかがでしょうか? タスクと装備も維持される、より安全な選択肢です。", "deleteLocalAccountText": "本当にいいのですか? この操作であなたのアカウントは完全に削除され、復元はできません!  もう一度 Habitica を使うには、新しいアカウントを登録しなくてはなりません。貯めているジェム、使ったジェムは、返金できません。本当にアカウントを削除するのなら、下のテキストボックスにパスワードを入力してください。", - "deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.", + "deleteSocialAccountText": "本当にいいのですか? この操作であなたのアカウントは完全に削除され、復元はできません!  もう一度 Habitica を使うには、新しいアカウントを登録しなくてはなりません。貯めているジェム、使ったジェムは、返金できません。本当にアカウントを削除するのなら、下のテキストボックスに”<%= magicWord %>”と入力してください。", "API": "API", "APIv3": "API v3", "APIText": "サードパーティのアプリケーションで使用する際にこちらをコピーしてください。しかし、APIトークンはパスワードのようなもので、公開しないでください。ユーザーIDを求められる場合はありますが、GitHub など他人から見える場所には、APIトークンは絶対に投稿しないでください。", @@ -106,7 +106,7 @@ "email": "メール", "registerWithSocial": "<%= network %> で登録", "registeredWithSocial": "<%= network %> で登録しました。", - "loginNameDescription": "This is what you use to log in to Habitica. To change it, use the form below. If instead you want to change the Display Name that appears on your avatar and in chat messages, go to the User Icon > Profile and click the Edit button.", + "loginNameDescription": "これは Habitica でのログインに使用するものです。変更するには、下のフォームを利用してください。アバター上や、チャットメッセージで表示される「表示名」を変更するには、ユーザーアイコン > プロフィールへ進み、「編集」ボタンをクリックしてください。", "emailNotifications": "メール通知", "wonChallenge": "あなたはチャレンジに成功しました!", "newPM": "プライベートメッセージが届きました", @@ -118,7 +118,7 @@ "giftedSubscription": "贈られた寄付(有料利用)", "giftedSubscriptionInfo": "<%= name %> から <%= months %> カ月分の寄付(有料)利用のプレゼントが届きました!", "giftedSubscriptionFull": "こんにちは、<%= userName %>。<%= sender %> から <%= monthCount %> カ月分の寄付(有料)利用のプレゼントが届きました!", - "giftedSubscriptionWinterPromo": "Hello <%= username %>, you received <%= monthCount %> months of subscription as part of our holiday gift-giving promotion!", + "giftedSubscriptionWinterPromo": "こんにちは、<%= username %>。寄付キャンペーンの一環で、あなたには<%= monthCount %> カ月分の寄付(有料)利用権が与えられました!", "invitedParty": "パーティへ招待されました", "invitedGuild": "ギルドへ招待されました", "importantAnnouncements": "タスクの完了し、賞を受けるために、チェックインを通知します。", @@ -130,7 +130,7 @@ "remindersToLogin": "Habitica へのチェックインを通知する", "subscribeUsing": "寄付の送金方法 : ", "unsubscribedSuccessfully": "購読を中止しました!", - "unsubscribedTextUsers": "You have successfully unsubscribed from all Habitica emails. You can enable only the emails you want to receive from Settings > > Notifications (requires login).", + "unsubscribedTextUsers": "Habitica からのメールをすべて停止しました。設定 > 通知受け取りたいメールだけを有効にすることができます(要ログイン)。", "unsubscribedTextOthers": "Habitica からの他のメールは発信されません。", "unsubscribeAllEmails": "チェックすると、メールの購読解除", "unsubscribeAllEmailsText": "私は、このボックスをチェックすることですべてのメールの購読を解除し、 サイトやアカウントの変更についての重要な内容であっても Habitica がメールを通じて私に告知することができなくなることを理解したことを証明します。", diff --git a/website/common/locales/ja/subscriber.json b/website/common/locales/ja/subscriber.json index 169e55ec74..721a53e135 100644 --- a/website/common/locales/ja/subscriber.json +++ b/website/common/locales/ja/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "カーペット乗りセット", "mysterySet201712": "ろうそく術士セット", "mysterySet201801": "霜の精のセット", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "スチームパンク標準 セット", "mysterySet301405": "スチームパンク アクセサリー セット", "mysterySet301703": "クジャクのスチームパンク セット", diff --git a/website/common/locales/ja/tasks.json b/website/common/locales/ja/tasks.json index 7e580e6ac9..e527fbbbcf 100644 --- a/website/common/locales/ja/tasks.json +++ b/website/common/locales/ja/tasks.json @@ -1,8 +1,8 @@ { "clearCompleted": "完了済みを削除", - "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", - "clearCompletedConfirm": "Are you sure you want to delete your completed To-Dos?", - "sureDeleteCompletedTodos": "Are you sure you want to delete your completed To-Dos?", + "clearCompletedDescription": "完了済みのTo-Doは、寄付会員は90日後、それ以外の場合は30日後に削除されます。", + "clearCompletedConfirm": "完了した To-Do を削除します。よろしいですか?", + "sureDeleteCompletedTodos": "完了した To-Do を削除します。よろしいですか?", "lotOfToDos": "最近完了した 30 件の「To-Do」をここに表示します。より古いものは、「データ > データ表示ツール」または「データ > データをエクスポート > ユーザーデータ」で確認できます。", "deleteToDosExplanation": "下のボタンをクリックすると、進行中のチャレンジやグループプランの「To-Do」を除いて、すべての完了した「To-Do」とアーカイブ済の「To-Do」が完全に削除されます。記録を保存しておきたい場合は、まずエクスポートしてください。", "addMultipleTip": "Tip:1複数のタスクを追加するには、(Shift + Enter)でタスクを分割し、\"Enter\"キーで確定して下さい。", @@ -34,7 +34,7 @@ "extraNotes": "メモ", "notes": "メモ", "direction/Actions": "目標・行動", - "advancedSettings": "Advanced Settings", + "advancedSettings": "詳細設定", "taskAlias": "タスクの別名", "taskAliasPopover": "タスクの別名は、サードパーティー 統合で使用します。ダッシュ、アンダースコア、英数字のキャラクターのみ対応しています。タスクの別名は、すべてのタスクの中でユニーク ( 固有の名称 ) にしてください。", "taskAliasPlaceholder": "タスクの別名を設定", @@ -45,8 +45,8 @@ "easy": "かんたん", "medium": "ふつう", "hard": "むずかしい", - "attributes": "Stats", - "attributeAllocation": "Stat Allocation", + "attributes": "ステータス", + "attributeAllocation": "能力値の割り当て", "attributeAllocationHelp": "Stat allocation is an option that provides methods for Habitica to automatically assign an earned Stat Point to a Stat immediately upon level-up.

You can set your Automatic Allocation method to Task Based in the Stats section of your profile.", "progress": "進捗", "daily": "日間", @@ -58,7 +58,7 @@ "repeat": "くり返し", "repeats": "繰り返し", "repeatEvery": "くり返しの間隔", - "repeatOn": "Repeat On", + "repeatOn": "くり返しの基準", "repeatHelpTitle": "このタスクはどんな間隔でくり返しますか?", "dailyRepeatHelpContent": "このタスクは数日ごとにくり返します。何日ごとにくり返しますか?", "weeklyRepeatHelpContent": "以下、日課をやるべき曜日をハイライトしています。曜日をクリックして、やるべき曜日・やらないでいい曜日を設定します。", @@ -66,7 +66,7 @@ "repeatWeek": "週の特定の曜日", "day": "日", "days": "日", - "restoreStreak": "Adjust Streak", + "restoreStreak": "連続実行回数の値を修正", "resetStreak": "実行回数のリセット", "todo": "To-Do", "todos": "To-Do", @@ -110,9 +110,9 @@ "streakSingular": "連続実行者", "streakSingularText": "日課を21日連続で実行しました", "perfectName": "<%= count %> 回のパーフェクトな日", - "perfectText": "Completed all active Dailies on <%= count %> days. With this achievement you get a +level/2 buff to all Stats for the next day. Levels greater than 100 don't have any additional effects on buffs.", + "perfectText": "<%= count %>日連続で、やるべき日課のすべてを完了しています。この実績により次の日の全ての能力値に対して「レベル÷2」のボーナスが与えられます。100を超えた分のレベルは計算には反映されません。", "perfectSingular": "パーフェクトな日", - "perfectSingularText": "Completed all active Dailies in one day. With this achievement you get a +level/2 buff to all Stats for the next day. Levels greater than 100 don't have any additional effects on buffs.", + "perfectSingularText": "今日はやるべき日課をすべて完了しました。この実績により次の日の全ての能力値に対して「レベル÷2」のボーナスが付与されます。100を超えた分のレベルは計算には反映されません。", "streakerAchievement": "あなたは「連続実行」の実績を手に入れました! 21日間の連続記録は習慣形成における一つの節目です。この21日連続実行の実績を胸に、今日の日課およびほかのタスクにも取りくみつづけましょう!", "fortifyName": "防御の薬", "fortifyPop": "すべてのタスクを中間の状態 (黄色)に戻し、体力をすべて回復させます。", @@ -120,7 +120,7 @@ "fortifyText": "防御は、チャレンジ関連のものを除くすべてのタスクを中間状態 (黄色) に戻し、追加した直後の状態にします。体力を満タンにします。これは、赤いタスクがゲームを難しくしていたり、青いタスクがゲームを簡単にしていたりする場合に効果的です。もし、新しく始めることでやる気が出るなら、ジェムを使ってこの救済措置を手に入れましょう!", "confirmFortify": "本当によろしいですか?", "fortifyComplete": "防御を完了しました。", - "deleteTask": "Delete this Task", + "deleteTask": "このタスクを削除", "sureDelete": "このタスクを削除します。よろしいですか?", "streakCoins": "連続実行ボーナス!", "taskToTop": "上へ", @@ -141,7 +141,7 @@ "toDoHelp3": "To-Doは細かく分割してチェックリストにすることで、おそれは緩和され、獲られるポイントも増加します。", "toDoHelp4": "参考のために、To-Do のサンプルをチェックしてみてください!", "rewardHelp1": "アバターのために購入した装備は、<%= linkStart %>所持品 > 装備<%= linkEnd %>に保存されます。", - "rewardHelp2": "Equipment affects your Stats (<%= linkStart %>Avatar > Stats<%= linkEnd %>).", + "rewardHelp2": "装備は、ステータスに効果を与えます。(<%= linkStart %>アバター > ステータス<%= linkEnd %>)", "rewardHelp3": "世界的なイベントの期間中、スペシャルな装備が出現します。", "rewardHelp4": "自分の好みの「ごほうび」を気軽に設定しましょう! サンプルがここにあるので参考にしてください。", "clickForHelp": "クリックでヘルプを表示", @@ -174,7 +174,7 @@ "taskApprovalHasBeenRequested": "承認手続きを送りました", "taskApprovalWasNotRequested": "Only a task waiting for approval can be marked as needing more work", "approvals": "承認", - "approvalRequired": "Needs Approval", + "approvalRequired": "承認が必要です", "repeatZero": "この日課に期日はありません", "repeatType": "くり返しの種類", "repeatTypeHelpTitle": "どんな種類のくり返しですか?", diff --git a/website/common/locales/nl/achievements.json b/website/common/locales/nl/achievements.json index b6cb122640..772012a434 100644 --- a/website/common/locales/nl/achievements.json +++ b/website/common/locales/nl/achievements.json @@ -1,8 +1,8 @@ { "share": "Deel", "onwards": "Voorwaarts!", - "levelup": "Door het voltooien van doelen in je echte leven, ben je een niveau gestegen en weer volledig genezen!", + "levelup": "Door het voltooien van doelen in je echte leven ben je een niveau gestegen en weer volledig genezen!", "reachedLevel": "Je hebt niveau <%= level %> bereikt", "achievementLostMasterclasser": "Queeste voltooier: de Masterclasser reeks", - "achievementLostMasterclasserText": "Alle zestien queesten in de Masterclasser queestereeks voltooid en het mysterie van de verdwaalde Masterclasser voltooid!" + "achievementLostMasterclasserText": "Alle zestien queesten in de Masterclasser reeks voltooid en het mysterie van de verdwaalde Masterclasser voltooid!" } diff --git a/website/common/locales/nl/challenge.json b/website/common/locales/nl/challenge.json index 4724622abd..67743cdf10 100644 --- a/website/common/locales/nl/challenge.json +++ b/website/common/locales/nl/challenge.json @@ -1,6 +1,6 @@ { "challenge": "Uitdaging", - "challengeDetails": "Uitdagingen zijn evenementen georganiseerd voor de gemeenschap waar spelers elkaar uitdagen en prijzen kunnen winnen door een groep aan elkaar gerelateerde taken te voltooien.", + "challengeDetails": "Uitdagingen zijn evenementen waar je aan mee kunt doen om prijzen te winnen door bijpassende taken te voltooien.", "brokenChaLink": "Gebroken uitdagingslink", "brokenTask": "Gebroken uitdagingslink: deze taak was onderdeel van een uitdaging, maar is daaruit verwijderd. Wat wil je ermee doen?", "keepIt": "Behoud hem", @@ -74,7 +74,7 @@ "noChallengeOwnerPopover": "Deze uitdaging heeft geen eigenaar omdat de eigenaar zijn of haar account heeft verwijderd.", "challengeMemberNotFound": "Gebruiker niet gevonden onder de deelnemers aan de uitdaging", "onlyGroupLeaderChal": "Alleen de groepsleider kan uitdagingen creëren", - "tavChalsMinPrize": "De prijs moet tenminste 1 edelsteen zijn voor openbare uitdagingen.", + "tavChalsMinPrize": "De prijs voor openbare uitdagingen moet tenminste 1 edelsteen zijn.", "cantAfford": "Je kunt deze beloning niet betalen. Koop meer edelstenen of verlaag de prijs.", "challengeIdRequired": "\"challengeId\" moet een valide UUID zijn.", "winnerIdRequired": "\"winnerId\" moet een valide UUID zijn.", diff --git a/website/common/locales/nl/character.json b/website/common/locales/nl/character.json index 6f2ed401d8..a20c63b60d 100644 --- a/website/common/locales/nl/character.json +++ b/website/common/locales/nl/character.json @@ -36,7 +36,7 @@ "bangs": "Pony", "hairBangs": "Pony", "ponytail": "Paardenstaart", - "glasses": "Bri", + "glasses": "Bril", "hairBase": "Basis", "hairSet1": "Kapselset 1", "hairSet2": "Kapselset 2", @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Klassebonus", "battleGear": "Strijduitrusting", + "gear": "Gear", "battleGearText": "Dit is de uitrusting die je in de strijd draagt. Het beïnvloedt scores als je met taken bezig bent.", "autoEquipBattleGear": "Automatisch nieuwe uitrusting gebruiken", "costume": "Kostuum", @@ -91,18 +92,18 @@ "xp": "EP", "health": "Gezondheid", "allocateStr": "Punten toegewezen aan kracht:", - "allocateStrPop": "Add a Point to Strength", + "allocateStrPop": "Wijs een punt toe aan kracht.", "allocateCon": "Punten toegewezen aan lichaam:", - "allocateConPop": "Add a Point to Constitution", + "allocateConPop": "Wijs een punt toe aan lichaam.", "allocatePer": "Punten toegewezen aan perceptie:", - "allocatePerPop": "Add a Point to Perception", + "allocatePerPop": "Wijs een punt toe aan perceptie.", "allocateInt": "Punten toegewezen aan intelligentie:", - "allocateIntPop": "Add a Point to Intelligence", - "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", + "allocateIntPop": "Wijs een punt toe aan intelligentie.", + "noMoreAllocate": "Nu je niveau 100 hebt bereikt verdien je geen nieuwe eigenschapspunten meer. Je kunt doorgaan met het bereiken van logeren niveaus, of een nieuwe avontuur beginnen vanaf niveau 1 door de Bol der Hergeboorte te gebruiken. Deze is dan gratis te verkrijgen op de markt.", "stats": "Statistieken", "achievs": "Prestaties", "strength": "Kracht", - "strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.", + "strText": "Kracht vergroot de kans op kritieke aanvallen, en zorgt ervoor dat je hieruit meer goud, ervaring en andere voorwerpen krijgt. Het zorgt er ook voor dat je meer schade aanricht aan boss monsters.", "constitution": "Lichaam", "conText": "Lichaam vermindert de schade die je ontvangt van negatieve gewoontes en gemiste dagelijkse taken.", "perception": "Perceptie", @@ -110,12 +111,12 @@ "intelligence": "Intelligentie", "intText": "Intelligentie bepaalt hoeveel ervaringspunten je verdient en, zodra je een klasse hebt vrijgespeeld, bepaalt het je maximale mana beschikbaar voor klassespecifieke vaardigheden.", "levelBonus": "Niveaugerelateerde bonus", - "levelBonusText": "Each Stat gets a bonus equal to half of (your Level minus 1).", + "levelBonusText": "Elke eigenschap krijgt een bonus gelijk aan de helft van (jouw niveau min 1).", "allocatedPoints": "Toegewezen punten", "allocatedPointsText": "Stat Points you've earned and assigned. Assign Points using the Character Build column.", "allocated": "Toegewezen", "buffs": "Versterkingen", - "buffsText": "Temporary Stat bonuses from abilities and achievements. These wear off at the end of your day. The abilities you've unlocked appear in the Rewards list of your Tasks page.", + "buffsText": "Tijdelijke eigenschapsbonussen afkomstig van vaardigheden en prestaties. Deze verdwijnen aan het einde van de dag. Je kunt de vaardigheden die je hebt vrijgespeeld vinden in de Beloningslijst van de Takenpagina.", "characterBuild": "Karakterbouw", "class": "Klasse", "experience": "Ervaring", @@ -168,7 +169,7 @@ "invalidTarget": "Je kan daar geen vaardigheid op uitspreken.", "youCast": "Je hebt <%= spell %> uitgesproken.", "youCastTarget": "Je hebt <%= spell %> uitgesproken over <%= target %>.", - "youCastParty": "Je hebt <%= spell %> uitgesproken voor de gezelschap.", + "youCastParty": "Je hebt <%= spell %> uitgesproken voor het gezelschap.", "critBonus": "Voltreffer! Bonus:", "gainedGold": "Je hebt wat goud verdiend", "gainedMana": "Je hebt wat mana verdiend", diff --git a/website/common/locales/nl/communityguidelines.json b/website/common/locales/nl/communityguidelines.json index 70e500e0e2..69d13e81a1 100644 --- a/website/common/locales/nl/communityguidelines.json +++ b/website/common/locales/nl/communityguidelines.json @@ -87,7 +87,7 @@ "commGuideList04E": "Plaats geen spam en saboteer pagina's niet voor eigen gewin", "commGuideList04F": "Lees de richtlijnen voor het bijdragen aan de wiki voordat je grote veranderingen maakt", "commGuideList04G": "Gebruik een onpartijdige toon in de wiki-pagina's", - "commGuideList04H": "Zorg ervoor dat wikimateriaal relevant is voor heel Habitica en niet alleen geldt voor een bepaald gilde of een bepaalde gezelschap (dat soort informatie kan op het forum besproken worden)", + "commGuideList04H": "Zorg ervoor dat wikimateriaal relevant is voor heel Habitica en niet alleen geldt voor een bepaald gilde of een bepaald gezelschap (dat soort informatie kan op het forum besproken worden)", "commGuidePara049": "De volgende mensen zijn op dit moment actief als wiki-beheerders:", "commGuidePara049A": "De volgende moderators kunnen snel bewerkingen maken in situaties waar een moderator nodig is en de bovenstaande beheerders niet beschikbaar zijn:", "commGuidePara018": "Voormalige Wiki Administrators:", diff --git a/website/common/locales/nl/content.json b/website/common/locales/nl/content.json index a9ca0d084f..01840f0250 100644 --- a/website/common/locales/nl/content.json +++ b/website/common/locales/nl/content.json @@ -275,7 +275,7 @@ "foodCandyGoldenThe": "the Honey Candy", "foodCandyGoldenA": "Honey Candy", "foodCandyZombie": "Bedorven snoep", - "foodCandyZombieThe": "the Rotten Candy", + "foodCandyZombieThe": "het bedorven snoep", "foodCandyZombieA": "Rotten Candy", "foodCandyDesert": "Zandsnoep", "foodCandyDesertThe": "the Sand Candy", diff --git a/website/common/locales/nl/faq.json b/website/common/locales/nl/faq.json index 160430d015..a48348582f 100644 --- a/website/common/locales/nl/faq.json +++ b/website/common/locales/nl/faq.json @@ -22,15 +22,15 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Hoe speel ik Habitica samen met mijn vrienden?", "iosFaqAnswer5": "De beste manier is om ze uit te nodigen voor een gezelschap met jou! Groepen kunnen queestes doen, monsters bevechten en vaardigheden uitspreken om elkaar te ondersteunen. Ga naar Menu > Groep en klik op \"Maak Nieuwe Groep\" als je er nog geen hebt. Druk dan op de ledenlijst en druk op Uitnodigen in de rechterbovenhoek om je vrienden uit te nodigen door hun Gebruikers-ID in te voeren (een serie nummers en letters die ze kunnen vinden onder Instellingen > Account in de app en Instellingen > API op de website). Op de website kun je ook vrienden uitnodigen via e-mail, hetgeen we in een latere update aan de app zullen toevoegen.\n\nOp de website kunnen jij en je vrienden je ook aansluiten bij Gildes, dat zijn publieke chatrooms. Gildes worden aan de app toegevoegd in een toekomstige update.", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Hoe kan ik een huisdier of een rijdier krijgen?", "iosFaqAnswer6": "Op niveau 3 speel je het vondstensysteem vrij. Iedere keer dat je een taak voltooit, heb je een willekeurige kans om een ei, een uitbroeddrank of eten te ontvangen. Ze zullen opgeslagen worden in Menu > Boedel.\n\nOm een huisdier te laten uitkomen, heb je een ei en een uitbroeddrank nodig. Druk op het ei om de soort te bepalen en selecteer 'Laat ei uitkomen'. Kies daarna een uitbroeddrank om de kleur te bepalen! Ga naar Menu > Huisdieren om je avatar uit te rusten met je nieuwe huisdier door erop te drukken.\n\nJe kunt je huisdieren ook laten opgroeien tot rijdieren door ze te voederen onder Menu > Huisdieren. Druk op het huisdier en selecteer dan 'Huisdier Voeren'. Je zult een huisdier vele malen moeten voederen voordat het verandert in een rijdier, maar als je zijn favoriete voedsel kan bepalen, zal 'ie sneller groeien. Probeer het met vallen en opstaan of [zie het hier verklapt](http://nl.habitica.wikia.com/wiki/Voedsel#Voedsel_voorkeuren). Als je eenmaal een rijdier hebt, kun je het toevoegen aan je avatar onder Menu > Rijdieren.\n\nJe kunt ook eieren van queeste-huisdieren krijgen door bepaalde queesten te voltooien. (Lees hieronder meer over queesten.) ", "androidFaqAnswer6": "Op niveau 3 speel je het dropsysteem vrij. Iedere keer dat je een taak voltooit, heb je een willekeurige kans om een ei, een uitbroeddrank of eten te ontvangen. Ze zullen opgeslagen worden in Menu > Boedel.\n\nOm een huisdier te laten uitkomen, heb je een ei en een uitbroeddrank nodig. Druk op het ei om de soort te bepalen en selecteer 'Laat ei uitkomen met toverdrank'. Kies daarna een uitbroeddrank om de kleur te bepalen! Om je huisdier uit te rusten ga je naar Menu > Stal > Huisdieren, klik je op je het gewenste huisdier en selecteer je \"Gebruik\" (Je avatar wordt niet geüpdatet met de verandering).\n\nJe kunt je huisdieren ook laten opgroeien tot rijdieren door ze te voeren onder Menu > Stal > [> Huisdieren]. Druk op een huisdier en selecteer dan \"Voeren\"! Je zult een huisdier vele malen moeten voeren voordat het verandert in een rijdier, maar als je zijn favoriete voedsel kan bepalen, zal hij sneller groeien. Probeer het met vallen en opstaan of [zie het hier verklapt](http://nl.habitica.wikia.com/wiki/Voedsel#Voedsel_voorkeuren). Om je rijdier uit te rusten ga je naar Menu > Stal > Rijdieren, selecteer je een soort, klik je op je het gewenste rijdier en selecteer je \"Gebruik\" (Je avatar wordt niet geüpdatet met de verandering).\n\nJe kunt ook eieren van queeste-huisdieren krijgen door bepaalde queestes te voltooien. (Lees hieronder meer over queestes.) ", "webFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored under Inventory > Items. To hatch a Pet, you'll need an egg and a hatching potion. Once you have both an egg and a potion, go to Inventory > Stable to hatch your pet by clicking on its image. Once you've hatched a pet, you can equip it by clicking on it. You can also grow your Pets into Mounts by feeding them under Inventory > Stable. Drag a piece of food from the action bar at the bottom of the screen and drop it on a pet to feed it! You'll have to feed a Pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once you have a Mount, click on it to equip it to your avatar. You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", "faqQuestion7": "Hoe word ik een Krijger, Magiër, Dief of Heler?", "iosFaqAnswer7": "Je kan pas kiezen om een krijger, magiër, dief of heler te worden als je niveau 10 bereikt hebt. (Alle spelers beginnen standaard als krijger.) Elke klasse heeft andere uitrusting, verschillende vaardigheden die ze kunnen uitspreken na niveau 11 en meer verschillende voordelen. Krijgers kunnen veel schade aanrichten bij eindbazen, schade weerstaan van taken en hun gezelschap sterker maken. Magiërs kunnen ook makkelijk schade aanrichten bij eindbazen, evenals sneller niveaus behalen en extra mana geven aan de gezelschap. Dieven verdienen het meeste geld en vinden sneller voorwerpen en kunnen hun gezelschap hetzelfde laten doen. Tenslotte kunnen helers zichzelf, en mensen uit hun gezelschap, helen.\n\nAls je nog niet direct een klasse wilt kiezen -- als je bijvoorbeeld nog al je uitrusting wilt kopen voor je huidige klasse -- kun je op \"later beslissen\" klikken en later kiezen bij menu > kies klasse.", - "androidFaqAnswer7": "Je kan pas kiezen om een krijger, magiër, dief of heler te worden als je niveau 10 bereikt hebt. (Alle spelers beginnen standaard als krijger.) Elke klasse heeft andere uitrusting, verschillende vaardigheden die ze kunnen uitspreken na niveau 11 en meer verschillende voordelen. Krijgers kunnen veel schade aanrichten bij eindbazen, schade weerstaan van taken en hun gezelschap sterker maken. Magiërs kunnen ook makkelijk schade aanrichten bij eindbazen, evenals sneller niveaus behalen en extra mana geven aan de gezelschap. Dieven verdienen het meeste geld en vinden sneller voorwerpen en kunnen hun gezelschap hetzelfde laten doen. Tenslotte kunnen helers zichzelf, en mensen uit hun gezelschap, helen.\n\nAls je nog niet direct een klasse wilt kiezen -- als je bijvoorbeeld nog al je uitrusting wilt kopen voor je huidige klasse -- kun je op \"afmelden\" klikken en later kiezen bij menu > kies klasse.", + "androidFaqAnswer7": "Je kan pas kiezen om een krijger, magiër, dief of heler te worden als je niveau 10 bereikt hebt. (Alle spelers beginnen standaard als krijger.) Elke klasse heeft andere uitrusting, verschillende vaardigheden die ze kunnen uitspreken na niveau 11 en meer verschillende voordelen. Krijgers kunnen veel schade aanrichten bij eindbazen, schade weerstaan van taken en hun gezelschap sterker maken. Magiërs kunnen ook makkelijk schade aanrichten bij eindbazen, evenals sneller niveaus behalen en extra mana geven aan het gezelschap. Dieven verdienen het meeste geld en vinden sneller voorwerpen en kunnen hun gezelschap hetzelfde laten doen. Tenslotte kunnen helers zichzelf, en mensen uit hun gezelschap, helen.\n\nAls je nog niet direct een klasse wilt kiezen -- als je bijvoorbeeld nog al je uitrusting wilt kopen voor je huidige klasse -- kun je op \"afmelden\" klikken en later kiezen bij menu > kies klasse.", "webFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most Gold and find the most item drops, and they can help their party do the same. Finally, Healers can heal themselves and their party members. If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click \"Opt Out\" and re-enable it later under Settings.", "faqQuestion8": "What is the blue Stat bar that appears in the Header after level 10?", "iosFaqAnswer8": "The blauwe balk die verscheen toen je niveau 10 bereikte en een klasse koos, is je mana-balk. Als je een hoger niveau bereikt, speel je speciale vaardigheden vrij die mana kosten om te gebruiken. Elke klasse heeft andere vaardigheden, die vanaf niveau 11 verschijnen onder Menu > Gebruik vaardigheden. Anders dan bij je gezondheidsbalk, reset je mana-balk niet als je een nieuw niveau bereikt. In plaats daarvan krijg je meer mana wanneer je goede gewoonten, dagelijkse taken en to-do's doet en verlies je het wanneer je hebt toegegeven aan slechte gewoonten. Je krijgt 's nachts ook wat mana terug -- hoe meer dagelijkse taken je voltooide, hoe meer je verdient.", @@ -49,9 +49,9 @@ "androidFaqAnswer11": "Je kunt een bug rapporteren, een functionaliteit aanvragen of feedback versturen onder Menu > Fout melden en Menu > Stuur feedback! We zullen alles doen wat we kunnen om je te helpen.", "webFaqAnswer11": "To report a bug, go to [Help > Report a Bug](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) and read the points above the chat box. If you're unable to log in to Habitica, send your login details (not your password!) to [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Don't worry, we'll get you fixed up soon! Feature requests are collected on Trello. Go to [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) and follow the instructions. Ta-da!", "faqQuestion12": "Hoe strijd ik tegen een Wereldbaas?", - "iosFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", - "androidFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", - "webFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual. You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party. A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change. You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", + "iosFaqAnswer12": "Wereldbazen zijn uitzonderlijke monsters die verschijnen in de Herberg. Alle actieve gebruikers vechten automatisch tegen de Wereldbaas, hun taken en eigenschappen beschadigen deze baas zoals normaal. \n\nJe kunt tegelijkertijd een normale queeste doorlopen. Je taken en eigenschappen tellen dan zowel tegen de Wereldbaas als tegen de baas of verzamelqueeste van je gezelschap.\n\nEen wereldbaas zal jou of je account nooit beschadigen. In plaats daarvan heeft deze een furiebalk die zich vult wanneer gebruikers hun dagelijkse taken niet doen. Als de furiebalk gevuld is, valt de Baas een van de NPC’s op de site aan. Hierdoor verandert de afbeelding de betreffende NPC.\n\nJe kunt meer lezen over [wereldbazen uit het verleden](http://nl.habitica.wikia.com/wiki/Wereldbazen)", + "androidFaqAnswer12": "Wereldbazen zijn uitzonderlijke monsters die verschijnen in de Herberg. Alle actieve gebruikers vechten automatisch tegen de Wereldbaas, hun taken en eigenschappen beschadigen deze baas zoals normaal. \n\nJe kunt tegelijkertijd een normale queeste doorlopen. Je taken en eigenschappen tellen dan zowel tegen de Wereldbaas als tegen de baas of verzamelqueeste van je gezelschap.\n\nEen wereldbaas zal jou of je account nooit beschadigen. In plaats daarvan heeft deze een furiebalk die zich vult wanneer gebruikers hun dagelijkse taken niet doen. Als de furiebalk gevuld is, valt de Baas een van de NPC’s op de site aan. Hierdoor verandert de afbeelding de betreffende NPC.\n\nJe kunt meer lezen over [wereldbazen uit het verleden](http://nl.habitica.wikia.com/wiki/Wereldbazen) op de wiki.", + "webFaqAnswer12": "Wereldbazen zijn uitzonderlijke monsters die verschijnen in de Herberg. Alle actieve gebruikers vechten automatisch tegen de Wereldbaas, hun taken en eigenschappen beschadigen deze baas zoals normaal. \n\nJe kunt tegelijkertijd een normale queeste doorlopen. Je taken en eigenschappen tellen dan zowel tegen de Wereldbaas als tegen de baas of verzamelqueeste van je gezelschap.\n\nEen wereldbaas zal jou of je account nooit beschadigen. In plaats daarvan heeft deze een furiebalk die zich vult wanneer gebruikers hun dagelijkse taken niet doen. Als de furiebalk gevuld is, valt de Baas een van de NPC’s op de site aan. Hierdoor verandert de afbeelding de betreffende NPC.\n\nJe kunt meer lezen over [wereldbazen uit het verleden](http://nl.habitica.wikia.com/wiki/Wereldbazen) op de wiki.", "iosFaqStillNeedHelp": "Als je een vraag hebt die niet in deze lijst of op [Wiki FAQ](http://nl.habitica.wikia.com/wiki/Veel_Gestelde_Vragen) staat, kom het dan vragen in de Herberg bij Menu > Herberg! Wij helpen je graag verder.", "androidFaqStillNeedHelp": "Als je een vraag hebt die niet op deze lijst of op de [Wiki FAQ](http://nl.habitica.wikia.com/wiki/Veel_Gestelde_Vragen) staat, kom het dan vragen in de Herberg bij Menu > Herberg! Wij helpen je graag verder.", "webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.wikia.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help." diff --git a/website/common/locales/nl/front.json b/website/common/locales/nl/front.json index cb1dc65cfa..3485e22bdb 100644 --- a/website/common/locales/nl/front.json +++ b/website/common/locales/nl/front.json @@ -1,6 +1,6 @@ { "FAQ": "FAQ", - "termsAndAgreement": "By clicking the button below, you are indicating that you have read and agree to the Terms of Service and Privacy Policy.", + "termsAndAgreement": "Door op de knop beneden te klikken, geef je aan dat je de servicdvoorwaarden en het Privacybeleid hebt gelezen en ga je met beide akkoord.", "accept1Terms": "Door op onderstaande knop te drukken, stem ik in met de", "accept2Terms": "en het", "alexandraQuote": "Ik kon niet NIET over [Habitica] praten tijdens mijn speech in Madrid. Een must-have voor freelancers die nog steeds een baas nodig hebben.", @@ -157,7 +157,7 @@ "pkAnswer7": "Habitica uses pixel art for several reasons. In addition to the fun nostalgia factor, pixel art is very approachable to our volunteer artists who want to chip in. It's much easier to keep our pixel art consistent even when lots of different artists contribute, and it lets us quickly generate a ton of new content!", "pkQuestion8": "How has Habitica affected people's real lives?", "pkAnswer8": "You can find lots of testimonials for how Habitica has helped people here: https://habitversary.tumblr.com", - "pkMoreQuestions": "Do you have a question that’s not on this list? Send an email to leslie@habitica.com!", + "pkMoreQuestions": "Heb je een vraag die niet op deze lijst staat? Stuur dan een mail naar leslie@habitica.com!", "pkVideo": "Video", "pkPromo": "Promoties", "pkLogo": "Logo's", @@ -276,7 +276,7 @@ "newEmailRequired": "Ontbrekend nieuw e-mailadres.", "usernameTaken": "Loginnaam is al in gebruik.", "usernameWrongLength": "Login Name must be between 1 and 20 characters long.", - "usernameBadCharacters": "Login Name must contain only letters a to z, numbers 0 to 9, hyphens, or underscores.", + "usernameBadCharacters": "Inlognaam mag alleen bestaan uit letters a t/m z, nummers 0 t/m 9, koppeltekens of liggende streepjes.", "passwordConfirmationMatch": "Wachtwoordconfirmatie komt niet overeen met wachtwoord.", "invalidLoginCredentials": "Incorrecte gebruikersnaam en/of e-mail en/of wachtwoord.", "passwordResetPage": "Reset je wachtwoord", @@ -299,9 +299,9 @@ "loginWithSocial": "Inloggen met <%= social %>", "confirmPassword": "Wachtwoord bevestigen", "usernameLimitations": "Login Name must be 1 to 20 characters long, containing only letters a to z, or numbers 0 to 9, or hyphens, or underscores.", - "usernamePlaceholder": "e.g., HabitRabbit", - "emailPlaceholder": "e.g., rabbit@example.com", - "passwordPlaceholder": "e.g., ******************", + "usernamePlaceholder": "Bijv., GewoonteDier", + "emailPlaceholder": "Bijv., dier@voorbeeld.com", + "passwordPlaceholder": "bijv., ******************", "confirmPasswordPlaceholder": "Zorg ervoor dat het wachtwoord hetzelfde is!", "joinHabitica": "Doe mee met Habitica", "alreadyHaveAccountLogin": "Heb je al een account op Habitica? Log in.", diff --git a/website/common/locales/nl/gear.json b/website/common/locales/nl/gear.json index 5eccd5e38b..9c7f1b8d30 100644 --- a/website/common/locales/nl/gear.json +++ b/website/common/locales/nl/gear.json @@ -418,7 +418,7 @@ "armorSpecialBirthday2016Notes": "Van harte gefeliciteerd, Habitica! Draag deze Belachelijke Feestgewaden om deze mooie dag te vieren. Verleent geen voordelen.", "armorSpecialBirthday2017Text": "Wispelturig feestgewaad", "armorSpecialBirthday2017Notes": "Fijne verjaardag, Habitica! Draag dit wispelturig feestgewaad om deze wonderbaarlijke dag te vieren. Verleent geen voordelen.", - "armorSpecialBirthday2018Text": "Fanciful Party Robes", + "armorSpecialBirthday2018Text": "Fantasievolle feestmantel", "armorSpecialBirthday2018Notes": "Happy Birthday, Habitica! Wear these Fanciful Party Robes to celebrate this wonderful day. Confers no benefit.", "armorSpecialGaymerxText": "Harnas van de Regenboogkrijger", "armorSpecialGaymerxNotes": "Om de GaymerX-conferentie te vieren is deze speciale wapenrusting gedecoreerd met een stralend, kleurrijk, regenboogpatroon! GaymerX is een game-conventie die LGTBQ en gamen viert en open is voor iedereen.", @@ -540,15 +540,15 @@ "armorSpecialFall2017WarriorNotes": "This armor will protect you like a delicious candy shell. Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.", "armorSpecialFall2017MageText": "Masquerade Robes", "armorSpecialFall2017MageNotes": "What masquerade ensemble would be complete without dramatic and sweeping robes? Increases Intelligence by <%= int %>. Limited Edition 2017 Autumn Gear.", - "armorSpecialFall2017HealerText": "Haunted House Armor", + "armorSpecialFall2017HealerText": "Spookslotharnas", "armorSpecialFall2017HealerNotes": "Your heart is an open door. And your shoulders are roofing tiles! Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.", "armorSpecialWinter2018RogueText": "Reindeer Costume", "armorSpecialWinter2018RogueNotes": "You look so cute and fuzzy, who could suspect you are after holiday loot? Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", "armorSpecialWinter2018WarriorText": "Wrapping Paper Armor", "armorSpecialWinter2018WarriorNotes": "Don't let the papery feel of this armor fool you. It's nearly impossible to rip! Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", - "armorSpecialWinter2018MageText": "Sparkly Tuxedo", + "armorSpecialWinter2018MageText": "Glitterende smoking", "armorSpecialWinter2018MageNotes": "The ultimate in magical formalwear. Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", - "armorSpecialWinter2018HealerText": "Mistletoe Robes", + "armorSpecialWinter2018HealerText": "Maretakgewaad", "armorSpecialWinter2018HealerNotes": "These robes are woven with spells for extra holiday joy. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "armorMystery201402Text": "Boodschappersgewaden", "armorMystery201402Notes": "Het gewaad is glinsterend en sterk en heeft vele zakken om brieven te dragen. Verleent geen voordelen. Abonnee-uitrusting februari 2014.", @@ -606,12 +606,14 @@ "armorMystery201704Notes": "Feeën hebben dit harnas gemaakt van ochtenddauw om de kleuren van de zonsopkomst te vangen. Verleent geen voordelen. April 2017 abonnee voorwerp. ", "armorMystery201707Text": "Jellymancer-harnas", "armorMystery201707Notes": "Dit harnas zal je helpen samen te smelten met de wezens van de oceaan terwijl je onderwaterqueestes en -avonturen najaagt. Verleent geen voordelen. Abonnee-artikel juli 2017.", - "armorMystery201710Text": "Imperious Imp Apparel", + "armorMystery201710Text": "Kordate Kabouterkledij", "armorMystery201710Notes": "Scaly, shiny, and strong! Confers no benefit. October 2017 Subscriber Item.", - "armorMystery201711Text": "Carpet Rider Outfit", - "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", + "armorMystery201711Text": "Tapijtvliegerpak", + "armorMystery201711Notes": "Deze knuffelig warme trui-set houdt je warm terwijl je door de lucht glijdt! Verleent geen voordelen. November 2017 abonnee-artikel", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunkpak", "armorMystery301404Notes": "Net en zwierig, niet? Verleent geen voordelen. Abonnee-uitrusting februari 3015.", "armorMystery301703Text": "Steampunk pauw jurk", @@ -665,7 +667,7 @@ "armorArmoireWoodElfArmorText": "Boselfharnas", "armorArmoireWoodElfArmorNotes": "This armor of bark and leaves will serve as durable camouflage in the forest. Increases Perception by <%= per %>. Enchanted Armoire: Wood Elf Set ", "armorArmoireRamFleeceRobesText": "Ramsvacht Gewaden", - "armorArmoireRamFleeceRobesNotes": "These robes keep you warm even through the fiercest blizzard. Increases Constitution by <%= con %> and Strength by <%= str %>. Enchanted Armoire: Ram Barbarian Set (Item 2 of 3).", + "armorArmoireRamFleeceRobesNotes": "Deze mantel houdt je zelfs warm tijdens de zwaarste sneeuwstorm. Verhoogt Lichaam met <%= con %> en Kracht met<%= str %>. Betoverd Kabinet: Barbaarse Ram Set (voorwerp 2 of 3).", "armorArmoireGownOfHeartsText": "Hartenjurk", "armorArmoireGownOfHeartsNotes": "Deze jurk heeft alle franjes! Maar da's niet alles, het verhoogt ook de kracht van je hart. Verhoogt lichaam met <%= con %>. Betoverd kabinet: Harten koningin set (voorwerp 2 van 3).", "armorArmoireMushroomDruidArmorText": "Paddenstoel druïde harnas", @@ -904,21 +906,21 @@ "headSpecialSummer2017HealerNotes": "Deze helm is gemaakt van vriendelijke zeewezens die tijdelijk op je hoofd rusten, terwijl ze je wijze raad geven. Verhoogt Intelligentie met <%= int %>. Beperkte oplage zomeruitrusting 2017.", "headSpecialFall2017RogueText": "Jack-o-Lantern Helm", "headSpecialFall2017RogueNotes": "Ready for treats? Time to don this festive, glowing helm! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", - "headSpecialFall2017WarriorText": "Candy Corn Helm", + "headSpecialFall2017WarriorText": "Maïssnoephelm", "headSpecialFall2017WarriorNotes": "This helm might look like a treat, but wayward tasks won't find it so sweet! Increases Strength by <%= str %>. Limited Edition 2017 Autumn Gear.", "headSpecialFall2017MageText": "Masquerade Helm", "headSpecialFall2017MageNotes": "When you appear in this feathery hat, everyone will be left guessing the identity of the magical stranger in the room! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", - "headSpecialFall2017HealerText": "Haunted House Helm", - "headSpecialFall2017HealerNotes": "Invite spooky spirits and friendly creatures to seek your healing powers in this helm! Increases Intelligence by <%= int %>. Limited Edition 2017 Autumn Gear.", - "headSpecialNye2017Text": "Fanciful Party Hat", - "headSpecialNye2017Notes": "You've received a Fanciful Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.", - "headSpecialWinter2018RogueText": "Reindeer Helm", - "headSpecialWinter2018RogueNotes": "The perfect holiday disguise, with a built-in headlight! Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", + "headSpecialFall2017HealerText": "Spookslothelm", + "headSpecialFall2017HealerNotes": "Nodig geestige geesten en schattige schepsels uit om je genezende krachten te voelen door deze helm! Verhoogt Intelligentie met<%= int %>. Beperkte Oplage 2017 Herfstuitrusting. ", + "headSpecialNye2017Text": "Fantasievolle Feesthoed", + "headSpecialNye2017Notes": "Je hebt een Fantasievolle Feesthoed gekregen! Draag het met trots terwijl je het nieuwe jaar inluidt! Verleent geen voordelen.", + "headSpecialWinter2018RogueText": "Rendierhelm", + "headSpecialWinter2018RogueNotes": "De perfecte vermomming voor de feestdagen, met een ingebouwde koplamp <%= per %>. Beperkte oplage 2017-2018 Winteruitrusting", "headSpecialWinter2018WarriorText": "Giftbox Helm", "headSpecialWinter2018WarriorNotes": "This jaunty box top and bow are not only festive, but quite sturdy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", "headSpecialWinter2018MageText": "Sparkly Top Hat", "headSpecialWinter2018MageNotes": "Ready for some extra special magic? This glittery hat is sure to boost all your spells! Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", - "headSpecialWinter2018HealerText": "Mistletoe Hood", + "headSpecialWinter2018HealerText": "Maretakkap", "headSpecialWinter2018HealerNotes": "This fancy hood will keep you warm with happy holiday feelings! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", "headSpecialGaymerxText": "Helm van de Regenboogkrijger", "headSpecialGaymerxNotes": "Om de GaymerX conferentie te vieren, is deze speciale helm gedecoreerd met een stralend, kleurrijk, regenboogpatroon! GaymerX is een game-conventie die LGTBQ en gamen viert en open is voor iedereen.", @@ -980,10 +982,12 @@ "headMystery201705Notes": "Habitica staat bekend om zijn woeste en productieve Griffioenkrijgers! Voeg je bij hun prestigieuze rangen als je deze geveerde helm opzet. Verleent geen voordelen. Mei 2017 abonnee-artikel.", "headMystery201707Text": "Jellymancer-helm", "headMystery201707Notes": "Heb je wat extra handen nodig voor je taken? Deze transparante geleihelm heeft een aantal tentakels om je te helpen! Verleent geen voordelen. Abonnee-artikel juli 2017.", - "headMystery201710Text": "Imperious Imp Helm", + "headMystery201710Text": "Kordate Kabouterhelm", "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Chique hoge hoed", "headMystery301404Notes": "Een chique hoge hoed voor lieden van deftigen huize! Abonnee-uitrusting januari 3015. Verleent geen voordelen.", "headMystery301405Text": "Standaard hoge hoed", @@ -1218,7 +1222,7 @@ "shieldSpecialWinter2018RogueNotes": "Perfect for climbing walls or distracting your foes with sweet, sweet candy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", "shieldSpecialWinter2018WarriorText": "Magic Gift Bag", "shieldSpecialWinter2018WarriorNotes": "Just about any useful thing you need can be found in this sack, if you know the right magic words to whisper. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", - "shieldSpecialWinter2018HealerText": "Mistletoe Bell", + "shieldSpecialWinter2018HealerText": "Maretakbel", "shieldSpecialWinter2018HealerNotes": "What's that sound? The sound of warmth and cheer for all to hear! Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "shieldMystery201601Text": "Slachter van Voornemens", "shieldMystery201601Notes": "Dit zwaard kan gebruikt worden om alle afleidingen af te weren. Verleent geen voordelen. Abonnee-uitrusting januari 2016.", @@ -1226,8 +1230,10 @@ "shieldMystery201701Notes": "Breng de tijd tot stilstand en volbreng je taken! Verleent geen voordelen. Abonnee-uitrusting januari 2017.", "shieldMystery201708Text": "Lava Schild", "shieldMystery201708Notes": "Dit grove uit gesmolten steen bestaande schild beschermd je tegen slechte gewoontes, maar brand niet je handen. Verleent geen voordelen. Abonnee-uitrusting augustus 2017", - "shieldMystery201709Text": "Sorcery Handbook", + "shieldMystery201709Text": "Toverspreukenboek", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Klokkenschild", "shieldMystery301405Notes": "Je hebt alle tijd van de wereld met dit enorme klokkenschild! Verleent geen voordelen. Abonnee-uitrusting juni 3015.", "shieldMystery301704Text": "Wapperende waaier", @@ -1300,7 +1306,7 @@ "backMystery201706Notes": "\nHet gezicht van deze Jolly Roger-emblazoned vlag vult elke dag, of dagelijks, met vrees! Geen voordeel uitbetaald. Juni 2017 Abonnee Item.", "backMystery201709Text": "Stack o' Sorcery Books", "backMystery201709Notes": "Learning magic takes a lot of reading, but you're sure to enjoy your studies! Confers no benefit. September 2017 Subscriber Item.", - "backMystery201801Text": "Frost Sprite Wings", + "backMystery201801Text": "Vorstflitsvleugels", "backMystery201801Notes": "They may look as delicate as snowflakes, but these enchanted wings can carry you anywhere you wish! Confers no benefit. January 2018 Subscriber Item.", "backSpecialWonderconRedText": "Machtige cape", "backSpecialWonderconRedNotes": "Zwiept met kracht en schoonheid. Verleent geen voordelen. Speciale congresuitrusting.", @@ -1315,7 +1321,7 @@ "backSpecialTurkeyTailBaseText": "Turkey Tail", "backSpecialTurkeyTailBaseNotes": "Wear your noble Turkey Tail with pride while you celebrate! Confers no benefit.", "body": "Lichaamsaccessoire", - "bodyCapitalized": "Body Accessory", + "bodyCapitalized": "Lichaamsaccessoire", "bodyBase0Text": "Geen lichaamsaccessoire", "bodyBase0Notes": "Geen lichaamsaccessoire.", "bodySpecialWonderconRedText": "Robijnrode kraag", @@ -1325,9 +1331,9 @@ "bodySpecialWonderconBlackText": "Ebbenhouten kraag", "bodySpecialWonderconBlackNotes": "Een aantrekkelijke ebbenhouten kraag! Verleent geen voordelen. Speciale congresuitrusting.", "bodySpecialTakeThisText": "Take This schouderbladen", - "bodySpecialTakeThisNotes": "These pauldrons were earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", - "bodySpecialAetherAmuletText": "Aether Amulet", - "bodySpecialAetherAmuletNotes": "This amulet has a mysterious history. Increases Constitution and Strength by <%= attrs %> each.", + "bodySpecialTakeThisNotes": "Deze epauletten zijn verdiend door deel te nemen aan een gesponsorde uitdaging van Take This. Gefeliciteerd! Verhoogt alle eigenschappen met <%= attrs %>.", + "bodySpecialAetherAmuletText": "Etherisch Amulet", + "bodySpecialAetherAmuletNotes": "Dit amulet heeft een mysterieus verleden. Verhoogt Lichaam en Kracht elk met <%= attrs %>.", "bodySpecialSummerMageText": "Glanzende korte cape", "bodySpecialSummerMageNotes": "Zout noch zoet water kan deze korte metaalachtige cape aantasten. Verleent geen voordelen. Beperkte oplage zomeruitrusting 2014.", "bodySpecialSummerHealerText": "Kraag van koraal", @@ -1412,7 +1418,7 @@ "headAccessoryMystery201502Notes": "Geef je fantasie de vrije vlucht! Verleent geen voordelen. Abonnee-uitrusting februari 2015.", "headAccessoryMystery201510Text": "Koboldhoorns", "headAccessoryMystery201510Notes": "Deze angstaanjagende hoorns zijn een beetje slijmerig. Verleent geen voordelen. Abonnee-uitrusting oktober 2015.", - "headAccessoryMystery201801Text": "Frost Sprite Antlers", + "headAccessoryMystery201801Text": "Vorstflitsgewei", "headAccessoryMystery201801Notes": "These icy antlers shimmer with the glow of winter auroras. Confers no benefit. January 2018 Subscriber Item.", "headAccessoryMystery301405Text": "Veiligheidsbril voor op je hoofd", "headAccessoryMystery301405Notes": "\"Veiligheidsbrillen zijn voor je ogen,\" zeiden ze. \"Niemand wil een veiligheidsbril die je alleen maar op je hoofd kunt dragen,\" zeiden ze. Ha! Jij hebt ze laten zien hoe het echt moet! Verleent geen voordelen. Abonnee-uitrusting augustus 3015.", diff --git a/website/common/locales/nl/generic.json b/website/common/locales/nl/generic.json index 63169f7467..4661e51d5e 100644 --- a/website/common/locales/nl/generic.json +++ b/website/common/locales/nl/generic.json @@ -15,7 +15,7 @@ "titleProfile": "Profiel", "titleInbox": "Inbox", "titleTavern": "Herberg", - "titleParty": "Groep", + "titleParty": "Gezelschap", "titleHeroes": "Hal der Helden", "titlePatrons": "Hal der Weldoeners", "titleGuilds": "Gilden", @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's thema", "audioTheme_beatscribeNesTheme": "Beatscribe's NES-thema", "audioTheme_arashiTheme": "Arashi's thema", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/nl/groups.json b/website/common/locales/nl/groups.json index 1364f6816e..208558dd94 100644 --- a/website/common/locales/nl/groups.json +++ b/website/common/locales/nl/groups.json @@ -34,14 +34,14 @@ "communityGuidelinesRead2": "voordat je begint met chatten.", "bannedWordUsed": "Oeps! Het lijkt er op dat dit bericht een scheldwoord, religieuze eed, of verwijzing naar een verslavende substantie of volwassen onderwerp bevat. Habitica heeft gebruikers van alle achtergronden, dus houden we onze chat heel netjes. Je mag gerust je bericht bewerken zodat je het kan plaatsen!", "bannedSlurUsed": "Je bericht bevatte ongepast taalgebruik en je chatprivileges zijn ingetrokken.", - "party": "Groep", + "party": "Gezelschap", "createAParty": "Creëer een gezelschap", - "updatedParty": "Groepsinstellingen bijgewerkt.", + "updatedParty": "Gezelschaps-instellingen bijgewerkt.", "errorNotInParty": "Je zit niet in een gezelschap", "noPartyText": "You are either not in a Party or your Party is taking a while to load. You can either create one and invite friends, or if you want to join an existing Party, have them enter your Unique User ID below and then come back here to look for the invitation:", "LFG": "To advertise your new Party or find one to join, go to the <%= linkStart %>Party Wanted (Looking for Group)<%= linkEnd %> Guild.", "wantExistingParty": "Want to join an existing Party? Go to the <%= linkStart %>Party Wanted Guild<%= linkEnd %> and post this User ID:", - "joinExistingParty": "Aansluiten bij de gezelschap van iemand anders", + "joinExistingParty": "Aansluiten bij het gezelschap van iemand anders", "needPartyToStartQuest": "Whoops! You need to create or join a Party before you can start a quest!", "createGroupPlan": "Aanmake", "create": "Creëren", @@ -55,7 +55,7 @@ "joinPartyConfirmationText": "Are you sure you want to join the Party \"<%= partyName %>\"? You can only be in one Party at a time. If you join, all other Party invitations will be rejected.", "invitationAcceptedHeader": "Je uitnodiging is geaccepteerd", "invitationAcceptedBody": "<%= username %> heeft je uitnodiging voor <%= groupName %> geaccepteerd!", - "joinNewParty": "Aansluiten bij nieuwe gezelschap", + "joinNewParty": "Aansluiten bij nieuw gezelschap", "declineInvitation": "Uitnodiging weigeren", "partyLoading1": "Your Party is being summoned. Please wait...", "partyLoading2": "Your Party is coming in from battle. Please wait...", @@ -202,7 +202,6 @@ "partyOnName": "Groepsfeestje", "partyUpText": "Is lid geworden van een gezelschap met een andere persoon! Veel plezier met het vechten tegen monsters en het ondersteunen van elkaar.", "partyOnText": "Is lid geworden van een gezelschap met minstens vier personen! Geniet van je verhoogde verantwoordelijkheid als je samen werkt met je vrienden om je vijanden te verslaan.", - "largeGroupNote": "Notitie: deze gilde is nu te groot om mededelingen te ondersteunen! Zorg ervoor dat je elke dag terugkomt om nieuwe berichten te zien.", "groupIdRequired": "\"groupId\" moet een geldige UUID zijn", "groupNotFound": "Groep niet gevonden of je hebt geen toegang.", "groupTypesRequired": "Je moet een geldig \"type\" query string geven.", @@ -220,17 +219,17 @@ "inviteMissingUuid": "De gebruikers-ID ontbreekt in de uitnodiging", "inviteMustNotBeEmpty": "De uitnodiging mag niet leeg zijn.", "partyMustbePrivate": "Groepen moeten privé zijn", - "userAlreadyInGroup": "De gebruiker zit al in die groep.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Je kunt jezelf niet voor een groep uitnodigen.", - "userAlreadyInvitedToGroup": "De gebruiker is al uitgenodigd voor die groep.", - "userAlreadyPendingInvitation": "De gebruiker heeft al een uitnodiging in de wacht staan.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Gebruiker met id \"<%= userId %>\" niet gevonden.", "userHasNoLocalRegistration": "De gebruiker heeft geen lokale registratie (gebruikersnaam, e-mail, wachtwoord).", "uuidsMustBeAnArray": "Gebruikers-ID-uitnodigingen moeten een array zijn.", "emailsMustBeAnArray": "E-mailadres-uitnodigingen moeten een array zijn. ", "canOnlyInviteMaxInvites": "Je kunt er slechts \"<%= maxInvites %>\" uitnodigen per keer", - "partyExceedsMembersLimit": "Grootte van de gezelschap is beperkt tot <%= maxMembersParty %> leden", + "partyExceedsMembersLimit": "Grootte van het gezelschap is beperkt tot <%= maxMembersParty %> leden", "onlyCreatorOrAdminCanDeleteChat": "Niet gemachtigd om dit bericht te verwijderen!", "onlyGroupLeaderCanEditTasks": "Niet gemachtigd om taken te beheren!", "onlyGroupTasksCanBeAssigned": "Enkel groepstaken kunnen toegewezen worden.", @@ -416,12 +415,14 @@ "wouldYouParticipate": "Wil je deelnemen?", "managerAdded": "Manager succesvol toegevoegd", "managerRemoved": "Manager succesvol verwijderd", - "leaderChanged": "Leader has been changed", - "whatIsWorldBoss": "What is a World Boss?", - "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", - "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", - "worldBossBullet1": "Complete tasks to damage the World Boss", - "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", + "leaderChanged": "Leider is veranderd", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", + "whatIsWorldBoss": "Wat is een Wereldbaas?", + "worldBossDesc": "Een wereldbaas is een speciaal evenement dat de Gemeenschap van Habitica samenbrengt om gezamenlijk een krachtig monster te verslaan door het vervullen van taken! Alle Habitica gebruikers worden beloond wanneer het monster uiteindelijk is verslagen, zelfs degen die hebben uitgerust in de Herberg of die Habitica überhaupt niet hebben gebruikt voor de duur van deze queeste.", + "worldBossLink": "Lees meer over de eerdere Habiticaanse Wereldbazen op de Wiki.", + "worldBossBullet1": "Voltooi je taken om de Wereldbaas te beschadigen.", + "worldBossBullet2": "De Wereldbaas zal jou geen schade berokkenen voor je gemiste taken, maar zijn furiebalk zal zich vullen. Als de balk geheel gevuld is, valt de Wereldbaas een van Habitica’s winkeleigenaren aan!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Kom regelmatig in de Herberg kijken om de vooruitgang van de Wereldbaas en zijn woede aanvallen te zien.", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/nl/limited.json b/website/common/locales/nl/limited.json index 1dffa33baf..cfb9a5422a 100644 --- a/website/common/locales/nl/limited.json +++ b/website/common/locales/nl/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh... Welkom in de Seizoenswinkel... We hebben op het moment najaars spullen in voorraad, ofzo... Alles is te koop tijdens het Najaars Volksfeest-evenement ieder jaar, maar we zijn maar open tot 31 oktober... Zorg maar dat je inslaat anders zou je moeten wachten... wachten... en nog eens wachten... *zucht*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Als je eerder uitrusting hiervan in het verleden hebt gekocht, maar momenteel niet bezit, kun je deze opnieuw kopen in de Beloningen-kolom. Je zult enkel de voorwerpen voor je huidige klasse (Krijger is standaard) kunnen kopen, maar vrees niet, de andere klasse-specifieke voorwerpen zullen beschikbaar worden als je naar die klasse wisselt.", "candycaneSet": "Zuurstok (Magiër)", "skiSet": "Skimoordenaar (Dief)", diff --git a/website/common/locales/nl/loadingscreentips.json b/website/common/locales/nl/loadingscreentips.json index df6ac037f7..38e233e51e 100644 --- a/website/common/locales/nl/loadingscreentips.json +++ b/website/common/locales/nl/loadingscreentips.json @@ -1,13 +1,13 @@ { "tipTitle": "Tip #<%= tipNumber %>", "tip1": "Houd je taken overal in de gaten met de Habitica mobiele app. ", - "tip2": "Click any equipment to see a preview, or equip it instantly by clicking the star in its upper-left corner!", + "tip2": "Klik op de uitrusting voor een preview, of gebruik de uitrusting direct door op de ster in de linkerbovenhoek te klikken!", "tip3": "Gebruik emoticons om snel onderscheid te maken tussen je taken.", "tip4": "Gebruik het # teken voor de naam van een taak om het heel groot te maken!", "tip5": "It’s best to use skills that cause buffs in the morning so they last longer.", "tip6": "Hover over a task and click the dots to access advanced task controls, such as the ability to push tasks to the top/bottom of your list.", "tip7": "Some backgrounds connect perfectly if Party members use the same background. Ex: Mountain Lake, Pagodas, and Rolling Hills.", - "tip8": "Send a Message to someone by clicking their name in chat and then clicking the envelope icon at the top of their profile!", + "tip8": "Stuur een persoonlijk bericht naar iemand door te klikken op het envelopje bij zijn of haar naam in de chat!", "tip9": "Use the filters + search bar in the Inventories, Shops, Guilds, and Challenges to quickly find what you want.", "tip10": "Je kan edelstenen winnen door deel te nemen aan uitdagingen. Dagelijks worden er nieuwe toegevoegd!", "tip11": "Having more than four Party members increases accountability!", @@ -16,14 +16,14 @@ "tip14": "Je kan titels of inspirerende uitspraken zonder (+/-) toevoegen aan je lijst van gewoontes .", "tip15": "Complete all the Masterclasser Quest-lines to learn about Habitica’s secret lore.", "tip16": "Click the link to the Data Display Tool in the footer for valuable insights on your progress.", - "tip17": "Use the mobile apps to set reminders for your tasks.", + "tip17": "Gebruik de mobiele app’s om herinneringen in te stellen voor je taken.", "tip18": "Gewoontes die positief of negatief zijn, \"vervagen\" en worden weer langzaam geel.", "tip19": "Boost your Intelligence Stat to gain more experience when you complete a task.", "tip20": "Verhoog je perceptie-eigenschap om meer vondsten en goud te krijgen.", "tip21": "Verhoog je kracht-eigenschap om meer schade toe te brengen aan eindbazen en meer voltreffers te krijgen.", "tip22": "Verhoog je lichaam-eigenschap om de schade van onvoltooide dagelijkse taken te minderen.", "tip23": "Reach level 100 to unlock the Orb of Rebirth for free and start a new adventure!", - "tip24": "Have a question? Ask in the Habitica Help Guild!", + "tip24": "Heb je een vraag? Raadpleeg het Habitica Help Gilde!", "tip25": "De vier seizoengebonden Grote Gala's beginnen dicht bij de zonnewendes en de nachteveningen.", "tip26": "An arrow to the right of someone’s name means they’re currently buffed.", "tip27": "Gisteren een dagelijkse taak gedaan, maar vergeten het te controleren? Maak je geen zorgen! Met Registreer Activiteit van Gisteren, heb je de kans om te registreren wat je deed voordat je je nieuwe dag begint.", diff --git a/website/common/locales/nl/npc.json b/website/common/locales/nl/npc.json index a1bf25b619..519e7c4bf3 100644 --- a/website/common/locales/nl/npc.json +++ b/website/common/locales/nl/npc.json @@ -31,8 +31,8 @@ "danielText2": "Wees gewaarschuwd: Als je meedoet aan een queeste met een eindbaas, zal de eindbaas je nog steeds pijn doen voor de gemiste dagelijkse taken van je groepsgenoten, tenzij ze ook in de herberg verblijven! Je zult zelf ook geen schade toebrengen aan de eindbaas (of voorwerpen krijgen) totdat je de Herberg verlaat.", "danielTextBroken": "Welkom in de herberg... Denk ik... Als je rust nodig hebt, zal ik je onderbrengen in de herberg... Zolang je ingecheckt bent, zullen je dagelijkse taken je geen pijn doen aan het eind van de dag... Je kunt ze nog wel afvinken... Als je daar de energie voor hebt...", "danielText2Broken": "Oh... Als je meedoet aan een queeste met een eindbaas, zal de eindbaas je nog steeds pijn doen voor de gemiste dagelijkse taken van je groepsgenoten... Je zult zelf ook geen schade toebrengen aan de eindbaas (of voorwerpen vinden) totdat je de Herberg verlaat...", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "Wereldbaasevenement", + "worldBossDescription": "Wereldbaasbeschrijving", "alexander": "Alexander de Koopman", "welcomeMarket": "Welkom op de markt! Koop zeldzame eieren en drankjes! Verkoop je overschot! Gebruik nuttige diensten! Kom langs en bekijk zelf wat we voor je hebben.", "welcomeMarketMobile": "Welcome to the Market! Buy hard-to-find eggs and potions! Come see what we have to offer.", @@ -98,7 +98,7 @@ "USD": "(USD)", "newStuff": "New Stuff by Bailey", "newBaileyUpdate": "New Bailey Update!", - "tellMeLater": "Tell Me Later", + "tellMeLater": "Een andere keer lezen", "dismissAlert": "Boodschap verbergen", "donateText1": "Voegt 20 edelstenen toe aan je account. Edelstenen kunnen worden gebruikt om speciale digitale objecten te kopen, zoals shirts en kapsels.", "donateText2": "Steun Habitica", diff --git a/website/common/locales/nl/overview.json b/website/common/locales/nl/overview.json index 1d15a03b6f..afd4d93ba1 100644 --- a/website/common/locales/nl/overview.json +++ b/website/common/locales/nl/overview.json @@ -2,7 +2,7 @@ "needTips": "Tips nodig om van start te gaan? Hier is een korte speluitleg!", "step1": "Stap 1: Voer taken in", - "webStep1Text": "Habitica is nothing without real-world goals, so enter a few tasks. You can add more later as you think of them! All tasks can be added by clicking the green \"Create\" button.\n* **Set up [To-Dos](http://habitica.wikia.com/wiki/To-Dos):** Enter tasks you do once or rarely in the To-Dos column, one at a time. You can click on the tasks to edit them and add checklists, due dates, and more!\n* **Set up [Dailies](http://habitica.wikia.com/wiki/Dailies):** Enter activities you need to do daily or on a particular day of the week, month, or year in the Dailies column. Click task to edit when it will be due and/or set a start date. You can also make it due on a repeating basis, for example, every 3 days.\n* **Set up [Habits](http://habitica.wikia.com/wiki/Habits):** Enter habits you want to establish in the Habits column. You can edit the Habit to change it to just a good habit :heavy_plus_sign: or a bad habit :heavy_minus_sign:\n* **Set up [Rewards](http://habitica.wikia.com/wiki/Rewards):** In addition to the in-game Rewards offered, add activities or treats which you want to use as a motivation to the Rewards column. It's important to give yourself a break or allow some indulgence in moderation!\n* If you need inspiration for which tasks to add, you can look at the wiki's pages on [Sample Habits](http://habitica.wikia.com/wiki/Sample_Habits), [Sample Dailies](http://habitica.wikia.com/wiki/Sample_Dailies), [Sample To-Dos](http://habitica.wikia.com/wiki/Sample_To-Dos), and [Sample Rewards](http://habitica.wikia.com/wiki/Sample_Custom_Rewards).", + "webStep1Text": "Habitica is niets zonder doelen in het echte leven, dus voeg enkele taken toe. Je kunt later nog meer taken toevoegen zodra je er meer bedenkt!

\n* **[Taken](http://nl.habitica.wikia.com/wiki/To-do's) opstellen:**\n\nVoeg taken die je eenmalig of zelden doet één voor één toe aan de Takenkolom. Je kunt op het potlood klikken om ze te bewerken en om afvinklijsten, een einddatum en meer toe te voegen!

\n* **[Dagelijkse taken](http://nl.habitica.wikia.com/wiki/Dagelijkse_taken) opstellen:**\n\nVoeg activiteiten die je dagelijks of op een bepaalde dag van de week moet doen toe aan de Dagelijkse taken kolom. Klik op het potloodicoon van de taak om te kiezen op welke dag(en) van de week de taak moet worden gedaan. Je kunt de taak ook zo aanpassen dat deze zichzelf herhaalt om de zoveel dagen, bijvoorbeeld om de drie dagen.

\n* **[Gewoonten](http://nl.habitica.wikia.com/wiki/Gewoonten) opstellen:**\n\nVoeg gewoonten die je wilt ontwikkelen toe in de Gewoontenkolom. Je kan de gewoonte aanpassen en er een enkel goede gewoonte of een enkel slechte gewoonte van maken.

\n* **[Beloningen](http://nl.habitica.wikia.com/wiki/Beloningen) opstellen:**\n\nNaast de beloningen die je in het spel worden aangeboden, kun je activiteiten of lekkernijen die je als motivatie wilt gebruiken in de Beloningenkolom toevoegen. Het is belangrijk om jezelf een pauze te gunnen!

Als je inspiratie nodig hebt om taken toe te voegen, neem dan kijkje op de wikipagina's over [Voorbeelden van gewoonten](http://nl.habitica.wikia.com/wiki/Voorbeeldgewoonten), [Voorbeelden van dagelijkse taken](http://nl.habitica.wikia.com/wiki/Voorbeelden_van_dagelijkse_taken), [Voorbeelden van Taken](http://nl.habitica.wikia.com/wiki/Voorbeeld_To-do's) en [Voorbeelden van aangepaste beloningen](http://nl.habitica.wikia.com/wiki/Voorbeelden_van_aangepaste_beloningen).", "step2": "Stap 2: krijg punten door dingen te doen in het echte leven", "webStep2Text": "Begin nu met het tackelen van je doelen op de lijst! Als je taken voltooit en ze afstreept in Habitica krijg je [ervaringspunten](http://nl.habitica.wikia.com/wiki/Ervaringspunten), die je helpen om niveaus omhoog te gaan, en [goud](http://nl.habitica.wikia.com/wiki/Goud), waarmee je beloningen kunt kopen. Als je terugvalt in slechte gewoontes of dagelijkse taken mist, zul je [levenspunten](http://nl.habitica.wikia.com/wiki/Levenspunten) verliezen. Op deze manier zijn de ervaringsbalk en gezondheidsbalk een leuke indicator van je vooruitgang ten opzichte van je doelen. Je zult zien dat je echte leven verbetert naarmate je personage in het spel vooruit gaat.", diff --git a/website/common/locales/nl/quests.json b/website/common/locales/nl/quests.json index ca0ff33f3a..4e28f7ae5e 100644 --- a/website/common/locales/nl/quests.json +++ b/website/common/locales/nl/quests.json @@ -63,7 +63,7 @@ "questTaskCollection": "<%= items %> voorwerpen verzameld vandaag", "questOwnerNotInPendingQuest": "De eigenaar van de queeste heeft de queeste verlaten en kan deze niet meer handmatig starten. Advies is om de queeste te annuleren. De eigenaar van de queeste houdt de queeste-perkamentrol.", "questOwnerNotInRunningQuest": "De eigenaar van de queeste heeft de queeste verlaten. Als het nodig is, kun je de queeste afbreken. Het is ook mogelijk om de queeste door te laten gaan; alle resterende deelnemers krijgen hun beloning als de queeste afgelopen is.", - "questOwnerNotInPendingQuestParty": "De eigenaar van de queeste heeft de gezelschap verlaten en kan de queeste niet meer handmatig starten. Advies is om de queeste te annuleren. De eigenaar van de queeste houdt de queeste-perkamentrol.", + "questOwnerNotInPendingQuestParty": "De eigenaar van de queeste heeft het gezelschap verlaten en kan de queeste niet meer handmatig starten. Advies is om de queeste te annuleren. De eigenaar van de queeste houdt de queeste-perkamentrol.", "questOwnerNotInRunningQuestParty": "De eigenaar van de queeste heeft de gezelschap verlaten. Als het nodig is, kun je de queeste afbreken, maar het is ook mogelijk om de queeste door te laten gaan; alle resterende deelnemers krijgen hun beloning als de queeste afgelopen is.", "questParticipants": "Deelnemers", "scrolls": "Queeste-perkamentrol", @@ -83,8 +83,8 @@ "sureCancel": "Weet je zeker dat je deze queeste af wilt breken? Alle geaccepteerde uitnodigingen gaan verloren. De eigenaar van de queeste houdt de queeste-perkamentrol.", "sureAbort": "Weet je zeker dat je deze missie wilt afbreken? De missie wordt afgebroken voor iedereen in jouw gezelschap; alle vorderingen gaan verloren. De queeste-perkamentrol wordt teruggegeven aan de eigenaar van de queeste.", "doubleSureAbort": "Weet je het echt heel zeker? Zorg ervoor dat ze niet voor altijd een hekel aan je krijgen!", - "questWarning": "Als nieuwe spelers bij de gezelschap komen voordat de queeste begint, krijgen ze ook een uitnodiging. Als de queeste eenmaal begonnen is, kunnen nieuwe gezelschapsleden zich echter niet bij de queeste aansluiten.", - "questWarningBroken": "Als nieuwe spelers bij de gezelschap komen voordat de queeste begint, krijgen ze ook een uitnodiging... Als de queeste eenmaal begonnen is, kunnen nieuwe gezelschapsleden zich echter niet bij de queeste aansluiten...", + "questWarning": "Als nieuwe spelers bij het gezelschap komen voordat de queeste begint, krijgen ze ook een uitnodiging. Als de queeste eenmaal begonnen is, kunnen nieuwe gezelschapsleden zich echter niet bij de queeste aansluiten.", + "questWarningBroken": "Als nieuwe spelers bij eht gezelschap komen voordat de queeste begint, krijgen ze ook een uitnodiging... Als de queeste eenmaal begonnen is, kunnen nieuwe gezelschapsleden zich echter niet bij de queeste aansluiten...", "bossRageTitle": "Woede", "bossRageDescription": "Als deze balk vol is, zal de eindbaas een speciale aanval ontketenen.", "startAQuest": "START EEN QUEESTE", diff --git a/website/common/locales/nl/questscontent.json b/website/common/locales/nl/questscontent.json index e8582c04c8..a10c1598f9 100644 --- a/website/common/locales/nl/questscontent.json +++ b/website/common/locales/nl/questscontent.json @@ -520,8 +520,8 @@ "questLostMasterclasser2Notes": "The Joyful Reaper drums her bony fingers on some of the books that you brought. “Oh, dear,” the Master of Healers says. “There is a malevolent life essence at work. I might have guessed, considering the attacks by reanimated skulls during each incident.” Her assistant @tricksy.fox brings in a chest, and you are startled to see the contents that @beffymaroo unloads: the very same objects once used by this mysterious Tzina to possess people.

“I’m going to use resonant healing magic to try to make this creature manifest,” the Joyful Reaper says, reminding you that the skeleton is a somewhat unconventional Healer. “You’ll need to read the revealed information quickly, in case it breaks loose.”

As she concentrates, a twisting mist begins to siphon from the books and twine around the objects. Quickly, you flip through the pages, trying to read the new lines of text that are writhing into view. You catch only a few snippets: “Sands of the Timewastes” — “the Great Disaster” —“split into four”— “permanently corrupted”— before a single name catches your eye: Zinnya.

Abruptly, the pages wrench free from your fingers and shred themselves as a howling creature explodes into being, coalescing around the possessed objects.

“It’s an a’Voidant!” the Joyful Reaper shouts, throwing up a protection spell. “They’re ancient creatures of confusion and obscurity. If this Tzina can control one, she must have a frightening command over life magic. Quickly, attack it before it escapes back into the books!”

", "questLostMasterclasser2Completion": "The a’Voidant succumbs at last, and you share the snippets that you read.

“None of those references sound familiar, even for someone as old as I,” the Joyful Reaper says. “Except… the Timewastes are a distant desert at the most hostile edge of Habitica. Portals often fail nearby, but swift mounts could get you there in no time. Lady Glaciate will be glad to assist.” Her voice grows amused. “Which means that the enamored Master of Rogues will undoubtedly tag along.” She hands you the glimmering mask. “Perhaps you should try to track the lingering magic in these items to its source. I’ll go harvest some sustenance for your journey.”", "questLostMasterclasser2Boss": "The a'Voidant", - "questLostMasterclasser2DropEyewear": "Aether Mask (Eyewear)", - "questLostMasterclasser3Text": "The Mystery of the Masterclassers, Part 3: City in the Sands", + "questLostMasterclasser2DropEyewear": "Etherisch masker (oogaccessoire)", + "questLostMasterclasser3Text": "Het Mysterie van de Masterclassers, deel 3: Stad in het Zand", "questLostMasterclasser3Notes": "As night unfurls over the scorching sands of the Timewastes, your guides @AnnDeLune, @Kiwibot, and @Katy133 lead you forward. Some bleached pillars poke from the shadowed dunes, and as you approach them, a strange skittering sound echoes across the seemingly-abandoned expanse.

“Invisible creatures!” says the April Fool, clearly covetous. “Oho! Just imagine the possibilities. This must be the work of a truly stealthy Rogue.”

“A Rogue who could be watching us,” says Lady Glaciate, dismounting and raising her spear. “If there’s a head-on attack, try not to irritate our opponent. I don’t want a repeat of the volcano incident.”

He beams at her. “But it was one of your most resplendent rescues.”

To your surprise, Lady Glaciate turns very pink at the compliment. She hastily stomps away to examine the ruins.

“Looks like the wreck of an ancient city,” says @AnnDeLune. “I wonder what…”

Before she can finish her sentence, a portal roars open in the sky. Wasn’t that magic supposed to be nearly impossible here? The hoofbeats of the invisible animals thunder as they flee in panic, and you steady yourself against the onslaught of shrieking skulls that flood the skies.", "questLostMasterclasser3Completion": "The April Fool surprises the final skull with a spray of sand, and it blunders backwards into Lady Glaciate, who smashes it expertly. As you catch your breath and look up, you see a single flash of someone’s silhouette moving on the other side of the closing portal. Thinking quickly, you snatch up the amulet from the chest of previously-possessed items, and sure enough, it’s drawn towards the unseen person. Ignoring the shouts of alarm from Lady Glaciate and the April Fool, you leap through the portal just as it snaps shut, plummeting into an inky swath of nothingness.", "questLostMasterclasser3Boss": "Void Skull Swarm", @@ -541,8 +541,8 @@ "questLostMasterclasser4RageTitle": "Siphoning Void", "questLostMasterclasser4RageDescription": "Siphoning Void: This bar fills when you don't complete your Dailies. When it is full, Anti'zinnya will remove the party's Mana!", "questLostMasterclasser4RageEffect": "`Anti'zinnya uses SIPHONING VOID!` In a twisted inversion of the Ethereal Surge spell, you feel your magic drain away into the darkness!", - "questLostMasterclasser4DropBackAccessory": "Aether Cloak (Back Accessory)", - "questLostMasterclasser4DropWeapon": "Aether Crystals (Two-Handed Weapon)", + "questLostMasterclasser4DropBackAccessory": "Etherische mantel (rugaccessoire)", + "questLostMasterclasser4DropWeapon": "Etherische Kristallen (tweehandig wapen)", "questLostMasterclasser4DropMount": "Invisible Aether Mount", "questYarnText": "A Tangled Yarn", "questYarnNotes": "It’s such a pleasant day that you decide to take a walk through the Taskan Countryside. As you pass by its famous yarn shop, a piercing scream startles the birds into flight and scatters the butterflies into hiding. You run towards the source and see @Arcosine running up the path towards you. Behind him, a horrifying creature consisting of yarn, pins, and knitting needles is clicking and clacking ever closer.

The shopkeepers race after him, and @stefalupagus grabs your arm, out of breath. \"Looks like all of his unfinished projects\" gasp gasp \"have transformed the yarn from our Yarn Shop\" gasp gasp \"into a tangled mass of Yarnghetti!\"

\"Sometimes, life gets in the way and a project is abandoned, becoming ever more tangled and confused,\" says @khdarkwolf. \"The confusion can even spread to other projects, until there are so many half-finished works running around that no one gets anything done!\"

It’s time to make a choice: complete your stalled projects… or decide to unravel them for good. Either way, you'll have to increase your productivity quickly before the Dread Yarnghetti spreads confusion and discord to the rest of Habitica!", @@ -565,15 +565,18 @@ "questBadgerDropBadgerEgg": "Badger (Egg)", "questBadgerUnlockText": "Unlocks purchasable Badger eggs in the Market", "questDysheartenerText": "De Harteloze", - "questDysheartenerNotes": "The sun is rising on Valentine’s Day when a shocking crash splinters the air. A blaze of sickly pink light lances through all the buildings, and bricks crumble as a deep crack rips through Habit City’s main street. An unearthly shrieking rises through the air, shattering windows as a hulking form slithers forth from the gaping earth.

Mandibles snap and a carapace glitters; legs upon legs unfurl in the air. The crowd begins to scream as the insectoid creature rears up, revealing itself to be none other than that cruelest of creatures: the fearsome Dysheartener itself. It howls in anticipation and lunges forward, hungering to gnaw on the hopes of hard-working Habiticans. With each rasping scrape of its spiny forelegs, you feel a vise of despair tightening in your chest.

“Take heart, everyone!” Lemoness shouts. “It probably thinks that we’re easy targets because so many of us have daunting New Year’s Resolutions, but it’s about to discover that Habiticans know how to stick to their goals!”

AnnDeLune raises her staff. “Let’s tackle our tasks and take this monster down!”", + "questDysheartenerNotes": "De zon komt op op Valentijnsdag als plotseling een allesvermorzelende knal de lucht schokt. Een vuur van misselijkmakend roze licht vlamt door gebouwen, terwijl een diepe scheur bakstenen verpulvert en de hoofdstraat van Gewoontestad doormidden klieft. Een griezelig snerpend gekrijs doemt op en versplintert ruiten als een immens wezen zich kronkelend oprijst uit de gapende kloof. 

Malende kaken, een glinsterend pantser, meer en meer tentakels ontvouwen zich. De menigte begint te gillen terwijl het insectoïde gedaante opzwelt. Het onthult het wreedste monster ooit gezien, niemand minder dan de angstaanjagende Harteloze. Het insect krijst verwachtingsvol en valt uit naar de menigte, hongerend om te knagen aan de hoop van hardwerkende Habiticanen. Met elke raspende uithaal van zijn stekelige voorpoten, beneemt de wanhoop je de adem.

“Houd moed, mensen!!” schreeuwt Lemoness. “Het monster denkt vast dat we een makkelijke prooi zijn, omdat velen van ons uitdagende goede voornemens zijn aangegaan, maar.... Het zal ontdekken dat wij, Habiticanen niet zomaar voor onze doelen wijken!”

AnnDeLune heft haar staf: “We gaan onze taken aan en vermorzelen dit monster!”", "questDysheartenerCompletion": "The Dysheartener is DEFEATED!

Together, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”

Glowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.

The crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.

Our newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.

Beffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”

Crooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", - "questDysheartenerBossRageTitle": "Shattering Heartbreak", - "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", - "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", + "questDysheartenerBossRageTitle": "Versplinterend Hartezeer", + "questDysheartenerBossRageDescription": "De meter voor de uitbarsting van razernij vult zich als Habiticanen hun taken niet voltooien. Als de meter helemaal vol is, dan zal de Harteloze zijn Versplinterend Hartezeer op een van Habitica’s marktkopers loslaten. Dus doe je taken!", + "questDysheartenerBossRageSeasonal": "‘De Harteloze zet het VERSPLINTEREND HARTEZEER in!’\n\nO, nee! Doordat de Harteloze zich te goed heeft gedaan aan omze onafgemaakte dagelijkse taken, heeft hij zovel kracht gewonnen dat hij met Versplinterend Hartezeer aanvalt. Met een schrille kreet, plant het monster zijn stekelige voorpoten in het paviljoen waar de Seizoenswinkel is gevestigd! De verbijsterend magische slag versnippert het hout, de Seizoenstovenares geheel ontdaan achterlatend in het aanzicht van haar getroffen winkel. \n\nSnel, hou je aan je dagelijkse taken zodat het monster niet opnieuw toeslaat!", + "seasonalShopRageStrikeHeader": "De Seizoenswinkel is aangevallen! ", + "seasonalShopRageStrikeLead": "Leslie is verscheurd door verdriet!", + "seasonalShopRageStrikeRecap": "Op 21 februari is onze dierbare Leslie de Seizoenstovenares aangevallen door de Harteloze. Haar hart was gebroken toen ze haar prachtige winkel aan stukken geslagen zag. Snel, pak je taken aan om het monster te verslaan en Leslie’s winkel te herstellen!", + "questDysheartenerBossRageMarket": "‘De Harteloze zet het VERSPLINTEREND HARTEZEER in!’\n\nHelp! Doordat de De Harteloze zich opnieuw tegoed heeft gedaan aan onze onafgemaakte dagelijkse taken, valt hij opnieuw aan met Versplinterend Hartezeer. Dit keer vermorzelt hij de muren en de vloer van de Markt! Terwijl het steen naar beneden raast, laat Alex de Koopman bittere tranen om zijn verlorengegane waar, getroffen door de verwoesting.\n\nWe kunnen dit niet nog eens laten gebeuren! Wees zeker dat je al je dagelijkse taken voltooit, alleen zo voorkomen we dat de Harteloze zijn ultieme slag zal toebrengen.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", - "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", - "questDysheartenerDropHippogriffMount": "Hopeful Hippogriff (Mount)", - "dysheartenerArtCredit": "Artwork by @AnnDeLune" + "questDysheartenerDropHippogriffPet": "Hoopvolle Hippogrief (Huisdier)", + "questDysheartenerDropHippogriffMount": "Hoopvolle Hippogrief (Rijdier)", + "dysheartenerArtCredit": "Ontwerp van @AnnDeLune" } \ No newline at end of file diff --git a/website/common/locales/nl/settings.json b/website/common/locales/nl/settings.json index 8ea7e421c7..4317e9d725 100644 --- a/website/common/locales/nl/settings.json +++ b/website/common/locales/nl/settings.json @@ -147,7 +147,7 @@ "promoCode": "Promotiecode", "promoCodeApplied": "Promotiecode toegepast! Kijk in je boedel", "promoPlaceholder": "Voer promotiecode in", - "displayInviteToPartyWhenPartyIs1": "Toon de 'Uitnodigen voor gezelschap'-knop wanneer de gezelschap 1 lid heeft.", + "displayInviteToPartyWhenPartyIs1": "Toon de 'Uitnodigen voor gezelschap'-knop wanneer het gezelschap 1 lid heeft.", "saveCustomDayStart": "Begin van de dag opslaan", "registration": "Registratie", "addLocalAuth": "Plaatselijke authenticatie toevoegen:", diff --git a/website/common/locales/nl/spells.json b/website/common/locales/nl/spells.json index 328f1af76c..0057edabbf 100644 --- a/website/common/locales/nl/spells.json +++ b/website/common/locales/nl/spells.json @@ -1,6 +1,6 @@ { "spellWizardFireballText": "Uiteenspatting van Vlammen", - "spellWizardFireballNotes": "You summon XP and deal fiery damage to Bosses! (Based on: INT)", + "spellWizardFireballNotes": "Je roept EP op en brengt verschroeiende schade toe aan de Eindbazen! (Gebaseerd op: INT)", "spellWizardMPHealText": "Golf van Ether", "spellWizardMPHealNotes": "You sacrifice mana so the rest of your Party gains MP! (Based on: INT)", "spellWizardEarthText": "Aardbeving", diff --git a/website/common/locales/nl/subscriber.json b/website/common/locales/nl/subscriber.json index d3c12c578b..22d0bb971b 100644 --- a/website/common/locales/nl/subscriber.json +++ b/website/common/locales/nl/subscriber.json @@ -134,11 +134,12 @@ "mysterySet201706": "Piraten-Pionier set", "mysterySet201707": "Geleimantiërset", "mysterySet201708": "Lavastrijderset", - "mysterySet201709": "Sorcery Student Set", + "mysterySet201709": "Tovenaarsleerlingset", "mysterySet201710": "Imperious Imp Set", "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", - "mysterySet201801": "Frost Sprite Set", + "mysterySet201801": "Vorstflitsset", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Standaard Steampunkset", "mysterySet301405": "Opgesmukte Steampunkset", "mysterySet301703": "Pauw steampunkset", diff --git a/website/common/locales/pl/character.json b/website/common/locales/pl/character.json index 393759f084..7497ff279f 100644 --- a/website/common/locales/pl/character.json +++ b/website/common/locales/pl/character.json @@ -64,6 +64,7 @@ "classBonusText": "Twoja klasa postaci (Wojownik, jeśli nie wybrałeś innej klasy lub nie odblokowałeś jeszcze tej możliwości) o wiele skuteczniej włada wyposażeniem jej przypisanym niż przeznaczonym dla innych klas. Wyposażenie przypisane do twojej aktualnej klasy zwiększa premię do statystyki o dodatkowe 50%.", "classEquipBonus": "Premia klasowa", "battleGear": "Wyposażenie bojowe", + "gear": "Gear", "battleGearText": "Z tym wyposażeniem ruszasz do boju. Ma ono wpływ na punkty podczas interakcji z zadaniami.", "autoEquipBattleGear": "Automatycznie załóż nowe wyposażenie", "costume": "Kostium", diff --git a/website/common/locales/pl/faq.json b/website/common/locales/pl/faq.json index c54c73ebc4..18abe2f91c 100644 --- a/website/common/locales/pl/faq.json +++ b/website/common/locales/pl/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Jak grać w Habitikę z przyjaciółmi?", "iosFaqAnswer5": "Najlepszy sposób to zaproszenie ich do twojej drużyny! W drużynie można wypełniać misje, walczyć z potworami i używać umiejętności, aby wzajemnie się wspierać. Wejdź w Menu > Drużyna i kliknij \"Załóż Drużynę\", jeśli jeszcze nie masz drużyny. Następnie kliknij w listę członków, a potem w Zaproś w prawym górnym rogu, aby zaprosić swoich przyjaciół, wpisując ich ID użytkownika (ciąg liczb i znaków, który mogą znaleźć w Ustawienia > Szczegóły konta w aplikacji lub Ustawienia > API na stronie). Na stronie możesz też zaprosić przyjaciół przez email, co dodamy do aplikacji w przyszłej aktualizacji.\n\nNa stronie ty i twoi przyjaciele możecie też dołączyć do gildii, czyli publicznych czatów. Gildie zostaną dodane w aplikacji w przyszłej aktualizacji!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Jak zdobyć chowańca albo wierzchowca?", "iosFaqAnswer6": "Na poziomie 3. odblokujesz system zdobyczy. Za każdym razem, gdy ukończysz zadanie, dostaniesz szansę na zdobycie jaja, eliksiru wyklucia lub jedzenia. Znajdziesz je w Menu > Przedmioty.\n\nAby wykluć Chowańca, potrzebujesz jaja oraz eliksiru wyklucia. Kliknij na jajo aby wybrać gatunek, jaki chcesz wykluć, a potem na \"Wykluj Jajo\". Następnie wybierz eliksir wyklucia, aby wybrać jego kolor! Idź do Menu > Chowańce aby dodać swojego nowego Chowańca do swojego awatara, klikając na niego.\n\nMożesz też sprawić, że twój Chowaniec wyrośnie na Wierzchowca, karmiąc go w Menu > Chowańce. Kliknij na Chowańca, a potem na \"Nakarm Chowańca\"! Musisz nakarmić Chowańca dużo razy, zanim stanie się Wierzchowcem, ale jeśli odnajdziesz jego ulubione jedzenie, będzie szybciej rósł. Możesz to zrobić metodą prób i błędów albo [skorzystać z podpowiedzi](http://habitica.wikia.com/wiki/Food#Food_Preferences). Gdy już masz Wierzchowca, idź do Menu > Wierzchowce i kliknij na niego, aby twój awatar go dosiadł.\n\nMożesz też otrzymać jaja Chowańców z Misji, kończąc niektóre Misje. (Patrz niżej, aby dowiedzieć się więcej o Misjach).", "androidFaqAnswer6": "Na poziomie 3. odblokujesz system zdobyczy. Za każdym razem, gdy ukończysz zadanie, dostaniesz szansę na zdobycie jaja, eliksiru wyklucia lub jedzenia. Znajdziesz je w Menu > Przedmioty.\n\nAby wykluć Chowańca, potrzebujesz jaja oraz eliksiru wyklucia. Kliknij na jajo aby wybrać gatunek, jaki chcesz wykluć, a potem na \"Wykluj Jajo\". Następnie wybierz eliksir wyklucia, aby wybrać jego kolor! Idź do Menu > Chowańce aby dodać swojego nowego Chowańca do swojego awatara, klikając na niego.\n\nMożesz też sprawić, że twój Chowaniec wyrośnie na Wierzchowca, karmiąc go w Menu > Chowańce. Kliknij na Chowańca, a potem na \"Nakarm Chowańca\"! Musisz nakarmić Chowańca dużo razy, zanim stanie się Wierzchowcem, ale jeśli odnajdziesz jego ulubione jedzenie, będzie szybciej rósł. Możesz to zrobić metodą prób i błędów albo [skorzystać z podpowiedzi](http://habitica.wikia.com/wiki/Food#Food_Preferences). Gdy już masz Wierzchowca, idź do Menu > Wierzchowce i kliknij na niego, aby twój awatar go dosiadł.\n\nMożesz też otrzymać jaja Chowańców z Misji, kończąc niektóre Misje. (Patrz niżej, aby dowiedzieć się więcej o Misjach).", diff --git a/website/common/locales/pl/gear.json b/website/common/locales/pl/gear.json index 397b209288..ed75cdc7f9 100644 --- a/website/common/locales/pl/gear.json +++ b/website/common/locales/pl/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Zbroja Świeczkodzieja", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunkowy garnitur", "armorMystery301404Notes": "Elegancki i stylowy! Brak dodatkowych korzyści. Przedmiot Abonencki, luty 2015.", "armorMystery301703Text": "Steampunkowa pawia suknia", @@ -741,11 +743,11 @@ "headSpecial0Text": "Hełm cienia", "headSpecial0Notes": "Krew i popiół, lawa i obsydian nadają temu hełmowi jego wygląd i moc. Zwiększa Inteligencję o <%= int %>.", "headSpecial1Text": "Kryształowy hełm", - "headSpecial1Notes": "The favored crown of those who lead by example. Increases all Stats by <%= attrs %>.", + "headSpecial1Notes": "Ulubiona korona tych, którzy świecą przykładem. Zwiększa wszystkie statystyki o <%= attrs %>.", "headSpecial2Text": "Bezimienny hełm", "headSpecial2Notes": "Świadectwo tych, którzy poświęcili się nie żądając niczego w zamian. Zwiększa Inteligencję jak i Siłę o <%= attrs %>.", "headSpecialTakeThisText": "Hełm Take This", - "headSpecialTakeThisNotes": "This helm was earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", + "headSpecialTakeThisNotes": "Ten hełm został zdobyty poprzez udział w sponsorowanym wyzwaniu utworzonym przez Take This. Gratulacje! Zwiększa wszystkie statystyki o <%= attrs %>.", "headSpecialFireCoralCircletText": "Wieniec koralowca ognistego", "headSpecialFireCoralCircletNotes": "Ten wieniec zaprojektowany przez największych alchemików Habitiki umożliwia oddychanie wodą i nurkowanie po skarby! Zwiększa percepcję o <%= per %>.", "headSpecialPyromancersTurbanText": "Turban Piromanty", @@ -771,9 +773,9 @@ "headSpecialKabutoText": "Kabuto", "headSpecialKabutoNotes": "Ten hełm jest funkcjonalny i piękny! Twoi wrogowie rozproszą się podziwiając go. Zwiększa Inteligencję o <%= int %>.", "headSpecialNamingDay2017Text": "Hełm purpurowego królewskiego gryfa", - "headSpecialNamingDay2017Notes": "Happy Naming Day! Wear this fierce and feathery helm as you celebrate Habitica. Confers no benefit.", + "headSpecialNamingDay2017Notes": "Szczęśliwych Imienin! Ubierz ten groźny i pierzasty hełm by celebrować Habitikę. Nie daje żadnych korzyści.", "headSpecialTurkeyHelmBaseText": "Hełm Indyka", - "headSpecialTurkeyHelmBaseNotes": "Your Turkey Day look will be complete when you don this beaked helm! Confers no benefit.", + "headSpecialTurkeyHelmBaseNotes": "Twój wygląd Dnia Indyka będzie kompletny gdy ubierzesz ten dziobiasty hełm. Nie daje żadnych korzyści.", "headSpecialNyeText": "Absurdalna czapeczka imprezowa", "headSpecialNyeNotes": "Oto absurdalna czapeczka imprezowa dla Ciebie! Noś ją z dumą, świętując Nowy Rok! Nie daje żadnych korzyści.", "headSpecialYetiText": "Hełm poskramiacza yeti", @@ -905,7 +907,7 @@ "headSpecialFall2017RogueText": "Jack-o-Lantern Helm", "headSpecialFall2017RogueNotes": "Ready for treats? Time to don this festive, glowing helm! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", "headSpecialFall2017WarriorText": "Candy Corn Helm", - "headSpecialFall2017WarriorNotes": "This helm might look like a treat, but wayward tasks won't find it so sweet! Increases Strength by <%= str %>. Limited Edition 2017 Autumn Gear.", + "headSpecialFall2017WarriorNotes": "Ten hełm może wyglądać jak poczęstunek, ale krnąbrne zadania nie uznają go za taki słodki. Zwiększa Siłę o <%= str %>. Edycja Limitowana Jesień 2017", "headSpecialFall2017MageText": "Balowa Maska", "headSpecialFall2017MageNotes": "When you appear in this feathery hat, everyone will be left guessing the identity of the magical stranger in the room! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.", "headSpecialFall2017HealerText": "Nawiedzony Dom Hełm", @@ -914,10 +916,10 @@ "headSpecialNye2017Notes": "You've received a Fanciful Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.", "headSpecialWinter2018RogueText": "Hełm Renifera", "headSpecialWinter2018RogueNotes": "The perfect holiday disguise, with a built-in headlight! Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", - "headSpecialWinter2018WarriorText": "Giftbox Helm", + "headSpecialWinter2018WarriorText": "Hełm Pudełka Prezentowego", "headSpecialWinter2018WarriorNotes": "This jaunty box top and bow are not only festive, but quite sturdy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", "headSpecialWinter2018MageText": "Skrzący Cylinder", - "headSpecialWinter2018MageNotes": "Ready for some extra special magic? This glittery hat is sure to boost all your spells! Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", + "headSpecialWinter2018MageNotes": "Gotowy na trochę ekstra specjalnej magii? Ta migocząca czapka z pewnością wzmocni wszystkie Twoje zaklęcia! Zwiększa Percepcję o <%= per %>. Edycja Limitowana Zima 2017-2018.", "headSpecialWinter2018HealerText": "Jemiołowy Kaptur", "headSpecialWinter2018HealerNotes": "This fancy hood will keep you warm with happy holiday feelings! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", "headSpecialGaymerxText": "Hełm tęczowego wojownika", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Korona Świeczkodzieja", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Szykowny cylinder", "headMystery301404Notes": "Fantazyjny cylinder dla najwyżej urodzonych. Przedmiot Abonencki, styczeń 2015. Brak dodatkowych korzyści.", "headMystery301405Text": "Klasyczny cylinder", @@ -1101,7 +1105,7 @@ "shieldSpecial0Text": "Udręczona czaszka", "shieldSpecial0Notes": "Spoziera ponad całunem śmierci i ukazuje to, co widzi wrogom, by wzbudzić w nich strach. Zwiększa Percepcję o <%= per %>.", "shieldSpecial1Text": "Kryształowa tarcza", - "shieldSpecial1Notes": "Shatters arrows and deflects the words of naysayers. Increases all Stats by <%= attrs %>.", + "shieldSpecial1Notes": "Kryszy strzały i odbija słowa malkontentów. Zwiększa wszystkie statystyki o <%= attrs %>.", "shieldSpecialTakeThisText": "Tarcza Take This", "shieldSpecialTakeThisNotes": "This shield was earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", "shieldSpecialGoldenknightText": "Morgensztern miażdżący kamienie milowe Mustaine'a", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Podręcznik Magii", "shieldMystery201709Notes": "Ta książka przeprowadzi Cię przez tajniki magii. Brak dodatkowych korzyści. Przedmiot abonencki, wrzesień 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Tarcza zegarowa", "shieldMystery301405Notes": "Czas jest po Twojej stronie z tą tarczą zegarową. Brak dodatkowych korzyści. Przedmiot Abonencki, czerwiec 2015.", "shieldMystery301704Text": "Wirujący wiatrak", @@ -1299,7 +1305,7 @@ "backMystery201706Text": "Postrzępiona Flaga Piracka", "backMystery201706Notes": "The sight of this Jolly Roger-emblazoned flag fills any To-Do or Daily with dread! Confers no benefit. June 2017 Subscriber Item.", "backMystery201709Text": "Stos Ksiąg Magicznych", - "backMystery201709Notes": "Learning magic takes a lot of reading, but you're sure to enjoy your studies! Confers no benefit. September 2017 Subscriber Item.", + "backMystery201709Notes": "Nauka magii wymaga wiele czytania, ale Ty z pewnością radujesz się studiowani! Nie przynosi żadnych korzyści. Przedmiot abonencki wrzesień 2017", "backMystery201801Text": "Frost Sprite Wings", "backMystery201801Notes": "They may look as delicate as snowflakes, but these enchanted wings can carry you anywhere you wish! Confers no benefit. January 2018 Subscriber Item.", "backSpecialWonderconRedText": "Potężna peleryna", @@ -1417,7 +1423,7 @@ "headAccessoryMystery301405Text": "Gogle na głowę", "headAccessoryMystery301405Notes": "\"Gogle nosi się na oczach\", mówili. \"Nikt nie chce gogli które można nosić tylko na głowie\", mówili. Ha! Niech spojrzą na Ciebie! Brak dodatkowych korzyści. Przedmiot Abonencki, sierpień 2015.", "headAccessoryArmoireComicalArrowText": "Zabawna Strzała", - "headAccessoryArmoireComicalArrowNotes": "This whimsical item doesn't provide a Stat boost, but it sure is good for a laugh! Confers no benefit. Enchanted Armoire: Independent Item.", + "headAccessoryArmoireComicalArrowNotes": "Ten figlarny przedmiot nie zwiększa statystyk, ale z pewnością rozbawia do łez. Nie daje żadnych korzyści. Zaczarowana Szafa: Przedmiot Niezależny.", "eyewear": "Okulary", "eyewearCapitalized": "Okulary", "eyewearBase0Text": "Brak okularów", diff --git a/website/common/locales/pl/generic.json b/website/common/locales/pl/generic.json index 1af904f104..19619e0aa0 100644 --- a/website/common/locales/pl/generic.json +++ b/website/common/locales/pl/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Motyw dźwiękowy Airu", "audioTheme_beatscribeNesTheme": "Motyw dźwiękowy Beatscribe NES", "audioTheme_arashiTheme": "Motyw dźwiękowy Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Motyw dźwiękowy Lunasol", "audioTheme_spacePenguinTheme": "Motyw dźwiękowy SpacePenguin", "audioTheme_maflTheme": "Motyw dźwiękowy MAFL", diff --git a/website/common/locales/pl/groups.json b/website/common/locales/pl/groups.json index 2e86676523..0b815785e4 100644 --- a/website/common/locales/pl/groups.json +++ b/website/common/locales/pl/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Jeden za wszystkich, wszyscy za jednego", "partyUpText": "Dołączyłeś do drużyny z inną osobą! Bawcie się dobrze walcząc z potworami i wspierając się wzajemnie.", "partyOnText": "Dołączyłeś do drużyny z przynajmniej czwórką osób! Ciesz się zwiększoną odpowiedzialnością, jednocząc się ze znajomymi by zwyciężyć waszych wrogów!", - "largeGroupNote": "Notatka: Ta Gildia jest zbyt duża by obsługiwała powiadomienia! Zaglądaj tu codziennie by zobaczyć nowe wiadomości.", "groupIdRequired": "\"groupId\" musi być prawidłowym UUID", "groupNotFound": "Nie znaleziono grupy lub nie posiadasz dostępu.", "groupTypesRequired": "Musisz podać prawidłową \"type\" wartość do napisu.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Brakujący identyfikator użytkownika w zaproszeniu", "inviteMustNotBeEmpty": "Zaproszenie nie może być puste.", "partyMustbePrivate": "Drużyny muszą być prywatne.", - "userAlreadyInGroup": "Użytkownik jest już członkiem tej grupy.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Nie możesz zaprosić siebie do grupy.", - "userAlreadyInvitedToGroup": "Użytkownik został już zaproszony do tej grupy.", - "userAlreadyPendingInvitation": "Użytkownik już oczekuje na zaproszenie.", - "userAlreadyInAParty": "Użytkownik jest już w Drużynie.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Nie znaleziono użytkownika o numerze ID „<%= userId %>”.", "userHasNoLocalRegistration": "Użytkownik nie ma lokalnej rejestracji (nazwa użytkownika, email, hasło).", "uuidsMustBeAnArray": "Zaproszenia ID Użytkownika muszą być tablicą.", @@ -417,11 +416,13 @@ "managerAdded": "Pomyślnie dodano Managera", "managerRemoved": "Pomyślnie usunięto Managera", "leaderChanged": "Lider/ka został/a zmieniony/a", - "whatIsWorldBoss": "What is a World Boss?", - "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", - "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", - "worldBossBullet1": "Complete tasks to damage the World Boss", - "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", - "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", + "whatIsWorldBoss": "Co to jest Globalny Boss?", + "worldBossDesc": "Globalny Boss to specjalne wydarzenie, które łączy społeczność Habitiki, by wspólnie pokonać potężnego potwora przy pomocy zadań! Wszyscy użytkownicy Habitiki zostaną nagrodzenie po jego pokonaniu. Nawet ci którzy odpoczywali w Gospodzie albo nie używali Habitiki przez cały okres misji.", + "worldBossLink": "Przeczytaj więcej o poprzednich Globalnych Bossach Habitiki na Wiki.", + "worldBossBullet1": "Wykonuj zadania by zadać obrażenia Globalnemu Bossowi", + "worldBossBullet2": "Globalny Boss nie zada Ci obrażeń za ominięte zadania, ale jego licznik Szału wzrośnie. Jeśli pasek się naładuje to Boss zaatakuje jednego z sprzedawców Habitiki!", + "worldBossBullet3": "Możesz kontynuować walkę z normalnymi Bossami z Misji. Obrażenia będą zadane obu", + "worldBossBullet4": "Sprawdzaj regularnie Karczmę by zobaczyć postępy w walce z Globalnym Bossem i ataki Szału jakie wykonał", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/pl/limited.json b/website/common/locales/pl/limited.json index 07ce1b4e69..576587e779 100644 --- a/website/common/locales/pl/limited.json +++ b/website/common/locales/pl/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Wesołego Jesiennego Festiwalu! Czy chciałbyś kupić kilka rzadkich przedmiotów? Będą one dostępne jedynie do 31 października!", "seasonalShopWinterText": "Wesołych Obchodów Cudownej Zimy! Czy chciałbyś kupić kilka rzadkich przedmiotów? Będą one dostępne jedynie do 31 stycznia!", "seasonalShopFallTextBroken": "Oh... Witaj w Sezonowym Sklepiku... Aktualnie mamy na składzie jesienne przedmioty z Edycji sezonowej lub coś w tym rodzaju... Wszystko dostępne tutaj będzie w sprzedaży co roku podczas Jesiennego Festiwalu, lecz będziemy otwarci tylko do 31 października... Powinieneś więc teraz zrobić odpowiednie zapasy, inaczej będziesz zmuszony czekać... i czekać... i czekać... *ehh*", + "seasonalShopBrokenText": "Mój pawilon!!!!!! Moje dekoracje!!!!! O nie, Odsercowiaczka wszystko zniszczyła :( Proszę pomóż pokonać ją w Karczmie bym mogła się odbudować!", "seasonalShopRebirth": "Jeśli kupiłeś w przeszłości jakieś z tych przedmiotów ale teraz ich nie posiadasz, możesz kupić je jeszcze raz w dziale nagród. Początkowo będziesz mógł kupić jedynie przedmioty dla twojej aktualnej klasy (domyślnie Wojownik) jednak nie obawiaj się - przedmioty specyficzne dla innych klas będą dostępne jeżeli zmienisz klasę.", "candycaneSet": "Cukierkowa laska (Mag)", "skiSet": "Narto-bójca (Łotrzyk)", diff --git a/website/common/locales/pl/npc.json b/website/common/locales/pl/npc.json index 33c5848e4c..118ad09176 100644 --- a/website/common/locales/pl/npc.json +++ b/website/common/locales/pl/npc.json @@ -31,8 +31,8 @@ "danielText2": "Uważaj: Jeśli uczestniczysz w walce z bossem, wciąż może on zadać tobie obrażenia, jeśli członkowie twojej drużyny ominą Codzienne! Również twoje obrażenia dla bossa (lub zebrane przedmioty) nie zostaną zaaplikowane, dopóki nie zakończysz odpoczynku w Gospodzie.", "danielTextBroken": "Witaj w Karczmie... czy jakoś tak... Jeśli potrzebujesz odpoczynku, znajdę dla ciebie pokój w gospodzie... Kiedy odpoczywasz, twoje Codzienne nie skrzywdzą ciebie na koniec dnia, jednak nadal możesz je odhaczać... jeśli starczy ci energii...", "danielText2Broken": "Aha... Jeśli uczestniczysz w walce z bossem, wciąż może on zadać ci obrażenia, jeśli członkowie twojej drużyny ominą Codzienne... Twoje obrażenia dla bossa (lub zebrane przedmioty) też nie zostaną zaaplikowane, dopóki nie zakończysz odpoczynku w gospodzie...", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "Wydarzenie Globalny Boss", + "worldBossDescription": "Opis Globalnego Bossa", "alexander": "Handlarz Aleksander", "welcomeMarket": "Witaj na Targu! Tu kupisz rzadkie jaja oraz eliksiry! Sprzedasz nadmiar towaru! Zamówisz usługi! Zobacz, co dla Ciebie mamy.", "welcomeMarketMobile": "Witamy na Targu! Kup ciężkie do znalezienia jajka i eliksiry! Zobacz co mamy na stanie.", diff --git a/website/common/locales/pl/quests.json b/website/common/locales/pl/quests.json index 5d624c3374..59a6148306 100644 --- a/website/common/locales/pl/quests.json +++ b/website/common/locales/pl/quests.json @@ -121,9 +121,9 @@ "questBundles": "Przecenione pakiety misji", "buyQuestBundle": "Kup pakiet misji", "noQuestToStart": "Nie możesz znaleźć żadnej misji? Wejdź do Sklepu Misji na Targu po nowe zadania!", - "pendingDamage": "<%= damage %> pending damage", - "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health", - "rageAttack": "Rage Attack:", - "bossRage": "<%= currentRage %> / <%= maxRage %> Rage", - "rageStrikes": "Rage Strikes" + "pendingDamage": "<%= damage %> oczekujących obrażeń", + "bossHealth": "<%= currentHealth %>/<%= maxHealth %> Życia", + "rageAttack": "Atak Szału:", + "bossRage": "<%= currentRage %>/<%= maxRage %> Szału", + "rageStrikes": "Napad Szału" } \ No newline at end of file diff --git a/website/common/locales/pl/questscontent.json b/website/common/locales/pl/questscontent.json index 36e86abb52..e45b00aeae 100644 --- a/website/common/locales/pl/questscontent.json +++ b/website/common/locales/pl/questscontent.json @@ -564,16 +564,19 @@ "questBadgerBoss": "Zborsuczone Zmartwienie", "questBadgerDropBadgerEgg": "Borsuk (jajo)", "questBadgerUnlockText": "Odblokowuje dostęp do kupna borsuczych jaj na Targu", - "questDysheartenerText": "The Dysheartener", - "questDysheartenerNotes": "The sun is rising on Valentine’s Day when a shocking crash splinters the air. A blaze of sickly pink light lances through all the buildings, and bricks crumble as a deep crack rips through Habit City’s main street. An unearthly shrieking rises through the air, shattering windows as a hulking form slithers forth from the gaping earth.

Mandibles snap and a carapace glitters; legs upon legs unfurl in the air. The crowd begins to scream as the insectoid creature rears up, revealing itself to be none other than that cruelest of creatures: the fearsome Dysheartener itself. It howls in anticipation and lunges forward, hungering to gnaw on the hopes of hard-working Habiticans. With each rasping scrape of its spiny forelegs, you feel a vise of despair tightening in your chest.

“Take heart, everyone!” Lemoness shouts. “It probably thinks that we’re easy targets because so many of us have daunting New Year’s Resolutions, but it’s about to discover that Habiticans know how to stick to their goals!”

AnnDeLune raises her staff. “Let’s tackle our tasks and take this monster down!”", + "questDysheartenerText": "Odsercawiaczka", + "questDysheartenerNotes": "Słońce wychodziło za horyzontu w Walentynki kiedy wstrząsający łomot rozszczepił powietrze. Blask bladoróżowego światła przebił się przez wszystkie budynki i głębokie szczeliny rozkruszyły cegły na wskroś głównej ulicy Habit City. Nieziemski pisk wzniósł się w powietrzu, tłukąc okna podczas gdy niezdarna figura wypełzała z ziejącej wyrwy w ziemi.

Żuwaczki kłapały i skorupa błyszczała, a nogi rozwijały się w powietrzu. Tłum zaczął wyć gdy insektoid wzniósł się i wyjawił się jako nie kto inny jak najokrutniejszy ze wszystkich stworów. Przerażająca Odsercowiaczka we własnej osobie. Zaskowyczała uprzedzająco i rzuciła się naprzód łaknąc wgryźć się w nadzieje ciężko pracujących Habiticzan. Z każdym skrobiącym zgrzytnięciem jej kolczastych przednich odnóży czułeś zaciskające się imadło rozpaczy w Twojej klatce piersiowej.

\"Nabierzcie otuchy!\" Zakrzyknęła Lemoness. \"Ona pewnie bierze nas za łatwy cel ponieważ tak dużo z nas ma przytłaczające postanowienia noworoczne. Wkrótce się przekona, że Habiticzanie wiedzą jak trzymać się swoich celów!\"

AnnDeLune wzniosła swoją laskę. \"Stawmy czoło naszym zadaniom i powalmy tą bestię!\"", "questDysheartenerCompletion": "The Dysheartener is DEFEATED!

Together, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”

Glowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.

The crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.

Our newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.

Beffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”

Crooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Druzgoczące Złamanie Serca", - "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageDescription": "Pasek Ataku Szału napełnia się kiedy Habiticzanin omija swoje Codzienne. Jeśli się napełni to Odsercowiaczka wyzwoli swój atak Druzgoczące Złamanie Serca na jednym z sprzedawców Habitiki, więc bądź pewny, że wykonałeś swoje zadania!", + "questDysheartenerBossRageSeasonal": "'Odsercowiaczka używa DRUZGOCZĄCEGO ZŁAMANIA SERCA!'\n\nO nie! Po posileniu się na naszych niewykonanych Codziennych, Odsercowiaczka zdobyła siłę by wyzwolić jej atak Druzgoczącego Złamania Serca. Z przeraźliwym skowytem uderzyła swoimi kolczystymi przednimi odnóżami w pawilon Sezonowego Sklepiku! Wstrząsający podmuch magii szatkuje las, a Sezonowa Czarodziejka zostaje zmożona przez żal na miejscu.\n\nSzybko. Kontynuujmy wykonywanie naszych Codziennych, żeby bestia nie uderzyła ponownie!", + "seasonalShopRageStrikeHeader": "Sezonowy Sklepik został zaatakowany!", + "seasonalShopRageStrikeLead": "Leslie ma Złamane Serce!", + "seasonalShopRageStrikeRecap": "21 Lutego nasza ukochana Sezonowa Czarodziejka Leslie poczuła się zdewastowana gdy Odsercowiaczka roztrzaskała Sezonowy Sklepik. Szybko, zajmijmy się naszymi zadaniami by pokonać szkaradę i pomóc się odbudować!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Optymistyczny Hipogryf (Chowaniec)", "questDysheartenerDropHippogriffMount": "Optymistyczny Hipogryf (Wierzchowiec)", - "dysheartenerArtCredit": "Artwork by @AnnDeLune" + "dysheartenerArtCredit": "Grafika zrobiona przez @AnnDeLune" } \ No newline at end of file diff --git a/website/common/locales/pl/subscriber.json b/website/common/locales/pl/subscriber.json index 8707d33a22..d78bbf2863 100644 --- a/website/common/locales/pl/subscriber.json +++ b/website/common/locales/pl/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Zestaw Jeźdźca Dywanów", "mysterySet201712": "Zestaw Świeczkodzieja", "mysterySet201801": "Zestaw Ducha Mrozu", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Standardowy zestaw steampunkowy", "mysterySet301405": "Zestaw steampunkowych akcesoriów", "mysterySet301703": "Zestaw steampunkowego pawia", diff --git a/website/common/locales/pl/tasks.json b/website/common/locales/pl/tasks.json index 381d20ef4c..f43fbcd0b0 100644 --- a/website/common/locales/pl/tasks.json +++ b/website/common/locales/pl/tasks.json @@ -121,7 +121,7 @@ "confirmFortify": "Na pewno?", "fortifyComplete": "Wzmocnienie ukończone!", "deleteTask": "Usuń to Zadanie", - "sureDelete": "Jesteś pewien, że chcesz usunąć te zadanie?", + "sureDelete": "Jesteś pewien, że chcesz usunąć to zadanie?", "streakCoins": "Premia za serię!", "taskToTop": "Na górę", "taskToBottom": "Na dół", diff --git a/website/common/locales/pt/character.json b/website/common/locales/pt/character.json index 329e5ff0e4..f5a7004236 100644 --- a/website/common/locales/pt/character.json +++ b/website/common/locales/pt/character.json @@ -64,6 +64,7 @@ "classBonusText": "A tua classe (Guerreiro, se ainda não desbloqueaste ou seleccionaste outra classe) utiliza o seu próprio equipamento de forma mais eficaz que equipamento de outras classes. Usar equipamento da tua classe actual faz acrescer um reforço de 50% aos bónus de características que ele já contenha.", "classEquipBonus": "Bônus de Classe", "battleGear": "Equipamento de Batalha", + "gear": "Gear", "battleGearText": "Este é o equipamento que você usa em batalha; ele influencia os números ao interagir com suas tarefas.", "autoEquipBattleGear": "Auto-equipar novos equipamentos", "costume": "Traje", diff --git a/website/common/locales/pt/content.json b/website/common/locales/pt/content.json index 2bd1f43e7b..cf1f3bbdfb 100644 --- a/website/common/locales/pt/content.json +++ b/website/common/locales/pt/content.json @@ -194,95 +194,95 @@ "hatchingPotionNotes": "Utilize isto num ovo, e ele chocará como um mascote <%= potText(locale) %>.", "premiumPotionAddlNotes": "Não utilizável nos ovos de mascote de missão.", "foodMeat": "Carne", - "foodMeatThe": "the Meat", - "foodMeatA": "Meat", + "foodMeatThe": "a Carne", + "foodMeatA": "Carne", "foodMilk": "Leite", - "foodMilkThe": "the Milk", - "foodMilkA": "Milk", + "foodMilkThe": "o Leite", + "foodMilkA": "Leite", "foodPotatoe": "Batata", - "foodPotatoeThe": "the Potato", - "foodPotatoeA": "a Potato", + "foodPotatoeThe": "a Batata", + "foodPotatoeA": "uma Batata", "foodStrawberry": "Morango", - "foodStrawberryThe": "the Strawberry", - "foodStrawberryA": "a Strawberry", + "foodStrawberryThe": "o Morango", + "foodStrawberryA": "um Morango", "foodChocolate": "Chocolate", - "foodChocolateThe": "the Chocolate", + "foodChocolateThe": "o Chocolate", "foodChocolateA": "Chocolate", "foodFish": "Peixe", - "foodFishThe": "the Fish", - "foodFishA": "a Fish", + "foodFishThe": "o Peixe", + "foodFishA": "um Peixe", "foodRottenMeat": "Carne Estragada", - "foodRottenMeatThe": "the Rotten Meat", - "foodRottenMeatA": "Rotten Meat", + "foodRottenMeatThe": "a Carne Podre", + "foodRottenMeatA": "Carne Podre", "foodCottonCandyPink": "Algodão-doce Rosa", - "foodCottonCandyPinkThe": "the Pink Cotton Candy", - "foodCottonCandyPinkA": "Pink Cotton Candy", + "foodCottonCandyPinkThe": "o Algodão Doce Cor-de-Rosa", + "foodCottonCandyPinkA": "Algodão Doce Cor-de-Rosa", "foodCottonCandyBlue": "Algodão-doce Azul", - "foodCottonCandyBlueThe": "the Blue Cotton Candy", - "foodCottonCandyBlueA": "Blue Cotton Candy", + "foodCottonCandyBlueThe": "o Algodão Doce Azul", + "foodCottonCandyBlueA": "Algodão Doce Azul", "foodHoney": "Mel", - "foodHoneyThe": "the Honey", - "foodHoneyA": "Honey", + "foodHoneyThe": "o Mel", + "foodHoneyA": "Mel", "foodCakeSkeleton": "Bolo Esquelético", - "foodCakeSkeletonThe": "the Bare Bones Cake", - "foodCakeSkeletonA": "a Bare Bones Cake", + "foodCakeSkeletonThe": "o Bolo de Ossos Nús", + "foodCakeSkeletonA": "um Bolo de Ossos Nús", "foodCakeBase": "Bolo Básico", - "foodCakeBaseThe": "the Basic Cake", - "foodCakeBaseA": "a Basic Cake", + "foodCakeBaseThe": "o Bolo Básico", + "foodCakeBaseA": "um Bolo Básico", "foodCakeCottonCandyBlue": "Bolo de Doce Azul", - "foodCakeCottonCandyBlueThe": "the Candy Blue Cake", - "foodCakeCottonCandyBlueA": "a Candy Blue Cake", + "foodCakeCottonCandyBlueThe": "o Bolo Doce Azul", + "foodCakeCottonCandyBlueA": "um Bolo Doce Azul", "foodCakeCottonCandyPink": "Bolo de Doce Rosa", - "foodCakeCottonCandyPinkThe": "the Candy Pink Cake", - "foodCakeCottonCandyPinkA": "a Candy Pink Cake", + "foodCakeCottonCandyPinkThe": "o Bolo Doce Cor-de-Rosa", + "foodCakeCottonCandyPinkA": "um Bolo Doce Cor-de-Rosa", "foodCakeShade": "Bolo de Chocolate", - "foodCakeShadeThe": "the Chocolate Cake", - "foodCakeShadeA": "a Chocolate Cake", + "foodCakeShadeThe": "o Bolo de Chocolate", + "foodCakeShadeA": "um Bolo de Chocolate", "foodCakeWhite": "Bolo de Creme", - "foodCakeWhiteThe": "the Cream Cake", - "foodCakeWhiteA": "a Cream Cake", + "foodCakeWhiteThe": "o Bolo de Creme", + "foodCakeWhiteA": "um Bolo de Creme", "foodCakeGolden": "Bolo de Mel", - "foodCakeGoldenThe": "the Honey Cake", - "foodCakeGoldenA": "a Honey Cake", + "foodCakeGoldenThe": "o Bolo de Mel", + "foodCakeGoldenA": "um Bolo de Mel", "foodCakeZombie": "Bolo Estragado", - "foodCakeZombieThe": "the Rotten Cake", - "foodCakeZombieA": "a Rotten Cake", + "foodCakeZombieThe": "o Bolo Podre", + "foodCakeZombieA": "um Bolo Podre", "foodCakeDesert": "Bolo de Areia", - "foodCakeDesertThe": "the Sand Cake", - "foodCakeDesertA": "a Sand Cake", + "foodCakeDesertThe": "o Bolo de Areia", + "foodCakeDesertA": "um Bolo de Areia", "foodCakeRed": "Bolo de Morango", - "foodCakeRedThe": "the Strawberry Cake", - "foodCakeRedA": "a Strawberry Cake", + "foodCakeRedThe": "o Bolo de Morango", + "foodCakeRedA": "um Bolo de Morango", "foodCandySkeleton": "Bala de Ossos", - "foodCandySkeletonThe": "the Bare Bones Candy", - "foodCandySkeletonA": "Bare Bones Candy", + "foodCandySkeletonThe": "o Doce de Ossos Nús", + "foodCandySkeletonA": "Doce de Ossos Nús", "foodCandyBase": "Bala Comum", - "foodCandyBaseThe": "the Basic Candy", - "foodCandyBaseA": "Basic Candy", + "foodCandyBaseThe": "o Doce Básico", + "foodCandyBaseA": "Doce Básico", "foodCandyCottonCandyBlue": "Bala Azul Azedo", - "foodCandyCottonCandyBlueThe": "the Sour Blue Candy", - "foodCandyCottonCandyBlueA": "Sour Blue Candy", + "foodCandyCottonCandyBlueThe": "o Doce Amargo Azul", + "foodCandyCottonCandyBlueA": "Doce Amargo Azul", "foodCandyCottonCandyPink": "Bala Rosa Azeda", - "foodCandyCottonCandyPinkThe": "the Sour Pink Candy", - "foodCandyCottonCandyPinkA": "Sour Pink Candy", + "foodCandyCottonCandyPinkThe": "o Doce Amargo Cor-de-Rosa", + "foodCandyCottonCandyPinkA": "Doce Amargo Cor-de-Rosa", "foodCandyShade": "Bala de Chocolate", - "foodCandyShadeThe": "the Chocolate Candy", - "foodCandyShadeA": "Chocolate Candy", + "foodCandyShadeThe": "o Doce de Chocolate", + "foodCandyShadeA": "Doce de Chocolate", "foodCandyWhite": "Bala de Baunilha", - "foodCandyWhiteThe": "the Vanilla Candy", - "foodCandyWhiteA": "Vanilla Candy", + "foodCandyWhiteThe": "o Doce de Baunilha", + "foodCandyWhiteA": "Doce de Baunilha", "foodCandyGolden": "Bala de Mel", - "foodCandyGoldenThe": "the Honey Candy", - "foodCandyGoldenA": "Honey Candy", + "foodCandyGoldenThe": "o Doce de Mel", + "foodCandyGoldenA": "Doce de Mel", "foodCandyZombie": "Bala Podre", - "foodCandyZombieThe": "the Rotten Candy", - "foodCandyZombieA": "Rotten Candy", + "foodCandyZombieThe": "o Doce Podre", + "foodCandyZombieA": "Doce Podre", "foodCandyDesert": "Bala de Areia", - "foodCandyDesertThe": "the Sand Candy", - "foodCandyDesertA": "Sand Candy", + "foodCandyDesertThe": "o Doce de Areia", + "foodCandyDesertA": "Doce de Areia", "foodCandyRed": "Bala de Canela", - "foodCandyRedThe": "the Cinnamon Candy", - "foodCandyRedA": "Cinnamon Candy", + "foodCandyRedThe": "o Doce de Canela", + "foodCandyRedA": "Doce de Canela", "foodSaddleText": "Sela", "foodSaddleNotes": "Eleve instantaneamente um dos seus mascotes para uma montada.", "foodSaddleSellWarningNote": "Hey! Este objeto é bastante útil! Está familiarizado com a utilização de uma Sela com as suas Mascotes?", diff --git a/website/common/locales/pt/faq.json b/website/common/locales/pt/faq.json index 0685a4c2a3..2351ffbffc 100644 --- a/website/common/locales/pt/faq.json +++ b/website/common/locales/pt/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Há várias coisas que lhe podem dar dano. Primeiro, se deixar Tarefas Diárias por completar ao final do dia e não as marcar como completar no ecrã que aparece na manhã seguinte, essas Tarefas Diárias incompletas irão dar-lhe dano. Segundo, se clicar num mau Hábito, irá receber dano. Finalmente, se a sua Equipe estiver em combate com um Chefão e um dos membros da mesma não completar as suas Tarefas Diárias, o Chefão irá atacá-lo. A principal forma de se curar é subir de nível, pois tal restaura toda a sua vida. Pode também comprar uma Poção de Vida com ouro na coluna de Recompensas. Mais, a partir de nível 10 pode escolher tornar-se um Curandeiro, podendo então aprender habilidades de cura. Outros Curandeiros podem curá-lo também se estiver numa Equipa com eles. Aprenda mais clicando em \"Equipe\" na barra de navegação.", "faqQuestion5": "Como é que eu jogo Habitica com meus amigos?", "iosFaqAnswer5": "O melhor jeito é convida-los para uma Equipe com você! Equipes podem fazer missões, batalhar monstros e usar habilidades para ajudar um ao outro. Vá em Menu > Equipe e clique \"Criar Nova Equipe\" se você ainda não tiver uma Equipe. Em seguida toque na lista de Membros e toque em Convidar, no canto superior direito, para convidar amigos usando suas IDs de Usuário (uma linha de números e letras que pode ser encontrada em Configurações > Detalhes da Conta no aplicativo, e Configurações > API no site). No site, você também pode convidar amigos via email, que também adicionaremos ao aplicativo em uma atualização futura.\n\nNo site, você e seus amigos também podem se unir a Guildas, que são salas de bate-papo públicas. Guildas serão adicionadas ao aplicativo em uma atualização futura!", - "androidFaqAnswer5": "A melhor maneira é convidá-los para uma Equipa consigo! Equipas podem ir em missões, combater monstros e usar habilidades para se suportarem entre si. Dirija-se á [página](https://habitica.com/) para criar uma se não tem já uma Equipe. Podem também juntar-se a corporações juntos (Social > Corporações). Corporações são salas de chat focadas em interesses ou perseguição de um objetivo comuns, podendo ser públicas ou privadas. Pode juntar-se a tantas corporações como queira mas só a uma equipe.\n\nPara informação mais detalhada, veja as páginas de wiki sobre [Equipas](http://habitrpg.wikia.com/wiki/Party) e [Corporações](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "A melhor forma é convidá-los para uma Equipa consigo clicando em \"Equipa\" na barra de navegação! Equipas podem ir em missões, combater monstros e usar habilidades para se suportarem entre si. Podem também juntar-se a corporações juntos (clique em \"Corporações\" na barra de navegação). Corporações são salas de chat focadas em interesses ou a perseguição de um objetivo comuns, podendo ser publicas ou privadas. Pode juntar-se a tantas corporações como queira mas só a uma Equipa. Para mais informação detalhada, veja as páginas de wiki sobre [Equipas](http://habitrpg.wikia.com/wiki/Party) e [Corporações](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Como é que eu obtenho uma Mascote ou Montada?", "iosFaqAnswer6": "No nível 3, você irá destravar o sistema de Drop. Toda vez que você completar uma tarefa, você terá uma chance aleatória de receber um ovo, uma poção de eclosão ou um pedaço de comida. Eles serão guardados em Menu > Itens.\n\nPara eclodir um Mascote, você precisará de um ovo e uma poção de eclosão. Toque no ovo para determinar que espécie você quer eclodir e selecione \"Eclodir Ovo.\" Depois escolha uma poção de eclosão para determinar sua cor! Vá para Menu > Mascotes para equipar o novo Mascote ao seu avatar ao toca-lo.\n\nVocê também pode transformar seus Mascotes em Montarias ao alimenta-los em Menu > Mascotes. Selecione um Mascote, e depois escolha \"Alimentar Mascote\"! Você tera que alimentar um mascote várias vezes antes dele se tornar uma Montaria, mas se você conseguir descobrir qual é sua comida favorita, ele crescerá mais rapidamente. Use tentativa e erro, ou [veja os spoilers aqui](http://pt-br.habitica.wikia.com/wiki/Comida#Prefer.C3.AAncias_de_Comida). Logo que conseguir uma Montaria, vá para Menu > Montarias e toque nele para equipa-lo ao seu avatar.\n\nVocê também pode conseguir ovos para Mascotes de Missão ao completar certas Missões. (Veja abaixo para aprender mais sobre Missões.)", "androidFaqAnswer6": "Quando chegar a nível 3, passará a ter acesso ao sistema de Drops. Toda vez que você completar uma tarefa, você terá uma chance aleatória de receber um ovo, uma poção de eclosão ou um pedaço de comida. Eles serão guardados em Menu > Itens.\n\nPara eclodir um Mascote, você precisará de um ovo e uma poção de eclosão. Toque no ovo para determinar que espécie você quer eclodir e selecione \"Eclodir Ovo.\" Depois escolha uma poção de eclosão para determinar sua cor! Vá para Menu > Estábulo > Mascotes para equipar o novo Mascote ao seu Avatar ao toca-lo e clicando \"Usar\"(O seu avatar não reflete atualização para a alteração).\n\nVocê também pode transformar seus Mascotes em Montarias ao alimenta-los em Menu > Estábulo > [ Mascotes ]. Selecione um Mascote, e depois escolha \"Alimentar Mascote\"! Você terá que alimentar um mascote várias vezes antes dele se tornar uma Montaria, mas se você conseguir descobrir qual é sua comida favorita, ele crescerá mais rapidamente. Use tentativa e erro, ou [veja os spoilers aqui](http://pt-br.habitica.wikia.com/wiki/Comida#Prefer.C3.AAncias_de_Comida). Logo que conseguir uma Montaria, vá para Menu > Montarias e toque nele para equipa-lo ao seu avatar e clicando \"Usar\"(O seu avatar não reflete atualização para a alteração).\n\nVocê também pode conseguir ovos para Mascotes de Missão ao completar certas Missões. (Veja abaixo para aprender mais sobre Missões.)", @@ -38,20 +38,20 @@ "webFaqAnswer8": "A barra azul que apareceu quando chegaste ao nível 10 e escolheste uma Classe é a tua barra de Mana. À medida que continuas a subir de nível vais desbloquear Habilidades especiais que te vão custar Mana ao usá-las. Cada Classe tem diferentes Habilidades que aparecem no nível 11, na barra de acções no fundo do ecrã. Ao contrário da barra de Vida, a barra de Mana não se volta a preencher quando passas de nível. Em vez disso, ganhas Mana quando completas bons Hábitos, tarefas Diárias e Afazeres, e perdes Mana quando alimentas maus Hábitos. também vais recuperar Mana durante a noite -- quanto mais tarefas Diárias tiveres completado nesse dia, mais vais recuperar.", "faqQuestion9": "Como eu faço para enfrentar monstros e participar de Missões?", "iosFaqAnswer9": "Primeiro, precisas de te juntar a uma Equipa ou de criar uma nova (ver acima). Apesar de ser possível lutares sozinho contra monstros, recomendamos que jogues em grupo, pois isto vai tornar as Missões muito mais fáceis. Além disso, ter um amigo a incentivar-te à medida que vais completando as tuas tarefas é altamente motivante!\n\nA seguir, precisas de um Pergaminho de Missão. Podes encontrá-lo em Menu > Itens. Há três formas de obter um pergaminho:\n\n- No nível 15 recebes um Enredo-missão, ou seja, três missões interligadas. Outros Enredos-missão vão ser desbloqueados nos níveis 30, 40 e 60, respectivamente.\n- Quando convidas pessoas para a tua Equipa és recompensado com o Pergaminho Basi-Lista!\n- Podes comprar Missões na Loja de Missões em troca de Ouro e Gemas.\n\nPara lutar contra um Boss ou recolher itens para uma Colecção de Missão basta completares as tuas tarefas normalmente que elas vão ser contabilizadas como dano da noite para o dia. (Pode ser necessário recarregar a página puxando o ecrã para baixo para ver a barra de vida do Boss a diminuir.) Se estiveres a lutar contra um Boss e falhares quaisquer Tarefas Diárias, o Boss vai causar dano à tua Equipa ao mesmo tempo que tu lhe causas dano a ele.\n\nNo nível 11, Magos e Guerreiros vão adquirir Habilidades que lhes permitem infligir dano adicional ao Boss, portanto estas são excelentes classes para escolher no nível 10 se quiseres ser um lutador da pesada.", - "androidFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", - "webFaqAnswer9": "First, you need to join or start a Party by clicking \"Party\" in the navigation bar. Although you can battle monsters alone, we recommend playing in a group, because this will make quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating! Next, you need a Quest Scroll, which are stored under Inventory > Quests. There are four ways to get a scroll:\n * When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n * At level 15, you get a Quest-line, i.e., three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively.\n * You can buy Quests from the Quests Shop (Shops > Quests) for Gold and Gems.\n * When you check in to Habitica a certain number of times, you'll be rewarded with Quest Scrolls. You earn a Scroll during your 1st, 7th, 22nd, and 40th check-ins.\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading may be required to see the Boss's Health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", + "androidFaqAnswer9": "Primeiro, precisas de te juntar a uma Equipa ou de criar uma nova (ver acima). Apesar de ser possível lutares sozinho contra monstros, recomendamos que jogues em grupo, pois isto vai tornar as Missões muito mais fáceis. Além disso, ter um amigo a incentivar-te à medida que vais completando as tuas tarefas é altamente motivante!\n\nA seguir, precisas de um Pergaminho de Missão. Podes encontrá-lo em Menu > Itens. Há três formas de obter um pergaminho:\n\n- No nível 15, recebes um Enredo-Missão, ou seja, três missões interligadas. Outros Enredos-Missão vão ser desbloqueados nos níveis 30, 40 e 60, respectivamente.\n- Quando convidas pessoas para a tua Equipa és recompensado com o Pergaminho Basi-Lista!\n- Podes comprar Missões na Loja de Missões em troca de Ouro e Gemas.\n\nPara lutar contra um Líder ou recolher itens para uma Colecção de Missão basta completares as tuas tarefas normalmente que elas vão ser contabilizadas como dano da noite para o dia. (Pode ser necessário recarregar a página puxando o ecrã para baixo para ver a barra de vida do Líder a diminuir.) Se estiveres a lutar contra um Líder e falhares quaisquer Tarefas Diárias, o Líder vai causar dano à tua Equipa ao mesmo tempo que tu lhe causas dano a ele.\n\nA partir do nível 11, Magos e Guerreiros vão adquirir Habilidades que lhes permitem infligir dano adicional ao Líder, portanto estas são excelentes classes para escolher no nível 10 se quiseres ser um lutador da pesada.", + "webFaqAnswer9": "Primeiro, precisas de te juntar a uma Equipa clicando em \"Equipa\" na barra de navegação. Apesar de ser possível lutares sozinho contra monstros, recomendamos que jogues em grupo, pois isto vai tornar as missões muito mais fáceis. Além disso, ter um amigo a incentivar-te à medida que vais completando as tuas tarefas é altamente motivante! A seguir, precisas de um Pergaminho de Missão; estes estão guardados em Inventário > Missões. Há quatro formas de obter um pergaminho:\n* Quando convidares pessoas para a tua Equipa serás recompensado com o Pergaminho Basi-Lista!\n* No nível 15, recebes um Enredo-Missão, i.e., três missões interligadas. Outros Enredos-Missão vão ser desbloqueados nos níveis 30, 40 e 60, respectivamente.\n* Podes comprar Missões na Loja de Missões (Lojas > Missões) em troca de Ouro e Gemas.\n* Quando entras no Habitica um certo número de vezes, és recompensado com Pergaminhos de Missão. Ganhas um Pergaminho quando entras pela 1ª, 7ª, 22ª e 40ª vez.\nPara lutar contra um Líder ou recolher itens para uma Colecção de Missão basta completares as tuas tarefas normalmente que elas vão ser contabilizadas como dano da noite para o dia. (Pode ser necessário recarregar a página puxando o ecrã para baixo para ver a barra de vida do Líder a diminuir.) Se estiveres a lutar contra um Líder e falhares quaisquer Tarefas Diárias, o Líder vai causar dano à tua Equipa ao mesmo tempo que tu lhe causas dano a ele. A partir do nível 11, Magos e Guerreiros vão adquirir Habilidades que lhes permitem infligir dano adicional ao Líder, portanto estas são excelentes classes para escolher no nível 10 se quiseres ser um lutador da pesada.", "faqQuestion10": "O que são Gemas, e como as consigo?", - "iosFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", - "androidFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", - "webFaqAnswer10": "Gems are purchased with real money, although [subscribers](https://habitica.com/user/settings/subscription) can purchase them with Gold. When people subscribe or buy Gems, they are helping us to keep the site running. We're very grateful for their support! In addition to buying Gems directly or becoming a subscriber, there are two other ways players can gain Gems:\n* Win a Challenge that has been set up by another player. Go to Challenges > Discover Challenges to join some.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica). Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the site without them!", + "iosFaqAnswer10": "As Gemas compram-se com dinheiro verdadeiro clicando no ícone da Gema no cabeçalho. Ao comprarem Gemas ajudam-nos a manter o site em funcionamento. Ficamos muito gratos aos que o fazem pelo seu apoio!\n\nAlém de comprar Gemas directamente, há outras três formas de os jogadores obterem Gemas:\n\n* Ganhar um Desafio criado por outro jogador. Vai a Social > Desafios para entrar em alguns.\n* Subscreve e desbloqueia a possibilidade de comprar um certo número de Gemas por mês.\n* Contribui para o projecto Habitica através das tuas próprias habilidades. Vê esta página para mais detalhes: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\nLembra-te que os itens comprados com Gemas não dão qualquer vantagem estatística, por isso os jogadores podem usar a app sem elas.", + "androidFaqAnswer10": "As Gemas compram-se com dinheiro verdadeiro clicando no ícone da Gema no cabeçalho. Ao comprarem Gemas ajudam-nos a manter o site em funcionamento. Ficamos muito gratos aos que o fazem pelo seu apoio!\n\nAlém de comprar Gemas directamente, há outras três formas de os jogadores obterem Gemas:\n\n* Ganhar um Desafio criado por outro jogador. Vai a Social > Desafios para entrar em alguns.\n* Subscreve e desbloqueia a possibilidade de comprar um certo número de Gemas por mês.\n* Contribui para o projecto Habitica através das tuas próprias habilidades. Vê esta página para mais detalhes: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\nLembra-te que os itens comprados com Gemas não dão qualquer vantagem estatística, por isso os jogadores podem usar a app sem elas.", + "webFaqAnswer10": "As Gemas compram-se com dinheiro verdadeiro, ainda que os subscritores (https://habitica.com/user/settings/subscription) as possam comprar com Ouro. Quando alguém subscreve ou compra Gemas ajuda-nos a manter o site em funcionamento. Ficamos muito gratos aos que o fazem pelo seu apoio! Além de comprar Gemas directamente ou tornarem-se subscritores, há outras duas formas de os jogadores obterem Gemas:\n* Ganhar um Desafio criado por outro jogador. Vai a Social > Desafios para entrar em alguns.\n* Contribui para o projecto Habitica através das tuas próprias habilidades. Vê esta página wiki para mais detalhes: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica). Lembra-te que os itens comprados com Gemas não dão qualquer vantagem estatística, por isso os jogadores podem usar a app sem elas.", "faqQuestion11": "Como é que eu comunico um erro ou solicito uma funcionalidade?", - "iosFaqAnswer11": "You can report a bug, request a feature, or send feedback under Menu > About > Report a Bug and Menu > About > Send Feedback! We'll do everything we can to assist you.", + "iosFaqAnswer11": "Podes reportar um bug, solicitar uma funcionalidade ou enviar feedback em Menu > Sobre > Reportar Bug e Menu > Sobre > Enviar Feedback! Faremos os possíveis para ajudar.", "androidFaqAnswer11": "Pode reportar um erro, solicitar uma funcionalidade, ou enviar o seu comentário/opinião em Sobre > Comunicar um Erro e Sobre > Envie-nos Comentário! Nós faremos todos os possíveis para o assistir.", - "webFaqAnswer11": "To report a bug, go to [Help > Report a Bug](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) and read the points above the chat box. If you're unable to log in to Habitica, send your login details (not your password!) to [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Don't worry, we'll get you fixed up soon! Feature requests are collected on Trello. Go to [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) and follow the instructions. Ta-da!", + "webFaqAnswer11": "Para reportar um bug vai a [Help > Report a Bug](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) e lê os pontos acima da caixa da conversação. Se não conseguires entrar na tua conta do Habitica envia os teus detalhes de acesso (mas não a palavra-passe!) para [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Não te preocupes, vamos resolver o problema rapidamente! Pedidos de novas funcionalidades são recolhidos no Trello. vai a [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) e segue as instruções. Ta-da!", "faqQuestion12": "Como luto contra um Chefão Global?", - "iosFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", - "androidFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", - "webFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual. You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party. A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change. You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", + "iosFaqAnswer12": "Líderes Globais são monstros especiais que aparecem na Estalagem. Todos os utilizadores activos combatem automaticamente o Líder e as suas tarefas e Habilidades causam dano ao Líder como é normal.\n\nPodes estar numa Missão normal ao mesmo tempo. As tuas tarefas e Habilidades contam tanto para o Líder Global como para o Líder/Missão de Colecção da tua equipa.\n\nUm Líder Global nunca te vai prejudicar a ti ou à tua conta seja de que forma for. Em vez disso, ele tem uma Barra de Raiva que se enche quando os utilizadores falham Tarefas Diárias. Se a Barra de Raiva ficar cheia, ele ataca uma das Personagens Não-Jogáveis do site e a imagem delas muda.\n\nPodes ler mais sobre [Líderes Globais anteriores](http://habitica.wikia.com/wiki/World_Bosses) na wiki.", + "androidFaqAnswer12": "Líderes Globais são monstros especiais que aparecem na Estalagem. Todos os utilizadores activos combatem automaticamente o Líder e as suas tarefas e Habilidades causam dano ao Líder como é normal.\n\nPodes estar numa Missão normal ao mesmo tempo. As tuas tarefas e Habilidades contam tanto para o Líder Global como para o Líder/Missão de Colecção da tua equipa.\n\nUm Líder Global nunca te vai prejudicar a ti ou à tua conta seja de que forma for. Em vez disso, ele tem uma Barra de Raiva que se enche quando os utilizadores falham Tarefas Diárias. Se a Barra de Raiva ficar cheia, ele ataca uma das Personagens Não-Jogáveis do site e a imagem delas muda.\n\nPodes ler mais sobre [Líderes Globais anteriores](http://habitica.wikia.com/wiki/World_Bosses) na wiki.", + "webFaqAnswer12": "Líderes Globais são monstros especiais que aparecem na Estalagem. Todos os utilizadores activos combatem automaticamente o Líder e as suas tarefas e Habilidades causam dano ao Líder como é normal. Podes estar numa Missão normal ao mesmo tempo. As tuas tarefas e Habilidades contam tanto para o Líder Global como para o Líder/Missão de Colecção da tua equipa. Um Líder Global nunca te vai prejudicar a ti ou à tua conta seja de que forma for. Em vez disso, ele tem uma Barra de Raiva que se enche quando os utilizadores falham Tarefas Diárias. Se a Barra de Raiva ficar cheia, ele ataca uma das Personagens Não-Jogáveis do site e a imagem delas muda. Podes ler mais sobre [Líderes Globais anteriores](http://habitica.wikia.com/wiki/World_Bosses) na wiki.", "iosFaqStillNeedHelp": "Se você tem uma pergunta que não está na [Wiki FAQ](http://habitica.wikia.com/wiki/FAQ), venha perguntar no chat da Taberna em Menu > Taberna! Ficamos felizes em ajudar.", "androidFaqStillNeedHelp": "Se tem alguma pergunta que não está nesta lista ou na [FAQ da Wiki](http://habitica.wikia.com/wiki/FAQ), venha perguntar no chat da Taverna acessível em Menu > Taverna! Estamos sempre dispostos a ajudar.", "webFaqStillNeedHelp": "Se tiver uma pergunta que não esteja nesta lista ou na página de [Wiki de FAQ](http://habitica.wikia.com/wiki/FAQ), venha coloca-la na [Corporação de Ajuda de Habitica](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)!  Estamos felizes em ajudar." diff --git a/website/common/locales/pt/gear.json b/website/common/locales/pt/gear.json index 4daa49ba19..4e1c63782c 100644 --- a/website/common/locales/pt/gear.json +++ b/website/common/locales/pt/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Fantasia Steampunk", "armorMystery301404Notes": "Elegante e distinto. Não concede benefícios. Item de Assinante de Fevereiro 3015.", "armorMystery301703Text": "Vestido do Pavão Steampunk", @@ -984,6 +986,8 @@ "headMystery201710Notes": "Este elmo fá-lo parecer intimidante...but não lhe fará quaisquer favores para a sua percepção de profundidade! Não confere benefícios. Item de Assinante de Outubro de 2017.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Cartola Chique", "headMystery301404Notes": "Uma cartola chique para as damas e cavalheiros mais finos! Item de Assinante de Janeiro 3015. Não concede benefícios.", "headMystery301405Text": "Cartola Básica", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Este escudo de aspeto rude feito de rocha derretida protege-o de maus Hábitos mas não queimará as suas mãos. Não confere benefícios. Item de Assinante de Agosto de 2017.", "shieldMystery201709Text": "Livro de mão de Feitiçaria", "shieldMystery201709Notes": "Este livro irá guiá-lo através das suas explorações em feitiçaria. Não confere benefícios. Item de Assinante de Setembro de 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Escudo Relógio", "shieldMystery301405Notes": "O tempo está do seu lado com esse eminente escudo relógio! Não concede benefícios. Item de Assinante de Junho 3015.", "shieldMystery301704Text": "Leque Vibrante", diff --git a/website/common/locales/pt/generic.json b/website/common/locales/pt/generic.json index ac38cc164b..9216a299a0 100644 --- a/website/common/locales/pt/generic.json +++ b/website/common/locales/pt/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Tema Airu", "audioTheme_beatscribeNesTheme": "Tema da NES do Beatscribe", "audioTheme_arashiTheme": "Tema de Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/pt/groups.json b/website/common/locales/pt/groups.json index cbef2e3f50..7ae9797473 100644 --- a/website/common/locales/pt/groups.json +++ b/website/common/locales/pt/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Equipe online", "partyUpText": "Junte-se a uma Equipa com outra pessoa! Divirtam-se batalhando contra monstros e ajudando uns aos outros.", "partyOnText": "Juntou-se a uma equipe com pelo menos quarto pessoas! Aprecie o aumento de responsabilidade quando se juntar aos seus amigos para vencer os seus inimigos!", - "largeGroupNote": "Nota: Essa Guilda agora está grande demais para suportar notificações! Tenha certeza de checar de novo todo dia para ver novas mensagens.", "groupIdRequired": "\"groupId\" precisa ser um UUID válido.", "groupNotFound": "Grupo não encontrado ou ao qual você não tem acesso.", "groupTypesRequired": "Deve fornecer um \"tipo\" válido de pesquisa.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "A id. do utilizador está em falta no convite", "inviteMustNotBeEmpty": "O convite não deve estar em branco.", "partyMustbePrivate": "Equipes precisam ser privadas.", - "userAlreadyInGroup": "Usuário já nesse grupo.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Você não pode se convidar para um grupo.", - "userAlreadyInvitedToGroup": "Usuário já convidado para esse grupo.", - "userAlreadyPendingInvitation": "Usuário ainda com convite pendente.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Usuário com id \"<%= userId %>\" não encontrado.", "userHasNoLocalRegistration": "O utilizador não tem um registo local (nome de utilizador, e-mail, palavra-passe).", "uuidsMustBeAnArray": "Convites de ID de Usuário devem ser um arranjo.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/pt/limited.json b/website/common/locales/pt/limited.json index 8617f43725..c5e6ee4e71 100644 --- a/website/common/locales/pt/limited.json +++ b/website/common/locales/pt/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Ah... Bem-vindo à Loja Sazonal... Estamos estocando itens da Edição Sazonal de outono, ou algo assim... Tudo aqui ficará a disposição para compra durante o Festival de Outono anual, mas ficaremos abertos apenas até o dia 31 de Outubro... Acho que você deveria fazer seu próprio estoque agora, ou terá que esperar... e esperar... e esperar... *argh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Se você comprou algum deste equipamento no passado, mas atualmente não possui-lo, você pode recomprá-lo na coluna Recompensas. Inicialmente, você só vai ser capaz de comprar os itens para a sua classe atual (Guerreiro por padrão), mas não tenha medo, os outros itens específicos de classe estarão disponível se você alternar para essa classe.", "candycaneSet": "Bastão Doce (Mago)", "skiSet": "Assa-ski-no (Ladino)", diff --git a/website/common/locales/pt/messages.json b/website/common/locales/pt/messages.json index 0691b0dfa0..f527c7914e 100644 --- a/website/common/locales/pt/messages.json +++ b/website/common/locales/pt/messages.json @@ -9,8 +9,8 @@ "messageCannotFeedPet": "Não é possível alimentar este mascote.", "messageAlreadyMount": "Já possui essa montaria. Tente alimentar outro mascote.", "messageEvolve": "Você domou <%= egg %>, vamos dar um passeio.", - "messageLikesFood": "<%= egg %> really likes <%= foodText %>!", - "messageDontEnjoyFood": "<%= egg %> eats <%= foodText %> but doesn't seem to enjoy it.", + "messageLikesFood": "<%= egg %>gosta muito de <%= foodText %>!", + "messageDontEnjoyFood": "<%= egg %> come <%= foodText %> mas não parece apreciar muito.", "messageBought": "Comprou <%= itemText %>", "messageEquipped": "<%= itemText %> equipado.", "messageUnEquipped": "<%= itemText %> desequipado.", @@ -21,24 +21,24 @@ "messageNotEnoughGold": "Ouro Insuficiente", "messageTwoHandedEquip": "Para usar <%= twoHandedText %> são necessárias duas mãos, por isso <%= offHandedText %> foi desequipado.", "messageTwoHandedUnequip": "<%= twoHandedText %> precisa de duas mãos, então ele foi retirado ao equipar <%= offHandedText %>", - "messageDropFood": "You've found <%= dropText %>!", - "messageDropEgg": "You've found a <%= dropText %> Egg!", - "messageDropPotion": "You've found a <%= dropText %> Hatching Potion!", + "messageDropFood": "Encontraste 1 <%= dropText %>!", + "messageDropEgg": "Encontraste um Ovo <%= dropText %>!", + "messageDropPotion": "Encontraste uma Poção de Eclosão <%= dropText %>!", "messageDropQuest": "Você encontrou uma Missão!", "messageDropMysteryItem": "Você abre a caixa e encontra <%= dropText %>!", "messageFoundQuest": "Você encontrou a missão \"<%= questText %>\"!", "messageAlreadyPurchasedGear": "Você comprou este equipamento no passado, mas não possuí mais o mesmo. Você pode comprá-lo novamente na coluna de recompensas na página de tarefas.", "messageAlreadyOwnGear": "Você já possui este item. Vista-o indo até a página de equipamentos.", - "previousGearNotOwned": "You need to purchase a lower level gear before this one.", + "previousGearNotOwned": "Tens de comprar o equipamento um nível abaixo antes de comprares este.", "messageHealthAlreadyMax": "Já tem a saúde máxima.", - "messageHealthAlreadyMin": "Oh no! You have already run out of health so it's too late to buy a health potion, but don't worry - you can revive!", + "messageHealthAlreadyMin": "Oh, não! Já ficaste sem vida por isso é tarde demais para comprares uma poção de vida, mas não te preocupes - podes ressuscitar!", "armoireEquipment": "<%= image %> Encontrou uma peça de Equipamento raro no Armário: <%= dropText %>! Fantástico!", - "armoireFood": "<%= image %> You rummage in the Armoire and find <%= dropText %>. What's that doing in here?", + "armoireFood": "<%= image %> Vasculhas o Armário e encontras <%= dropText %>. O que é que isto estava a fazer aqui dentro?", "armoireExp": "Você se engalfinhou com o Armário e ganhou Experiência. Pega essa!", "messageInsufficientGems": "Gemas insuficientes!", "messageAuthPasswordMustMatch": ":password e :confirmPassword não combinam", "messageAuthCredentialsRequired": ":username, :email, :password, :confirmPassword requeridos", - "messageAuthUsernameTaken": "Login Name already taken", + "messageAuthUsernameTaken": "Nome de utilizador já registado", "messageAuthEmailTaken": "Email já cadastrado", "messageAuthNoUserFound": "Usuário não encontrado.", "messageAuthMustBeLoggedIn": "Deve ter a sessão iniciada.", @@ -53,12 +53,12 @@ "messageGroupChatFlagAlreadyReported": "Já reportou esta mensagem.", "messageGroupChatNotFound": "Mensagem não encontrada!", "messageGroupChatAdminClearFlagCount": "Somente um administrador pode remover o contador de bandeira!", - "messageCannotFlagSystemMessages": "You cannot flag a system message. If you need to report a violation of the Community Guidelines related to this message, please email a screenshot and explanation to Lemoness at <%= communityManagerEmail %>.", - "messageGroupChatSpam": "Whoops, looks like you're posting too many messages! Please wait a minute and try again. The Tavern chat only holds 200 messages at a time, so Habitica encourages posting longer, more thoughtful messages and consolidating replies. Can't wait to hear what you have to say. :)", + "messageCannotFlagSystemMessages": "Não é possível assinalar uma mensagem do sistema. Se precisares de reportar uma violação das Directrizes de Comunidade relacionada com esta mensagem, por favor envia uma captura de ecrã e uma explicação por e-mail à Lemoness através do <%= communityManagerEmail %>.", + "messageGroupChatSpam": "Ups, parece que estás a publicar demasiadas mensagens! Por favor aguarda um minuto e volta a tentar. A conversação da Estalagem só pode conter 200 mensagens de cada vez, por isso o Habitica encoraja publicações mais longas e reflectidas, assim como respostas sólidas. Mal podemos esperar por ouvir o que tens a dizer. :)", "messageUserOperationProtected": "caminho `<%= operation %>` não foi salvo, já que é um caminho protegido.", "messageUserOperationNotFound": "<%= operation %> operação não encontrada", "messageNotificationNotFound": "Notificação não encontrada.", "notificationsRequired": "São necessárias as identificações de notificação.", - "unallocatedStatsPoints": "You have <%= points %> unallocated Stat Points", - "beginningOfConversation": "This is the beginning of your conversation with <%= userName %>. Remember to be kind, respectful, and follow the Community Guidelines!" + "unallocatedStatsPoints": "Tens <%= points %> Ponto(s) de Atributo por alocar ", + "beginningOfConversation": "Isto é o início da tua conversa com <%= userName %>. Lembra-te de ser gentil, respeitador, e de seguir as Directrizes da Comunidade." } \ No newline at end of file diff --git a/website/common/locales/pt/quests.json b/website/common/locales/pt/quests.json index cdff22dc29..11649f1446 100644 --- a/website/common/locales/pt/quests.json +++ b/website/common/locales/pt/quests.json @@ -29,7 +29,7 @@ "askLater": "Perguntar Depois", "questLater": "Voltar depois para a Missão", "buyQuest": "Comprar Missão", - "accepted": "Aceito", + "accepted": "Aceite", "declined": "Recusado", "rejected": "Rejeitado", "pending": "Pendente", diff --git a/website/common/locales/pt/questscontent.json b/website/common/locales/pt/questscontent.json index 5760fa431c..dca7c82133 100644 --- a/website/common/locales/pt/questscontent.json +++ b/website/common/locales/pt/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/pt/subscriber.json b/website/common/locales/pt/subscriber.json index 11ff4e43ad..4a79280942 100644 --- a/website/common/locales/pt/subscriber.json +++ b/website/common/locales/pt/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Conjunto \"Steampunk Padrão\"", "mysterySet301405": "Conjunto \"Acessórios Steampunk\"", "mysterySet301703": "Conjunto do Pavão Steampunk", diff --git a/website/common/locales/pt_BR/challenge.json b/website/common/locales/pt_BR/challenge.json index ef1310fafb..dd2a21c056 100644 --- a/website/common/locales/pt_BR/challenge.json +++ b/website/common/locales/pt_BR/challenge.json @@ -110,7 +110,7 @@ "challengeSummaryPlaceholder": "Escreva uma breve descrição anunciando seu Desafio para outros Habiticanos. Qual é o principal objetivo do Desafio e por que as pessoas deveriam entrar nele? Tente incluir palavras chave úteis na descrição de forma que Habiticanos possam encontrá-lo facilmente em suas buscas.", "challengeDescriptionPlaceholder": "Use essa seção para dar maiores informações sobre tudo que os participantes do Desafio deveriam saber sobre seu Desafio.", "challengeGuild": "Adicionar a", - "challengeMinimum": "É necessário o mínimo de 1 Gema para desafios públicos (Ajuda a prevenir o spam, ajuda mesmo).", + "challengeMinimum": "Desafios na Taverna exigem o mínimo de 1 gema. Outros lugares, basta colocar 0 no prêmio. ", "participantsTitle": "Participantes", "shortName": "Nome Curto", "shortNamePlaceholder": "Que etiqueta curta serve para identificar o seu Desafio?", diff --git a/website/common/locales/pt_BR/character.json b/website/common/locales/pt_BR/character.json index aabd3f767c..f69e2cd3b6 100644 --- a/website/common/locales/pt_BR/character.json +++ b/website/common/locales/pt_BR/character.json @@ -64,6 +64,7 @@ "classBonusText": "Sua classe (Guerreiro(a), se você ainda não liberou ou selecionou outra classe) usa um equipamento específico com mais eficiência que equipamentos de outras classes. Usar equipamentos da própria classe garante um aumento de 50% aos bônus de atributo concedidos pelo equipamento.", "classEquipBonus": "Bônus de Classe", "battleGear": "Equipamento de Batalha", + "gear": "Gear", "battleGearText": "Este é o equipamento que você usará em batalha; ele influencia os valores de atributos que são usados quando você interage com suas tarefas.", "autoEquipBattleGear": "Auto-equipar novos equipamentos", "costume": "Aparência", @@ -121,7 +122,7 @@ "experience": "Experiência", "warrior": "Guerreiro", "healer": "Curandeiro", - "rogue": "Ladino", + "rogue": "Gatuno", "mage": "Mago", "wizard": "Mago", "mystery": "Mistério", @@ -145,7 +146,7 @@ "warriorText": "Guerreiros causam mais e melhores \"golpes críticos\", que dão aleatoriamente bônus de Ouro, Experiência e chance de drop ao cumprir uma tarefa. Eles também causam muito dano aos chefões. Jogue de Guerreiro se encontra motivação em recompensas aleatórias, ou se gosta de acabar com chefões de Missões!", "wizardText": "Magos aprendem rapidamente, ganhando experiência e níveis mais rápido do que as outras classes. Eles também conseguem uma boa quantidade de Mana para usar em habilidades especiais. Jogue com Magos se você adora os aspectos táticos de Habitica ou se você é fortemente motivado por subir de níveis e desbloquear funções avançadas!", "mageText": "Magos aprendem rápido, ganhando Experiência e Níveis mais rápido que outras classes. Eles também tem muito mais Mana para usar habilidades especiais. Jogue de Mago se você gostar dos aspectos táticos de jogo do Habitica ou se você sentir bastante motivação por aumentar seu nível e desbloquear novas funcionalidades. ", - "rogueText": "Ladinos amam acumular fortunas, ganhando mais Ouro que qualquer um, e são peritos em achar itens aleatórios. Sua habilidade icônica, Furtividade, os permite evitar as consequências de Diárias não feitas. Jogue de Ladino se tiver grande motivação com receber Recompensas e Conquistas, e se gostar de ganhar itens e medalhas!", + "rogueText": "Gatunos amam acumular fortunas, ganhando mais Ouro que qualquer um, e são peritos em achar itens aleatórios. Sua habilidade icônica, Furtividade, os permite evitar as consequências de Diárias não feitas. Jogue de Gatuno se tiver grande motivação com receber Recompensas e Conquistas, e se gostar de ganhar itens e medalhas!", "healerText": "Curandeiros são impenetráveis contra danos, e extendem essa proteção aos outros. Diárias perdidas e maus Hábitos não incomodam muito, e eles possuem maneiras de recuperar Vida do fracasso. Jogue de Curandeiro se gostar de ajudar os outros em seu Grupo, ou se a ideia de enganar a Morte com trabalho duro o inspira!", "optOutOfClasses": "Se Abster", "optOutOfPMs": "Se Abster", @@ -190,7 +191,7 @@ "chooseClassHeading": "Escolha sua Classe! Ou deixe para escolher mais tarde.", "warriorWiki": "Guerreiro", "mageWiki": "Mago", - "rogueWiki": "Ladino", + "rogueWiki": "Gatuno", "healerWiki": "Curandeiro", "chooseClassLearn": "Aprenda mais sobre classes", "str": "FOR", diff --git a/website/common/locales/pt_BR/faq.json b/website/common/locales/pt_BR/faq.json index 79646aa678..047822e6d2 100644 --- a/website/common/locales/pt_BR/faq.json +++ b/website/common/locales/pt_BR/faq.json @@ -22,16 +22,16 @@ "webFaqAnswer4": "Existem diversas coisas que podem fazer você levar dano. Primeiro, se você deixar uma Diária incompleta até o fim do dia, ela te dará dano. Segundo, se você fizer um mau Hábito, ele te dará dano. Finalmente, se você estiver em uma Missão de Chefão com seu Grupo e um de seus companheiros não tiver completado todas suas Diárias, o Chefão irá te atacar. O principal modo de se curar é ganhando um nível, que restaura toda sua vida. Você também pode comprar uma Poção de Vida com ouro na coluna de Recompensas. Além disso, após o nível 10, você pode escolher se tornar um Curandeiro e então você aprenderá habilidades de cura. Se você está em um grupo com um Curandeiro, ele pode te curar também. Leia mais clicando em \"Grupo\" na barra de navegação.", "faqQuestion5": "Como jogo Habitica com meus amigos?", "iosFaqAnswer5": "O melhor jeito é convida-los para um Grupo com você! Grupos podem fazer missões, batalhar contra monstros e usar habilidades para ajudar um ao outro. Vá em Menu > Grupo e clique \"Criar Novo Grupo\" se você ainda não tiver um Grupo. Em seguida toque na lista de Membros e toque em Convidar, no canto superior direito, para convidar amigos usando suas IDs de Usuário (uma linha de números e letras que pode ser encontrada em Configurações > Detalhes da Conta no aplicativo, e Configurações > API no site). No site, você também pode convidar amigos via email, que também adicionaremos ao aplicativo em uma atualização futura.\n\nNo site, você e seus amigos também podem se unir a Guildas, que são salas de chat públicas. Guildas serão adicionadas ao aplicativo em uma atualização futura!", - "androidFaqAnswer5": "A melhor forma é convidá-los para um Grupo com você! Grupos podem fazer missões, lutar contra monstros e lançar habilidades para ajudar uns aos outros. Vá para o [site](https://habitica.com/) para criar um se você ainda não tiver um Grupo. Vocês também podem entrar em guildas juntos (Social > Guildas). Guildas são salas de chat focadas em interesses em comum ou na busca de um objetivo mútuo e podem ser públicas ou privadas. Você pode entrar em tantas guildas quanto quiser, mas em apenas um grupo. \n\nPara mais informações, verifique as páginas da wiki sobre [Grupos]((http://pt-br.habitica.wikia.com/wiki/Party) e [Guildas](http://pt-br.habitica.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "A melhor forma é convidá-los para um Grupo com você clicando em \"Grupo\" na barra de navegação. Grupos podem fazer missões, lutar contra monstros e lançar habilidades para ajudar uns aos outros. Vocês também podem entrar em guildas juntos (clique em \"Guildas\" na barra de navegação). Guildas são salas de chat focadas em interesses em comum ou na busca de um objetivo mútuo e podem ser públicas ou privadas. Você pode entrar em tantas guildas quanto quiser, mas em apenas um grupo. Para mais informações, verifique as páginas da wiki sobre [Grupos]((http://pt-br.habitica.wikia.com/wiki/Party) e [Guildas](http://pt-br.habitica.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Como consigo um Mascote ou Montaria?", "iosFaqAnswer6": "No nível 3, você irá destravar o sistema de Drop. Toda vez que você completar uma tarefa, você terá uma chance aleatória de receber um ovo, uma poção de eclosão ou uma comida. Eles serão guardados em Menu > Itens.\n\nPara chocar um Mascote, você precisará de um ovo e uma poção de eclosão. Toque no ovo para determinar que espécie você quer chocar e selecione \"Chocar Ovo.\" Depois escolha uma poção de eclosão para determinar sua cor! Vá para Menu > Mascotes para equipar o novo Mascote ao seu avatar clicando nele.\n\nVocê também pode transformar seus Mascotes em Montarias ao alimentá-los em Menu > Mascotes. Selecione um Mascote e depois escolha \"Alimentar Mascote\"! Você tera que alimentar um mascote várias vezes antes dele se tornar uma Montaria, mas se você conseguir descobrir qual é sua comida favorita, ele crescerá mais rápido. Use tentativa e erro, ou [veja os spoilers aqui](http://pt-br.habitica.wikia.com/wiki/Comida#Prefer.C3.AAncias_de_Comida). Logo que conseguir uma Montaria, vá para Menu > Montarias e clique nela para equipá-la ao seu avatar.\n\nVocê também pode conseguir ovos em Missões de Mascotes ao completar certas Missões. (Veja abaixo para aprender mais sobre Missões.)", "androidFaqAnswer6": "No nível 3, você irá destravar o sistema de Drop. Toda vez que você completar uma tarefa, você terá uma chance aleatória de receber um ovo, uma poção de eclosão ou uma comida. Eles serão guardados em Menu > Itens.\n\nPara chocar um Mascote, você precisará de um ovo e uma poção de eclosão. Toque no ovo para determinar que espécie você quer chocar e selecione \"Chocar com poção.\" Depois escolha uma poção de eclosão para determinar sua cor! Para equipar o novo Mascote vá para Menu > Estábulo > Mascotes , escolha a espécie, clique no Mascote desejado e selecione \"Usar\" (Seu avatar não atualiza para refletir a mudança).\n\nVocê também pode transformar seus Mascotes em Montarias ao alimentá-los em Menu > Estábulo [ > Mascotes]. Selecione um Mascote e depois escolha \"Alimentar Mascote\"! Você terá que alimentar um mascote várias vezes antes dele se tornar uma Montaria, mas se você conseguir descobrir qual é sua comida favorita, ele crescerá mais rápido. Use tentativa e erro, ou [veja os spoilers aqui](http://pt-br.habitica.wikia.com/wiki/Comida#Prefer.C3.AAncias_de_Comida). Para equipar sua Montaria vá para Menu > Estábulo > Montarias, escolha uma espécie e clique em \"Usar\" (Seu avatar não atualiza para refletir a mudança).\n\nVocê também pode conseguir ovos em Missões de Mascotes ao completar certas Missões. (Veja abaixo para aprender mais sobre Missões.)", "webFaqAnswer6": "No nível 3, você desbloqueará o Sistema de Drop. Cada vez que você completar uma tarefa, terá uma chance aleatória de receber um ovo, uma poção de eclosão ou uma comida. Eles ficarão guardados em Inventário > Itens. Para chocar um Mascote, você precisará tanto de um ovo quanto uma poção de eclosão. Uma vez que tiver ambos o ovo e a poção, vá até Inventário > Estábulo para chocar seu mascote clicando na imagem dele. Quando tiver chocado o mascote, você poderá equipá-lo simplesmente clicando nele. Você também pode evoluir seus Mascotes em Montarias alimentando-os em Inventário > Estábulo. Arraste uma comida da barra de ação na parte inferir da tela e solte-a em um mascote para alimentá-lo! Você terá de alimentar o Mascote diversas vezes antes dele se tornar uma Montaria, mas se você descobrir a comida favorita dele, ele crescerá mais rápido. Use tentativa e erro ou [veja spoilers aqui](http://pt-br.habitica.wikia.com/wiki/Food#Prefer.C3.AAncias_de_Comida). Uma vez que você tiver uma Montaria, clique nela para equipá-la junto do seu avatar. Você também pode conseguir ovos de Missões de Mascotes ao completar certas Missões. (Veja abaixo para aprender mais sobre Missões.)", - "faqQuestion7": "Como me tornar Guerreiro(a), Mago(a), Ladino(a) ou Curandeiro(a)?", - "iosFaqAnswer7": "No nível 10, você poderá escolher entre se tornar um(a) Guerreiro, Mago, Ladino ou Curandeiro. (Todo jogador começa como Guerreiro por padrão). Cada Classe tem diferentes opções de equipamento, diferentes Habilidades que podem ser usadas após o nível 11 e diferentes vantagens. Guerreiros podem causar dano a Chefões com facilidade, aguentar mais dano pelas suas tarefas e ajudar seu Grupo a ficar mais forte. Magos também podem facilmente causar dano a Chefões, além de ganhar níveis rapidamente e restaurar a Mana de seu Grupo. Ladinos ganham mais ouro e encontram mais itens, além de poder ajudar seu Grupo a fazer o mesmo. Finalmente, Curandeiros podem curar a si mesmos e seus companheiros de Grupo.\n\nSe você não quer escolher uma Classe imediatamente -- por exemplo, se você ainda está se esforçando para comprar todo o equipamento de sua classe atual -- você pode clicar em \"Decidir Depois\" e escolher mais tarde em Menu > Escolher Classe.", - "androidFaqAnswer7": "No nível 10, você poderá escolher entre se tornar um Guerreiro, Mago, Ladino ou Curandeiro. (Todo jogador começa como Guerreiro por padrão). Cada Classe tem diferentes opções de equipamento, diferentes Habilidades que podem ser usadas após o nível 11 e diferentes vantagens. Guerreiros podem causar dano a Chefões com facilidade, aguentar mais dano pelas suas tarefas e ajudar seu Grupo a ficar mais forte. Magos também podem facilmente causar dano a Chefões, além de ganhar níveis rapidamente e restaurar a Mana de seu Grupo. Ladinos ganham mais ouro e encontram mais itens, além de poder ajudar seu Grupo a fazer o mesmo. Finalmente, Curandeiros podem curar a si mesmos e seus companheiros de Grupo. \n\nSe você não quer escolher uma Classe imediatamente -- por exemplo, se você ainda está se esforçando para comprar todo o equipamento de sua classe atual -- você pode clicar em \"Decidir Depois\" e escolher mais tarde em Menu > Escolher Classe.", - "webFaqAnswer7": "No nível 10, você poderá escolher se juntar aos Guerreiros, Magos, Ladinos ou Curandeiros. (Todo jogador começa como Guerreiro por padrão). Cada Classe tem diferentes opções de equipamento, diferentes Habilidades que podem ser usadas após o nível 11 e diferentes vantagens. Guerreiros podem causar dano a Chefões com facilidade, aguentar mais dano pelas suas tarefas e ajudar seu Grupo a ficar mais forte. Magos também podem facilmente causar dano a Chefões, além de ganhar níveis rapidamente e restaurar a Mana de seu Grupo. Ladinos ganham mais ouro e encontram mais itens, além de poder ajudar seu Grupo a fazer o mesmo. Por último, Curandeiros podem curar a si mesmos e seus companheiros de Grupo. Se você não quer escolher uma Classe imediatamente -- por exemplo, se você ainda está se esforçando para comprar todo o equipamento de sua classe atual -- você pode clicar em \"Recusar\" e depois reabilitar em nas Configurações", + "faqQuestion7": "Como me tornar Guerreiro(a), Mago(a), Gatuno(a) ou Curandeiro(a)?", + "iosFaqAnswer7": "No nível 10, você poderá escolher entre se tornar um(a) Guerreiro, Mago, Gatuno ou Curandeiro. (Todo jogador começa como Guerreiro por padrão). Cada Classe tem diferentes opções de equipamento, diferentes Habilidades que podem ser usadas após o nível 11 e diferentes vantagens. Guerreiros podem causar dano a Chefões com facilidade, aguentar mais dano pelas suas tarefas e ajudar seu Grupo a ficar mais forte. Magos também podem facilmente causar dano a Chefões, além de ganhar níveis rapidamente e restaurar a Mana de seu Grupo. Gatunos ganham mais ouro e encontram mais itens, além de poder ajudar seu Grupo a fazer o mesmo. Finalmente, Curandeiros podem curar a si mesmos e seus companheiros de Grupo.\n\nSe você não quer escolher uma Classe imediatamente -- por exemplo, se você ainda está se esforçando para comprar todo o equipamento de sua classe atual -- você pode clicar em \"Decidir Depois\" e escolher mais tarde em Menu > Escolher Classe.", + "androidFaqAnswer7": "No nível 10, você poderá escolher entre se tornar um Guerreiro, Mago, Gatuno ou Curandeiro. (Todo jogador começa como Guerreiro por padrão). Cada Classe tem diferentes opções de equipamento, diferentes Habilidades que podem ser usadas após o nível 11 e diferentes vantagens. Guerreiros podem causar dano a Chefões com facilidade, aguentar mais dano pelas suas tarefas e ajudar seu Grupo a ficar mais forte. Magos também podem facilmente causar dano a Chefões, além de ganhar níveis rapidamente e restaurar a Mana de seu Grupo. Gatunos ganham mais ouro e encontram mais itens, além de poder ajudar seu Grupo a fazer o mesmo. Finalmente, Curandeiros podem curar a si mesmos e seus companheiros de Grupo. \n\nSe você não quer escolher uma Classe imediatamente -- por exemplo, se você ainda está se esforçando para comprar todo o equipamento de sua classe atual -- você pode clicar em \"Decidir Depois\" e escolher mais tarde em Menu > Escolher Classe.", + "webFaqAnswer7": "No nível 10, você poderá escolher se juntar aos Guerreiros, Magos, Gatunos ou Curandeiros. (Todo jogador começa como Guerreiro por padrão). Cada Classe tem diferentes opções de equipamento, diferentes Habilidades que podem ser usadas após o nível 11 e diferentes vantagens. Guerreiros podem causar dano a Chefões com facilidade, aguentar mais dano pelas suas tarefas e ajudar seu Grupo a ficar mais forte. Magos também podem facilmente causar dano a Chefões, além de ganhar níveis rapidamente e restaurar a Mana de seu Grupo. Gatunos ganham mais ouro e encontram mais itens, além de poder ajudar seu Grupo a fazer o mesmo. Por último, Curandeiros podem curar a si mesmos e seus companheiros de Grupo. Se você não quer escolher uma Classe imediatamente -- por exemplo, se você ainda está se esforçando para comprar todo o equipamento de sua classe atual -- você pode clicar em \"Recusar\" e depois reabilitar em nas Configurações", "faqQuestion8": "O que é a barra azul de Atributos que aparece no Cabeçalho após o nível 10?", "iosFaqAnswer8": "A barra azul que apareceu após você chegar no nível 10 e escolher sua Classe é sua barra de Mana. À medida que você continua ganhando níveis, você desbloqueará Habilidades especiais que custarão Mana para serem usadas. Cada Classe tem diferentes Habilidades que aparecerão após o nível 11 em Menu > Usar Habilidades. Diferente da barra de vida, sua Mana não enche quando você ganha um nível. Ao invés disso, Mana é adquirida quando você completa Bons Hábitos, Diárias e Afazeres, mas perdida quando você faz Maus Hábitos. Você também irá recuperar um pouco de Mana ao fim do dia -- quanto mais Diárias você completar, mais você irá ganhar.", "androidFaqAnswer8": "A barra azul que apareceu após você chegar no nível 10 e escolher sua Classe é sua barra de Mana. À medida que você continua ganhando níveis, você desbloqueará Habilidades especiais que custarão Mana para serem usadas. Cada Classe tem diferentes Habilidades que aparecerão após o nível 11 em Menu > Usar Habilidades. Diferente da barra de vida, sua Mana não enche quando você ganha um nível. Ao invés disso, Mana é adquirida quando você completa Bons Hábitos, Diárias e Afazeres, mas perdida quando você faz Maus Hábitos. Você também irá recuperar um pouco de Mana ao fim do dia -- quanto mais Diárias você completar, mais você irá ganhar.", diff --git a/website/common/locales/pt_BR/gear.json b/website/common/locales/pt_BR/gear.json index c6ff69fa9e..07ac3e9493 100644 --- a/website/common/locales/pt_BR/gear.json +++ b/website/common/locales/pt_BR/gear.json @@ -3,7 +3,7 @@ "equipmentType": "Tipo", "klass": "Classe", "groupBy": "Organizar Por <%= type %>", - "classBonus": "(This item matches your class, so it gets an additional 1.5 Stat multiplier.)", + "classBonus": "(Este item foi feito para sua classe, então tem um multiplicador de atributos adicional de 1.5x.)", "classArmor": "Armadura da Classe", "featuredset": "Conjunto em Destaque: <%= name %>", "mysterySets": "Conjunto Misterioso", @@ -495,7 +495,7 @@ "armorSpecialSpring2016HealerText": "Calções de Coelhinho Fofinho", "armorSpecialSpring2016HealerNotes": "Saltando por ai! De colina a colina, curando aqueles que precisam. Aumenta Constituição em <%= con %>. Equipamento de Edição Limitada. Primavera de 2016.", "armorSpecialSummer2016RogueText": "Cauda de Enguia", - "armorSpecialSummer2016RogueNotes": "Essas eletrificantes vestes transformam seu usuário em um verdadeiro Ladino Enguia! Aumenta Percepção em <%= per %>. Equipamento de Edição Limitada. Verão de 2016.", + "armorSpecialSummer2016RogueNotes": "Essas eletrificantes vestes transformam seu usuário em um verdadeiro Gatuno Enguia! Aumenta Percepção em <%= per %>. Equipamento de Edição Limitada. Verão de 2016.", "armorSpecialSummer2016WarriorText": "Cauda de Tubarão", "armorSpecialSummer2016WarriorNotes": "Essas grossas vestes transformam seu usuário em um verdadeiro Guerreiro Tubarão! Aumenta Constituição em <%= con %>. Equipamento de Edição Limitada. Verão de 2016.", "armorSpecialSummer2016MageText": "Cauda de Golfinho", @@ -592,7 +592,7 @@ "armorMystery201605Notes": "Diferente dos bardos tradicionais que se unem a grupos de caça, bardos que se unem às bandas marchantes Habiticanas são conhecidos por grandes atrações, não ataques a calabouços. Não concede benefícios. Item de Assinante, Maio de 2016.", "armorMystery201606Text": "Cauda de Sereia", "armorMystery201606Notes": "Essa forte cauda brilha como a espuma do mar se quebrando na costa. Não concede benefícios. Item de Assinante, Junho de 2016.", - "armorMystery201607Text": "Armadura de Ladino das Profundezas", + "armorMystery201607Text": "Armadura de Gatuno das Profundezas", "armorMystery201607Notes": "Misture-se às profundezas do mar com esta furtiva armadura aquática. Não concede benefícios. Item de Assinante, Julho de 2016.", "armorMystery201609Text": "Armadura Bovina", "armorMystery201609Notes": "Complete o resto do rebanho com esta armadura! Não concede benefícios. Item de Assinante, Setembro de 2016.", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "Este aconchegante conjunto de agasalho vai mantê-lo aquecido enquanto você voa pelo céu! Não concede benefícios. Item de Assinante, Novembro de 2017.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Traje da Revolução Industrial", "armorMystery301404Notes": "Elegante e distinto! Não concede benefícios. Item de Assinante, Fevereiro de 3015.", "armorMystery301703Text": "Vestido de Pavão da Revolução Industrial", @@ -960,7 +962,7 @@ "headMystery201605Notes": "Setenta e seis dragões comandaram o grande desfile, com cento e dez grifos ao alcance das mãos! Não concede benefícios. Item de Assinante, Maio de 2016.", "headMystery201606Text": "Chapéu de Sereia", "headMystery201606Notes": "Cantarole a melodia do oceano enquanto você se torna um com as brincalhonas focas! Não concede benefícios. Item de Assinante, Junho de 2016.", - "headMystery201607Text": "Elmo de Ladinos das Profundezas", + "headMystery201607Text": "Elmo de Gatunos das Profundezas", "headMystery201607Notes": "A alga que cresce neste elmo ajuda a te camuflar. Não concede benefícios. Item de Assinante, Julho de 2016.", "headMystery201608Text": "Elmo do Relâmpago", "headMystery201608Notes": "Este elmo conduz eletricidade! Não concede benefícios. Item de Assinante, Agosto de 2016.", @@ -984,6 +986,8 @@ "headMystery201710Notes": "Este elmo o faz parecer intimidador... mas não facilitará seu senso de profundidade! Não concede benefícios. Item de Assinante, Outubro de 2017.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Cartola Chique", "headMystery301404Notes": "Uma cartola chique para os mais finos cavalheiros e damas! Não concede benefícios. Item de Assinante, Janeiro de 3015.", "headMystery301405Text": "Cartola Básica", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Este bruto escudo de pedras derretidas te protege contra seus maus hábitos mas não irá queimar suas mãos. Não concede benefícios. Item de Assinante, Agosto de 2017.", "shieldMystery201709Text": "Livro Estudante de Feitiçaria", "shieldMystery201709Notes": "Este livro irá te guiar durante seu caminho à feitiçaria. Não concede benefícios. Item de Assinante, Setembro de 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Escudo Relógio", "shieldMystery301405Notes": "O tempo está do seu lado com esse eminente escudo relógio! Não concede benefícios. Item de Assinante, Junho de 3015.", "shieldMystery301704Text": "Ventilador Borboleteante ", @@ -1375,7 +1381,7 @@ "headAccessorySpecialSpring2016WarriorText": "Orelhas Vermelhas de Ratinho", "headAccessorySpecialSpring2016WarriorNotes": "Para melhor escutar sua canção tema pelos clamorosos campos de batalha. Não concede benefícios. Equipamento de Edição Limitada. Primavera de 2016.", "headAccessorySpecialSpring2016MageText": "Orelhas Amarelas de Gatinho", - "headAccessorySpecialSpring2016MageNotes": "Estas orelhas afiadas podem detectar o murmurar da Mana no ambiente, ou as passadas silenciosas de um Ladino. Não concede benefícios. Equipamento de Edição Limitada. Primavera de 2016.", + "headAccessorySpecialSpring2016MageNotes": "Estas orelhas afiadas podem detectar o murmurar da Mana no ambiente, ou as passadas silenciosas de um Gatuno. Não concede benefícios. Equipamento de Edição Limitada. Primavera de 2016.", "headAccessorySpecialSpring2016HealerText": "Orelhas Roxas de Coelhinho", "headAccessorySpecialSpring2016HealerNotes": "Eles levantam como bandeiras sobre a briga, deixando os outros saberem onde correr por ajuda. Não concede benefícios. Equipamento de Edição Limitada. Primavera de 2016.", "headAccessorySpecialSpring2017RogueText": "Orelhas Vermelhas de Coelhinho", diff --git a/website/common/locales/pt_BR/generic.json b/website/common/locales/pt_BR/generic.json index 03f9b778b4..c0abb14f25 100644 --- a/website/common/locales/pt_BR/generic.json +++ b/website/common/locales/pt_BR/generic.json @@ -33,7 +33,7 @@ "showLess": "Mostrar Menos", "expandToolbar": "Expandir Barra de Ferramentas", "collapseToolbar": "Esconder Barra de Ferramentas", - "markdownHelpLink": "Markdown formatting help", + "markdownHelpLink": "Ajuda sobre formatação Markdown", "showFormattingHelp": "Mostrar ajuda de formatação", "hideFormattingHelp": "Esconder ajuda de formatação", "youType": "Você digita:", @@ -60,7 +60,7 @@ "groupPlansTitle": "Planos de Times", "newGroupTitle": "Novo Grupo", "subscriberItem": "Item Misterioso", - "newSubscriberItem": "You have new Mystery Items", + "newSubscriberItem": "Você possui novos Itens Surpresa", "subscriberItemText": "A cada mês, assinantes receberão um item misterioso. Ele normalmente é liberado cerca de uma semana antes do final do mês. Veja a página \"Item Misterioso\" da wiki para mais informações.", "all": "Todos", "none": "Nenhum", @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Tema de Airu's", "audioTheme_beatscribeNesTheme": "Tema Beastscribe's NES", "audioTheme_arashiTheme": "Tema de Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "Tema MAFL", @@ -168,9 +169,9 @@ "achievementBewilderText": "Ajudou a derrotar o Ilusion-lista durante o Festival de Primavera de 2016!", "checkOutProgress": "Veja o meu progresso no Habitica!", "cards": "Cartões", - "sentCardToUser": "You sent a card to <%= profileName %>", - "cardReceivedFrom": "<%= cardType %> from <%= userName %>", - "cardReceived": "You received a <%= card %>", + "sentCardToUser": "Você enviou uma carta a <%= profileName %>", + "cardReceivedFrom": "<%= cardType %> de <%= userName %>", + "cardReceived": "Você recebeu <%= card %>", "greetingCard": "Cartão de Saudação", "greetingCardExplanation": "Ambos receberam a conquista Camarada Animado!", "greetingCardNotes": "Mande um cartão de saudação para um membro do seu grupo.", @@ -275,11 +276,11 @@ "spirituality": "Espiritualidade", "time_management": "Gestão de Tempo + Responsabilidade", "recovery_support_groups": "Grupos de Apoio + Recuperação", - "dismissAll": "Dismiss All", + "dismissAll": "Dispensar Tudo", "messages": "Mensagens", "emptyMessagesLine1": "Você não tem mensagens", "emptyMessagesLine2": "Envie uma mensagem para iniciar uma conversa!", - "userSentMessage": "<%= user %> sent you a message", + "userSentMessage": "<%= user %> enviou-lhe uma mensagem", "letsgo": "Vamo que vamo!", "selected": "Selecionado", "howManyToBuy": "Qual quantidade gostaria de comprar?", diff --git a/website/common/locales/pt_BR/groups.json b/website/common/locales/pt_BR/groups.json index 7c10dcb987..4879ef072f 100644 --- a/website/common/locales/pt_BR/groups.json +++ b/website/common/locales/pt_BR/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Agrupamento", "partyUpText": "Entrou num Grupo com outra pessoa! Divirta-se batalhando monstros e ajudando uns aos outros.", "partyOnText": "Entrou num Grupo com, pelo menos, quatro pessoas! Aproveite sua maior responsabilidade enquanto se une com seus amigos e destrói seus inimigos!", - "largeGroupNote": "Nota: Essa Guilda agora está grande demais para suportar notificações! Lembre de verificar todo dia para ver novas mensagens.", "groupIdRequired": "\"groupId\" precisa ser um UUID válido.", "groupNotFound": "Grupo não encontrado ou ao qual você não tem acesso.", "groupTypesRequired": "Deve fornecer uma string \"type\" válida.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Falta o ID do usuário no convite", "inviteMustNotBeEmpty": "O convite não pode estar vazio.", "partyMustbePrivate": "Grupos precisam ser privados.", - "userAlreadyInGroup": "Usuário já está nesse grupo.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Você não pode se convidar para um grupo.", - "userAlreadyInvitedToGroup": "Usuário já convidado para esse grupo.", - "userAlreadyPendingInvitation": "Usuário já com convite pendente.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Usuário com id \"<%= userId %>\" não encontrado.", "userHasNoLocalRegistration": "Usuário não tem um registro local (usuário, e-mail, senha).", "uuidsMustBeAnArray": "Convites de ID de Usuário devem ser um array.", @@ -417,11 +416,13 @@ "managerAdded": "Gestor(a) adicionado(a) com sucesso.", "managerRemoved": "Gestor(a) removido(a) com sucesso.", "leaderChanged": "O líder foi alterado", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/pt_BR/inventory.json b/website/common/locales/pt_BR/inventory.json index f9730a68bd..ac6b4a79ca 100644 --- a/website/common/locales/pt_BR/inventory.json +++ b/website/common/locales/pt_BR/inventory.json @@ -1,8 +1,8 @@ { - "noItemsAvailableForType": "You have no <%= type %>.", - "foodItemType": "Food", - "eggsItemType": "Eggs", - "hatchingPotionsItemType": "Hatching Potions", - "specialItemType": "Special items", - "lockedItem": "Locked Item" + "noItemsAvailableForType": "Você não possui <%= type %>.", + "foodItemType": "Comida", + "eggsItemType": "Ovos", + "hatchingPotionsItemType": "Poções de Eclosão", + "specialItemType": "Itens Especiais", + "lockedItem": "Item bloqueado" } diff --git a/website/common/locales/pt_BR/limited.json b/website/common/locales/pt_BR/limited.json index 272a801469..4154944ec7 100644 --- a/website/common/locales/pt_BR/limited.json +++ b/website/common/locales/pt_BR/limited.json @@ -34,19 +34,20 @@ "seasonalShopFallText": "Feliz Festival de Outono!! Gostaria de comprar alguns itens raros? Eles estarão disponíveis apenas até 31 de Outubro!", "seasonalShopWinterText": "Feliz Maravilhas de Inverno!! Gostaria de comprar alguns itens raros? Eles estarão disponíveis apenas até 31 de Janeiro!", "seasonalShopFallTextBroken": "Ah... Boas vindas à Loja Sazonal... Estamos estocando itens da Edição Sazonal de outono ou algo assim... Tudo aqui ficará disponível para compra durante o Festival de Outono anual, mas ficaremos abertos apenas até o dia 31 de Outubro... Acho que você deveria fazer seu próprio estoque agora ou terá que esperar... e esperar... e esperar... *argh*", + "seasonalShopBrokenText": "Meu pavilhão!!!!!!! Minhas decorações!!!! Oh, o Descoraçador destruiu tudo :( Por favor ajude a derrotá-lo na Taverna para que eu possa reconstruir!", "seasonalShopRebirth": "Se você comprou algum equipamento antes mas não o possui, ele pode ser recomprado na Coluna de Recompensas. Inicialmente, poderá comprar itens para sua classe atual (Guerreiro, por padrão), mas não tema, os itens específicos das outras classes ficarão disponíveis se você trocar para aquela classe.", "candycaneSet": "Bastão Doce (Mago)", - "skiSet": "Assa-ski-no (Ladino)", + "skiSet": "Assa-ski-no (Gatuno)", "snowflakeSet": "Floco de Neve (Curandeiro)", "yetiSet": "Domante de Yeti (Guerreiro)", "northMageSet": "Mago do Norte (Mago)", - "icicleDrakeSet": "Dragão de Gelo (Ladino)", + "icicleDrakeSet": "Dragão de Gelo (Gatuno)", "soothingSkaterSet": "Patinante Alentador (Curandeiro)", "gingerbreadSet": "Guerreiro de Gengibre (Guerreiro)", "snowDaySet": "Dia do Guerreiro da Neve (Guerreiro)", "snowboardingSet": "Feiticeiro Snowboarding (Mago)", "festiveFairySet": "Fada Festiva (Curandeiro)", - "cocoaSet": "Ladino Cacau (Ladino)", + "cocoaSet": "Gatuno Cacau (Gatuno)", "toAndFromCard": "De: <%= fromName %>, Para: <%= toName %>", "nyeCard": "Cartão de Ano Novo", "nyeCardExplanation": "Por celebrarem o ano novo juntos, ambos receberam a medalha \"Velhos Conhecidos\"!", @@ -63,59 +64,59 @@ "mightyBunnySet": "Coelhinho Poderoso (Guerreiro)", "magicMouseSet": "Ratinho Encantado (Mago)", "lovingPupSet": "Canino Amoroso (Curandeiro)", - "stealthyKittySet": "Felino Furtivo (Ladino)", + "stealthyKittySet": "Felino Furtivo (Gatuno)", "daringSwashbucklerSet": "Marujo Ousado (Guerreiro)", "emeraldMermageSet": "Sereia Esmeralda (Mago)", "reefSeahealerSet": "Curandeiro dos Corais (Curandeiro)", - "roguishPirateSet": "Pirata Malandro (Ladino)", + "roguishPirateSet": "Pirata Malandro (Gatuno)", "monsterOfScienceSet": "Monstro da Ciência (Guerreiro)", "witchyWizardSet": "Bruxo Bruxólico (Mago)", "mummyMedicSet": "Médico Múmia (Curandeiro)", - "vampireSmiterSet": "Vampiro Violento (Ladino)", + "vampireSmiterSet": "Vampiro Violento (Gatuno)", "bewareDogSet": "Cuidado com o Cão (Guerreiro)", "magicianBunnySet": "Coelho do Mágico (Mago)", "comfortingKittySet": "Gatinho Confortante (Curandeiro)", - "sneakySqueakerSet": "Ladrão Sorrateiro (Ladino)", + "sneakySqueakerSet": "Ladrão Sorrateiro (Gatuno)", "sunfishWarriorSet": "Guerreiro Peixe-Lua (Guerreiro)", "shipSoothsayerSet": "Navio Vidente (Mago)", "strappingSailorSet": "Forte Marinheiro (Curandeiro)", - "reefRenegadeSet": "Renegado dos Corais (Ladino)", + "reefRenegadeSet": "Renegado dos Corais (Gatuno)", "scarecrowWarriorSet": "Guerreiro Espantalho (Guerreiro) ", "stitchWitchSet": "Bruxa Costura (Mago)", "potionerSet": "Poçãoneiro (Curandeiro)", - "battleRogueSet": "Ladino Morcego (Ladino)", + "battleRogueSet": "Gatuno Morcego (Gatuno)", "springingBunnySet": "Coelhinho Saltitante (Curandeiro)", "grandMalkinSet": "Grande Gatuno (Mago)", - "cleverDogSet": "Cachorro Esperto (Ladino)", + "cleverDogSet": "Cachorro Esperto (Gatuno)", "braveMouseSet": "Rato Valente (Guerreiro)", "summer2016SharkWarriorSet": "Guerreiro Tubarão (Guerreiro)", "summer2016DolphinMageSet": "Mago Golfinho (Mago)", "summer2016SeahorseHealerSet": "Curandeiro Cavalo-Marinho (Curandeiro)", - "summer2016EelSet": "Ladino Enguia (Ladino)", + "summer2016EelSet": "Gatuno Enguia (Gatuno)", "fall2016SwampThingSet": "Coisa Pantanosa (Guerreiro)", "fall2016WickedSorcererSet": "Feiticeiro Perverso (Mago)", "fall2016GorgonHealerSet": "Curandeiro de Medusa (Curandeiro)", - "fall2016BlackWidowSet": "Ladino Viúva-Negra (Ladino)", + "fall2016BlackWidowSet": "Gatuno Viúva-Negra (Gatuno)", "winter2017IceHockeySet": "Hóquei no Gelo (Guerreiro)", "winter2017WinterWolfSet": "Lobo Invernal (Mago)", "winter2017SugarPlumSet": "Curandeiro Bombonzinho (Curandeiro)", - "winter2017FrostyRogueSet": "Ladino Glacial (Ladino)", + "winter2017FrostyRogueSet": "Gatuno Glacial (Gatuno)", "spring2017FelineWarriorSet": "Guerreiro Felino (Guerreiro)", "spring2017CanineConjurorSet": "Ilusionista Canino (Mago)", "spring2017FloralMouseSet": "Rato Colorido (Curandeiro)", - "spring2017SneakyBunnySet": "Coelhinho Sorrateiro (Ladino)", + "spring2017SneakyBunnySet": "Coelhinho Sorrateiro (Gatuno)", "summer2017SandcastleWarriorSet": "Guerreiro do Castelo de Areia (Guerreiro)", "summer2017WhirlpoolMageSet": "Mago do Turbilhão (Mago)", "summer2017SeashellSeahealerSet": "Curandeiro Concha Marinha (Curandeiro)", - "summer2017SeaDragonSet": "Dragão do Mar (Ladino)", + "summer2017SeaDragonSet": "Dragão do Mar (Gatuno)", "fall2017HabitoweenSet": "Guerreiros Habitoween (Guerreiros)", "fall2017MasqueradeSet": "Magos Masgarados (Magos)", "fall2017HauntedHouseSet": "Curandeiros Casa Assombrada (Curandeiros)", - "fall2017TrickOrTreatSet": "Ladinos Doçura ou Travessura (Ladinos)", + "fall2017TrickOrTreatSet": "Gatunos Doçura ou Travessura (Gatunos)", "winter2018ConfettiSet": "Mago de Confete (Mago)", "winter2018GiftWrappedSet": "Guerreiro Embrulhado para Presente (Guerreiro)", "winter2018MistletoeSet": "Curandeiro do Visco (Curandeiro)", - "winter2018ReindeerSet": "Ladino da Rena ( Ladino)", + "winter2018ReindeerSet": "Gatuno da Rena ( Gatuno)", "eventAvailability": "Disponível para compra até <%= date(locale) %>.", "dateEndApril": "19 de Abril", "dateEndMay": "17 de Maio", @@ -125,7 +126,7 @@ "dateEndOctober": "31 de Outubro", "dateEndNovember": "30 de Novembro", "dateEndJanuary": "31 de Janeiro", - "dateEndFebruary": "February 28", + "dateEndFebruary": "28 de fevereiro", "winterPromoGiftHeader": "Presenteie alguém com uma assinatura e ganhe outra grátis !", "winterPromoGiftDetails1": "Somente até o dia 12 de Janeiro, ao presentear alguém com uma assinatura, você ganhará a mesma assinatura para você de graça!", "winterPromoGiftDetails2": "Por favornote que se você ou que será presenteado já tiver uma assinatura recorrente, a assinatura presenteada somente iniciará depois que a outra assinatura seja cancelada ou expire. Obrigado pelo seu apoio! <3", diff --git a/website/common/locales/pt_BR/messages.json b/website/common/locales/pt_BR/messages.json index 3087a97186..112efe1af9 100644 --- a/website/common/locales/pt_BR/messages.json +++ b/website/common/locales/pt_BR/messages.json @@ -9,8 +9,8 @@ "messageCannotFeedPet": "Não foi possível alimentar este mascote.", "messageAlreadyMount": "Você já possui essa montaria. Tente alimentar outro mascote.", "messageEvolve": "Você domou <%= egg %>, vamos dar um passeio!", - "messageLikesFood": "<%= egg %> really likes <%= foodText %>!", - "messageDontEnjoyFood": "<%= egg %> eats <%= foodText %> but doesn't seem to enjoy it.", + "messageLikesFood": "<%= egg %>adora <%= foodText %>!", + "messageDontEnjoyFood": "<%= egg %> comeu <%= foodText %>, mas parece não gostar.", "messageBought": "Comprou <%= itemText %>", "messageEquipped": "<%= itemText %> equipado.", "messageUnEquipped": "<%= itemText %> desequipado.", @@ -21,7 +21,7 @@ "messageNotEnoughGold": "Ouro Insuficiente", "messageTwoHandedEquip": "<%= twoHandedText %> precisa das duas mãos, então <%= offHandedText %> foi desequipado.", "messageTwoHandedUnequip": "<%= twoHandedText %> precisa das duas mãos, então ele foi retirado ao equipar <%= offHandedText %>.", - "messageDropFood": "You've found <%= dropText %>!", + "messageDropFood": "Você encontrou <%= dropText %>!", "messageDropEgg": "Você encontrou um Ovo <%= dropText %>!", "messageDropPotion": "Você encontrou uma Poção de Eclosão <%= dropText %>!", "messageDropQuest": "Você encontrou uma Missão!", @@ -33,7 +33,7 @@ "messageHealthAlreadyMax": "Você já está com o máximo de vida.", "messageHealthAlreadyMin": "Ah não! Você já está completamente sem vida, portanto é muito tarde para comprar uma poção de vida, mas não se preocupe - você pode reviver!", "armoireEquipment": "<%= image %> Você encontrou um Equipamento raro no Armário: <%= dropText %>! Incrível!", - "armoireFood": "<%= image %> You rummage in the Armoire and find <%= dropText %>. What's that doing in here?", + "armoireFood": "<%= image %>Você revira o Armário e encontra <%= dropText %>. O que isso está fazendo aqui?", "armoireExp": "Você chutou o Armário e ganhou Experiência. Toma essa!", "messageInsufficientGems": "Gemas insuficientes!", "messageAuthPasswordMustMatch": ":password e :confirmPassword não combinam", diff --git a/website/common/locales/pt_BR/npc.json b/website/common/locales/pt_BR/npc.json index 5f0a5637e6..694a10b8bf 100644 --- a/website/common/locales/pt_BR/npc.json +++ b/website/common/locales/pt_BR/npc.json @@ -31,8 +31,8 @@ "danielText2": "Tenha cuidado: Se estiver participando de uma missão contra um Chefão, ele ainda lhe causará danos pelas Diárias não feitas dos seus companheiros de grupo! Além disso, o seu dano no Chefão (ou itens coletados) não serão calculados até que você saia da Pousada.", "danielTextBroken": "Boas vindas à Taverna... Eu acho... Se você precisa descansar, eu irei te hospedar na Pousada... Enquanto estiver na Pousada, suas Diárias não te machucarão no final do dia, mas você ainda pode marcá-las como realizadas... se você tiver energia...", "danielText2Broken": "Oh... Se você estiver participando de uma missão de Chefão, ele ainda te causará dano pelas Diárias não feitas dos teus colegas de grupo... Além disso, seu dano no Chefão (ou itens coletados) não serão calculados até que você saia da Pousada...", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "Evento de Chefão Global", + "worldBossDescription": "Descrição do Chefão Global", "alexander": "Alexander, o Comerciante", "welcomeMarket": "Boas vindas ao Mercado! Compre ovos e poções difíceis de encontrar! Venda seus extras! Encomende serviços úteis! Venha ver o que temos para oferecer.", "welcomeMarketMobile": "Boas vindas ao Mercado! Compre ovos raros e poções! Venha ver o que temos a oferecer.", @@ -96,9 +96,9 @@ "alreadyUnlocked": "Conjunto completo já destravado.", "alreadyUnlockedPart": "Conjunto completo parcialmente destravado.", "USD": "(Dólar)", - "newStuff": "New Stuff by Bailey", - "newBaileyUpdate": "New Bailey Update!", - "tellMeLater": "Tell Me Later", + "newStuff": "Novidades da Bailey", + "newBaileyUpdate": "Nova atualização da Bailey!", + "tellMeLater": "Lembrar Mais Tarde", "dismissAlert": "Remover Alerta", "donateText1": "Adiciona 20 Gemas em sua conta. Gemas são usadas para comprar itens especiais dentro do jogo, como camisetas e estilos de cabelo.", "donateText2": "Ajude a manter o Habitica", @@ -113,7 +113,7 @@ "classGearText": "Parabéns por ter escolhido uma classe! Eu adicionei sua nova arma básica no seu inventário. Dê uma olhada abaixo para equipá-lo!", "classStats": "Estes são seus Atributos de Classe; eles afetam o modo de jogar. Cada vez que você sobe um nível você ganha um Ponto para distribuir para uma Atributo em particular. Passe o mouse sobre um Atributo para mais informações.", "autoAllocate": "Distribuição Automática", - "autoAllocateText": "If 'Automatic Allocation' is selected, your avatar gains Stats automatically based on your tasks' Stats, which you can find in TASK > Edit > Advanced Settings > Stat Allocation. Eg, if you hit the gym often, and your 'Gym' Daily is set to 'Strength', you'll gain Strength automatically.", + "autoAllocateText": "Se a \"Distribuição Automática\" estiver marcada, seu avatar distribuirá atributos automaticamente baseado nos atributos das suas tarefas, os quais podem ser encontrados em TAREFA > Editar > Avançado > Atributos . Por exemplo, se você malhar com frequência e sua Tarefa Diária de \"Malhar\" estiver programada para \"Força\", você distribuirá Força automaticamente.", "spells": "Habilidades", "spellsText": "Você pode agora desbloquear habilidades específicas de classe. Você irá ver a primeira no nível 11. Sua mana recupera em 10 pontos por dia e mais 1 ponto por Afazer completado.", "skillsTitle": "Habilidades", @@ -139,7 +139,7 @@ "tourHallPage": "Boas Vindas ao Salão dos Heróis, onde os contribuidores do código aberto do Habitica são honrados. Seja através de programação, arte, música, escrita ou apenas prestatividade, eles receberam Gemas, equipamentos exclusivos e títulos prestigiosos. Você também pode contribuir para o Habitica!", "tourPetsPage": "Este é o Estábulo! Após alcançar o nível 3, você encontrará ovos de mascotes e poções de eclosão conforme completar tarefas. Quando você eclodir um ovo de mascote no Mercado, ele vai aparecer aqui! Clique na imagem de um mascote para adicioná-lo a seu avatar. Alimente-os com a comida que encontrar após o nível 3 e eles se tornarão montarias poderosas.", "tourMountsPage": "Depois que você alimentar um mascote o suficiente para transformá-lo em uma montaria, ele aparecerá aqui. Clique em uma montaria para subir nela!", - "tourEquipmentPage": "This is where your Equipment is stored! Your Battle Gear affects your Stats. If you want to show different Equipment on your avatar without changing your Stats, click \"Enable Costume.\"", + "tourEquipmentPage": "Aqui é onde seu Equipamento fica guardado! Seu Equipamento de Batalha afeta seus atributos. Se quiser usar outro Equipamento no seu avatar sem alterar seus atributos, clique em \"Mostrar Aparência\".", "equipmentAlreadyOwned": "Você já possui esse equipamento", "tourOkay": "Okay!", "tourAwesome": "Incrível!", diff --git a/website/common/locales/pt_BR/pets.json b/website/common/locales/pt_BR/pets.json index 0078f016d8..29865ec015 100644 --- a/website/common/locales/pt_BR/pets.json +++ b/website/common/locales/pt_BR/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "Grifo Real Roxo", "phoenix": "Fênix", "magicalBee": "Abelha Mágica", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "Hipogrifo Otimista", + "hopefulHippogriffMount": "Hipogrifo Otimista", "royalPurpleJackalope": "Lebrílope Roxo Real ", "invisibleAether": "Éter Invisível", "rarePetPop1": "Clique na pata de ouro para saber mais em como obter esse mascote raro através de contribuições ao Habitica.", @@ -83,7 +83,7 @@ "petNotOwned": "Você não possui esse mascote.", "mountNotOwned": "Você não possui essa montaria.", "earnedCompanion": "Com toda sua produtividade, você conseguiu um novo companheiro. Alimente-o para fazê-lo crescer.", - "feedPet": "Feed <%= text %> to your <%= name %>?", + "feedPet": "Dar <%= text %> para seu <%= name %>?", "useSaddle": "Usar sela em <%= pet %>?", "raisedPet": "Você domou seu <%= pet %>!", "earnedSteed": "Por completar suas tarefas, você conquistou uma fiel montaria!", diff --git a/website/common/locales/pt_BR/quests.json b/website/common/locales/pt_BR/quests.json index 07a75e7c5c..4cff8ac3df 100644 --- a/website/common/locales/pt_BR/quests.json +++ b/website/common/locales/pt_BR/quests.json @@ -121,9 +121,9 @@ "questBundles": "Pacotes de Missões com Desconto", "buyQuestBundle": "Comprar Pacote de Missões", "noQuestToStart": "Não consegue achar uma missão? Experimente visitar a Loja de Missões no Mercado e veja os novos lançamentos!", - "pendingDamage": "<%= damage %> pending damage", - "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health", + "pendingDamage": "<%= damage %> de dano pendente", + "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Vida", "rageAttack": "Rage Attack:", - "bossRage": "<%= currentRage %> / <%= maxRage %> Rage", + "bossRage": "<%= currentRage %> / <%= maxRage %> Fúria", "rageStrikes": "Rage Strikes" } \ No newline at end of file diff --git a/website/common/locales/pt_BR/questscontent.json b/website/common/locales/pt_BR/questscontent.json index 65b1d282f9..4faecbc129 100644 --- a/website/common/locales/pt_BR/questscontent.json +++ b/website/common/locales/pt_BR/questscontent.json @@ -486,8 +486,8 @@ "questMayhemMistiflying3Completion": "Logo quando você acreditava que não poderia aguentar o vento nenhum pouco mais, você consegue se esgueirar e arrancar a máscara do Manipulador do Vento. Instantaneamente, o tornado desaparece, deixando apenas uma reparadora briza com o brilho do sol. O Manipular do Vento olha ao redor aliviado. \"Onde ela foi?\"

\"Quem\", seu amigo @khdarkwolf pergunta.

\"Aquela doce mulher que se ofereceu para entregar um pacote por mim. Tzina.\" Ao notar a cidade que fora atacada pelo vento, sua expressão cai. \"Então, talvez ela não fosse tão doce...\"

O Primeiro de Abril o consola e entrega dois envelopes brilhantes. \"Aqui, por que você não deixa esse cansado amigo descansar e toma conta das cartas um pouco? Eu ouvi que a mágica nesses envelopes farão valer à pena seu tempo.\"", "questMayhemMistiflying3Boss": "O Manipulador do Vento", "questMayhemMistiflying3DropPinkCottonCandy": "Algodão-Doce Rosa (Comida)", - "questMayhemMistiflying3DropShield": "Mensagem do Arco-Íris Ladino (Mão Secundária)", - "questMayhemMistiflying3DropWeapon": "Mensagem do Arco-Íris Ladino (Mão Primária)", + "questMayhemMistiflying3DropShield": "Mensagem do Arco-Íris Gatuno (Mão Secundária)", + "questMayhemMistiflying3DropWeapon": "Mensagem do Arco-Íris Gatuno (Mão Primária)", "featheredFriendsText": "Pacote de Missões dos Amigos Emplumados", "featheredFriendsNotes": "Contém 'Socorro, Harpia!,' 'A Coruja Noturna,' e 'As Aves de Rapinrolação.' Disponível até 31 de Maio.", "questNudibranchText": "Infestação das Lesmas Marinhas FaçAgora", @@ -518,11 +518,11 @@ "questLostMasterclasser1CollectHiddenTomes": "Tomos Escondidos", "questLostMasterclasser2Text": "O Mistério dos Mestres de Classe, Parte 2: Conjurando o a'Voidant", "questLostMasterclasser2Notes": "A Ceifadora Alegre batuca seus dedos ósseos em alguns dos livros que você trouxe. \"Oh, minha cara,\" a Mestre dos Curandeiros diz. \"Existe uma essência de vida malévola em ação. Eu deveria ter percebido, considerando os ataques de crânios reanimados durante cada incidente.\" Sua assistente @tricksy.fox traz um baú e você se assusta ao ver o conteúdo que @beffymaroo despeja: os mesmos objetos usados por essa misteriosa Tzina para possuir as pessoas.

\"Vou usar magia de cura ressonante para fazer com que essa criatura se manifeste,\" diz a Ceifadora Alegre, lembrando a você que o esqueleto é de alguma forma um Curandeiro não convencional. \"Você precisa ler a mensagem revelada rapidamente, caso a criatura saia do nosso controle.\"

Conforme ela se concentra, uma névoa torcida começa a sair dos livros e envolver os objetos. Rapidamente, você viras as páginas tentando ler as novas linhas de texto que se aproximam. Você consegue pegar apenas alguns trechos: \"Areias dos Tempos Perdidos\" - \"o Grande Desastre\" - \"dividir em quatro\" - \"permanentemente corrompido\" - Até que um nome chama a sua atenção: Zinnya.

De forma bruta, as páginas se libertam de seus dedos e se destroem enquanto uma criatura uivante explode em existência, fundindo-se em torno dos objetos possuídos.

\"É um a'Voidant!\" a Ceifadora Alegre grita, conjurando um feitiço de proteção. \"São criaturas antigas de confusão e obscuridade. Se essa Tzina pode controlar uma delas, ela deve possuir um comando assustador sobre a vida mágica. Rápido, ataque-a antes que escape de volta para os livros!\"

", - "questLostMasterclasser2Completion": "O a'Voidant finalmente sucumbe e você partilha os trechos que lê.

\"Nenhuma dessas referências me parecem familiar, mesmo para alguém tão velha quanto eu,\" diz a Ceifadora Alegre. \"Exceto... os Tempos Perdidos são um deserto distante, nos limites mais hostis do Habitica. Portais frequentemente falham na região, mas montarias rápidas podem levar você até lá bem rápido. Lady Glaciata com prazer irá te ajudar.\" Sua voz soa divertida. \"O que significa que o Mestre dos Ladinos enamorado certamente virá junto.\" Ela entrega uma máscara cintilante a você. \"Talvez você deva tentar rastrear a magia que persiste nesses itens até sua origem. Eu irei colher algum sustento para a sua jornada.\"", + "questLostMasterclasser2Completion": "O a'Voidant finalmente sucumbe e você partilha os trechos que lê.

\"Nenhuma dessas referências me parecem familiar, mesmo para alguém tão velha quanto eu,\" diz a Ceifadora Alegre. \"Exceto... os Tempos Perdidos são um deserto distante, nos limites mais hostis do Habitica. Portais frequentemente falham na região, mas montarias rápidas podem levar você até lá bem rápido. Lady Glaciata com prazer irá te ajudar.\" Sua voz soa divertida. \"O que significa que o Mestre dos Gatunos enamorado certamente virá junto.\" Ela entrega uma máscara cintilante a você. \"Talvez você deva tentar rastrear a magia que persiste nesses itens até sua origem. Eu irei colher algum sustento para a sua jornada.\"", "questLostMasterclasser2Boss": "O a'Voidant", "questLostMasterclasser2DropEyewear": "Máscara Etérea (Acessório de Olhos)", "questLostMasterclasser3Text": "O Mistério dos Mestres de Classe, Parte 3: Cidade nas Areias", - "questLostMasterclasser3Notes": "Assim que a noite cai sobre as areias incandescentes de Tempo Perdido, seus guias @AnndeLuna, @KiwiBot e @Katy133 lhe levam a frente. Pilares alvejantes atravessam as dunas sombrias e, ao se aproximarem, um som arrepiante ecoa o ambiente que antes parecia abandonado.

\" Criaturas invisíveis!\" diz Primeiro de Abril claramente ambicioso \"Hehehe! Só imaginem as possibilidades. Este deve de ser um trabalho de um Ladino realmente furtivo\"

\" Um Ladino que pode estar nos vigiando\", fala Lady Glaciata desmontando de seu corcel e brandindo sua lança. \" Se eles estão prontos para atacar, tentem não irritar-los . Eu não quero outro incidente como o dos vulcões.\"

Ele então retruca \" Mas aquele foi com certeza um dos resgastes mais esplendidos\"

Para sua surpresa, Lady Glaciata cora com o elogio e dá um passo afobado para trás, como que para examinar as ruínas.

\"Parecem os destroços de uma antiga cidade\" diz @AnnDeLune. \"Eu só imagino o que será...\"

Antes que ela pudesse terminar sua fala, um portal emerge dos céus. Magia não deveria ser praticamente impossível aqui?! Você ouve o trote brusco dos animais invisíveis ao fugirem em pânico, e prontamente se põe em guarda para mais uma vez lutar contra uivantes caveiras que transbordam dos céus prontas para um massacre.", + "questLostMasterclasser3Notes": "Assim que a noite cai sobre as areias incandescentes de Tempo Perdido, seus guias @AnndeLuna, @KiwiBot e @Katy133 lhe levam a frente. Pilares alvejantes atravessam as dunas sombrias e, ao se aproximarem, um som arrepiante ecoa o ambiente que antes parecia abandonado.

\" Criaturas invisíveis!\" diz Primeiro de Abril claramente ambicioso \"Hehehe! Só imaginem as possibilidades. Este deve de ser um trabalho de um Gatuno realmente furtivo\"

\" Um Gatuno que pode estar nos vigiando\", fala Lady Glaciata desmontando de seu corcel e brandindo sua lança. \" Se eles estão prontos para atacar, tentem não irritar-los . Eu não quero outro incidente como o dos vulcões.\"

Ele então retruca \" Mas aquele foi com certeza um dos resgastes mais esplendidos\"

Para sua surpresa, Lady Glaciata cora com o elogio e dá um passo afobado para trás, como que para examinar as ruínas.

\"Parecem os destroços de uma antiga cidade\" diz @AnnDeLune. \"Eu só imagino o que será...\"

Antes que ela pudesse terminar sua fala, um portal emerge dos céus. Magia não deveria ser praticamente impossível aqui?! Você ouve o trote brusco dos animais invisíveis ao fugirem em pânico, e prontamente se põe em guarda para mais uma vez lutar contra uivantes caveiras que transbordam dos céus prontas para um massacre.", "questLostMasterclasser3Completion": "The April Fool surprises the final skull with a spray of sand, and it blunders backwards into Lady Glaciate, who smashes it expertly. As you catch your breath and look up, you see a single flash of someone’s silhouette moving on the other side of the closing portal. Thinking quickly, you snatch up the amulet from the chest of previously-possessed items, and sure enough, it’s drawn towards the unseen person. Ignoring the shouts of alarm from Lady Glaciate and the April Fool, you leap through the portal just as it snaps shut, plummeting into an inky swath of nothingness.", "questLostMasterclasser3Boss": "Enxame de Caveiras do Vácuo", "questLostMasterclasser3RageTitle": "Retorno do Enxame", @@ -562,18 +562,21 @@ "questBadgerNotes": "Ah, winter in the Taskwoods. The softly falling snow, the branches sparkling with frost, the Flourishing Fairies… still not snoozing?

“Why are they still awake?” cries @LilithofAlfheim. “If they don't hibernate soon, they'll never have the energy for planting season.”

As you and @Willow the Witty hurry to investigate, a furry head pops up from the ground. Before you can yell, “It’s the Badgering Bother!” it’s back in its burrow—but not before snatching up the Fairies' “Hibernate” To-Dos and dropping a giant list of pesky tasks in their place!

“No wonder the fairies aren't resting, if they're constantly being badgered like that!” @plumilla says. Can you chase off this beast and save the Taskwood’s harvest this year?", "questBadgerCompletion": "You finally drive away the the Badgering Bother and hurry into its burrow. At the end of a tunnel, you find its hoard of the faeries’ “Hibernate” To-Dos. The den is otherwise abandoned, except for three eggs that look ready to hatch.", "questBadgerBoss": "The Badgering Bother", - "questBadgerDropBadgerEgg": "Badger (Egg)", + "questBadgerDropBadgerEgg": "Texugo (Ovo)", "questBadgerUnlockText": "Unlocks purchasable Badger eggs in the Market", - "questDysheartenerText": "The Dysheartener", - "questDysheartenerNotes": "The sun is rising on Valentine’s Day when a shocking crash splinters the air. A blaze of sickly pink light lances through all the buildings, and bricks crumble as a deep crack rips through Habit City’s main street. An unearthly shrieking rises through the air, shattering windows as a hulking form slithers forth from the gaping earth.

Mandibles snap and a carapace glitters; legs upon legs unfurl in the air. The crowd begins to scream as the insectoid creature rears up, revealing itself to be none other than that cruelest of creatures: the fearsome Dysheartener itself. It howls in anticipation and lunges forward, hungering to gnaw on the hopes of hard-working Habiticans. With each rasping scrape of its spiny forelegs, you feel a vise of despair tightening in your chest.

“Take heart, everyone!” Lemoness shouts. “It probably thinks that we’re easy targets because so many of us have daunting New Year’s Resolutions, but it’s about to discover that Habiticans know how to stick to their goals!”

AnnDeLune raises her staff. “Let’s tackle our tasks and take this monster down!”", + "questDysheartenerText": "O Descoraçador", + "questDysheartenerNotes": "O sol nasce no Dia dos Namorados quando um impacto violento percorre os céus. Uma labareda com uma gritante luz rosa perfura os edifícios e tijolos desmoronam enquanto uma fenda profunda atravessa a rua principal da Cidade dos Hábitos. Um grito sobrenatural ergue-se aos céus destruindo janelas, enquanto uma silhueta pesada rasteja pelas terras abaladas.

Mandíbulas estalam, uma carapaça brilha; pernas e mais pernas espalham-se no ar. A multidão grita enquanto o insetoide se vira, revelando ser ninguém menos que a mais cruel das criaturas: o temido Descoraçador. Ele urra em preparação e ataca em frente, faminto em consumir as esperanças dos Habiticanos que trabalham duro. A cada esfregão áspero de suas pernas dianteiras espinhosas, você sente um quê de desespero apertando em seu peito.

\"Acalmem-se, pessoal!\" Lemoness grita. \"Provavelmente acha que nós somos alvos fáceis, porque muitos de nós andamos desmotivados com as Promessas de Ano Novo, mas vamos mostrar que os Habiticanos sabem focar em suas tarefas!\"

AnnDeLune ergue seu cajado. \"Vamos com tudo em nossas tarefas e por um fim a esse monstro!\"", "questDysheartenerCompletion": "The Dysheartener is DEFEATED!

Together, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”

Glowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.

The crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.

Our newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.

Beffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”

Crooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", - "questDysheartenerBossRageTitle": "Shattering Heartbreak", - "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", - "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", - "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", - "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", - "questDysheartenerDropHippogriffMount": "Hopeful Hippogriff (Mount)", - "dysheartenerArtCredit": "Artwork by @AnnDeLune" + "questDysheartenerBossRageTitle": "Ataque do Coração Partido", + "questDysheartenerBossRageDescription": "A barra do Ataque de Fúria enche quando os Habiticanos não fazem suas tarefas diárias. Caso encha, o Descoraçador libera seu Ataque do Coração Partido em um dos comerciantes de Habitica, então lembre-se de completar suas tarefas!", + "questDysheartenerBossRageSeasonal": "O Descoraçador usou o Ataque do Coração Partido!\n\nEssa não! Depois de devorar nossas tarefas diárias incompletas, o Descoraçador foi capaz de usar o seu Ataque do Coração Partido. Com um grito estridente, ele avança suas pernas espinhosas sobre o pavilhão que abriga a Loja Sazonal! A rajada sucessiva de magia destroça a madeira e a Feiticeira Sazonal está arrasada com o que vê.\n\nRápido, vamos manter nossas tarefas diárias para que o monstro não ataque outra vez!", + "seasonalShopRageStrikeHeader": "A Loja Sazonal foi Atacada!", + "seasonalShopRageStrikeLead": "Leslie está de coração partido!", + "seasonalShopRageStrikeRecap": "No dia 21 de Fevereiro, nossa querida Leslie a Feiticeira Sazonal foi devastada quando o Descoraçador reduziu a Loja Sazonal aos pedaços. Depressa, força nas tarefas para derrotar o monstro e ajudar na reconstrução!", + "questDysheartenerBossRageMarket": "O Descoraçador usa o Ataque do Coração Partido!\n\nSocorro! Depois de devorar nossas tarefas diárias incompletas, o Descoraçador repetiu o Ataque do Coração Partido, esmagando as paredes e piso do Mercado! Com o desmoronar das pedras, Alex o Mercador chora sobre sua mercadoria destruída, abalado com a destruição.\n\nNão podemos deixar isso acontecer outra vez! Lembre-se de fazer todas suas tarefas diárias para impedir o Descoraçador de usar seu ataque final.", + "questDysheartenerBossRageQuests": "O Descoraçador usa ATAQUE DO CORAÇÃO PARTIDO! \n\nAaaah! Deixamos de fazer as tarefas diárias outra vez, e o Descoraçador reuniu a energia para um ataque final contra nossos queridos comerciantes. A região ao redor de Ian, o Mestre das Missões, foi varrida pelo Ataque do Coração Partido e Ian foi abalado pela visão horrível. Estamos tão perto de derrotar esse monstro.... Vamos! Não desista agora!", + "questDysheartenerDropHippogriffPet": "Hipogrifo Otimista (mascote)", + "questDysheartenerDropHippogriffMount": "Hipogrifo Otimista (montaria)", + "dysheartenerArtCredit": "Arte por @AnnDeLune" } \ No newline at end of file diff --git a/website/common/locales/pt_BR/subscriber.json b/website/common/locales/pt_BR/subscriber.json index 2526a0ed3a..57bb89a278 100644 --- a/website/common/locales/pt_BR/subscriber.json +++ b/website/common/locales/pt_BR/subscriber.json @@ -120,7 +120,7 @@ "mysterySet201604": "Conjunto \"Guerreiro de Folha\"", "mysterySet201605": "Conjunto \"Bardo Marcial\"", "mysterySet201606": "Conjunto \"Túnica de Selkie\"", - "mysterySet201607": "Conjunto \"Ladino das Profundezas\"", + "mysterySet201607": "Conjunto \"Gatuno das Profundezas\"", "mysterySet201608": "Conjunto \"Tempestade\"", "mysterySet201609": "Conjunto \"Fantasia de Vaca\"", "mysterySet201610": "Conjunto do \"Fogo Espectral\"", @@ -139,6 +139,7 @@ "mysterySet201711": "Conjunto do (a) Cavaleiro(a) do Carpete", "mysterySet201712": "Conjunto \"Velamante\"", "mysterySet201801": "Conjunto Duende de Neve", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Conjunto \"Revolução Industrial Padrão\"", "mysterySet301405": "Conjunto \"Acessórios Revolução Industrial\"", "mysterySet301703": "Conjunto \"Revolução Industrial Pavão\"", diff --git a/website/common/locales/pt_BR/tasks.json b/website/common/locales/pt_BR/tasks.json index 7f5af44e03..e701103f60 100644 --- a/website/common/locales/pt_BR/tasks.json +++ b/website/common/locales/pt_BR/tasks.json @@ -66,7 +66,7 @@ "repeatWeek": "Em Certos Dias da Semana", "day": "Dia", "days": "Dias", - "restoreStreak": "Adjust Streak", + "restoreStreak": "Ajustar combo", "resetStreak": "Reinicia Combo", "todo": "Afazer", "todos": "Afazeres", @@ -174,7 +174,7 @@ "taskApprovalHasBeenRequested": "Aprovação foi solicitada", "taskApprovalWasNotRequested": "Only a task waiting for approval can be marked as needing more work", "approvals": "Aprovações", - "approvalRequired": "Needs Approval", + "approvalRequired": "Requer Aprovação", "repeatZero": "Diárias nunca expiram", "repeatType": "Intervalo de Repetição", "repeatTypeHelpTitle": "Qual é o tipo desta recorrência?", diff --git a/website/common/locales/ro/character.json b/website/common/locales/ro/character.json index 2a6b693790..d68ac431f2 100644 --- a/website/common/locales/ro/character.json +++ b/website/common/locales/ro/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Bonus de Clasă", "battleGear": "Echipament de luptă", + "gear": "Gear", "battleGearText": "Acesta este echipamentul pe care îl porți în bătălie; are efect asupra numerelor, atunci când interacționezi cu sarcinile tale.", "autoEquipBattleGear": "Echipeaza automat noile echipamente", "costume": "Costum", diff --git a/website/common/locales/ro/faq.json b/website/common/locales/ro/faq.json index 250afa3abb..750ae21ea7 100644 --- a/website/common/locales/ro/faq.json +++ b/website/common/locales/ro/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Cum joc Habitica cu prietenii mei?", "iosFaqAnswer5": "Cea mai bună metodă este să-i inviți într-o ceată cu tine! Cetele pot merge în expediții, lupta cu monștri și pot face vrăji pentru a se susține reciproc. Mergi la Meniu > Ceată și clic pe „Creează o nouă ceată” dacă nu ai deja o ceată activă. Apoi apasă pe lista de membri și apasă pe „Invită” în colțul din dreapta sus pentru a invita prieteni prin introducerea ID-urilor lor de utilizatori (un șir de numere și litere pe care le găsești în Setări > Detalii cont în aplicație și Setări > API pe site-ul web). Pe site poți invita prieteni și prin intermediul e-mailului, o funcție pe care o vom adăuga și aplicației într-o actualizare viitoare.\n\nPe site, tu și prietenii tăi vă puteți alătura și breslelor, care sunt camere de chat publice. Breslele vor fi adăugate aplicației într-o actualizare viitoare!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Cum pot obține un companion sau bidiviu (mount)?", "iosFaqAnswer6": "La nivelul 3 vei descuia sistemul de drop. De fiecare dată când completezi o sarcină ai o șansă să-ți pice un ou, o licoare de eclozat sau mâncare. Acestea sunt stocate în Meniu > Articole.\n\n Pentru a ecloza un companion, ai nevoie de un ou și o licoare de eclozat. Apasă pe ou pentru a stabili specia pe care vrei să o eclozezi și selectează „Eclozează oul”. Apoi alege licoarea de eclozat pentru a stabili culoarea acestuia. mergi la Meniu > Compaioni pentru a adăuga noul companion avatarului tău printr-un clic pe acesta.\n\n Poți să și crești companionii în bidivii (mounts) dacă îi hrănești - Meniu > Companioni, apoi selectează „Hrănește companion”! Va trebui să hrănești un companion de multe ori înainte ca acesta să devină bidiviu, dar dacă afli care e mâncarea sa preferată, acesta va crește mai repede. Poți afla prin încercarea repetată sau [poți vedea spoilerele aici](http://habitica.wikia.com/wiki/Food#Food_Preferences). Odată ce ai un bidiviu, mergi la Meniu > Bidivii și apasă pe acesta pentru a-l adăuga avatarului.\n\n Poți obține ouă pentru companioni de expediție prin completarea anumitor expediții. (Vezi mai jos pentru a afla mai multe despre expediții.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/ro/gear.json b/website/common/locales/ro/gear.json index a2ed5575c2..05356bcd22 100644 --- a/website/common/locales/ro/gear.json +++ b/website/common/locales/ro/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Basic Top Hat", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/ro/generic.json b/website/common/locales/ro/generic.json index d1667db918..496f8a4579 100644 --- a/website/common/locales/ro/generic.json +++ b/website/common/locales/ro/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/ro/groups.json b/website/common/locales/ro/groups.json index 2079d35a15..6a8de40ce7 100644 --- a/website/common/locales/ro/groups.json +++ b/website/common/locales/ro/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Party On", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "User with id \"<%= userId %>\" not found.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/ro/limited.json b/website/common/locales/ro/limited.json index ecd6f2d83c..e8f5605d14 100644 --- a/website/common/locales/ro/limited.json +++ b/website/common/locales/ro/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until October 31... I guess you should to stock up now, or you'll have to wait... and wait... and wait... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Rogue)", diff --git a/website/common/locales/ro/questscontent.json b/website/common/locales/ro/questscontent.json index 90492c040d..0b0cb79fb6 100644 --- a/website/common/locales/ro/questscontent.json +++ b/website/common/locales/ro/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/ro/subscriber.json b/website/common/locales/ro/subscriber.json index 2c79b163a1..5316d4f0b7 100644 --- a/website/common/locales/ro/subscriber.json +++ b/website/common/locales/ro/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/ru/challenge.json b/website/common/locales/ru/challenge.json index 463ae1c801..41d4cb15c7 100644 --- a/website/common/locales/ru/challenge.json +++ b/website/common/locales/ru/challenge.json @@ -17,7 +17,7 @@ "toCreate": "для создания нового.", "selectWinner": "Выбрать победителя и закрыть испытание:", "deleteOrSelect": "Удалить или выбрать победителя", - "endChallenge": "Завершить испытание", + "endChallenge": "Завершить", "challengeDiscription": "Эти задания входят в испытание. После присоединения к испытанию они будут добавлены к списку ваших заданий. Цвет размещенных ниже заданий испытания будет меняться, станут доступны графики, показывающие общие достижения группы.", "hows": "Как идут дела?", "filter": "Фильтр", diff --git a/website/common/locales/ru/character.json b/website/common/locales/ru/character.json index 2cc7d28a60..a8f7fd258f 100644 --- a/website/common/locales/ru/character.json +++ b/website/common/locales/ru/character.json @@ -60,18 +60,19 @@ "winteryColors": "Зимние цвета", "equipment": "Снаряжение", "equipmentBonus": "Снаряжение", - "equipmentBonusText": "Stat bonuses provided by your equipped battle gear. See the Equipment tab under Inventory to select your battle gear.", - "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", + "equipmentBonusText": "Дополнительные очки характеристик от надетой боевой экипировки. Выбор экипировки доступен на вкладке Снаряжение на странице инвентаря.", + "classBonusText": "Ваш класс (воин, если вы еще не открыли систему классов и не выбрали другой класс) использует свою собственную экипировку более эффективно, чем экипировку других классов. Надетая экипировка текущего класса дает 50% бонус ко всем характеристикам.", "classEquipBonus": "Бонус класса", "battleGear": "Боевая экипировка", + "gear": "Gear", "battleGearText": "Это ваша экипировка для сражений, она влияет на игровые результаты от взаимодействия с задачами.", "autoEquipBattleGear": "Авто-надевание нового снаряжения", "costume": "Костюм", "costumeText": "Если внешний вид какой-либо экипировки вам нравится больше, чем надетой сейчас, можете отметить «Использовать костюм» для того, чтобы визуально предстать в желаемом костюме поверх боевой экипировки.", "useCostume": "Использовать костюм", - "useCostumeInfo1": "Click \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can equip for the best Stats on the left, and dress up your avatar with your equipment on the right.", - "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your Stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", - "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", + "useCostumeInfo1": "Нажмите «Использовать костюм», чтобы надеть на персонажа вещи, не влияя на характеристики текущей экипировки. Это позволит вам надеть наиболее эффективную экипировку на левой половине экрана и отдельно настроить внешний вид аватара на правой половине экрана.", + "useCostumeInfo2": "Нажав \"Использовать Костюм\" на вашем аватаре не будет экипировки, но не бойтесь! Если вы посмотрите налево вы увидите, что ваша боевая экипировка еще действует на характеристики персонажа. Все что вы экипируете на правой половине экрана не повлияет на ваши характеристики, но позволит вашему аватару отлично выглядеть. Вы можете пробовать различные комбинации: смешивать экипировку из различных наборов а также выбирать питомца, скакуна и фон.

Есть вопросы? Посмотрите страницу костюмов на вики. Нашли отличное сочетание? Продемонстрируйте его в Гильдии карнавальных костюмов или похвастайтесь им в Таверне!", + "costumePopoverText": "Выбор этой опции позволяет надеть на аватар вашего персонажа любые, понравившиеся вам вещи, не влияя на характеристики боевой экипировки.", "autoEquipPopoverText": "Выберите этот вариант для самонадевания новой экипировки, как только вы её приобретаете.", "costumeDisabled": "Вы отключили функцию \"костюм\"", "gearAchievement": "Вы заработали значок «Превосходная экипировка» за максимальное усовершенствование комплекта экипировки для вашего класса! Вы собрали полные наборы для следующих классов:", @@ -91,18 +92,18 @@ "xp": "опыта", "health": "Здоровье", "allocateStr": "Очки, распределенные на силу:", - "allocateStrPop": "Add a Point to Strength", + "allocateStrPop": "Добавить очко к силе", "allocateCon": "Очки, распределенные на телосложение:", - "allocateConPop": "Add a Point to Constitution", + "allocateConPop": "Добавить очко к телосложению", "allocatePer": "Очки, распределенные на восприятие:", - "allocatePerPop": "Add a Point to Perception", + "allocatePerPop": "Добавить очко к восприятию", "allocateInt": "Очки, распределенные на интеллект:", - "allocateIntPop": "Add a Point to Intelligence", - "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", + "allocateIntPop": "Добавить очко к интеллекту", + "noMoreAllocate": "Теперь, после достижения 100-го уровня, вы больше не будете получать Очки Характеристик. Вы можете продолжить повышать свой уровень или же начать новое приключение с первого уровня, воспользовавшись Шаром возрождения, доступным бесплатно на Рынке.", "stats": "Характеристики", "achievs": "Достижения", "strength": "Сила", - "strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.", + "strText": "Сила увеличивает шанс случайных «критических ударов» и количество получаемого золота, опыта и вещей за выполненные задачи. Она также помогает наносить больший урон монстрам-боссам.", "constitution": "Телосложение", "conText": "Телосложение уменьшает урон получаемый от плохих привычек и пропущенных ежедневных заданий.", "perception": "Восприятие", @@ -110,12 +111,12 @@ "intelligence": "Интеллект", "intText": "Интеллект увеличивает получаемый опыт, а также, после открытия классов, определяет максимальный уровень маны, используемой для применения навыков класса.", "levelBonus": "Бонус за уровень", - "levelBonusText": "Each Stat gets a bonus equal to half of (your Level minus 1).", + "levelBonusText": "Каждая характеристика получает дополнительные очки, равные половине от (ваш уровень минус 1).", "allocatedPoints": "Распределенные очки", - "allocatedPointsText": "Stat Points you've earned and assigned. Assign Points using the Character Build column.", + "allocatedPointsText": "Заработанные и распределенные вами очки характеристик. Распределяйте очки в колонке «Развитие персонажа».", "allocated": "Распределено очков", "buffs": "Бафы", - "buffsText": "Temporary Stat bonuses from abilities and achievements. These wear off at the end of your day. The abilities you've unlocked appear in the Rewards list of your Tasks page.", + "buffsText": "Временные дополнительные очки характеристик, получаемые благодаря навыкам и достижениям. Действуют до конца дня. Открытые навыки появляются в списке наград на странице задач.", "characterBuild": "Развитие персонажа", "class": "Класс", "experience": "Опыт", @@ -124,24 +125,24 @@ "rogue": "Разбойник", "mage": "Маг", "wizard": "Маг", - "mystery": "Таинственный", + "mystery": "Таинственные предметы", "changeClass": "Сменить класс, перераспределить очки навыков", "lvl10ChangeClass": "Для того чтобы изменить класс, вы должны быть, как минимум, на уровне 10.", "changeClassConfirmCost": "Вы уверены, что хотите изменить ваш класс и заплатить за это 3 самоцвета?", "invalidClass": "Неверный класс. Пожалуйста, выберите 'warrior', 'rogue', 'wizard' или 'healer'.", - "levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.", - "unallocated": "Unallocated Stat Points", - "haveUnallocated": "You have <%= points %> unallocated Stat Point(s)", + "levelPopover": "Каждый уровень приносит вам одно очко, которое можно направить на улучшение характеристик по вашему выбору. Это можно сделать вручную, а можно позволить игре решать за вас, выбрав один из вариантов автоматического распределения.", + "unallocated": "Нерастределенные очки характеристик", + "haveUnallocated": "Вы не распределили <%= points %> очки характеристик", "autoAllocation": "Автоматическое распределение", - "autoAllocationPop": "Places Points into Stats according to your preferences, when you level up.", - "evenAllocation": "Distribute Stat Points evenly", - "evenAllocationPop": "Assigns the same number of Points to each Stat.", - "classAllocation": "Distribute Points based on Class", - "classAllocationPop": "Assigns more Points to the Stats important to your Class.", - "taskAllocation": "Distribute Points based on task activity", - "taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.", + "autoAllocationPop": "При получении нового уровня очки характеристик раcпределяются в соответствии с выбранными предпочтениями.", + "evenAllocation": "Распределять очки характеристик равномерно", + "evenAllocationPop": "Распределить очки поровну между всеми характеристиками.", + "classAllocation": "Распределять очки на основе класса", + "classAllocationPop": "Направлять больше очков на улучшение характеристик, важных для вашего класса.", + "taskAllocation": "Распределять очки на основе вида заданий", + "taskAllocationPop": "Распределить очки на Силу, Интеллект, Телосложение и Восприятие в соответствии с выполняемыми задачами.", "distributePoints": "Распределить свободные очки", - "distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.", + "distributePointsPop": "Направляет все нераспределенные очки на улучшение характеристик в соответствии с выбранной схемой распределения.", "warriorText": "Воины чаще и лучше наносят «критические удары», которые случайным образом увеличивают награду за выполнение заданий: золото, опыт и шанс выпадения предметов. Кроме того, воины наносят значительный урон монстрам-боссам. Играйте за воина, если для вас существенным стимулом станет возможность сорвать джекпот, неожиданно получив больше наград, или осыпать сильнейшими ударами босса в квестах!", "wizardText": "Маги довольно быстро учатся и приобретают опыт и уровни быстрее других классов. Они также получают много Маны для использования специальных способностей. Играйте за Мага, если вам нравятся тактические игровые аспекты страны Habitica, или если вы сильно мотивированы повышением уровня вашего персонажа и получением расширенных функций!", "mageText": "Маги быстро учатся, набирают опыт и уровни быстрее, чем другие классы. Они также получают много маны для использования специальных способностей. Играйте за мага, если вы любите тактический подход игры в Habitica, или если вас сильно мотивирует повышение уровня и разблокировка расширенных возможностей.", @@ -161,7 +162,7 @@ "respawn": "Возродиться!", "youDied": "Вы погибли!", "dieText": "Вы потеряли один уровень, все ваше золото и случайный предмет снаряжения. Поднимайтесь и попробуйте еще раз! Обуздайте отрицательные привычки, будьте усердны в выполнении ежедневных заданий, и держитесь от смерти на почтительном расстоянии, пользуясь эликсиром здоровья, если почувствуете слабость!", - "sureReset": "Are you sure? This will reset your character's class and allocated Stat Points (you'll get them all back to re-allocate), and costs 3 Gems.", + "sureReset": "Вы уверены? Это действие сбросит класс и очки характеристик вашего персонажа (количество очков сохранится, вы сможете их перераспределить). Цена — 3 самоцвета.", "purchaseFor": "Купить за <%= cost %> самоцветов?", "purchaseForHourglasses": "Купить за <%= cost %> песочных часов?", "notEnoughMana": "Недостаточно маны.", @@ -197,11 +198,11 @@ "con": "ТЕЛ", "per": "ВОС", "int": "ИНТ", - "showQuickAllocation": "Show Stat Allocation", - "hideQuickAllocation": "Hide Stat Allocation", - "quickAllocationLevelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options found in User Icon > Stats.", - "invalidAttribute": "\"<%= attr %>\" is not a valid Stat.", - "notEnoughAttrPoints": "You don't have enough Stat Points.", + "showQuickAllocation": "Показать распределение характеристик", + "hideQuickAllocation": "Спрятать распределение характеристик", + "quickAllocationLevelPopover": "Каждый уровень приносит вам одно очко для распределения на характеристики по вашему выбору. Вы можете сделать это вручную или позволить игре решать для вас, используя автоматическое распределение, находящееся в Пользователь > Характеристики.", + "invalidAttribute": "\"<%= attr %>\" - недопустимая характеристика. ", + "notEnoughAttrPoints": "У вас недостаточно очков характеристик.", "style": "Стиль", "facialhair": "Лицо", "photo": "Фото", diff --git a/website/common/locales/ru/content.json b/website/common/locales/ru/content.json index b9a9d4bbc5..66b6d915fc 100644 --- a/website/common/locales/ru/content.json +++ b/website/common/locales/ru/content.json @@ -8,7 +8,7 @@ "dropEggWolfText": "Волк", "dropEggWolfMountText": "Волк", "dropEggWolfAdjective": "верный", - "dropEggTigerCubText": "Тигренок", + "dropEggTigerCubText": "Тигрёнок", "dropEggTigerCubMountText": "Тигр", "dropEggTigerCubAdjective": "свирепый", "dropEggPandaCubText": "Детеныш панды", @@ -123,7 +123,7 @@ "questEggAxolotlMountText": "Аксолотль", "questEggAxolotlAdjective": "маленький", "questEggTurtleText": "Морская черепаха", - "questEggTurtleMountText": "Гигантская Морская Черепа", + "questEggTurtleMountText": "Гигантская морская черепаха", "questEggTurtleAdjective": "мирная", "questEggArmadilloText": "Броненосец", "questEggArmadilloMountText": "Броненосец", @@ -174,7 +174,7 @@ "hatchingPotionRed": "Красный", "hatchingPotionShade": "Сумрачный", "hatchingPotionSkeleton": "Костяной", - "hatchingPotionZombie": "Неживой", + "hatchingPotionZombie": "Зомби", "hatchingPotionCottonCandyPink": "Розовый сахарный", "hatchingPotionCottonCandyBlue": "Синий сахарный", "hatchingPotionGolden": "Золотой", @@ -194,97 +194,97 @@ "hatchingPotionNotes": "Полейте его на яйцо и из него вылупится <%= potText(locale) %> питомец.", "premiumPotionAddlNotes": "Несовместим с яйцами квестовых питомцев.", "foodMeat": "Мясо", - "foodMeatThe": "the Meat", - "foodMeatA": "Meat", + "foodMeatThe": "Мясная пища", + "foodMeatA": "Мясо", "foodMilk": "Молоко", - "foodMilkThe": "the Milk", - "foodMilkA": "Milk", + "foodMilkThe": "Теплое молоко", + "foodMilkA": "Молоко", "foodPotatoe": "Картофель", - "foodPotatoeThe": "the Potato", - "foodPotatoeA": "a Potato", + "foodPotatoeThe": "Картофель", + "foodPotatoeA": "Картошка", "foodStrawberry": "Земляника", - "foodStrawberryThe": "the Strawberry", - "foodStrawberryA": "a Strawberry", + "foodStrawberryThe": "Клубника", + "foodStrawberryA": "Земляника", "foodChocolate": "Шоколад", - "foodChocolateThe": "the Chocolate", - "foodChocolateA": "Chocolate", + "foodChocolateThe": "Шоколад", + "foodChocolateA": "Плитка шоколада", "foodFish": "Рыба", - "foodFishThe": "the Fish", - "foodFishA": "a Fish", + "foodFishThe": "Селёдка", + "foodFishA": "Рыбу", "foodRottenMeat": "Тухлое мясо", - "foodRottenMeatThe": "the Rotten Meat", - "foodRottenMeatA": "Rotten Meat", + "foodRottenMeatThe": "Прелое мясо", + "foodRottenMeatA": "Тухлое мясо", "foodCottonCandyPink": "Розовая сахарная вата", - "foodCottonCandyPinkThe": "the Pink Cotton Candy", - "foodCottonCandyPinkA": "Pink Cotton Candy", + "foodCottonCandyPinkThe": "Розовая сахарная вата", + "foodCottonCandyPinkA": "Розовая сахарная вата", "foodCottonCandyBlue": "Синяя сладкая вата", - "foodCottonCandyBlueThe": "the Blue Cotton Candy", - "foodCottonCandyBlueA": "Blue Cotton Candy", + "foodCottonCandyBlueThe": "Синяя сладкая вата", + "foodCottonCandyBlueA": "Синяя сладкая вата", "foodHoney": "Мёд", - "foodHoneyThe": "the Honey", - "foodHoneyA": "Honey", + "foodHoneyThe": "Пчелиный мед", + "foodHoneyA": "Мёд", "foodCakeSkeleton": "Костяной торт", - "foodCakeSkeletonThe": "the Bare Bones Cake", - "foodCakeSkeletonA": "a Bare Bones Cake", + "foodCakeSkeletonThe": "Костистый торт", + "foodCakeSkeletonA": "Торт из костей", "foodCakeBase": "Обычный торт", - "foodCakeBaseThe": "the Basic Cake", - "foodCakeBaseA": "a Basic Cake", + "foodCakeBaseThe": "Бисквитный торт", + "foodCakeBaseA": "Обычный торт", "foodCakeCottonCandyBlue": "Синий карамельный торт", - "foodCakeCottonCandyBlueThe": "the Candy Blue Cake", - "foodCakeCottonCandyBlueA": "a Candy Blue Cake", + "foodCakeCottonCandyBlueThe": "Синий карамельный торт", + "foodCakeCottonCandyBlueA": "Синий карамельный торт", "foodCakeCottonCandyPink": "Розовый карамельный торт", - "foodCakeCottonCandyPinkThe": "the Candy Pink Cake", - "foodCakeCottonCandyPinkA": "a Candy Pink Cake", + "foodCakeCottonCandyPinkThe": "Розовый карамельный торт", + "foodCakeCottonCandyPinkA": "Розовый карамельный торт", "foodCakeShade": "Шоколадный торт", - "foodCakeShadeThe": "the Chocolate Cake", - "foodCakeShadeA": "a Chocolate Cake", + "foodCakeShadeThe": "Шоколадный торт", + "foodCakeShadeA": "Шоколадный торт", "foodCakeWhite": "Кремовый торт", - "foodCakeWhiteThe": "the Cream Cake", - "foodCakeWhiteA": "a Cream Cake", + "foodCakeWhiteThe": "Кремовый торт", + "foodCakeWhiteA": "Кремовый торт", "foodCakeGolden": "Медовый торт", - "foodCakeGoldenThe": "the Honey Cake", - "foodCakeGoldenA": "a Honey Cake", + "foodCakeGoldenThe": "Медовый торт", + "foodCakeGoldenA": "Медовый торт", "foodCakeZombie": "Тухлый торт", - "foodCakeZombieThe": "the Rotten Cake", - "foodCakeZombieA": "a Rotten Cake", + "foodCakeZombieThe": "Прелый торт", + "foodCakeZombieA": "Прелый торт", "foodCakeDesert": "Песочный торт", - "foodCakeDesertThe": "the Sand Cake", - "foodCakeDesertA": "a Sand Cake", + "foodCakeDesertThe": "Песочный торт", + "foodCakeDesertA": "Песочный торт", "foodCakeRed": "Земляничный торт", - "foodCakeRedThe": "the Strawberry Cake", - "foodCakeRedA": "a Strawberry Cake", + "foodCakeRedThe": "Клубничный торт", + "foodCakeRedA": "Земляничный торт", "foodCandySkeleton": "Костяная конфета", - "foodCandySkeletonThe": "the Bare Bones Candy", - "foodCandySkeletonA": "Bare Bones Candy", + "foodCandySkeletonThe": "Костистая конфета", + "foodCandySkeletonA": "Костяная конфета", "foodCandyBase": "Обычная конфета", - "foodCandyBaseThe": "the Basic Candy", - "foodCandyBaseA": "Basic Candy", + "foodCandyBaseThe": "Обычная конфета", + "foodCandyBaseA": "Обычная конфета", "foodCandyCottonCandyBlue": "Голубая кислая конфета", - "foodCandyCottonCandyBlueThe": "the Sour Blue Candy", - "foodCandyCottonCandyBlueA": "Sour Blue Candy", + "foodCandyCottonCandyBlueThe": "Голубая кислая конфета", + "foodCandyCottonCandyBlueA": "Голубая кислая конфета", "foodCandyCottonCandyPink": "Розовая кислая конфета", - "foodCandyCottonCandyPinkThe": "the Sour Pink Candy", - "foodCandyCottonCandyPinkA": "Sour Pink Candy", + "foodCandyCottonCandyPinkThe": "Розовая кислая конфета", + "foodCandyCottonCandyPinkA": "Розовая кислая конфета", "foodCandyShade": "Шоколадная конфета", - "foodCandyShadeThe": "the Chocolate Candy", - "foodCandyShadeA": "Chocolate Candy", + "foodCandyShadeThe": "Конфета с шоколадом", + "foodCandyShadeA": "Шоколадная конфета", "foodCandyWhite": "Ванильная конфета", - "foodCandyWhiteThe": "the Vanilla Candy", - "foodCandyWhiteA": "Vanilla Candy", + "foodCandyWhiteThe": "Конфета с ванилью", + "foodCandyWhiteA": "Ванильная конфета", "foodCandyGolden": "Медовая конфета", - "foodCandyGoldenThe": "the Honey Candy", - "foodCandyGoldenA": "Honey Candy", + "foodCandyGoldenThe": "Конфета с мёдом", + "foodCandyGoldenA": "Медовая конфета", "foodCandyZombie": "Тухлая конфета", - "foodCandyZombieThe": "the Rotten Candy", - "foodCandyZombieA": "Rotten Candy", + "foodCandyZombieThe": "Протухшая конфета", + "foodCandyZombieA": "Тухлая конфета", "foodCandyDesert": "Песочная конфета", - "foodCandyDesertThe": "the Sand Candy", - "foodCandyDesertA": "Sand Candy", + "foodCandyDesertThe": "Песочная конфета", + "foodCandyDesertA": "Песочная конфета", "foodCandyRed": "Коричная конфета", - "foodCandyRedThe": "the Cinnamon Candy", - "foodCandyRedA": "Cinnamon Candy", + "foodCandyRedThe": "Коричная конфета", + "foodCandyRedA": "Коричная конфета", "foodSaddleText": "Седло", "foodSaddleNotes": "Моментально делает одного из питомцев скакуном.", "foodSaddleSellWarningNote": "Эй! Это довольно полезная вещь! Знаете ли вы, как пользоваться седлом?", - "foodNotes": "Кормите этим питомца, и он может вырасти выносливым скакуном." + "foodNotes": "Кормите этим питомца, и он сможет вырасти выносливым скакуном." } \ No newline at end of file diff --git a/website/common/locales/ru/faq.json b/website/common/locales/ru/faq.json index 8b457be6b7..2e39575bce 100644 --- a/website/common/locales/ru/faq.json +++ b/website/common/locales/ru/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Существует несколько причин, из-за которых вы можете получать урон. Во-первых, ночью вам наносят урон невыполненные ежедневные задания. Во-вторых, если вы нажимаете на плохую привычку, она наносит вам урон. И, наконец, если вы сражаетесь против босса в команде, и один из ваших сопартийцев не выполнил все свои ежедневные задания, босс вас атакует.\n\nОсновным способом вылечиться является повышение уровня, что влечёт полное восстановление шкалы здоровья. Также можно купить за золото эликсир здоровья, который находится в столбце наград. Кроме того, начиная с 10 уровня, вы можете выбрать игру за Целителя, и тогда вы получите восстанавливающие здоровье навыки. Если у вас в команде есть целитель, он также может вас излечить. Узнайте больше, нажав кнопку \"Команда\" на панели навигации.", "faqQuestion5": "Как играть вместе с друзьями?", "iosFaqAnswer5": "Лучший способ это пригласить их к себе в Команду! Команды могут выполнять квесты, биться с монстрами и накладывать заклинания, чтобы поддерживать друг друга. Нажмите Меню > Команда и кликните \"Создать новую Команду\" если у вас её ещё нет. Затем нажмите на список членов, и нажмите Пригласить в верхнем правом углу, чтобы пригласить своих друзей, введя их User ID (строка букв и цифр, которую можно найти под Настройками > Аккаунт в мобильном приложении и в Настройках > API на сайте). На сайте, вы также можете пригласить друзей через почту, эту функцию мы добавим в мобильное приложение в будущих обновлениях.\n\nНа сайте, вы и ваши друзья также можете записаться в Гильдии, которые являются открытыми чатрумами. Гильдии будут добавлены в мобильное приложение в будущем обновлении!", - "androidFaqAnswer5": "Лучший способ — пригласить их в команду с вами! Команды могут участвовать в квестах, сражаться с монстрами и накладывать заклинания для поддержки друг друга. Также вы вместе можете вступать в гильдии. Гильдии — это комнаты чата, где участники сконцентрированы на общих интересах или на преследовании общей цели. Вы можете вступать в неограниченное количество гильдий, но состоять только в одной команде.\n\nБолее подробную информацию вы можете узнать на страницах вики, содержащих информацию о [командах](http://ru.habitica.wikia.com/wiki/Команда) и [гильдиях](http://ru.habitica.wikia.com/wiki/Гильдии).", - "webFaqAnswer5": "Лучший способ — пригласить их в команду с вами, с помощью ссылки Команда в панели навигации! Команды могут участвовать в квестах, сражаться с монстрами и накладывать заклинания для поддержки друг друга. Также вы вместе можете вступать в гильдии (ссылка Гильдии в панели навигации). Гильдии — это комнаты чата, где участники сконцентрированы на общих интересах или на преследовании общей цели, могут быть публичными или частными. Вы можете вступать в неограниченное количество гильдий, но состоять только в одной команде. Более подробную информацию вы можете узнать на страницах вики, содержащих информацию о [командах](http://ru.habitrpg.wikia.com/wiki/Команда) и [гильдиях](http://ru.habitrpg.wikia.com/wiki/Гильдии).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Как получить питомца или скакуна?", "iosFaqAnswer6": "На 3 уровне вы откроете систему выпадения трофеев. Каждый раз, когда вы выполняете задание, есть небольшой шанс на то, что вы получите яйцо, инкубацонный эликсир или еду. Всё это будет храниться в Меню > Инвентарь.\n\nЧтобы выходить питомца, вам понадобится яйцо и инкубационный эликсир. Нажмите на яйцо, чтобы выбрать вид питомца, а потом выберите «инкубировать яйцо». Затем выберите инкубационный эликсир, чтобы задать цвет питомца! Перейдите в Меню > Питомцы и нажмите на вашего нового питомца, чтобы поместить его рядом со своим аватаром.\n\nВы также можете выращивать ваших питомцев до скакунов, скармливая им еду в разделе Меню > Питомцы. Нажмите на питомца, затем выберите «покормить питомца»! Вам придётся кормить питомца много раз, прежде чем он станет скакуном, но если вам удастся вычислить его любимую еду, он будет расти быстрее. Можете придерживаться метода проб и ошибок или же сразу узнать, чем кормить питомца здесь: [спойлер](http://ru.habitica.wikia.com/wiki/Еда#.D0.9F.D1.80.D0.B5.D0.B4.D0.BF.D0.BE.D1.87.D1.82.D0.B5.D0.BD.D0.B8.D1.8F_.D0.B2_.D0.B5.D0.B4.D0.B5). Как только у вас появится скакун, вы можете перейти в Меню > Скакуны и нажать на него, чтобы ваш аватар его оседлал.\n\nТакже вы можете получить яйца квестовых питомцев в качестве награды за выполнение определённых квестов. (О квестах читайте ниже.)", "androidFaqAnswer6": "На 3 уровне вы откроете систему выпадения трофеев. Каждый раз, когда вы выполняете задание, есть небольшой шанс на то, что вы получите яйцо, инкубацонный эликсир или еду. Всё это будет храниться в Меню > Инвентарь.\n\nЧтобы выходить питомца, вам понадобится яйцо и инкубационный эликсир. Нажмите на яйцо, чтобы выбрать вид питомца, а потом выберите «инкубировать яйцо». Затем выберите инкубационный эликсир, чтобы задать цвет питомца! Чтобы поместить нового питомца рядом с аватаром, перейдите в Меню > Стойла > Питомцы, выберите на питомца и нажмите \"Использовать\" (ваш аватар при этом не изменится).\n\nВы также можете выращивать ваших питомцев до скакунов, скармливая им еду в разделе Меню > Стойла [> Питомцы]. Нажмите на питомца, затем выберите «покормить питомца»! Вам придётся кормить питомца много раз, прежде чем он станет скакуном, но если вам удастся вычислить его любимую еду, он будет расти быстрее. Можете придерживаться метода проб и ошибок или же сразу узнать, чем кормить питомца здесь: [спойлер](http://ru.habitica.wikia.com/wiki/Еда#.D0.9F.D1.80.D0.B5.D0.B4.D0.BF.D0.BE.D1.87.D1.82.D0.B5.D0.BD.D0.B8.D1.8F_.D0.B2_.D0.B5.D0.B4.D0.B5). Чтобы оседлать скакуна, надо перейти в Меню > Стойла > Скакуны, выбрать скакуна и нажать \"Использовать\"(ваш аватар при этом не изменится).\n\nТакже вы можете получить яйца квестовых питомцев в качестве награды за выполнение определённых квестов. (О квестах читайте ниже.)", diff --git a/website/common/locales/ru/front.json b/website/common/locales/ru/front.json index 64e94f63b0..7bd40d63b9 100644 --- a/website/common/locales/ru/front.json +++ b/website/common/locales/ru/front.json @@ -166,7 +166,7 @@ "pkWebsite": "Сайт", "pkiOS": "iOS", "pkAndroid": "Android", - "privacy": "Политику конфиденциальности", + "privacy": "Политика конфиденциальности", "psst": "Псст", "punishByline": "Покончите с плохими привычками и прокрастинацией, зная о их немедленных последствиях.", "punishHeading1": "Пропустили ежедневное задание?", diff --git a/website/common/locales/ru/gear.json b/website/common/locales/ru/gear.json index 109cae7b6e..187524732e 100644 --- a/website/common/locales/ru/gear.json +++ b/website/common/locales/ru/gear.json @@ -113,7 +113,7 @@ "weaponSpecialTachiText": "Тати", "weaponSpecialTachiNotes": "Этот легкий и изогнутый меч искромсает ваши задания на мелкие кусочки! Увеличивает силу на <%= str %>.", "weaponSpecialAetherCrystalsText": "Эфирные кристаллы", - "weaponSpecialAetherCrystalsNotes": "Эти браслеты и кристаллы когда-то принадлежали пропавшему Мастеру. Увеличивает все характеристики на <%= attrs %>.", + "weaponSpecialAetherCrystalsNotes": "Эти браслеты и кристаллы когда-то принадлежали последней из ордена Мастеров. Увеличивает все характеристики на <%= attrs %>.", "weaponSpecialYetiText": "Копье укротителя Йети", "weaponSpecialYetiNotes": "Это копье позволяет владельцу управлять любым йети. Увеличивает силу на <%= str %>. Ограниченный выпуск зимы 2013-2014.", "weaponSpecialSkiText": "Палка лыжника-ассасина", @@ -612,6 +612,8 @@ "armorMystery201711Notes": "Этот уютный свитер поможет вам согреться, пока вы ездите по небу! Бонусов не даёт. Подарок подписчикам ноября 2017.", "armorMystery201712Text": "Броня свечника", "armorMystery201712Notes": "Тепло и свет от этой магической брони согреют ваше сердце, но никогда не обожгут кожу! Бонусов не даёт. Подарок подписчикам декабря 2017.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Стимпанковский костюм", "armorMystery301404Notes": "Чудной и лихой! Бонусов не дает. Подарок подписчикам февраля 3015.", "armorMystery301703Text": "Павлинье платье в стиле стимпанк", @@ -984,6 +986,8 @@ "headMystery201710Notes": "Этот шлем заставляет вас выглядеть пугающе...но это не принесет никакой пользы для вашего глубинного восприятия! Бонусов не дает. Подарок подписчикам октября 2017.", "headMystery201712Text": "Корона свечника", "headMystery201712Notes": "Эта корона принесет вам свет и тепло даже в самые темные зимние ночи. Бонусов не даёт. Подарок подписчикам декабря 2017.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Модный цилиндр", "headMystery301404Notes": "Модный цилиндр для самых уважаемых господ! Подарок подписчикам января 3015. Бонусов не дает.", "headMystery301405Text": "Обычный цилиндр", @@ -1067,12 +1071,12 @@ "headArmoireAntiProcrastinationHelmText": "Шлем против откладываемых дел", "headArmoireAntiProcrastinationHelmNotes": "Этот могучий стальной шлем поможет вам выиграть битву, чтобы стать более здоровым, счастливым и продуктивным! Увеличивает восприятие на <%= per %>. Зачарованный сундук: Набор против прокрастинации (Предмет 1 из 3).", "headArmoireCandlestickMakerHatText": "Шляпа изготовителя подсвечников", - "headArmoireCandlestickMakerHatNotes": "A jaunty hat makes every job more fun, and candlemaking is no exception! Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Candlestick Maker Set (Item 2 of 3).", - "headArmoireLamplightersTopHatText": "Lamplighter's Top Hat", - "headArmoireLamplightersTopHatNotes": "This jaunty black hat completes your lamp-lighting ensemble! Increases Constitution by <%= con %>.", - "headArmoireCoachDriversHatText": "Coach Driver's Hat", + "headArmoireCandlestickMakerHatNotes": "Яркая шляпа делает каждую работу более увлекательной, и даже свечеизготовление не является исключением! Увеличивает восприятие и интеллект на <%= attrs %> каждый. Зачарованный сундук: Набор Изготовителя подсвечников (Предмет 2 из 3).", + "headArmoireLamplightersTopHatText": "Цилиндр фонарщика", + "headArmoireLamplightersTopHatNotes": "Эта яркая черная шляпа завершает ваш ламповый ансамбль! Увеличивает телосложение на <%= con %>.", + "headArmoireCoachDriversHatText": "Водительская фуражка", "headArmoireCoachDriversHatNotes": "This hat is dressy, but not quite so dressy as a top hat. Make sure you don't lose it as you drive speedily across the land! Increases Intelligence by <%= int %>. Enchanted Armoire: Coach Driver Set (Item 2 of 3).", - "headArmoireCrownOfDiamondsText": "Crown of Diamonds", + "headArmoireCrownOfDiamondsText": "Бриллиантовая корона", "headArmoireCrownOfDiamondsNotes": "This shining crown isn't just a great hat; it will also sharpen your mind! Increases Intelligence by <%= int %>. Enchanted Armoire: King of Diamonds Set (Item 2 of 3).", "offhand": "предмет для защитной руки", "offhandCapitalized": "Защита", @@ -1218,7 +1222,7 @@ "shieldSpecialWinter2018RogueNotes": "Perfect for climbing walls or distracting your foes with sweet, sweet candy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", "shieldSpecialWinter2018WarriorText": "Волшебный подарочный мешок", "shieldSpecialWinter2018WarriorNotes": "Just about any useful thing you need can be found in this sack, if you know the right magic words to whisper. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", - "shieldSpecialWinter2018HealerText": "Mistletoe Bell", + "shieldSpecialWinter2018HealerText": "Омеловый колокол", "shieldSpecialWinter2018HealerNotes": "What's that sound? The sound of warmth and cheer for all to hear! Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "shieldMystery201601Text": "Уничтожитель Решительности", "shieldMystery201601Notes": "Этот клинок может быть использован, чтобы парировать все отвлечения. Бонусов не дает. Подарок подписчикам января 2016.", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Этот прочный щит из расплавленной породы защитит вас от плохих привычек, но не обожжет вам руки. Подарок подписчикам августа 2017.", "shieldMystery201709Text": "Колдовская книга", "shieldMystery201709Notes": "Эта книга будет направлять ваши набеги на колдовство. Бонусов не даёт. Подарок подписчикам сентября 2017.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Часовой Щит", "shieldMystery301405Notes": "С этим монументальным часовым щитом время на вашей стороне! Подарок подписчикам июня 3015. Бонусов не дает.", "shieldMystery301704Text": "Фазаний вентилятор", @@ -1268,9 +1274,9 @@ "shieldArmoireHorseshoeNotes": "Помогите своим копытным скакунам защитить ноги с помощью этой железной подковы. Увеличивает телосложение, восприятие и силу на <%= attrs %>. Зачарованный сундук: Набор Кузнеца (предмет 3 из 3).", "shieldArmoireHandmadeCandlestickText": "Handmade Candlestick", "shieldArmoireHandmadeCandlestickNotes": "Your fine wax wares provide light and warmth to grateful Habiticans! Increases Strength by <%= str %>. Enchanted Armoire: Candlestick Maker Set (Item 3 of 3).", - "shieldArmoireWeaversShuttleText": "Weaver's Shuttle", + "shieldArmoireWeaversShuttleText": "Ткацкий челнок", "shieldArmoireWeaversShuttleNotes": "This tool passes your weft thread through the warp to make cloth! Increases Intelligence by <%= int %> and Perception by <%= per %>. Enchanted Armoire: Weaver Set (Item 3 of 3).", - "shieldArmoireShieldOfDiamondsText": "Crimson Jewel Shield", + "shieldArmoireShieldOfDiamondsText": "Сапфировый щит", "shieldArmoireShieldOfDiamondsNotes": "This radiant shield not only provides protection, it empowers you with endurance! Increases Constitution by <%= con %>. Enchanted Armoire: Independent Item.", "back": "Аксессуар на спину", "backCapitalized": "Аксессуар на спину", @@ -1311,7 +1317,7 @@ "backSpecialSnowdriftVeilText": "Сугробная вуаль", "backSpecialSnowdriftVeilNotes": "Это прозрачное покрывало заставит вас думать, что вас окружает изящный снег! \nБонусов не дает.", "backSpecialAetherCloakText": "Эфирный плащ", - "backSpecialAetherCloakNotes": "Этот плащ когда-то принадлежал самому потерянному Мастеру. Увеличивает восприятие на <%= per %>. ", + "backSpecialAetherCloakNotes": "Этот плащ когда-то принадлежал самой последней из ордена Мастеров. Увеличивает восприятие на <%= per %>. ", "backSpecialTurkeyTailBaseText": "Turkey Tail", "backSpecialTurkeyTailBaseNotes": "Wear your noble Turkey Tail with pride while you celebrate! Confers no benefit.", "body": "Аксессуар на тело", @@ -1462,5 +1468,5 @@ "eyewearMystery301703Notes": "Идеально подходит для причудливого маскарада или для скрытного перемещения через особо хорошо одетую толпу. Бонусов не дает. Март 3017 Элемент подписчика.", "eyewearArmoirePlagueDoctorMaskText": "Маска чумного доктора", "eyewearArmoirePlagueDoctorMaskNotes": "Такие маски носили доктора, боровшиеся с Чумой Прокрастинации. Бонусов не даёт. Зачарованный сундук: Набор Чумного доктора (предмет 2 из 3)", - "twoHandedItem": "Two-handed item." + "twoHandedItem": "Двуручник" } \ No newline at end of file diff --git a/website/common/locales/ru/generic.json b/website/common/locales/ru/generic.json index b46e5228b5..67427b667d 100644 --- a/website/common/locales/ru/generic.json +++ b/website/common/locales/ru/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Тема от Airu", "audioTheme_beatscribeNesTheme": "Тема от Beatscribe's в стиле NES", "audioTheme_arashiTheme": "Тема от Arashi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Тема Lunasol", "audioTheme_spacePenguinTheme": "Тема SpacePenguin's", "audioTheme_maflTheme": "Тема MAFL", diff --git a/website/common/locales/ru/groups.json b/website/common/locales/ru/groups.json index 4e8175812a..b75a11e2b6 100644 --- a/website/common/locales/ru/groups.json +++ b/website/common/locales/ru/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Время вечеринок", "partyUpText": "Вы объединились в команду с другим человеком! Веселитесь сражаясь с монстрами и поддерживая друг друга!", "partyOnText": "Вы присоединились к команде как минимум из четырех человек! Получайте удовольствие от возросшей ответственности, объединяясь с друзьями, чтобы побеждать врагов!", - "largeGroupNote": "Примечание: эта гильдия слишком большая, чтобы поддерживать уведомления! Проверяйте новые сообщения каждый день, чтобы быть уверенным.", "groupIdRequired": "\"groupld\" должен быть действительным UUID.", "groupNotFound": "Группа не найдена, либо вы не имеете доступа.", "groupTypesRequired": "Необходима действительная строка запроса \"type\".", @@ -220,11 +219,11 @@ "inviteMissingUuid": "В приглашении отсутствует ID пользователя", "inviteMustNotBeEmpty": "В приглашении нет текста", "partyMustbePrivate": "Команды должны быть приватными", - "userAlreadyInGroup": "Пользоватеь уже состоит в этой группе.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Вы не можете приглосить себя в группу.", - "userAlreadyInvitedToGroup": "Пользователь уже приглашен в эту группу.", - "userAlreadyPendingInvitation": "Пользователь уже получил приглашение.", - "userAlreadyInAParty": "Пользователь уже в группе.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Пользователь с ID \"<%= userId %>\" не найден.", "userHasNoLocalRegistration": "Пользователь не имеет местной регистрации (имя пользователя, электронная почта, пароль)", "uuidsMustBeAnArray": "Приглашения User ID должны быть массивом.", @@ -404,7 +403,7 @@ "upgrade": "Улучшить", "selectPartyMember": "Выбрать участника команды", "areYouSureDeleteMessage": "Вы уверены, что хотите удалить это сообщение?", - "reverseChat": "Cсообщения в обратном порядке", + "reverseChat": "Cообщения в обратном порядке", "invites": "Приглашения", "details": "Подробности", "participantDesc": "Квест начнётся, когда все члены команды примут или отклонят его. Участвовать в квесте будут только те, кто нажал «Принять», и только они получат награду.", @@ -417,11 +416,13 @@ "managerAdded": "Менеджер успешно добавлен", "managerRemoved": "Менеджер успешно удалён", "leaderChanged": "Лидер был сменен", - "whatIsWorldBoss": "What is a World Boss?", - "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", - "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", - "worldBossBullet1": "Complete tasks to damage the World Boss", - "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", - "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", + "whatIsWorldBoss": "Кто такой Мировой Босс?", + "worldBossDesc": "Мировой босс — особое событие, во время которого сообщество Habitica объединяет усилия, чтобы своими заданиями победить сильнейшего монстра! После победы над мировым боссом все пользователи Habitica получают награду, даже те, кто отдыхал в Таверне или не использовал Habitica во время этого квеста.", + "worldBossLink": "Узнайте больше о предыдущих мировых боссах в википедии Habitica.", + "worldBossBullet1": "Выполняйте задачи, чтобы нанести урон Мировому боссу.", + "worldBossBullet2": "Мировой босс не ударит вас за пропущенные задания, но уровень его ярости поднимется. Когда шкала ярости заполнится, босс атакует одного из владельцев магазинов страны Habitica!", + "worldBossBullet3": "Можно одновременно сражаться с обычным квестовым боссом, вы нанесёте урон обоим.", + "worldBossBullet4": "Регулярно заходите в Таверну, чтобы увидеть уровни здоровья и ярости мирового босса.", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/ru/limited.json b/website/common/locales/ru/limited.json index bc3bc766ac..edb2bf2e19 100644 --- a/website/common/locales/ru/limited.json +++ b/website/common/locales/ru/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "С Осенним Фестивалем!! Не хотели бы вы приобрести редкие предметы? Они будут доступны только до 31 октября!", "seasonalShopWinterText": "С праздником Зимней Страны Чудес!! Не хотели бы вы приобрести редкие предметы? Они будут доступны только до 31 января!", "seasonalShopFallTextBroken": "Ох... Добро пожаловать в Сезонную Лавку... Мы предлагаем товары осеннего Сезонного выпуска, или что-то такое... Всё, что есть здесь, будет ежегодно доступно для покупки на протяжении Осеннего Фестиваля, но мы открыты только до 31 Октября... Я полагаю, вам стоит закупиться сейчас, либо придётся ждать... и ждать... и ждать... *вздох*", + "seasonalShopBrokenText": "Мой павильон!!!!!!! Мои украшения!!!! Ох, Гразочаровыватель уничтожил все :( Скорее, помогите изгнать его в таверне, чтобы я могла начать отстраиваться!", "seasonalShopRebirth": "Если вы ранее купили снаряжение, но сейчас его нет, вы можете повторно приобрести его в блоке Наград. Изначально доступно только снаряжение для вашего текущего класса (Воин по умолчанию), но не тревожьтесь - снаряжение для других классов будет доступно после смены класса.", "candycaneSet": "Карамельная палочка (Маг)", "skiSet": "Лыжник-ассасин (Разбойник)", diff --git a/website/common/locales/ru/messages.json b/website/common/locales/ru/messages.json index be5710003b..f97dc64e3a 100644 --- a/website/common/locales/ru/messages.json +++ b/website/common/locales/ru/messages.json @@ -23,7 +23,7 @@ "messageTwoHandedUnequip": "Удержать <%= twoHandedText %> возможно только двумя руками, поэтому его пришлось положить, когда вы вооружились <%= offHandedText %>.", "messageDropFood": "Вы нашли <%= dropText %>!", "messageDropEgg": "Вы нашли <%= dropText %> в яйце!", - "messageDropPotion": "Вы нашли <%= dropText %>инкубационный эликсир!", + "messageDropPotion": "Вы нашли <%= dropText %> инкубационный эликсир!", "messageDropQuest": "Вы нашли квест!", "messageDropMysteryItem": "Вы открываете коробку и находите <%= dropText %>!", "messageFoundQuest": "Вы нашли квест: «<%= questText %>»!", diff --git a/website/common/locales/ru/npc.json b/website/common/locales/ru/npc.json index ae998accd5..f9b452317e 100644 --- a/website/common/locales/ru/npc.json +++ b/website/common/locales/ru/npc.json @@ -31,8 +31,8 @@ "danielText2": "Будьте осторожны: если ваша команда сражается с Боссом, он все же будет наносить вам урон за Ежедневные задания, пропущенные вашими товарищами! Кроме того, нанесенный вами урон Боссу или найденные предметы не будут зарегистрированы, пока вы не покинете Гостиницу.", "danielTextBroken": "Добро пожаловать в Таверну... Полагаю... Если вам нужен отдых, я размещу вас в Гостинице... При этом пропущенные ежедневные задания не будут наносить урон в конце дня, но вы все же сможете их отмечать... Если у вас хватит на это сил... ", "danielText2Broken": "Ах да... Если вы участвуете в квесте с боссом, он все же будет наносить вам урон за ежедневные задания, не выполненные вашими друзьями по команде... Также, ваши повреждения боссу (или собранные квестовые предметы) не будут засчитаны, пока вы не покинете Гостиницу...", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "Мировое событие", + "worldBossDescription": "Описание мирового босса", "alexander": "Торговец Александр", "welcomeMarket": "Заходите на рынок! Купите редкие яйца и эликсиры! Продайте то, что вам не нужно! Воспользуйтесь полезными услугами! Загляните и ознакомьтесь со всеми предложениями.", "welcomeMarketMobile": "Добро пожаловать на рынок! Купите редкие яйца и эликсиры! Загляните и ознакомьтесь со всеми предложениями.", diff --git a/website/common/locales/ru/pets.json b/website/common/locales/ru/pets.json index 91fd84aa87..8f8f678d87 100644 --- a/website/common/locales/ru/pets.json +++ b/website/common/locales/ru/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "Королевский пурпурный грифон", "phoenix": "Феникс", "magicalBee": "Волшебная пчелка", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "Обнадеживающий Гиппогриф", + "hopefulHippogriffMount": "Надежный Гиппогриф", "royalPurpleJackalope": "Королевский пурпурный Джекалоп", "invisibleAether": "Невидимый Эфир", "rarePetPop1": "Нажмите золотую лапу, чтобы подробнее узнать, как получить этого редкого питомца, приняв участие в проекте Habitica!", diff --git a/website/common/locales/ru/quests.json b/website/common/locales/ru/quests.json index 33b46267fd..8b33b7bbd4 100644 --- a/website/common/locales/ru/quests.json +++ b/website/common/locales/ru/quests.json @@ -121,9 +121,9 @@ "questBundles": "Наборы квестов со скидкой", "buyQuestBundle": "Купить набор квестов", "noQuestToStart": "Не можете найти подходящий квест? Посетите магазин квестов на рынке. Возможно, что там есть новинки!", - "pendingDamage": "<%= damage %> pending damage", - "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health", - "rageAttack": "Rage Attack:", - "bossRage": "<%= currentRage %> / <%= maxRage %> Rage", - "rageStrikes": "Rage Strikes" + "pendingDamage": "<%= damage %> ожидаемого урона", + "bossHealth": "<%= currentHealth %> / <%= maxHealth %> здоровья", + "rageAttack": "Атака при ярости:", + "bossRage": "<%= currentRage %> / <%= maxRage %> ярости", + "rageStrikes": "Нападения" } \ No newline at end of file diff --git a/website/common/locales/ru/questscontent.json b/website/common/locales/ru/questscontent.json index 7640e0bf92..409c394f42 100644 --- a/website/common/locales/ru/questscontent.json +++ b/website/common/locales/ru/questscontent.json @@ -88,7 +88,7 @@ "questMoonstone3Completion": "Вам становится сложнее дышать, пот щиплет глаза, когда умирает восставший Змей. Останки Рецидивины рассеиваются в бледно-серый туман, который быстро уносится порывом освежающего ветерка. Вы слышите отдаленные восторженные крики Хаббитанцев, которые победили свои вредные привычки раз и навсегда.

Повелитель зверей @Baconsaur приземляется на грифоне. «Я видел конец вашей битвы с неба, и я был глубоко тронут. Пожалуйста, примите эту зачарованную тунику – ваша храбрость говорит о благородном сердце, и я верю, что вы должны получить ее.»", "questMoonstone3Boss": "Некро-Вайс", "questMoonstone3DropRottenMeat": "Тухлое мясо (еда)", - "questMoonstone3DropZombiePotion": "Зомби инкубационный эликсир", + "questMoonstone3DropZombiePotion": "Инкубационный эликсир Зомби ", "questGroupGoldenknight": "Золотой Рыцарь", "questGoldenknight1Text": "Золотой Рыцарь, часть 1: Строгий выговор", "questGoldenknight1Notes": "Золотой Рыцарь вечно недовольна бедными жителями Habitica. Не справились со всеми Ежедневными заданиями? Поддались негативной привычке? Для нее это повод позудеть, что вы должны следовать ее примеру. Она - яркий пример идеального Хаббитанца, а вы лишь неудачник. Что ж, это вовсе не вежливо! Все совершают ошибки, поэтому они не обязаны терпеть подобных обвинений. Наверное, пора бы вам собрать кое-какие заявления обиженных жителей страны Habitica и сделать Золотому Рыцарю строгий выговор!", @@ -323,7 +323,7 @@ "questFalconUnlockText": "Позволяет покупать на рынке сокола в яйце.", "questTreelingText": "Запутанное Дерево", "questTreelingNotes": "Проходит ежегодный Садовый Конкурс и все только и говорят о мистическом проекте, который обещал обнародовать @aurakami. Вы присоединились к толпе в день большого объявления и поражены представлением движущегося дерева. @fuzzytrees объясняет, что дерево поможет в уходе за садом, показывая как оно косит газон, подрезает живую изгородь и розы в одно и тоже время, до тех пор пока дерево внезапно не сходит с ума, направляя его секаторы на своего создателя! Толпа паникует и все пытаются сбежать, но вы не боитесь, вы выступаете вперед, готовый к битве. ", - "questTreelingCompletion": "Вы взяли себя в руки и последние несколько листьев упали на пол. Не надо расстраиваться, но Садовый Конкурс теперь завешен, хотя дерево, которое вы только что докромсали до кучи деревянных чипсов и не выйграет никаких призов. \"У нас еще есть немного дел для работы\", сказал @PainterProphet. \"Возможно, кто-нибудь другой справится лучше с подготовкой саженцев. Может пойдем?\"", + "questTreelingCompletion": "Вы взяли себя в руки и последние несколько листьев упали на пол. Не надо расстраиваться, но Садовый Конкурс теперь завешен, хотя дерево, которое вы только что докромсали до кучи деревянных чипсов и не выиграет никаких призов. \"У нас еще есть немного дел для работы\", сказал @PainterProphet. \"Возможно, кто-нибудь другой справится лучше с подготовкой саженцев. Может пойдем?\"", "questTreelingBoss": "Запутанное Дерево", "questTreelingDropTreelingEgg": "Кустик (Яйцо)", "questTreelingUnlockText": "Позволяет покупать на рынке кустик в яйце.", @@ -338,8 +338,8 @@ "questAxolotlRageEffect": "`Магический Аксолотль воспользовался РЕГЕНЕРАЦИЕЙ!`\n\n`Завеса разноцветных пузырьков на мгновение окутывает монстра, а когда она рассеивается, некоторые из его ран исчезают!`", "questTurtleText": "Помоги Черепахе найти дорогу", "questTurtleNotes": "На помощь! Эта гигантская морская черепаха не может отыскать дорогу к своему гнездовому пляжу. Каждый год она возвращается туда, чтобы отложить яйца, но в этом году Недоделанная Бухта заполнена токсическими Рабочими Обломками, состоящими из красных ежедневных дел и неотмеченных задач. — Она бьется в панике! — говорит @JessicaChase.
\n
@UncommonCriminal согласно кивает: \"Все из-за того, что ее чувство направления затуманено и сбито\".\n

@Scarabsi хватает вас за руку: \"Можете ли вы помочь расчистить Рабочие Обломки, преграждающие ей дорогу? Хоть это и опасно, но мы должны помочь ей!\"", - "questTurtleCompletion": "Ваша доблесная работа очистила воды моря, и теперь наша черепаха найдет свой пляж. Вы, @Bambin и @JaizakAripaik наблюдаете, как она закапывает свою кладку яиц глубоко в песок, чтобы потом из них вылупились сотни маленьких морских черепашат. Как истинная леди, черепаха дает каждому из вас по три яйца, и просит вас кормить и воспитывать детенышей, чтобы однажды они и сами стали большими морскими черепахами.", - "questTurtleBoss": "Рабочие Обломки", + "questTurtleCompletion": "Ваша доблестная работа очистила воды моря, и теперь наша черепаха найдет свой пляж. Вы, @Bambin и @JaizakAripaik наблюдаете, как она закапывает свою кладку яиц глубоко в песок, чтобы потом из них вылупились сотни маленьких морских черепашат. Как истинная леди, черепаха дает каждому из вас по три яйца, и просит вас кормить и воспитывать детенышей, чтобы однажды они и сами стали большими морскими черепахами.", + "questTurtleBoss": "Рабочие обломки", "questTurtleDropTurtleEgg": "Черепаха (Яйцо)", "questTurtleUnlockText": "Позволяет покупать на Рынке яйца Черепах", "questArmadilloText": "Потакание броненосца", @@ -349,7 +349,7 @@ "questArmadilloDropArmadilloEgg": "Броненосец (яйцо)", "questArmadilloUnlockText": "Позволяет покупать на рынке броненосца в яйце", "questCowText": "Корова-муутант", - "questCowNotes": "It’s been a long, hot day at Sparring Farms, and there is nothing more you want than a long sip of water and some sleep. You're standing there daydreaming when @Soloana suddenly screams, \"Everyone run! The prize cow has mootated!\"

@eevachu gulps. \"It must be our bad habits that infected it.\"

\"Quick!\" @Feralem Tau says. \"Let’s do something before the udder cows mootate, too.\"

You’ve herd enough. No more daydreaming -- it's time to get those bad habits under control!", + "questCowNotes": "Этим длинным и жарким днем на Тренировочных Фермах вы думаете только о том, чтобы напиться воды и немного поспать. Уже задремав, вы слышите внезапный крик @Soloana: \"Убегайте, все убегайте! Призовая корова МУУтировала!

@eevachu сглотнул: \"Должно быть, ее заразили наши плохие привычки\".

\"Скорее! Давайте сделаем что-то, пока дойные коровы не муутировали тоже\", — сказал @Feralem Tau.

Теперь вы узнали достаточно, и теперь — никакого сна! Настало время взять эти плохие привычки под контроль!", "questCowCompletion": "Вы выдоили из своих полезных привычек все, что можно, и корова вновь приобрела свой изначальный вид. Она смотрит на вас своими красивыми карими глазами и подталкивает носом три яйца.

@fuzzytrees смеется и вручает вам яйца: \"Если в них есть телята, то они, возможно, все еще муутированы! Но я уверен, что вы будете держаться своих хороших привычек, когда будете растить их!\".", "questCowBoss": "Корова-муутант", "questCowDropCowEgg": "Корова (яйцо)", @@ -417,15 +417,15 @@ "questSlothDropSlothEgg": "Ленивец (яйцо)", "questSlothUnlockText": "Позволяет покупать на рынке ленивца в яйце.", "questTriceratopsText": "Топот Трицератопса", - "questTriceratopsNotes": "Покрытые снегом вершины вулкана Stoïkalm вечно препираются с туристами и экскурсантами. Один турист, @plumilla, воззвала к толпе. \"Смотрите! Я заколдовала землю светиться, что бы мы могли поиграть в уличные игры, для выполнения наших ежедневных заданий\". Земля действительно вскружилась светящимися красными узорами. Даже некоторые из доисторических питомцев с округи пришли поиграть.

Внезапно что-то громко треснуло - это любопытный Трицератопс наступил на волшебную палочку @plumilla's! Он поглотил её всплеском магической энергии, и затряслась земля и стала нагреваться. Глаза Трицератопса светятся красным, и он рычит и начинает паническое бегство!

\"Это не хорошо,\" воззвал @McCoyly, указывая на расстоянии. Каждый топот, что наполнен магией, заставляет вулканы извергаться, и, под ногами у динозавра, светящаяся земля превращается в лаву! Быстро, вы должны сдержать Топающего Трицератопса пока кто-нибудь не обратит заклинание вспять!", - "questTriceratopsCompletion": "Быстро пошевелив мозгами, ты загоняешь создание в направлении утихающего Stoïkalm Steppes так что @*~Seraphina~* и @PainterProphet повернуть вспять заклятие лавы не отвлекаясь. Успокаивающая аура Шагов возымела эффект, и Трицератопс сворачивается в клубочек в то время как вулканы снова засыпают. @PainterProphet передаёт вам немного яиц, что были спасены из лавы. \"Без тебя мы бы не смогли сконцентрироваться, что бы остановить извержения. Позаботься хорошо об этих питомцах.\"", + "questTriceratopsNotes": "Покрытые снегом вершины вулкана Стойкальма вечно препираются с туристами и экскурсантами. Один турист, @plumilla, воззвала к толпе. \"Смотрите! Я заколдовала землю светиться, что бы мы могли поиграть в уличные игры, для выполнения наших ежедневных заданий\". Земля действительно вскружилась светящимися красными узорами. Даже некоторые из доисторических питомцев с округи пришли поиграть.

Внезапно что-то громко треснуло - это любопытный Трицератопс наступил на волшебную палочку @plumilla's! Он поглотил её всплеском магической энергии, и затряслась земля и стала нагреваться. Глаза Трицератопса светятся красным, и он рычит и начинает паническое бегство!

\"Это не хорошо,\" воззвал @McCoyly, указывая на расстоянии. Каждый топот, что наполнен магией, заставляет вулканы извергаться, и, под ногами у динозавра, светящаяся земля превращается в лаву! Быстро, вы должны сдержать Топающего Трицератопса пока кто-нибудь не обратит заклинание вспять!", + "questTriceratopsCompletion": "Быстро пошевелив мозгами, вы загоняете создание в направлении успокаивающих Стойкальмских степей чтобы @Seraphina и @PainterProphet могли отменить заклинание лавы, не отвлекаясь. Аура степной тишины возымела эффект, и Трицератопс сворачивается в клубочек в то время как вулканы снова засыпают. @PainterProphet передаёт вам немного яиц, что были спасены из лавы. \"Без тебя мы бы не смогли сконцентрироваться, что бы остановить извержения. Позаботься хорошо об этих питомцах.\"", "questTriceratopsBoss": "Вытаптывающий Трицератопс", "questTriceratopsDropTriceratopsEgg": "Трицератопс (яйцо)", "questTriceratopsUnlockText": "Позволяет покупать на рынке Трицератопса в яйце.", "questGroupStoikalmCalamity": "Стойкальмское бедствие", "questStoikalmCalamity1Text": "Стойкальмское бедствие, часть 1: Земляные враги", - "questStoikalmCalamity1Notes": "Вы получили лаконичное официальное письмо от @Kiwibot, и покрытый инеем свиток морозит вашу душу так же, как и ваши пальцы. \"Из-под земли вырываются монстры, посетите Стойкальмские Степи и помогите нам!\" Вы собрали группу и отправились на север, но как только вы рискнули спуститься с гор, снег под вашими ногами взорвался, и вас окружил рой зверски ухмыляющихся черепов!

Внезапно, мимо вас пролетело копье и погрузилось в череп, который, пробираясь через сугробы, собирался застать вас врасплох. Высокая женщина в тонко сделанных доспехах скачет в бой на спине мастодонта, её длинная коса раскачивается на ветру. Женщина бесцеремонно выдергивает своё копьё из раздавленного зверя. Пришло время повергнуть этих врагов с помощью Леди Глэсиэйт, лидера Наездников Мамонтов!", - "questStoikalmCalamity1Completion": "Когда Вы наносите последний удар по черепам, они исчезают в магической вспышке. \"Этот проклятый рой может больше и не появится, - говорит Леди Глэсиэйт, - но проблемы на этом не заканчиваются. Следуйте за мной.\" Она кидает Вам плащ, чтобы защитить Вас от холодного воздуха, и Вы скачете вслед за ней.", + "questStoikalmCalamity1Notes": "Вы получили лаконичное официальное письмо от @Kiwibot, и покрытый инеем свиток морозит вашу душу так же, как и ваши пальцы. \"Из-под земли вырываются монстры, посетите Стойкальмские Степи и помогите нам!\" Вы собрали группу и отправились на север, но как только вы рискнули спуститься с гор, снег под вашими ногами взорвался, и вас окружил рой зверски ухмыляющихся черепов!

Внезапно, мимо вас пролетело копье и погрузилось в череп, который, пробираясь через сугробы, собирался застать вас врасплох. Высокая женщина в тонко сделанных доспехах скачет в бой на спине мастодонта, её длинная коса раскачивается на ветру. Женщина бесцеремонно выдергивает своё копьё из раздавленного зверя. Пришло время повергнуть этих врагов с помощью Ледяной Леди, лидера Наездников Мамонтов!", + "questStoikalmCalamity1Completion": "Когда Вы наносите последний удар по черепам, они исчезают в магической вспышке. \"Этот проклятый рой может больше и не появится, - говорит Ледяная Леди, - но проблемы на этом не заканчиваются. Следуйте за мной.\" Она кидает Вам плащ, чтобы защитить Вас от холодного воздуха, и Вы скачете вслед за ней.", "questStoikalmCalamity1Boss": "Рой Земляных Черепов", "questStoikalmCalamity1RageTitle": "Возрождение Роя", "questStoikalmCalamity1RageDescription": "Возрождение Роя: Эта шкала заполняется, когда вы не выполняете свои ежедневные задания. Когда она будет заполнена, Рой Земляных Черепов излечит себя на 30% oт оставшегося здоровья!", @@ -434,20 +434,20 @@ "questStoikalmCalamity1DropDesertPotion": "Пустынный инкубационный эликсир", "questStoikalmCalamity1DropArmor": "Доспехи Наездника Мамонта", "questStoikalmCalamity2Text": "Стойкальмское бедствие, часть 2: Поиски ледяной пещеры", - "questStoikalmCalamity2Notes": "Величественный зал Наездников Мамонтов - строгий шедевр архитектуры, но сейчас он совершенно пуст. Здесь нет мебели, оружие отсутствует, даже колонны лишились инкрустации.

\"Черепа обчистили это место, - говорит Леди Глэсиэйт, и в её тоне сквозит метель. \"Унизительно. Ни одна живая душа не должна рассказывать об этом Апрельскому Шуту, иначе сплетням конца и края не будет\".

\"Как таинственно!\", - восклицает @Beffymaroo. - \"Но откуда же...\"

\"Пещера ледяных дрэйков\", - Леди Глэсиэйт указывает на сияющие монеты, раскиданные на снегу снаружи. - \"Какая небрежность\".

\"Но разве ледяные дрэйки не благородные создания со своими собственными сокровищницами?\", - спрашивает @Beffymaroo. - \"Почему они...\"

\"Гипноз\", отвечает Леди Глэсиэйт, совершенно не заботясь о вежливости. - \"Или что-то столь же напыщенное и неприятное\". Она начинает шагать в сторону выхода из зала. - \"Почему же вы просто там стоите?\"

Быстрее, идите по следам ледяных монет! ", - "questStoikalmCalamity2Completion": "Ледяные монеты привели вас прямиком ко входу в хитро спрятанную пещеру. Хотя погода снаружи спокойная и приятная, а лучики солнечного света пробиваются сквозь пласты снега, внутри пещеры раздается вой свирепого северного ветра. Леди Глэсиэйт кривится и протягивает вам Шлем Наездника Мамонта. \"Наденьте это\", - говорит она. - \"Потом пригодится\".", + "questStoikalmCalamity2Notes": "Величественный зал Наездников Мамонтов - строгий шедевр архитектуры, но сейчас он совершенно пуст. Здесь нет мебели, оружие отсутствует, даже колонны лишились инкрустации.

\"Черепа обчистили это место, - говорит Ледяная Леди, и в её тоне сквозит метель. \"Унизительно. Ни одна живая душа не должна рассказывать об этом Апрельскому Шуту, иначе сплетням конца и края не будет\".

\"Как таинственно!\", - восклицает @Beffymaroo. - \"Но откуда же...\"

\"Пещера ледяных дрэйков\", - Ледяная Леди указывает на сияющие монеты, раскиданные на снегу снаружи. - \"Какая небрежность\".

\"Но разве ледяные дрэйки не благородные создания со своими собственными сокровищницами?\", - спрашивает @Beffymaroo. - \"Почему они...\"

\"Гипноз\", отвечает Ледяная Леди, совершенно не заботясь о вежливости. - \"Или что-то столь же напыщенное и неприятное\". Она начинает шагать в сторону выхода из зала. - \"Почему же вы просто там стоите?\"

Быстрее, идите по следам ледяных монет! ", + "questStoikalmCalamity2Completion": "Ледяные монеты привели вас прямиком ко входу в хитро спрятанную пещеру. Хотя погода снаружи спокойная и приятная, а лучики солнечного света пробиваются сквозь пласты снега, внутри пещеры раздается вой свирепого северного ветра. Ледяная Леди кривится и протягивает вам Шлем Наездника Мамонта. \"Наденьте это\", - говорит она. - \"Потом пригодится\".", "questStoikalmCalamity2CollectIcicleCoins": "Ледяные монеты", "questStoikalmCalamity2DropHeadgear": "Шлем Наездника Мамонта (головной убор)", "questStoikalmCalamity3Text": "Стойкальмское бедствие, часть 3: Землетрясение ледяных дрэйков", - "questStoikalmCalamity3Notes": "Запутанные туннели пещеры ледяных дрэйков мерцают от инея... и прячут несметные богатства. Вы зеваете, но Леди Глэсиэйт проходит мимо, даже не взглянув на Вас. \"Очень напыщенно\", - говорит она. - \"Однако, респектабельный наемный труд и расчетливые инвестиции заслуживают восхищения. Смотрите дальше.\" Прищурившись, Вы замечаете возвышающуюся кучу украденных предметов, скрытую в тени.

Свистящий голос раздается громче, когда Вы подходите ближе. \"Мой вкусный клад! Не смей красть его у меня!\". Волнистое тело скользит по куче сокровищ, это же сама Королева Ледяных Дрэйков! У Вас хватило времени лишь для того, чтобы заметить странные браслеты, блестящие на ее запястьях и сияющие диким светом глаза, прежде чем она издала сотрясающий землю вой.", - "questStoikalmCalamity3Completion": "Вы ослабили Королеву Ледяных Дрэйков, дав Леди Глэсиэйт время для того, чтобы разбить браслеты. Королева застывает со смиренным видом, а затем быстро маскирует свое унижение надменной позой. \"Не стесняйтесь убрать эти посторонние предметы, - говорит она. - Боюсь, они просто не подходят нашему декору\".

\"А еще вы их украли, - замечает @Beffymaroo, - вы призвали этих монстров из-под земли\".

Королева Ледяных Дрэйков выглядит обиженной. \"Забирайте их с этим жалким браслетом торговки\", - отвечает она. - \"Ее имя - Цина, если хотите. По существу, я почти не участвовала.\"

Леди Глэсиэйт хлопает Вас по плечу. \"Вы хорошо сегодня постарались\", - говорит она, вручая Вам копье и горн, вытащенные ранее из кучи. - \"Гордитесь.\"", + "questStoikalmCalamity3Notes": "Запутанные туннели пещеры ледяных дрэйков мерцают от инея... и прячут несметные богатства. Вы зеваете, но Ледяная Леди проходит мимо, даже не взглянув на Вас. \"Очень напыщенно\", - говорит она. - \"Однако, респектабельный наемный труд и расчетливые инвестиции заслуживают восхищения. Смотрите дальше.\" Прищурившись, Вы замечаете возвышающуюся кучу украденных предметов, скрытую в тени.

Свистящий голос раздается громче, когда Вы подходите ближе. \"Мой вкусный клад! Не смей красть его у меня!\". Волнистое тело скользит по куче сокровищ, это же сама Королева Ледяных Дрэйков! У Вас хватило времени лишь для того, чтобы заметить странные браслеты, блестящие на ее запястьях и сияющие диким светом глаза, прежде чем она издала сотрясающий землю вой.", + "questStoikalmCalamity3Completion": "Вы ослабили Королеву Ледяных Дрэйков, дав Ледяной Леди время для того, чтобы разбить браслеты. Королева застывает со смиренным видом, а затем быстро маскирует свое унижение надменной позой. \"Не стесняйтесь убрать эти посторонние предметы, - говорит она. - Боюсь, они просто не подходят нашему декору\".

\"А еще вы их украли, - замечает @Beffymaroo, - вы призвали этих монстров из-под земли\".

Королева Ледяных Дрэйков выглядит обиженной. \"Забирайте их с этим жалким браслетом торговки\", - отвечает она. - \"Ее имя - Цина, если хотите. По существу, я почти не участвовала.\"

Ледяная Леди хлопает Вас по плечу. \"Вы хорошо сегодня постарались\", - говорит она, вручая Вам копье и горн, вытащенные ранее из кучи. - \"Гордитесь.\"", "questStoikalmCalamity3Boss": "Королева Ледяных Дрэйков", "questStoikalmCalamity3DropBlueCottonCandy": "Синяя сладкая вата (еда)", - "questStoikalmCalamity3DropShield": "Mammoth Rider's Horn (Off-Hand Item)", + "questStoikalmCalamity3DropShield": "Горн наездника мамонта (для защитной руки)", "questStoikalmCalamity3DropWeapon": "Копье Наездника Мамонта (оружие)", "questGuineaPigText": "Банда морских свинок", - "questGuineaPigNotes": "Вы как обычно прогуливаетесь по знаменитому Рынку Habit City, и тут @Pandah машет вам рукой. \"Эй, посмотри на этих!\". У них в руках коричнево-бежевое яйцо, которое ты не можешь опознать.

Торговец Александр неодобрительно хмурится. \"Что-то не припомню, чтобы я выставлял такое на продажу. Интересно, откуда оно взялось...\" Маленькая лапка прерывает его.

\"Тащи сюда все свое золото, торговец!\" - пищит тоненький голосок, переполненный злобой.

\"О нет, яйцо было отвлекающим маневром!\" восклицает @mewrose. \"Это безжалостная, жадная Банда Морских Свинок! Они никогда не делают ежедневные задания, и поэтому постоянно воруют золото, чтобы покупать зелье здоровья.\"

\"Грабить рынок?\" - произносит @emmavig. \"Не в мою смену!\" Без лишних разговоров, вы бросаетесь на помощь Александру.", - "questGuineaPigCompletion": "\"Мы сдаёмся!\" - Босс Банды Морских Свинок машет вам лапами, его пушистая голова стыдливо опущена. Из-под его шляпы выпадает список, и @snazzyorange быстро подхватывает его как улику. \"Погоди минутку\" -- отвечаете вы, -- \"Не удивительно, что вы терпите такой урон! У вас слишком много ежедневных заданий. Вам не нужно зелье здоровья -- вам нужна только помощь в организации.\"

\"Правда?\" - пищит Босс Банды Морских свинок. \"Мы ограбили так много людей из-за этого! Пожалуйста, возьми эти яйца в знак извинения за наши нечестные дела.\"", + "questGuineaPigNotes": "Вы как обычно прогуливаетесь по знаменитому Рынку Habit City, и тут @Pandah машет вам рукой. \"Эй, посмотри на этих!\". У них в руках коричнево-бежевое яйцо, которое ты не можешь опознать.

Торговец Александр неодобрительно хмурится. \"Что-то не припомню, чтобы я выставлял такое на продажу. Интересно, откуда оно взялось...\" Маленькая лапка прерывает его.

\"Тащи сюда все свое золото, торговец!\" - пищит тоненький голосок, переполненный злобой.

\"О нет, яйцо было отвлекающим маневром!\" восклицает @mewrose. \"Это безжалостная, жадная Банда морских свинок! Они никогда не делают ежедневные задания, и поэтому постоянно воруют золото, чтобы покупать зелье здоровья.\"

\"Грабить рынок?\" - произносит @emmavig. \"Не в мою смену!\" Без лишних разговоров, вы бросаетесь на помощь Александру.", + "questGuineaPigCompletion": "\"Мы сдаёмся!\" - босс Банды морских свинок машет вам лапами, его пушистая голова стыдливо опущена. Из-под его шляпы выпадает список, и @snazzyorange быстро подхватывает его как улику. \"Погоди минутку\" -- отвечаете вы, -- \"Не удивительно, что вы терпите такой урон! У вас слишком много ежедневных заданий. Вам не нужно зелье здоровья -- вам нужна только помощь в организации.\"

\"Правда?\" - пищит босс Банды морских свинок. \"Мы ограбили так много людей из-за этого! Пожалуйста, возьми эти яйца в знак извинения за наши нечестные дела.\"", "questGuineaPigBoss": "Банда морских свинок", "questGuineaPigDropGuineaPigEgg": "Морская свинка (Яйцо)", "questGuineaPigUnlockText": "Открывает покупку яиц Морской свинки на рынке", @@ -462,7 +462,7 @@ "questButterflyCompletion": "После яркой битвы в огне, вы схватили Пылающую бабочку. «Отличная работа по поимке несостоявшегося поджигателя», говорит @Megan со вздохом облегчения. «Тем не менее, сложно назвать злодеем даже самую гнусную бабочку. Лучше выпустим её в какое-нибудь безопасное место... например, в пустыню».

Одна из садовников, @Beffymaroo, пришла к вам опалённая, но улыбающаяся. «Поможете вырастить этих куколок, которых мы нашли? Возможно, в следующем году у нас будет зелёный сад для них».", "questButterflyBoss": "Пылающая бабочка", "questButterflyDropButterflyEgg": "Гусеница (яйцо)", - "questButterflyUnlockText": "Позваляет купить яйцо Гусеницы на рынке", + "questButterflyUnlockText": "Позволяет купить яйцо Гусеницы на рынке", "questGroupMayhemMistiflying": "Беспредел в Летящей Дымке", "questMayhemMistiflying1Text": "Беспредел в Летящей Дымке, часть 1: в которой Летящую дымку настигает ужасная забота", "questMayhemMistiflying1Notes": "Хотя местные прорицатели и предсказывали хорошую погоду, но во второй половине дня становится прохладно, поэтому вы с благодарностью следуете за своим другом @Kiwibot к нему в гости, чтобы не торчать на улице в такой ветер.

Никто из вас не ожидал найти там Апрельский Шута, развалившегося за столом.

«О, привет, – говорит он. – Так здорово вас здесь видеть. Пожалуйста, позвольте предложить вам этого восхитительного чая».

«Это... – начинает @Kiwibot. – Это МОЙ...»

«Да-да, конечно, – говорит Апрельский Шут, уплетая печенье. – Просто подумал, что было бы классно посидеть в доме и немного передохнуть от всех этих черепов, нагоняющих смерч». Он делает глоток из чашки. «Кстати, на город Летящая Дымка напали».

В ужасе вы с друзьями бежите в конюшни и седлаете своих самых быстрых крылатых скакунов. Когда вы подлетаете к парящему городу, то видите, что его осаждает рой болтающихся, летающих черепов... и некоторые замечают вас!", @@ -486,8 +486,8 @@ "questMayhemMistiflying3Completion": "Как только вы подумали, что не можете противостоять ветру больше, вам удалось сорвать маску с лица Ветродуя. Внезапно, торнадо рассасывается, оставляя только мягкий бриз и солнечный свет. Ветрянин оглядывается в замешательстве. «Куда она делась?»

«Кто?» спрашивает ваш друг @khdarkwolf.

«Эта милая женщина, которая предложила доставить пакет для меня. Цзина.» Когда он поворачивается в подверженный ветрам город под ним, его взгляд темнеет. «Ну вот, опять. Может быть, она была не такой милой ...»

Апрельский Шут похлопывает его по спине, затем вручает вам два мерцающих конверта. «Вот. Почему бы вам не позволить этому беспокойному товарищу отдохнуть и взять на себя ответственность за почту? Я слышал, что волшебство в этих конвертах стоит вашего времени.»", "questMayhemMistiflying3Boss": "Ветрянин", "questMayhemMistiflying3DropPinkCottonCandy": "Розовая сахарная вата (еда)", - "questMayhemMistiflying3DropShield": "Roguish Rainbow Message (Off-Hand Item)", - "questMayhemMistiflying3DropWeapon": "Roguish Rainbow Message (Main-Hand Item)", + "questMayhemMistiflying3DropShield": "Шутливый радужный конверт (для защитной руки)", + "questMayhemMistiflying3DropWeapon": "Шутливый радужный конверт (оружие)", "featheredFriendsText": "Набор квестов «Пернатые друзья»", "featheredFriendsNotes": "Содержит квесты «Помогите! Гарпия!», «Сова-Полуночник» и «Птицы прокрастинации». Доступен до 31 мая.", "questNudibranchText": "Заражение мотивирующими Морскими слизнями", @@ -511,7 +511,7 @@ "questGroupLostMasterclasser": "Тайна ордена Мастеров", "questUnlockLostMasterclasser": "Чтобы открыть этот квест, завершите финальные квесты в сериях «Бедствие Промедления», «Беспредел в Летящей Дымке», «Стойкальмское бедствие» и «Ужас Трудобора».", "questLostMasterclasser1Text": "Тайна ордена Мастеров, часть 1: Чтение сквозь строки", - "questLostMasterclasser1Notes": "Вы были неожиданно вызваны @beffymaroo и @Lemoness в Зал Привычки, где вы с изумлением обнаружили, что все четыре участника ордена Мастеров ждут вас в бледном свете зари. Даже Радостная жница выглядит мрачно.

«Ого, вы здесь» — говорит Апрельский Шут. — «Теперь мы не будем беспокоить вас из вашего покоя без причины поистине веской...»

«Помогите нам расследовать недавний приступ нападений», - прерывает Ледяная Леди. «Все жертвы обвинили кого-то по имени Цина».

Апрельский дурак явно оскорблен этим кратким изложением. «А что насчет моей речи?» — шипит он на нее. — «Что насчет туманов и последствий грозы?»

«Мы спешим», - пробормотала она. «И мои мамонты все еще мокрые из вашей непрерывной тренировки».

«Боюсь, что уважаемая Мастер Воинов права», - говорит король Манта. «Время имеет существенное значение. Вы поможете нам?»

Когда вы киваете, он машет руками, чтобы открыть портал, раскрывая подводную комнату. «Поплавайте со мной в Медлительности, и мы раскроем мою библиотеку за любые ссылки, которые могут дать нам ключ». При вашем замешательстве он добавляет: «Не волнуйтесь, бумага была зачарована задолго до того, как затонула Медлительность. Ни одна из книг ни подвержена сырости!» Он подмигивает. «В отличие от мамонтов Ледяной Леди».

«Я слышала это, Манта».

Когда вы погружаетесь в воду после Мастера Магов, ваши ноги волшебным образом сливаются в плавники. Хоть чуствуете вы себя бодрым, но когда вы видите тысячи книжных полок, ваше сердце тонет. Лучше начинать читать…", + "questLostMasterclasser1Notes": "Вы были неожиданно вызваны @beffymaroo и @Lemoness в Зал Привычки, где вы с изумлением обнаружили, что все четыре участника ордена Мастеров ждут вас в бледном свете зари. Даже Радостная жница выглядит мрачно.

«Ого, вы здесь» — говорит Апрельский Шут. — «Теперь мы не будем беспокоить вас из вашего покоя без причины поистине веской...»

«Помогите нам расследовать недавний приступ нападений», - прерывает Ледяная Леди. «Все жертвы обвинили кого-то по имени Цина».

Апрельский дурак явно оскорблен этим кратким изложением. «А что насчет моей речи?» — шипит он на нее. — «Что насчет туманов и последствий грозы?»

«Мы спешим», - пробормотала она. «И мои мамонты все еще мокрые из вашей непрерывной тренировки».

«Боюсь, что уважаемая Мастер Воинов права», - говорит король Манта. «Время имеет существенное значение. Вы поможете нам?»

Когда вы киваете, он машет руками, чтобы открыть портал, раскрывая подводную комнату. «Поплавайте со мной в Медлительности, и мы раскроем мою библиотеку за любые ссылки, которые могут дать нам ключ». При вашем замешательстве он добавляет: «Не волнуйтесь, бумага была зачарована задолго до того, как затонула Медлительность. Ни одна из книг ни подвержена сырости!» Он подмигивает. «В отличие от мамонтов Ледяной Леди».

«Я слышала это, Манта».

Когда вы погружаетесь в воду после Мастера Магов, ваши ноги волшебным образом сливаются в плавники. Хоть чувствуете вы себя бодрым, но когда вы видите тысячи книжных полок, ваше сердце тонет. Лучше начинать читать…", "questLostMasterclasser1Completion": "После нескольких часов поиска по томам, вы все еще не нашли никакой полезной информации.

\"Это кажется невозможным, и нет ни малейшей ссылки на хоть что-то похожее\", - говорит руководитель библиотеки @Tuqjoi, и его помощник @stefalupagus кивает в отчаянии.

\"Не невозможно…\" говорит король Манта, сужая глаза. “Преднамеренно.” На мгновение вода светится вокруг его рук, и несколько книг содрогаются. “Что-то скрывает информацию”, - говорит он. \"Не только статическое заклинание, но и что-то с собственной волей. Что-то ... живое.” Он отплывает из-за стола. \"Радостный Жнец должен услышать об этом. Давайте соберем еду в дорогу.”", "questLostMasterclasser1CollectAncientTomes": "Древние тома", "questLostMasterclasser1CollectForbiddenTomes": "Запретные тома", @@ -522,7 +522,7 @@ "questLostMasterclasser2Boss": "The a'Voidant", "questLostMasterclasser2DropEyewear": "Эфирная маска (очки)", "questLostMasterclasser3Text": "Тайна ордена Мастеров, часть 3: Город в Песках", - "questLostMasterclasser3Notes": "As night unfurls over the scorching sands of the Timewastes, your guides @AnnDeLune, @Kiwibot, and @Katy133 lead you forward. Some bleached pillars poke from the shadowed dunes, and as you approach them, a strange skittering sound echoes across the seemingly-abandoned expanse.

“Invisible creatures!” says the April Fool, clearly covetous. “Oho! Just imagine the possibilities. This must be the work of a truly stealthy Rogue.”

“A Rogue who could be watching us,” says Lady Glaciate, dismounting and raising her spear. “If there’s a head-on attack, try not to irritate our opponent. I don’t want a repeat of the volcano incident.”

He beams at her. “But it was one of your most resplendent rescues.”

To your surprise, Lady Glaciate turns very pink at the compliment. She hastily stomps away to examine the ruins.

“Looks like the wreck of an ancient city,” says @AnnDeLune. “I wonder what…”

Before she can finish her sentence, a portal roars open in the sky. Wasn’t that magic supposed to be nearly impossible here? The hoofbeats of the invisible animals thunder as they flee in panic, and you steady yourself against the onslaught of shrieking skulls that flood the skies.", + "questLostMasterclasser3Notes": "Когда ночь разворачивается над палящими песками утраченного времени, ваши проводники @AnnDeLune, @Kiwibot и @ Katy133 ведут вас вперед. Некоторые из выцветших столбов высунуты из затененных дюн, но когда вы приближаетесь к ним, странный скитающийся звук перекликается через, казалось бы, заброшенное пространство.

«Невидимые существа!» - говорит Апрельский Шут, очевидно предожидая. «Ого! Только представьте себе возможности. Это, должно быть, работа действительно скрытного разбойника.

«Разбойник, который мог наблюдать за нами», - говорит Ледяная Леди, спешиваясь и поднимая копье. «Если будет атака с фронта - постарайтесь не раздражать нашего противника. Я не хочу повторять инцидент с вулканом».

Он приободряет ее. «Но это было одно из самых ярких спасений».

К вашему удивлению, Ледяная Леди становится очень розовой на комплимент. Она спешно протопывает осмотреть руины.

«Похоже на развалины древнего города», - говорит @AnnDeLune. «Интересно, что…»

Прежде чем она сможет закончить свое предложение, в небе разверзается портал. Разве эта магия не была здесь почти невозможна? Копыта невидимых животных гремят, когда они бегут в панике, и вы упираетесь против натиска кричащих черепов, которые наводняют небо.", "questLostMasterclasser3Completion": "Апрельский Шут внезапно поражает оставшийся череп струей песка, и он пролетает обратно к Ледяной Леди, которая умело его разбивает. Как только вы отдышались и смотрите вверх, вы замечаете как промелькнул чей-то силуэт, движущийся по другую сторону закрывающего портала. Быстро соображая, вы хватаете амулет из сундука ранее одержимых предметов, и, конечно же, он тянется к невидимому человеку. Игнорируя крики тревоги от Ледяной Леди и Апрельского Шута, вы прыгаете через портал так же скоро, как он захлопывается сзади, отправляя вас в чернильное полотно небытия.", "questLostMasterclasser3Boss": "Рой черепов пустоты", "questLostMasterclasser3RageTitle": "Возрождение роя", @@ -545,16 +545,16 @@ "questLostMasterclasser4DropWeapon": "Эфирные кристаллы (Двуручное Оружие)", "questLostMasterclasser4DropMount": "Невидимый эфирный скакун", "questYarnText": "Спутанная пряжа", - "questYarnNotes": "It’s such a pleasant day that you decide to take a walk through the Taskan Countryside. As you pass by its famous yarn shop, a piercing scream startles the birds into flight and scatters the butterflies into hiding. You run towards the source and see @Arcosine running up the path towards you. Behind him, a horrifying creature consisting of yarn, pins, and knitting needles is clicking and clacking ever closer.

The shopkeepers race after him, and @stefalupagus grabs your arm, out of breath. \"Looks like all of his unfinished projects\" gasp gasp \"have transformed the yarn from our Yarn Shop\" gasp gasp \"into a tangled mass of Yarnghetti!\"

\"Sometimes, life gets in the way and a project is abandoned, becoming ever more tangled and confused,\" says @khdarkwolf. \"The confusion can even spread to other projects, until there are so many half-finished works running around that no one gets anything done!\"

It’s time to make a choice: complete your stalled projects… or decide to unravel them for good. Either way, you'll have to increase your productivity quickly before the Dread Yarnghetti spreads confusion and discord to the rest of Habitica!", - "questYarnCompletion": "With a feeble swipe of a pin-riddled appendage and a weak roar, the Dread Yarnghetti finally unravels into a pile of yarn balls.

\"Take care of this yarn,\" shopkeeper @JinjooHat says, handing them to you. \"If you feed them and care for them properly, they'll grow into new and exciting projects that just might make your heart take flight…\"", - "questYarnBoss": "The Dread Yarnghetti", - "questYarnDropYarnEgg": "Yarn (Egg)", - "questYarnUnlockText": "Unlocks purchasable Yarn eggs in the Market", - "winterQuestsText": "Winter Quest Bundle", - "winterQuestsNotes": "Contains 'Trapper Santa', 'Find the Cub', and 'The Fowl Frost'. Available until December 31.", - "questPterodactylText": "The Pterror-dactyl", - "questPterodactylNotes": "You're taking a stroll along the peaceful Stoïkalm Cliffs when an evil screech rends the air. You turn to find a hideous creature flying towards you and are overcome by a powerful terror. As you turn to flee, @Lilith of Alfheim grabs you. \"Don't panic! It's just a Pterror-dactyl.\"

@Procyon P nods. \"They nest nearby, but they're attracted to the scent of negative Habits and undone Dailies.\"

\"Don't worry,\" @Katy133 says. \"We just need to be extra productive to defeat it!\" You are filled with a renewed sense of purpose and turn to face your foe.", - "questPterodactylCompletion": "With one last screech the Pterror-dactyl plummets over the side of the cliff. You run forward to watch it soar away over the distant steppes. \"Phew, I'm glad that's over,\" you say. \"Me too,\" replies @GeraldThePixel. \"But look! It's left some eggs behind for us.\" @Edge passes you three eggs, and you vow to raise them in tranquility, surrounded by positive Habits and blue Dailies.", + "questYarnNotes": "Это такой приятный день, когда вы решили прогуляться по деревне Таскан. Когда вы проходите мимо знаменитого магазина пряжи, пронзительный крик пугает птиц в бегство и рассеивает бабочек в укрытие. Вы бежите к источнику и видите, как @Arcosine поднимается по пути к вам. За ним ужасное существо, состоящее из пряжи, штифтов и вязальных игл, щелкает и сжимается все ближе.

Лавочники гонятся за ним, а @stefalupagus хватает вашу руку, запыхавшись. «Похоже, что все его незавершенные проекты» вздох «превратили пряжу из нашей прядильной лавки» вздох «в запутанную массу Клубо-Прядилища!»

«Иногда жизнь берет другой путь, и отложенный проект становится все более запутанным и беспорядочным», - говорит @hdarkwolf. «Путаница может даже распространиться на другие проекты, пока не будет так много наполовину законченных работ, что никто ничего не сделает!»

Пришло время сделать выбор: завершить застопорившиеся проекты... или решить распутать их навсегда. В любом случае вам придется быстро увеличить производительность, прежде чем ужасное Клубище-Прядище породит путаницу и раздор в остальной части Habitica!", + "questYarnCompletion": "Со слабым движением остроконечного придатка и хилым ревом, ужасающее Клубище-Прядище, наконец, распадается в кучу шариков пряжи.

«Позаботьтесь об этой пряжи», - говорит лавочник @JinjooHat, вручая их вам. «Если вы будете кормить их и заботиться о них должным образом, они превратятся в новые и захватывающие проекты, которые смогут заставить ваше сердце летать...»", + "questYarnBoss": "Ужасающее Клубище-Прядище", + "questYarnDropYarnEgg": "Пряжа (яйцо)", + "questYarnUnlockText": "Позволяет покупать на рынке яйца пряжи", + "winterQuestsText": "Зимний набор квестов", + "winterQuestsNotes": "Содержит квесты «Санта Зверолов», «Найти детеныша» и «Птичий холод». Доступен до 31 декабря.", + "questPterodactylText": "Птеррор-дактиль!", + "questPterodactylNotes": "Вы гуляете по мирным скалам Стойкальма, когда злой визг раздирает воздух. Поворачиваясь, вы находите летящее к вам отвратительное существо, наполненное веской угрозой. Когда вы поворачиваетесь, чтобы бежать, @Lilith из Альфхейма захватывает вас. «Не паникуйте, это просто Птеррор-дактиль».

@Procyon P кивает. «Они гнездятся рядом, но их привлекает запах негативных привычек и не сделанных ежедневных дел».

«Не волнуйся, - говорит Кэти133. «Нам просто нужно быть более продуктивным, чтобы победить его!» Вы наполнены новым чувством цели и поворачиваетесь лицом к своему врагу.", + "questPterodactylCompletion": "С одним последним визгом Птеррор-дактиль падает на обочину скалы. Вы бежите вперед, чтобы посмотреть, как он парит в отдаленных степях. «Фу, я рад что все закончилось», - говорите вы. «Я тоже», - отвечает @GeraldThePixel. «Но смотри, у нас осталось несколько яиц». @Edge передает вам три яйца, и вы клянетесь, чтобы поднять их в тишине, в окружении положительных привычек и синих ежедневных дел.", "questPterodactylBoss": "Птеррор-дактиль", "questPterodactylDropPterodactylEgg": "Птеродактиль (яйцо)", "questPterodactylUnlockText": "Позволяет покупать на рынке птеродактиля в яйце.", @@ -562,18 +562,21 @@ "questBadgerNotes": "Ah, winter in the Taskwoods. The softly falling snow, the branches sparkling with frost, the Flourishing Fairies… still not snoozing?

“Why are they still awake?” cries @LilithofAlfheim. “If they don't hibernate soon, they'll never have the energy for planting season.”

As you and @Willow the Witty hurry to investigate, a furry head pops up from the ground. Before you can yell, “It’s the Badgering Bother!” it’s back in its burrow—but not before snatching up the Fairies' “Hibernate” To-Dos and dropping a giant list of pesky tasks in their place!

“No wonder the fairies aren't resting, if they're constantly being badgered like that!” @plumilla says. Can you chase off this beast and save the Taskwood’s harvest this year?", "questBadgerCompletion": "You finally drive away the the Badgering Bother and hurry into its burrow. At the end of a tunnel, you find its hoard of the faeries’ “Hibernate” To-Dos. The den is otherwise abandoned, except for three eggs that look ready to hatch.", "questBadgerBoss": "The Badgering Bother", - "questBadgerDropBadgerEgg": "Badger (Egg)", - "questBadgerUnlockText": "Unlocks purchasable Badger eggs in the Market", - "questDysheartenerText": "The Dysheartener", - "questDysheartenerNotes": "The sun is rising on Valentine’s Day when a shocking crash splinters the air. A blaze of sickly pink light lances through all the buildings, and bricks crumble as a deep crack rips through Habit City’s main street. An unearthly shrieking rises through the air, shattering windows as a hulking form slithers forth from the gaping earth.

Mandibles snap and a carapace glitters; legs upon legs unfurl in the air. The crowd begins to scream as the insectoid creature rears up, revealing itself to be none other than that cruelest of creatures: the fearsome Dysheartener itself. It howls in anticipation and lunges forward, hungering to gnaw on the hopes of hard-working Habiticans. With each rasping scrape of its spiny forelegs, you feel a vise of despair tightening in your chest.

“Take heart, everyone!” Lemoness shouts. “It probably thinks that we’re easy targets because so many of us have daunting New Year’s Resolutions, but it’s about to discover that Habiticans know how to stick to their goals!”

AnnDeLune raises her staff. “Let’s tackle our tasks and take this monster down!”", - "questDysheartenerCompletion": "The Dysheartener is DEFEATED!

Together, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”

Glowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.

The crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.

Our newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.

Beffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”

Crooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", - "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", - "questDysheartenerBossRageTitle": "Shattering Heartbreak", - "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", - "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", - "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", - "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", - "questDysheartenerDropHippogriffMount": "Hopeful Hippogriff (Mount)", - "dysheartenerArtCredit": "Artwork by @AnnDeLune" + "questBadgerDropBadgerEgg": "Барсук (яйцо)", + "questBadgerUnlockText": "Позволяет покупать на рынке барсука в яйце", + "questDysheartenerText": "Гразочаровыватель", + "questDysheartenerNotes": "Солнце вставало в Валентинов день, когда вдруг ужасный грохот сотряс воздух. Вспышка болезненно-розового света проходит сквозь здания, в стороны летят кирпичи, и глубокая трещина прорезает главную улицу Хабит-Сити. Чужеродный визг пронзает воздух, разбивая окна, когда неуклюжее существо вырывается из-под разверзнутой земли.

Его жвала щелкают и блестит его панцирь; многочисленные ноги перегородили улицу. В толпе раздаётся крик: это насекомоподобное существо оказывается тем самым жестоким и внушающим страх Гразочаровывателем! Он воет в нетерпении и бросается вперёд, собираясь пожрать все надежды трудолюбивых жителей Хабитики. С каждой глубокой царапиной, которую наносят мостовой когти на его передних лапах, вы чувствуете, как тиски отчаяния всё крепче сжимают вашу грудь.

«Мужайтесь, все! - кричит Lemoness. - Он, может, считает, что мы легко сдадимся, раз надавали себе так много новогодних обещаний! Но он узнает, насколько герои Хабитики тверды в движении к своим целям!»

AnnDeLune вздымает свой боевой посох: «Будем же выполнять наши задачи и победим этого монстра!»", + "questDysheartenerCompletion": "Гразочаровыватель ПОВЕРЖЕН!

Вместе все хабитяне наносят последний удар по своим задачам, и Гразочаровыватель отступает назад, вскрикивая с тревогой. «Что случилось, Чарователь?» - зовет AnnDeLune, сверкая глазами. «Чувствуешь разочарование?»

Светящиеся розовые переломы трескаются по панциру Гразочаровывателя, и он разбивается в клубок розового дыма. По мере того, как новое чувство бодрости и решимости проносится по всей земле, шквал восхитительных сладостей обрушивается на всех.

Толпа приветствует дико, обнимая друг друга, а их питомцы счастливо жуют запах запоздалого Валентинова дня. Внезапно радостный хор песни распространяется по воздуху, а сверкающие силуэты парят по небу.

Наш новый бодрый оптимизм привлек стаю Надежных Гиппогрифов! Изящные существа спускаются на землю, с интересом взмахивая перьями. «Похоже, что у нас появились новые друзья, которые помогают поддерживать дух, даже когда наши задачи сложны», - говорит Lemoness.

У Beffymaroo уже полная охапка пернатых пуховых питомцев. «Может быть, они помогут нам восстановить поврежденные районы Хабитики!»

С бормотанием и пением, Гиппогрифы, как и все хабитяне начинают работать вместе, чтобы восстановить наш любимый дом.", + "questDysheartenerCompletionChat": "`Гразочаровыватель ПОВЕРЖЕН!`\n\nВместе все хабитяне наносят последний удар по своим задачам, и Гразочаровыватель отступает назад, вскрикивая с тревогой. «Что случилось, Чарователь?» - зовет AnnDeLune, сверкая глазами. «Чувствуешь разочарование?»\n\nСветящиеся розовые переломы трескаются по панциру Гразочаровывателя, и он разбивается в клубок розового дыма. По мере того, как новое чувство бодрости и решимости проносится по всей земле, шквал восхитительных сладостей обрушивается на всех.\n\nТолпа приветствует дико, обнимая друг друга, а их питомцы счастливо жуют запах запоздалого Валентинова дня. Внезапно радостный хор песни распространяется по воздуху, а сверкающие силуэты парят по небу.\n\nНаш новый бодрый оптимизм привлек стаю Надежных Гиппогрифов! Изящные существа спускаются на землю, с интересом взмахивая перьями. «Похоже, что у нас появились новые друзья, которые помогают поддерживать дух, даже когда наши задачи сложны», - говорит Lemoness.\n\nУ Beffymaroo уже полная охапка из пернатых пуховых питомцев. «Может быть, они помогут нам восстановить поврежденные районы Хабитики!»\n\nС бормотанием и пением, Гиппогрифы, как и все хабитяне начинают работать вместе, чтобы восстановить наш любимый дом.", + "questDysheartenerBossRageTitle": "Сокрушение надежд", + "questDysheartenerBossRageDescription": "Шкала ярости заполняется, если игроки Habitica пропускают ежедневные задания. Когда шкала заполнится, Гразочаровыватель атакует Сокрушением надежд одного из владельцев магазинов Habitica. Обязательно выполняйте свои задания!", + "questDysheartenerBossRageSeasonal": "`Гразочаровыватель применяет СОКРУШЕНИЕ НАДЕЖД!`\n\nО нет! Пожрав наши не сделанные задания, Гразочаровыватель набрал силу на удар Сокрушения надежд. С пронзительным воплем он опускает свои острые передние лапы на павилион, где находится Сезонная лавка! Сокрушительный удар магии разносит магазин в щепки, а Сезонная волшебница от этого зрелища погружается в глубокую скорбь.\n\nБыстрее, давайте продолжим выполнять наши ежедневки, чтобы чудище больше не атаковало!", + "seasonalShopRageStrikeHeader": "Сезонная лавка атакована!", + "seasonalShopRageStrikeLead": "Лесли убита горем.", + "seasonalShopRageStrikeRecap": "21 февраля совершенно разорена наша дорогая Лесли, Сезонная чародейка: Гразочаровыватель разнёс Сезонную лавку. Скорее, завершайте ваши задания, чтобы победить этого монстра и помочь ей отстроить магазин снова!", + "questDysheartenerBossRageMarket": "`Гразочаровыватель применяет СОКРУШЕНИЕ НАДЕЖД!`\n\nПомогите! После пиршества на наших невыполненных ежедневных делах, Гразочаровыватель предпринимает другую сокрушительную атаку, ломая стены и пол рынка! И пока оседает каменная крошка, торговец Александр плачет о своем разбитом, пострадавшем от разрушения товаре.\n\nМы не можем позволить этому случиться снова! Обязательно выполняйте все ваши ежедневные задания, чтобы не дать Гразочаровывателю нанести свой финальный удар.", + "questDysheartenerBossRageQuests": "`Гразочаровыватель применяет СОКРУШЕНИЕ НАДЕЖД!`\n\nАааа! Мы оставили свои ежедневные дела снова, и Гразочаровыватель собрал энергию на еще один, окончательный удар против наших любимых лавочников. Сельская местность вокруг Яна Квест-мастера разрывается на части от его надеждосокрушающей атаки, и Яна поражает до глубины этим ужасным зрелищем. Мы так близки к победе над этим монстром ... Скорее! Не останавливайтесь!", + "questDysheartenerDropHippogriffPet": "Обнадеживающий Гиппогриф (питомец)", + "questDysheartenerDropHippogriffMount": "Надежный Гиппогриф (Скакун)", + "dysheartenerArtCredit": "Графика от @AnnDeLune" } \ No newline at end of file diff --git a/website/common/locales/ru/subscriber.json b/website/common/locales/ru/subscriber.json index d901bf5cf5..b681b67926 100644 --- a/website/common/locales/ru/subscriber.json +++ b/website/common/locales/ru/subscriber.json @@ -40,7 +40,7 @@ "cancelSub": "Отмена подписки", "cancelSubInfoGoogle": "Пожалуйста, зайдите в раздел \"Аккаунт\" > \"Подписки\" приложения Google Play Маркет, чтобы отменить свою подписку или увидеть дату завершения подписки, если вы уже отменили её. Этот экран не может показать вам, отменили ли вы свою подписку.", "cancelSubInfoApple": "Пожалуйста используйте Официальный инструкции Apple для отмены своей подписки или для просмотра даты завершения подписки, если вы уже её отменили. Этот экран не может показать вам, отменили ли вы свою подписку.", - "cancelSubInfoGroupPlan": "Because you have a free subscription from a Group Plan, you cannot cancel it. It will end when you are no longer in the Group. If you are the Group leader and want to cancel the entire Group Plan, you can do that from the group's \"Payment Details\" tab.", + "cancelSubInfoGroupPlan": "Поскольку у вас есть бесплатная подписка из группового плана, вы не можете отменить ее. Она закончится, когда вы больше не будете находится в группе. Если вы лидер группы и хотите отменить весь групповой план, вы можете сделать это на вкладке Детали платежа вашей группы.", "canceledSubscription": "Подписка отменена", "cancelingSubscription": "Отмена подписки", "adminSub": "Подписки администратора", @@ -137,8 +137,9 @@ "mysterySet201709": "Набор ученика-чародея", "mysterySet201710": "Набор могущественного беса", "mysterySet201711": "Набор наездника ковра", - "mysterySet201712": "Candlemancer Set", - "mysterySet201801": "Frost Sprite Set", + "mysterySet201712": "Набор Свечника", + "mysterySet201801": "Набор морозного Духа", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Стандартный Стимпанковый набор", "mysterySet301405": "Набор аксессуаров в стиле Стимпанка", "mysterySet301703": "Набор Стимпанк Павлина", @@ -191,7 +192,7 @@ "gemBenefitLeadin": "Самоцветы дают возможность купить веселые дополнения для аккаунта, в том числе:", "gemBenefit1": "Уникальные и стильные костюмы для вашего аватара", "gemBenefit2": "Фоны для вовлечения Вашего аватара в страну Habitica!", - "gemBenefit3": "Exciting Quest chains that drop pet eggs.", + "gemBenefit3": "Потрясающие квестовые серии, дающие трофейные яйца питомцев.", "gemBenefit4": "Сбросьте распределение очков аватара и поменяйте класс", "subscriptionBenefitLeadin": "Станьте подписчиком, и вы получите следующие преимущества:", "subscriptionBenefit1": "торговец Александр продаст Вам самоцветы по 20 золота за каждый", @@ -202,7 +203,7 @@ "subscriptionBenefit6": "Зарабатывайте Мистические песочные часы для использования в магазине Путешественников во времени!", "haveCouponCode": "У вас есть код купона?", "subscriptionAlreadySubscribedLeadIn": "Спасибо за подписку!", - "subscriptionAlreadySubscribed1": "To see your subscription details and cancel, renew, or change your subscription, please go to User icon > Settings > Subscription.", + "subscriptionAlreadySubscribed1": "Чтобы просмотреть свои данные о подписке и отменить, продлить или изменить её, пожалуйста перейдите по Иконке профилья > Настройки > Подписка.", "purchaseAll": "Приобрести всё", "gemsPurchaseNote": "Подписчики могут купить кристаллы за золото! Чтобы было проще, вы можете просто добавить кристалл в колонку наград.", "gemsRemaining": "самоцветов осталось", diff --git a/website/common/locales/sk/character.json b/website/common/locales/sk/character.json index f727942278..ec6d29af89 100644 --- a/website/common/locales/sk/character.json +++ b/website/common/locales/sk/character.json @@ -64,6 +64,7 @@ "classBonusText": "Tvoje povolanie (ak nemáš odomknuté alebo zvolené iné povolanie, si bojovník) používa vlastný výstroj efektívnejšie než výstroj iných povolaní. Výstroj tvojho aktuálneho povolania vylepší vlastnosť, ktorú poskytuje ešte o 50 %. ", "classEquipBonus": "Bonus za povolanie", "battleGear": "Bojová výzbroj", + "gear": "Gear", "battleGearText": "Toto je výzbroj, ktorú nosíš do boja; ovplyvňuje čísla pri interakcii s úlohami.", "autoEquipBattleGear": "Automaticky sa vybaviť novým výstrojom", "costume": "Kostým", @@ -91,13 +92,13 @@ "xp": "XP", "health": "Zdravie", "allocateStr": "Body pridelené do Sily:", - "allocateStrPop": "Add a Point to Strength", + "allocateStrPop": "Pridať body do Sily", "allocateCon": "Body pridelené do Odolnosti:", "allocateConPop": "Add a Point to Constitution", "allocatePer": "Body pridelené do Postrehu:", "allocatePerPop": "Add a Point to Perception", "allocateInt": "Body pridelené do Inteligencie:", - "allocateIntPop": "Add a Point to Intelligence", + "allocateIntPop": "Pridať bod do Inteligencie", "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", "stats": "Štatistiky", "achievs": "Odznaky", @@ -128,8 +129,8 @@ "changeClass": "Change Class, Refund Stat Points", "lvl10ChangeClass": "Aby si mohol zmeniť povolanie, musíš byť aspoň level 10.", "changeClassConfirmCost": "Are you sure you want to change your class for 3 Gems?", - "invalidClass": "Invalid class. Please specify 'warrior', 'rogue', 'wizard', or 'healer'.", - "levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.", + "invalidClass": "Nesprávne povolanie. Špecifikuj prosím 'bojovník', 'zlodej', 'kúzelník' alebo 'liečiteľ',", + "levelPopover": "Každý level získaš jeden Bod, ktorý môžeš ľubovolne rozdeliť do Vlastností. Môžeš tak spraviť manuálne, alebo nechať hru rozhodnúť použitím možnosti Automaticky Prerozdeliť.", "unallocated": "Unallocated Stat Points", "haveUnallocated": "You have <%= points %> unallocated Stat Point(s)", "autoAllocation": "Automatické pridelenie", @@ -209,7 +210,7 @@ "joined": "Joined", "totalLogins": "Total Check Ins", "latestCheckin": "Latest Check In", - "editProfile": "Edit Profile", + "editProfile": "Upraviť profil", "challengesWon": "Challenges Won", "questsCompleted": "Quests Completed", "headAccess": "Head Access.", @@ -217,7 +218,7 @@ "bodyAccess": "Body Access.", "mainHand": "Main-Hand", "offHand": "Off-Hand", - "pointsAvailable": "Points Available", - "pts": "pts", + "pointsAvailable": "Voľné body", + "pts": "body", "statsObjectRequired": "Stats update is required" } \ No newline at end of file diff --git a/website/common/locales/sk/faq.json b/website/common/locales/sk/faq.json index 0307fb25c2..4621f0be77 100644 --- a/website/common/locales/sk/faq.json +++ b/website/common/locales/sk/faq.json @@ -20,10 +20,10 @@ "iosFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you tap a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your Party and one of your Party mates did not complete all their Dailies, the Boss will attack you.\n\n The main way to heal is to gain a level, which restores all your health. You can also buy a Health Potion with gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. If you are in a Party with a Healer, they can heal you as well.", "androidFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you tap a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your Party and one of your Party mates did not complete all their Dailies, the Boss will attack you.\n\n The main way to heal is to gain a level, which restores all your health. You can also buy a Health Potion with gold from the Rewards tab on the Tasks page. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. If you are in a Party with a Healer, they can heal you as well.", "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", - "faqQuestion5": "How do I play Habitica with my friends?", + "faqQuestion5": "Ako si zahrám Habitiku so svojimi priateľmi?", "iosFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to Menu > Party and click \"Create New Party\" if you don't already have a Party. Then tap on the Members list, and tap Invite in the upper right-hand corner to invite your friends by entering their User ID (a string of numbers and letters that they can find under Settings > Account Details on the app, and Settings > API on the website). On the website, you can also invite friends via email, which we will add to the app in a future update.\n\nOn the website, you and your friends can also join Guilds, which are public chat rooms. Guilds will be added to the app in a future update!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Ako získam zvieratko alebo tátoša?", "iosFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch Egg.\" Then choose a hatching potion to determine its color! Go to Menu > Pets to equip your new Pet to your avatar by clicking on it. \n\n You can also grow your Pets into Mounts by feeding them under Menu > Pets. Tap on a Pet, and then select \"Feed Pet\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once you have a Mount, go to Menu > Mounts and tap on it to equip it to your avatar.\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/sk/front.json b/website/common/locales/sk/front.json index 1d8af42b74..0440d15f86 100644 --- a/website/common/locales/sk/front.json +++ b/website/common/locales/sk/front.json @@ -21,13 +21,13 @@ "chores": "Každodenná práca okolo domu", "clearBrowserData": "Prečisti si prehliadač", "communityBug": "Odoslať bug", - "communityExtensions": "Add-ons & Extensions", + "communityExtensions": "Doplnky a Rozšírenia", "communityFacebook": "Facebook", "communityFeature": "Navrhnúť funkciu", - "communityForum": "Forum", + "communityForum": "Fórum", "communityKickstarter": "Kickstarter", "communityReddit": "Reddit", - "companyAbout": "How It Works", + "companyAbout": "Ako to funguje", "companyBlog": "Blog", "devBlog": "Blog vývojárov", "companyContribute": "Contribute", @@ -39,10 +39,10 @@ "dragonsilverQuote": "I can't tell you how many time and task tracking systems I've tried over the decades... [Habitica] is the only thing I've used that actually helps me get things done rather than just list them.", "dreimQuote": "When I discovered [Habitica] last summer, I had just failed about half of my exams. Thanks to the Dailies... I was able to organize and discipline myself, and I actually passed all my exams with really good grades a month ago.", "elmiQuote": "Každé ráno sa teším na to, že vstanem a získam nejaké peniaze!", - "forgotPassword": "Forgot Password?", + "forgotPassword": "Zabudnuté heslo", "emailNewPass": "Email a Password Reset Link", - "forgotPasswordSteps": "Enter the email address you used to register your Habitica account.", - "sendLink": "Send Link", + "forgotPasswordSteps": "Zadaj emailovú adresu, ktorú si použil/a pri registrácii svojho Habitica účtu.", + "sendLink": "Pošli odkaz", "evagantzQuote": "My very first dentist appointment where the hygienist was actually excited about my flossing habits. Thanks [Habitica]!", "examplesHeading": "Players use Habitica to manage...", "featureAchievementByline": "Robíš niečo úplne úžasné? Získaj odznak a pochváľ sa!", diff --git a/website/common/locales/sk/gear.json b/website/common/locales/sk/gear.json index 141916ebee..d8b641451e 100644 --- a/website/common/locales/sk/gear.json +++ b/website/common/locales/sk/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Basic Top Hat", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/sk/generic.json b/website/common/locales/sk/generic.json index a2a1296a2d..4c15b94b3c 100644 --- a/website/common/locales/sk/generic.json +++ b/website/common/locales/sk/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/sk/groups.json b/website/common/locales/sk/groups.json index b98f22c46f..8ddc0796cb 100644 --- a/website/common/locales/sk/groups.json +++ b/website/common/locales/sk/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Party On", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Poznámka: Tento Cech je práve príliš veľký, aby podporoval upozornenia! Uisti sa, že prídeš každý deň, aby si videl nové správy.", "groupIdRequired": "\"groupId\" musí mať platné UUID", "groupNotFound": "Skupina nebola nájdená alebo nemáš povolenie.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Družiny musia byť súkromné", - "userAlreadyInGroup": "Používateľ už je v skupine.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Nemôžeš pozvať sám seba do skupiny.", - "userAlreadyInvitedToGroup": "Používateľ už je pozvaný do skupiny.", - "userAlreadyPendingInvitation": "Používateľ už má pozvánku.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Používateľ s ID \"<%= userId %>\" sa nenašiel.", "userHasNoLocalRegistration": "Používateľ tu nie je registrovaný (meno, e-mail, heslo).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/sk/limited.json b/website/common/locales/sk/limited.json index ff17ef55b8..9c2dcc30ba 100644 --- a/website/common/locales/sk/limited.json +++ b/website/common/locales/sk/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh... Vitaj v Sezónnom obchode... Máme tu jesennú Sezónnu edíciu vecičiek, alebo také niečo... Všetko čo tu vidíš si môžeš kúpiť počas Fall Festivalu každý rok, ale máme otvorené len do 31. Októbra... Myslím, že by si si mal niečo kúpiť teraz, inak budeš musieť čakať... a čakať... a čakať... *povzdych*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Rogue)", diff --git a/website/common/locales/sk/questscontent.json b/website/common/locales/sk/questscontent.json index fe8217cfec..4d8a847fd8 100644 --- a/website/common/locales/sk/questscontent.json +++ b/website/common/locales/sk/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/sk/subscriber.json b/website/common/locales/sk/subscriber.json index 1d4f9ad9f8..2acdaaf80d 100644 --- a/website/common/locales/sk/subscriber.json +++ b/website/common/locales/sk/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/sr/character.json b/website/common/locales/sr/character.json index 531ede82a3..f0dc4f57f6 100644 --- a/website/common/locales/sr/character.json +++ b/website/common/locales/sr/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Bonus klase", "battleGear": "Borbena oprema", + "gear": "Gear", "battleGearText": "Oprema u kojoj se borite. Utiče na interakciju sa zadacima.", "autoEquipBattleGear": "Automatski stavi novu opremu", "costume": "Kostim", diff --git a/website/common/locales/sr/faq.json b/website/common/locales/sr/faq.json index d36c6d721d..0ef6b42b6b 100644 --- a/website/common/locales/sr/faq.json +++ b/website/common/locales/sr/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Kako da igram Habitiku sa svojim prijateljima?", "iosFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to Menu > Party and click \"Create New Party\" if you don't already have a Party. Then tap on the Members list, and tap Invite in the upper right-hand corner to invite your friends by entering their User ID (a string of numbers and letters that they can find under Settings > Account Details on the app, and Settings > API on the website). On the website, you can also invite friends via email, which we will add to the app in a future update.\n\nOn the website, you and your friends can also join Guilds, which are public chat rooms. Guilds will be added to the app in a future update!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "How do I get a Pet or Mount?", "iosFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch Egg.\" Then choose a hatching potion to determine its color! Go to Menu > Pets to equip your new Pet to your avatar by clicking on it. \n\n You can also grow your Pets into Mounts by feeding them under Menu > Pets. Tap on a Pet, and then select \"Feed Pet\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once you have a Mount, go to Menu > Mounts and tap on it to equip it to your avatar.\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/sr/gear.json b/website/common/locales/sr/gear.json index 4c17a57141..0b41fa399d 100644 --- a/website/common/locales/sr/gear.json +++ b/website/common/locales/sr/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Stimpank odelo", "armorMystery301404Notes": "Kicoško i zanosno! Ne daje nikakav bonus. Predmet za pretplatnike februar 3015..", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Otmeni cilindar", "headMystery301404Notes": "Otmeni cilindar za pripadnike visokog društva! Predmet za pretplatnike januar 3015. Ne daje nikakav bonus.", "headMystery301405Text": "Jednostavni cilindar", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Štit sa kazaljkama", "shieldMystery301405Notes": "Sa ovim impozantnim štitom uvek imate dovoljno vremena. Ne daje nikakav bonus. Predmet za pretplatnike jun 3015.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/sr/generic.json b/website/common/locales/sr/generic.json index c377f5ed7c..334e949624 100644 --- a/website/common/locales/sr/generic.json +++ b/website/common/locales/sr/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/sr/groups.json b/website/common/locales/sr/groups.json index 0ef71c291a..d16c4ad6b0 100644 --- a/website/common/locales/sr/groups.json +++ b/website/common/locales/sr/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Party On", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "User with id \"<%= userId %>\" not found.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/sr/limited.json b/website/common/locales/sr/limited.json index 299d883d0a..a106ac3c18 100644 --- a/website/common/locales/sr/limited.json +++ b/website/common/locales/sr/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until October 31... I guess you should to stock up now, or you'll have to wait... and wait... and wait... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Šećerna oprema (Čarobnjak)", "skiSet": "Skijaška oprema (Odmetnik)", diff --git a/website/common/locales/sr/questscontent.json b/website/common/locales/sr/questscontent.json index ffeea84dbc..9d0ef27685 100644 --- a/website/common/locales/sr/questscontent.json +++ b/website/common/locales/sr/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/sr/subscriber.json b/website/common/locales/sr/subscriber.json index 381133bd7d..36b4a4e72b 100644 --- a/website/common/locales/sr/subscriber.json +++ b/website/common/locales/sr/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/sv/character.json b/website/common/locales/sv/character.json index ba968576fe..b4d4ac961a 100644 --- a/website/common/locales/sv/character.json +++ b/website/common/locales/sv/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Klassbonus", "battleGear": "Stridsutrustning", + "gear": "Gear", "battleGearText": "Detta är den utrustning som du bär i strid och den påverkar siffrorna när du hanterar dina uppgifter.", "autoEquipBattleGear": "Använd ny utrustning automatiskt ", "costume": "Dräkt", diff --git a/website/common/locales/sv/faq.json b/website/common/locales/sv/faq.json index f9cb62a762..d861d68497 100644 --- a/website/common/locales/sv/faq.json +++ b/website/common/locales/sv/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Hur spelar jag Habitica med mina vänner?", "iosFaqAnswer5": "Det bästa sättet är att bjuda in de till en grupp med dig! Grupper kan göra uppdrag, slåss mot monster och använda krafter för att hjälpa varandra. Gå till menyn > Grupp och tryck \"Skapa en ny grupp\" om du inte redan har en grupp. Tryck sedan på medlems listan och tryck bjud in i det övre högra hörnet för att kunna bjuda in de genom att skriva in deras Användar - ID (en text med siffror och bokstäver som de kan hitta vid Inställningar > Profil i appen och Inställningar > API på hemsidan). På hemsidan kan du också bjuda in vänner med deras mejl address, denna funktion kommer vi lägga till i appen i framtiden.\n\nPå hemsidan kan du och dina vänner också gå med i klaner som är publika chatt rum. Klaner kommer att bli tillagda i appen i en framtida uppdatering.", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Hur skaffar jag ett Husdjur eller ett Riddjur?", "iosFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch Egg.\" Then choose a hatching potion to determine its color! Go to Menu > Pets to equip your new Pet to your avatar by clicking on it. \n\n You can also grow your Pets into Mounts by feeding them under Menu > Pets. Tap on a Pet, and then select \"Feed Pet\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). Once you have a Mount, go to Menu > Mounts and tap on it to equip it to your avatar.\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/sv/gear.json b/website/common/locales/sv/gear.json index b3ce78b571..48d09e954e 100644 --- a/website/common/locales/sv/gear.json +++ b/website/common/locales/sv/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk-dräkt", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Stilig cylinderhatt", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Vanlig cylinderhatt", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Klocksköld", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/sv/generic.json b/website/common/locales/sv/generic.json index 53fa7ec6b2..d130c4c239 100644 --- a/website/common/locales/sv/generic.json +++ b/website/common/locales/sv/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's tema", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Tema", "audioTheme_arashiTheme": "Arashi's Tema", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Tema", "audioTheme_spacePenguinTheme": "SpacePenguin's Tema", "audioTheme_maflTheme": "MAFL Tema", diff --git a/website/common/locales/sv/groups.json b/website/common/locales/sv/groups.json index 3becae4c5e..3f121ae018 100644 --- a/website/common/locales/sv/groups.json +++ b/website/common/locales/sv/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Sällskapa vidare", "partyUpText": "Gick med i ett Sällskap med en annan person! Ha så kul med att slåss mot monster och att stötta varandra.", "partyOnText": "Gick med i ett Sällskap med minst fyra personer! Njut av din ökade ansvarhet medans du förenar med dina vänner för att utplåna era fiender!", - "largeGroupNote": "Observera att detta gille är för stort för att skicka notiser! Titta in varje dag för att se nya meddelanden\"", "groupIdRequired": "\"groupId\" måste vara en giltig UUID", "groupNotFound": "Gruppen hittades inte eller så har du inte tillträde till den.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Saknar användar id i inbjudan", "inviteMustNotBeEmpty": "Inbjudan kan inte vara tom.", "partyMustbePrivate": "Sällskapen måste vara privata", - "userAlreadyInGroup": "Användaren är redan i den gruppen.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Du kan inte bjuda in dig själv till en grupp.", - "userAlreadyInvitedToGroup": "Användare är redan inbjuden till den gruppen.", - "userAlreadyPendingInvitation": "Användare har redan en avvaktande inbjudan.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "Användaren med id \"<%= userId %>\" hittades inte.", "userHasNoLocalRegistration": "Användaren är inte lokalt registrerad (användarnamn, e-post, lösenord).", "uuidsMustBeAnArray": "Användar-ID inbjudningar måste vara i ordning.", @@ -417,11 +416,13 @@ "managerAdded": "Direktör lades till", "managerRemoved": "Direktör togs bort", "leaderChanged": "Ledaren har blivit utbytt", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/sv/limited.json b/website/common/locales/sv/limited.json index 852d85feed..80a4958144 100644 --- a/website/common/locales/sv/limited.json +++ b/website/common/locales/sv/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Glad Höstfestival!! Vill du köpa några sällsynta objekt? Dom kommer bara vara tillgängliga till 31:a Oktober!", "seasonalShopWinterText": "Glatt Vinterland!! Vill du köpa sällsynta objekt? De kommer bara vara tillgängliga tills 31:a Januari!", "seasonalShopFallTextBroken": "Åh.... Välkommen till Säsongsbutiken... Vi har höst-Säsongsutgåveföremål i lager, eller något... Allt här är tillgängligt att köpa under Höstfestivalsevenemanget varje år, men vi har bara öppet till 31 oktober... Jag antar att du borde köpa på dig föremål nu, eller så får du vänta... och vänta... och vänta... *suck*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Om du har köpt någon av denna utrustning tidigare, men inte äger den just nu så kan du köpa den igen i belöningskolumnen. Till att börja med kan du endast köpa föremål för din nuvarande klass (Krigare som standard), men var inte orolig, de andra klass-specifika föremålen blir tillgängliga om du byter till den klassen.", "candycaneSet": "Polkagris (Magiker)", "skiSet": "Skidninja (Tjuv)", diff --git a/website/common/locales/sv/questscontent.json b/website/common/locales/sv/questscontent.json index 0e442d9f99..62af051ae7 100644 --- a/website/common/locales/sv/questscontent.json +++ b/website/common/locales/sv/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/sv/subscriber.json b/website/common/locales/sv/subscriber.json index 08c6cc955b..605523a44d 100644 --- a/website/common/locales/sv/subscriber.json +++ b/website/common/locales/sv/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Matt-ryttare Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Tillbehör Set", "mysterySet301703": "Påfågel Steampunk Set", diff --git a/website/common/locales/tr/character.json b/website/common/locales/tr/character.json index 8b99a34255..ac20f92fa3 100644 --- a/website/common/locales/tr/character.json +++ b/website/common/locales/tr/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Sınıf Bonusu", "battleGear": "Savaş Ekipmanı", + "gear": "Gear", "battleGearText": "Bu, savaşta giydiğin ekipmandır; işlerinle etkileşime girerken sayıları etkiler.", "autoEquipBattleGear": "Yeni ekipmanı otomatik kullan", "costume": "Kostüm", diff --git a/website/common/locales/tr/faq.json b/website/common/locales/tr/faq.json index a5cd5a207c..e1be7fb670 100644 --- a/website/common/locales/tr/faq.json +++ b/website/common/locales/tr/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "Hasar almana neden olan birkaç şey vardır. Öncelikle, Günlük İşlerini yerine getirmediğin günün sonunda hasar alırsın. İkinci olarak, kötü bir Alışkanlığa tıklarsan yine hasar alırsın. Sonuncu olarak da, takımınla birlikte bir Canavar Savaşındaysan ve takım arkadaşlarından birisi Günlük İşlerini tamamlamadıysa Canavar hepinize saldıracaktır. \nİyileşmenin ana yolu seviye atlamaktır; bu, tüm Sağlığını geri getirir. İstersen Ödüller kısmından Altın karşılığı Sağlık İksiri de alabilirsin. Ayrıca, 10. seviyede veya üstündeysen Şifacı olmayı seçebilir ve iyileştirme yeteneklerini öğrenebilirsin. Takımında bir Şifacı varsa o da seni iyileştirebilir.", "faqQuestion5": "Habitica'yı arkadaşlarımla nasıl oynarım?", "iosFaqAnswer5": "En iyi yolu onları birlikte bir Takıma davet etmektir! Takımlar birbirini desteklemek için görevlere çıkabilir, canavarlarla savaşabilir ve yeteneklerini kullanabilirler. Mevcut Takımın yoksa Menü > Takım sekmesine gidip \"Yeni Takım Oluştur\"a tıkla. Arkadaşlarını Kullanıcı ID'leri (uygulamada Ayarlar > Hesap Bilgileri, sitede Ayarlar > API altında bulabilecekleri bir dizi sayı ve harf) ile davet etmek için Üyeler listesine, ardından sağ üst köşedeki Davet Et'e dokun. Web sitesinde ayrıca e-posta yoluyla da arkadaşlarını davet edebilirsin. Gelecekteki bir güncellemede bu özelliği uygulamaya da ekleyeceğiz.\n\nWeb sitesinde arkadaşların ve sen açık sohbet odaları olan Loncalara katılabilirsiniz. Loncalar gelecekteki bir güncellemede uygulamaya da eklenecektir!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Nereden evcil hayvan ya da binek bulacağım?", "iosFaqAnswer6": "3. seviyede, Eşya Düşme Sistemi açılır. Her görev tamamlayışında rastgele bir yumurta, kuluçka iksiri ya da yiyeceğin eline geçme şansı olur. Buradan düşenler Menü > Envanter sekmesi altında bulunur.\n\nYumurtadan hayvan çıkartmak için bir yumurta ve bir kuluçka iksiri gerekir. Elde etmek istediğin türü seçmek için yumurtaya dokunup \"Yumurtayı Aç\"a tıkla. Daha sonra rengini belirlemek için bir kuluçka iksiri seç! Yeni hayvanını avatarına eklemek için Menü > Hayvanlar sekmesine gidip hayvanın üzerine tıkla.\n\nMenü > Hayvanlar sekmesinde Hayvanlarını besleyip büyüterek Bineğe dönüştürebilirsin. Bir Hayvana dokun ve ardından \"Hayvanı Besle\"yi seç! Bir hayvanı binek yapmak için birçok kez beslemek gerekir ama favori yiyeceğini bulursan, hayvan daha hızlı büyüyecektir. Deneme yanılma yap veya [buradaki spoiler'lara bak](http://tr.habitica.wikia.com/wiki/Yiyecek#Yiyecek_Tercihleri). Bir Bineğin olduğunda avatarını bindirmek için Menü > Binekler sekmesine gidip üzerine dokun.\n\nAyrıca bazı Görevleri tamamlayarak Görev Hayvanlarının yumurtalarını elde edebilirsin. (Görevler hakkında daha fazla bilgi için aşağıya bak.)", "androidFaqAnswer6": "3. seviyede, Eşya Düşme Sistemi açılır. Her görev tamamlayışında rastgele bir yumurta, kuluçka iksiri ya da yiyeceğin eline geçme şansı olur. Buradan düşenler Menü > Envanter sekmesi altında bulunur.\n\nYumurtadan hayvan çıkartmak için bir yumurta ve bir kuluçka iksiri gerekir. Elde etmek istediğin türü seçmek için yumurtaya dokunup \"Yumurtayı iksirle aç\"a tıkla. Daha sonra rengini belirlemek için bir kuluçka iksiri seç! Yeni Hayvanını yanına almak için Menü > Ahır > Hayvanlar sekmesine git, bir türü seç, istediğin Hayvana tıkla ve \"Kullan\" seçeneğini seç (Avatarın değişikliği yansıtmak için güncellenmeyecektir).\n\nMenü > Ahır [ > Hayvanlar ] sekmesinde Hayvanlarını besleyip büyüterek Bineğe dönüştürebilirsin. Bir Hayvana dokun ve ardından \"Besle\"yi seç! Bir hayvanı binek yapmak için birçok kez beslemek gerekir ama favori yiyeceğini bulursan, hayvan daha hızlı büyüyecektir. Deneme yanılma yap veya [buradaki spoiler'lara bak](http://tr.habitica.wikia.com/wiki/Yiyecek#Yiyecek_Tercihleri). Bineğine binmek için Menü > Ahır > Binekler sekmesine git, bir tür seç, istediğin Bineğe tıkla ve \"Kullan\" seçeneğini seç (Avatarın değişikliği yansıtmak için güncellenmeyecektir).\n\nAyrıca bazı Görevleri tamamlayarak Görev Hayvanlarının yumurtalarını elde edebilirsin. (Görevler hakkında daha fazla bilgi için aşağıya bak.)", diff --git a/website/common/locales/tr/gear.json b/website/common/locales/tr/gear.json index 5ec8242dcc..a8d5289c8c 100644 --- a/website/common/locales/tr/gear.json +++ b/website/common/locales/tr/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Takım", "armorMystery301404Notes": "Şık ve enerjik, tam gaz! Bir fayda sağlamaz. Şubat 3015 Abone Eşyası.", "armorMystery301703Text": "Steampunk Tavuskuşu Cübbesi", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Süslü Silindir Şapka", "headMystery301404Notes": "Centilmenlerin en iyisine layık, süslü bir silindir şapka! Ocak 3015 Abone Eşyası. Bir fayda sağlamaz.", "headMystery301405Text": "Sade Silindir Şapka", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "Erimiş kayadan oluşan bu engebeli kalkan seni kötü alışkanlıklardan korur ancak ellerini yakmaz. Bir fayda sağlamaz. Ağustos 2017 Abone Eşyası.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Saat Kalkanı", "shieldMystery301405Notes": "Bu yükselen saat kalkanı ile zaman senin tarafında! Bir fayda sağlamaz. Haziran 3015 Abone Eşyası.", "shieldMystery301704Text": "Sallanan Yelpaze", diff --git a/website/common/locales/tr/generic.json b/website/common/locales/tr/generic.json index 353d5679f2..8c8ffe9df1 100644 --- a/website/common/locales/tr/generic.json +++ b/website/common/locales/tr/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu'nun Teması", "audioTheme_beatscribeNesTheme": "Beatscribe'ın NES Melodisi", "audioTheme_arashiTheme": "Arashi'nin Melodisi", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/tr/groups.json b/website/common/locales/tr/groups.json index d3fa5e11da..0d0582aaf9 100644 --- a/website/common/locales/tr/groups.json +++ b/website/common/locales/tr/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Takım Çalışması", "partyUpText": "Bir başka kişi ile birlikte bir takıma katıldın! Birbirinize destek olurken ve canavarlarla savaşırken eğlenin.", "partyOnText": "En az dört kişiden oluşan bir takıma katıldın! Düşmanlarınızı yok etmek için arkadaşlarınla birleşirken artan sorumluluğunun tadını çıkar!", - "largeGroupNote": "Not: Bu Lonca, bildirimleri desteklemek için çok büyüktür! Yeni mesajları görmek için her gün kontrol etmeyi unutma.", "groupIdRequired": "\"groupID\" geçerli bir UUID olmalıdır", "groupNotFound": "Grup bulunamadı veya erişimin bulunmuyor.", "groupTypesRequired": "Geçerli \"type\" içerisinde bir sorgu dizisi sağlamalısın.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Davet etmek için eksik kullanıcı ID'si", "inviteMustNotBeEmpty": "Davet boş bırakılmamalı.", "partyMustbePrivate": "Gruplar özel olmalıdır.", - "userAlreadyInGroup": "Kullanıcı zaten bu grupta.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "Kendini bir gruba davet edemezsin.", - "userAlreadyInvitedToGroup": "Kullanıcı bu gruba zaten davet edilmiş.", - "userAlreadyPendingInvitation": "Kullanıcı zaten davetiyeyi inceliyor.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "\"<%= userId %>\" ID numaralı kullanıcı bulunmuyor.", "userHasNoLocalRegistration": "Kullanıcının yerel bir kaydı bulunmuyor (kullanıcı adı, e-mail, şifre).", "uuidsMustBeAnArray": "Kullanıcı ID davetleri sıralı olmalıdır.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/tr/limited.json b/website/common/locales/tr/limited.json index ce0ac6050b..f41d191b39 100644 --- a/website/common/locales/tr/limited.json +++ b/website/common/locales/tr/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Mutlu Güz Festivali! Birkaç seyrek eşya satın almak ister misiniz? Sadece 31 Ekim'e kadar geçerli!", "seasonalShopWinterText": "Mutlu Kış Harikalar Diyarı! Birkaç seyrek eşya satın almak ister misiniz? Sadece 31 Ocak'a kadar geçerli!", "seasonalShopFallTextBroken": "Oh... Mevsimsel Dükkana hoş geldin... Şu anda güz zamanı Mevsimsel Sürüm eşyalarımız var, ya da onun gibi bir şey... Buradaki her şey, her yıl Güz Festivali esnasında satın alınabilir ama yalnızca 31 Ekim'e kadar açığız... Herhalde şu anda stok yapman lazım, yoksa beklemen gerekecek... beklemen... beklemen... *off*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "Eğer geçmişte bu ekipmanlardan aldıysan ama şu anda sahip değilsen, Ödüller Sütunundan tekrar satın alabilirsin. İlk başta yalnızca şu anki sınıfının eşyalarını satın alabilirsin (varsayılan olarak Savaşçı) ancak endişe etme, sınıfa özel diğer ekipmanlar eğer o sınıfa geçiş yaparsan satın alınabilir hale gelecektir.", "candycaneSet": "Baston Şeker (Büyücü)", "skiSet": "Sui-kay-stçi (Düzenbaz)", diff --git a/website/common/locales/tr/questscontent.json b/website/common/locales/tr/questscontent.json index a6978bea3f..171af183a9 100644 --- a/website/common/locales/tr/questscontent.json +++ b/website/common/locales/tr/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/tr/subscriber.json b/website/common/locales/tr/subscriber.json index 2aed71e60a..0a0c20a1ef 100644 --- a/website/common/locales/tr/subscriber.json +++ b/website/common/locales/tr/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Standart Steampunk Seti", "mysterySet301405": "Steampunk Aksesuarları Seti", "mysterySet301703": "Tavuskuşu Steampunk Seti", diff --git a/website/common/locales/uk/character.json b/website/common/locales/uk/character.json index 61857e00ad..b01d9e2d27 100644 --- a/website/common/locales/uk/character.json +++ b/website/common/locales/uk/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "Класовий бонус", "battleGear": "Бойове спорядження", + "gear": "Gear", "battleGearText": "Ви використовуєте це спорядження в бою; воно впливає на числа під час взаємодії з вашими завданнями.", "autoEquipBattleGear": "Автоматично вдягати нове спорядження", "costume": "Костюм", diff --git a/website/common/locales/uk/faq.json b/website/common/locales/uk/faq.json index 371ad0670b..dda8d946dd 100644 --- a/website/common/locales/uk/faq.json +++ b/website/common/locales/uk/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "Як грати разом з друзями?", "iosFaqAnswer5": "Кращий спосіб - запросити їх в Ваш гурт! Гурти можуть приймати участь в квестах, битися з монстрами та чаклувати для підтримки один одного. Натисніть Меню > Гурт, а потім \"Створити новий гурт\", якщо Ви ще не маєте Гурту. Після цього натисніть на Список учасників і клацніть Запросити у верхньому правому кутку, щоб запросити друзів шляхом введення їх ID гравця (рядок цифр і букв, який можна знайти в меню Налаштування > Деталі акаунту в додатку, або Налаштування > API на вебсайті). На вебсайті Ви також можете запросити друзів за допомогою електронної адреси, в додатку це можна буде зробити після його оновлення.\n\nНа сайті Ви та Ваші друзі також можуть долучатися до Гільдій, які є публічними чатами. Гільдії будуть доступні в додатку в майбутньому оновленні!", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "Як я можу отримати домашнього улюбленця або їздову тварину?", "iosFaqAnswer6": "На 3 рівні Ви розблоковуєте систему нагород. Кожного разу коли Ви виконали Завдання, Ви маєте випадковий шанс отримати яйце, зілля чи їжу. Все отримане зберігається у Меню>Предмети. ", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/uk/gear.json b/website/common/locales/uk/gear.json index 6ac3796af2..86c54cbd5a 100644 --- a/website/common/locales/uk/gear.json +++ b/website/common/locales/uk/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Basic Top Hat", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/uk/generic.json b/website/common/locales/uk/generic.json index 9280a5052e..a3fdcb85b2 100644 --- a/website/common/locales/uk/generic.json +++ b/website/common/locales/uk/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/uk/groups.json b/website/common/locales/uk/groups.json index 321fa8c678..7290929364 100644 --- a/website/common/locales/uk/groups.json +++ b/website/common/locales/uk/groups.json @@ -202,7 +202,6 @@ "partyOnName": "Party On", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "User with id \"<%= userId %>\" not found.", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/uk/limited.json b/website/common/locales/uk/limited.json index 3b8c54de43..c96975c7ac 100644 --- a/website/common/locales/uk/limited.json +++ b/website/common/locales/uk/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until October 31... I guess you should to stock up now, or you'll have to wait... and wait... and wait... *sigh*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "Candy Cane (Mage)", "skiSet": "Ski-sassin (Rogue)", diff --git a/website/common/locales/uk/questscontent.json b/website/common/locales/uk/questscontent.json index 423cd1cae3..8992856485 100644 --- a/website/common/locales/uk/questscontent.json +++ b/website/common/locales/uk/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/uk/subscriber.json b/website/common/locales/uk/subscriber.json index c375dac0c6..55de621274 100644 --- a/website/common/locales/uk/subscriber.json +++ b/website/common/locales/uk/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/locales/zh/achievements.json b/website/common/locales/zh/achievements.json index 92e53b2e86..8f86c6e323 100644 --- a/website/common/locales/zh/achievements.json +++ b/website/common/locales/zh/achievements.json @@ -3,6 +3,6 @@ "onwards": "继续!", "levelup": "在完成你的任务后,你将升级并且恢复满你的生命值!", "reachedLevel": "你达到第<%= level %>级", - "achievementLostMasterclasser": "Quest Completionist: Masterclasser Series", - "achievementLostMasterclasserText": "Completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!" + "achievementLostMasterclasser": "完成任务的专家:大师鉴别者系列", + "achievementLostMasterclasserText": "完成大师鉴别者系列任务的全部6个任务,解开失传的大师鉴别者的神秘面纱!" } diff --git a/website/common/locales/zh/challenge.json b/website/common/locales/zh/challenge.json index ab50f57b5a..4953bb2d5a 100644 --- a/website/common/locales/zh/challenge.json +++ b/website/common/locales/zh/challenge.json @@ -6,8 +6,8 @@ "keepIt": "保留", "removeIt": "删除", "brokenChallenge": "无效的挑战链接:这项任务原本是挑战的一部分,但是该挑战 (或小组) 已经被删除了。你想怎么处置这项任务?", - "keepThem": "Keep Tasks", - "removeThem": "Remove Tasks", + "keepThem": "保留任务", + "removeThem": "移除任务", "challengeCompleted": "这个挑战已被完成,赢家是<%= user %>!你想怎么处置这项任务?", "unsubChallenge": "无效的挑战链接:这项任务本来是一个挑战的一部分,可是你取消了该挑战。你想怎么处置这项任务?", "challengeWinner": "赢得了以下挑战", diff --git a/website/common/locales/zh/character.json b/website/common/locales/zh/character.json index a0f7fd2a4d..7c28382fd3 100644 --- a/website/common/locales/zh/character.json +++ b/website/common/locales/zh/character.json @@ -1,7 +1,7 @@ { "communityGuidelinesWarning": "请注意您的用户名、头像和简介,必须遵从社区指南(例如,不能包含亵渎言论、成人话题及侮辱言论)。如果您对某件事是否适当有任何问题,欢迎发送电子邮件到 <%= hrefBlankCommunityManagerEmail %>!", "profile": "角色信息", - "avatar": "自订形象", + "avatar": "自定义形象", "editAvatar": "编辑角色形象", "noDescription": "这个Habitican没有添加描述。", "noPhoto": "这个Habitican没有添加图像", @@ -64,14 +64,15 @@ "classBonusText": "使用与职业相符道具时可以发挥比其他职业的道具更显著的效果。(如果您还未解锁职业,也没有选择其他职业,则您的默认职业是战士。)使用符合您当前职业的装备可令属性点获得50%加成。", "classEquipBonus": "职业奖励", "battleGear": "战斗装备", + "gear": "Gear", "battleGearText": "这是你在战斗中的装备;这会影响您在任务重的各项数值", "autoEquipBattleGear": "自动配备新装备", "costume": "服装", "costumeText": "如果你更喜欢其它装备的样子,勾选\"显示服装\"的按钮,在装备战斗装备的情况下换一个造型。", "useCostume": "显示服装", - "useCostumeInfo1": "Click \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can equip for the best Stats on the left, and dress up your avatar with your equipment on the right.", - "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your Stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", - "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", + "useCostumeInfo1": "点击“使用服装”来更换装备不影响你战斗装备的属性点,所以你可以在左边为你的人物最优属性点装备,右边为你的人物装备上好看的装备", + "useCostumeInfo2": "如果你点击“穿上服装”你的虚拟化身将看起来很普通...但是别担心!如果你注意左侧,你将看到你的战斗装备还装配着。下一步,你可以开始精心设计!你在左侧装备的东西不会影响你的数值,但是可以让你看起来超级酷。试试不同的套餐、混合搭配,并且将你的服装同你的宠物、坐骑、背景搭配起来。

还有更多问题?在wiki上查看这个服装页面。发现完美整体效果?把它展示在服装嘉年华公会或者去酒馆里炫耀一番!", + "costumePopoverText": "选择“使用服装”来装备你的角色形象不会影响你的战斗装备的属性点!这意味着你可以随便装扮你的角色,而不会改变你的最优属性点的战斗装备。", "autoEquipPopoverText": "选择此选项可以在购买后自动装备。", "costumeDisabled": "你已经脱下了你的服装。", "gearAchievement": "你因为得到了一个职业的装备组,所以你获得了成就“终极装备”!你已经得到了以下的全套装备:", @@ -98,7 +99,7 @@ "allocatePerPop": "增加一点感知", "allocateInt": "分配到智力的点数", "allocateIntPop": "增加一点智力", - "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", + "noMoreAllocate": "现在你已经达到了100级,你不会再获得任何属性点。你可以继续升级,或者使用 重生之球从1级开始新的冒险。现在重生之球在市场免费提供。", "stats": "状态", "achievs": "成就", "strength": "力量", @@ -110,12 +111,12 @@ "intelligence": "智力", "intText": "\"智力\"属性能提高你的经验值,解锁职业系统后,决定了你的最大魔法值。", "levelBonus": "等级加成", - "levelBonusText": "Each Stat gets a bonus equal to half of (your Level minus 1).", + "levelBonusText": "等级加成等于 (你的等级减1) 的一半.", "allocatedPoints": "分配的属性点", - "allocatedPointsText": "Stat Points you've earned and assigned. Assign Points using the Character Build column.", + "allocatedPointsText": "你获得了属性点并已经分配。使用角色设定栏目来分配你的点数。", "allocated": "分配", "buffs": "增益魔法", - "buffsText": "Temporary Stat bonuses from abilities and achievements. These wear off at the end of your day. The abilities you've unlocked appear in the Rewards list of your Tasks page.", + "buffsText": "当前从你的能力和成就中获得的属性加成。这些将在当天结束后消失。你所解锁的能力将会出现在任务界面的奖励栏里。", "characterBuild": "角色塑造", "class": "职业", "experience": "经验值", @@ -125,23 +126,23 @@ "mage": "法师", "wizard": "法师", "mystery": "神秘", - "changeClass": "Change Class, Refund Stat Points", + "changeClass": "更改职业,重新分配属性点", "lvl10ChangeClass": "你最少要到等級10才能變更職業。", "changeClassConfirmCost": "你确定你想使用3颗宝石来更换你的职业吗?", "invalidClass": "无效的职业。请指定'战士', '盗贼', '法师', 或'治愈师'。", - "levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.", - "unallocated": "Unallocated Stat Points", - "haveUnallocated": "You have <%= points %> unallocated Stat Point(s)", + "levelPopover": "每一级你可以获得一个可自由分配的属性点。你可以手动分配,或者让系统为你自动分配。", + "unallocated": "未分配的属性点", + "haveUnallocated": "你有<%= points %>点未分配的属性点", "autoAllocation": "自动分配", - "autoAllocationPop": "Places Points into Stats according to your preferences, when you level up.", - "evenAllocation": "Distribute Stat Points evenly", - "evenAllocationPop": "Assigns the same number of Points to each Stat.", - "classAllocation": "Distribute Points based on Class", - "classAllocationPop": "Assigns more Points to the Stats important to your Class.", - "taskAllocation": "Distribute Points based on task activity", - "taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.", + "autoAllocationPop": "升级后,请将技能点分配到你喜欢的属性.", + "evenAllocation": "平均分配属性点", + "evenAllocationPop": "所有属性平均分配技能点.", + "classAllocation": "根据职业分配属性点", + "classAllocationPop": "分配更多的技能点到对你职业有用的属性.", + "taskAllocation": "根据任务分配技能点", + "taskAllocationPop": "根据力量,智力,体质分配属性点,感知类别与你完成的任务相关。", "distributePoints": "配置未分配的属性点", - "distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.", + "distributePointsPop": "根据你所选择的方法来分配所有未分配的属性点。", "warriorText": "战士们会有更大的机率触发暴击并在完成任务时随机获得额外的金币,经验和掉率。他们还能对boss造成严重的伤害。如果你希望获得随机性的奖励,或者在boss任务中重创boss,来玩战士吧!", "wizardText": "法师相比其他职业,拥有可以通过快速学习来更快的获得经验和等级提升的优势。他们在使用特殊技能时也会获得大量的法力。如果你热衷于habitica游戏里策略性部分,或者是如果升级和解锁高级功能为你提供强大动力的话,那就来当个法师吧!", "mageText": "法师相比其他职业,拥有可以通过快速学习来更快的获得经验和等级提升的优势。他们在使用特殊技能时也会获得大量的法力。如果你热衷于habitica游戏里策略性部分,或者是如果升级和解锁高级功能为你提供强大动力的话,那就来当个法师吧!", @@ -161,7 +162,7 @@ "respawn": "重生!", "youDied": "你已经死亡!", "dieText": "你掉了一级,失去所有的金币,和随机的一件装备。起来吧,Habit世界的居民,再接再厉!远离那些坏习惯、注意完成每日任务、并在快支撑不住的时候使用生命药水免于死亡!", - "sureReset": "Are you sure? This will reset your character's class and allocated Stat Points (you'll get them all back to re-allocate), and costs 3 Gems.", + "sureReset": "你确定吗?这将会重置你的角色职业和已分配的属性点(它们会被返还并让你重新分配),这将会消耗3个宝石。", "purchaseFor": "花费<%= cost %>宝石购买?", "purchaseForHourglasses": "用<%= cost %>砂漏去购买", "notEnoughMana": "魔法值不足。", @@ -197,11 +198,11 @@ "con": "体质", "per": "感知", "int": "智力", - "showQuickAllocation": "Show Stat Allocation", - "hideQuickAllocation": "Hide Stat Allocation", - "quickAllocationLevelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options found in User Icon > Stats.", - "invalidAttribute": "\"<%= attr %>\" is not a valid Stat.", - "notEnoughAttrPoints": "You don't have enough Stat Points.", + "showQuickAllocation": "显示属性分配的状态", + "hideQuickAllocation": "隐藏属性分配的状态", + "quickAllocationLevelPopover": "每一级您都可以获得一个可自由分配的属性点。你可以手动分配,也可以在用户图标 -> 状态界面中选择让系统为你自动分配。", + "invalidAttribute": "\"<%= attr %>\" 不是一个有效的属性点分配数字。", + "notEnoughAttrPoints": "您没有足够的属性点数。", "style": "风格", "facialhair": "面部", "photo": "图片", diff --git a/website/common/locales/zh/faq.json b/website/common/locales/zh/faq.json index 6342f28900..aff5771265 100644 --- a/website/common/locales/zh/faq.json +++ b/website/common/locales/zh/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "有这样一些东西会减少你的生命值,第一,如果你有每日任务没完成,它会减少你的生命值,第二,如果你“点击”了一个坏习惯,它也会减少你的生命值,最后,如果你在和你的队员一起进行BOSS战时,一旦队伍中有一个成员没能完成每日任务,BOSS就会攻击你。\n

\n回复生命值最主要的办法是升级,每一次升级时,所有的生命值都会回复。你也可以用金币从奖励栏里可以购买生命药剂。另外,在达到10级以上的级数时,你可以选择成为一个医师,然后学习治疗技能。如果你的队伍(可在社交>队伍里查看)里有一个医师,他也能治疗你。", "faqQuestion5": "我怎么和朋友们一起玩Habitica?", "iosFaqAnswer5": "最好的办法是邀请他们加入你的战队!战队可以接受任务,和怪物作战,使用技能互相支持。 如果你还没有自己的队伍,进入目录 > 队伍点击“建立新的队伍”。 然后点击成员列表,在右上角选择邀请,输入朋友们的用户ID (一串由数字和字母组成的列表,可以在手机APP的设置 > 账户明细或者网页版的设置 > API下查看)。在网页版中,你还可以使用email地址邀请朋友,手机APP会在未来增加这个功能。\n\n在网页版中你和朋友们还能加入公会,即公共聊天室,APP也会跟进公会功能!", - "androidFaqAnswer5": "最好的办法是邀请他们加入你的队伍!队伍可以接受任务,和怪物作战,通过使用技能来互相帮助。 如果你还没有自己的队伍,进入 目录 > 队伍 接着选择 “建立新的队伍”。 然后点击成员列表,点击右上角按钮来邀请你的朋友,通过输入他们的邮箱或者用户ID (一串由数字和字母组成的列表,可以在APP的 设置 > 账户信息 或者网页版的 设置 > API 下查看)。你们也可以一起加入一个公会(社交 > 公会)。公会主要是一个用于分享兴趣或者追求同意目标 的聊天室,可以公开也可以私聊。你可以加入很多个公会,但是你只能加入一个队伍。\n\n若想获取更多详细信息, 请转到wiki关于[队伍]页面\n(http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "最好的方法就是邀请他们跟你一起加入队伍,选择「社交」>「队伍」。队伍可以参加任务卷轴、和魔王对抗、使用技能来支援彼此。你也可以加入公会(「社交」>「公会」),公会里面有聊天室,你可以在上面分享些新鲜事或者说说你想要达成的好习惯目标,你可以自由的选择要公开聊天或者私聊。你可以加入多个公会,但是队伍一次只能加入一组喔!\n

\n想要知道更多资讯,请点选我们的wiki页面\n[队伍](http://habitrpg.wikia.com/wiki/Party) \n[公会](http://habitrpg.wikia.com/wiki/Guilds)", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "我要怎样才能得到宠物或是坐骑呢?", "iosFaqAnswer6": "当你等级升到3的时候,就会解锁掉落系统。每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到时系统就会自动存入「选单」>「物品」。\n\n想要孵化宠物,你需要同时拥有宠物蛋和孵化药水各一。点选宠物蛋确认你要孵化的种类,接着点击「孵化」,然后选择孵化药水就能够确认宠物的颜色啰!孵化完成后你可以到「选单」>「宠物」将你的宠物装备到角色上。\n\n你也可以用喂食的方式让宠物进化成坐骑。点选宠物选择「喂食」,你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度啰!请多多尝试食物种类或者看这个[剧透]。 (http://habitica.wikia.com/wiki/Food#Food_Preferences)\n当你拥有了一只座骑,你可以到「选单」>「坐骑」将它装备到角色上。\n\n当你完成某些任务卷轴时,你也可能收到任务宠物蛋。 (你可以看看下面有一些关于任务卷轴的介绍)。", "androidFaqAnswer6": "当你等级升到3的时候,就会解锁掉落系统。每当你完成任务时,你就会有一定的机率收到宠物蛋、孵化药水,或是喂养宠物的食物。当你收到时系统就会自动存入「选单」>「物品」。\n\n想要孵化宠物,你需要同时拥有一个宠物蛋和一瓶孵化药水。点选宠物蛋确认你要孵化的宠物,接着点击「孵化」,然后选择孵化药水就能够确认宠物的颜色!孵化完成后你可以到「选单」>[宠物],然后选择“使用”(你的角色形象不会显示变动),将你的宠物装备到角色上。\n\n你也可以用喂食的方式让宠物进化成坐骑。点选宠物选择「喂食」,你会看到一条绿色的状态列随着你喂食次数而增长,当状态列额满后就会进化成坐骑。这需要花点时间,不过如果你能找到宠物最喜欢的食物,就可以加速宠物进化的速度啰!请多多尝试食物种类或者看这个[揭露] (http://habitica.wikia.com/wiki/Food#Food_Preferences).\n\n当你拥有了一只座骑,你可以到「选单」>「坐骑」选项,选择你需要的坐骑,然后选择“使用”(你的角色形象不会显示变动)将它装备到角色上。\n当你完成某些任务卷轴时,你也可能收到任务宠物蛋。 (你可以看看下面有一些关于任务卷轴的介绍)。", diff --git a/website/common/locales/zh/gear.json b/website/common/locales/zh/gear.json index 85934b9a94..d8a204e2c4 100644 --- a/website/common/locales/zh/gear.json +++ b/website/common/locales/zh/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "这件舒服的毛衣会让你穿梭在天空时保持温暖!没有属性加成。2017年11月订阅者专享。", "armorMystery201712Text": "蜡烛术士护甲", "armorMystery201712Notes": "這個魔法护甲产生的光和熱力會在不燒傷你的皮膚的條件下為你的心保持温暖。没有属性加成。2017年十二月捐赠者物品。", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "蒸汽朋克套装", "armorMystery301404Notes": "整洁又精神,真聪明!没有属性加成。3015年2月订阅者物品", "armorMystery301703Text": "蒸汽朋克孔雀装礼服", @@ -984,6 +986,8 @@ "headMystery201710Notes": "这个头盔让你看起来很吓人。。。但他不会对你的深度感知有任何加成! 没有属性加成。2017年十月订阅者专享。", "headMystery201712Text": "蜡烛术士王冠", "headMystery201712Notes": "這個王冠能夠為最黑的寒冬夜晚帶來光明和溫暖。没有属性加成。2017年十二月捐赠者物品。", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "华丽礼帽", "headMystery301404Notes": "上流社会佼佼者的华丽礼帽!3015年1月捐赠者物品。没有属性加成。", "headMystery301405Text": "基础礼帽", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "这顶坚固的熔岩护盾可以保护你不受坏习惯的伤害,抵挡伤害的时候甚至不会让你的手受到冲击。没有属性加成。2017年8月捐赠者物品。", "shieldMystery201709Text": "《魔法入门手册》", "shieldMystery201709Notes": "这本书将引导你初次接触魔法的奥秘。没有属性加成。2017年9月捐赠者物品。", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "时钟之盾", "shieldMystery301405Notes": "拥有这块高耸的时钟之盾,时间与你同在!没有属性加成。3015年6月捐赠者物品。", "shieldMystery301704Text": "轻柔扇子", diff --git a/website/common/locales/zh/generic.json b/website/common/locales/zh/generic.json index 9379d9947b..f66a6c577f 100644 --- a/website/common/locales/zh/generic.json +++ b/website/common/locales/zh/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu 的主题", "audioTheme_beatscribeNesTheme": "Beatscribe的新主题", "audioTheme_arashiTheme": "岚 主题", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL主题", diff --git a/website/common/locales/zh/groups.json b/website/common/locales/zh/groups.json index 203cd1d29f..803ed01cf3 100644 --- a/website/common/locales/zh/groups.json +++ b/website/common/locales/zh/groups.json @@ -202,7 +202,6 @@ "partyOnName": "欢乐派对", "partyUpText": "和另一个人一起加入队伍!愉快的打怪并互相支持吧!玩的愉快嗷~!", "partyOnText": "加入了一个至少有四人的队伍!享受你增强的责任感,和伙伴们并肩作战,打倒敌人吧!", - "largeGroupNote": "注意:这个公会现在太大,以至于不能支持通知!保证每日查阅记录来查看新消息。", "groupIdRequired": "\"groupId\"必须是一个有效的UUID", "groupNotFound": "没有找到这个小组,或者你没有权限。", "groupTypesRequired": "你必须提供一个有效的\"type\"查询字符串。", @@ -220,11 +219,11 @@ "inviteMissingUuid": "邀请中缺失用户ID", "inviteMustNotBeEmpty": "邀请不能是空的。", "partyMustbePrivate": "队伍必须是私有的", - "userAlreadyInGroup": "用户已经在这个小组中。", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "你不能邀请自己到一个小组", - "userAlreadyInvitedToGroup": "用户已经被邀请进入这个小组。", - "userAlreadyPendingInvitation": "用户已经收到邀请等待接受。", - "userAlreadyInAParty": "用户已经在一个队伍中。", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "这个ID \"<%= userId %>\"的用户没有找到。", "userHasNoLocalRegistration": "用户不能有一个本地注册(用户名,电子邮件,密码)。", "uuidsMustBeAnArray": "用户ID邀请必须是一个数组。", @@ -417,11 +416,13 @@ "managerAdded": "成功添加管理员", "managerRemoved": "成功移除管理员", "leaderChanged": "首領被改變了", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/zh/limited.json b/website/common/locales/zh/limited.json index 6079cb9458..646c299ce7 100644 --- a/website/common/locales/zh/limited.json +++ b/website/common/locales/zh/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "快乐秋天嘉年华!你想买些稀罕东西吗?10月31日前购买!", "seasonalShopWinterText": "快乐冬天嘉年华!你想买些稀罕东西吗?1月31日前购买!", "seasonalShopFallTextBroken": "啊……欢迎来到季节商店……我们正在准备秋季特供产品,还有其他一些什么的…… 这里所有的东西都会在每年秋季节庆期间开放购买,但我们只开门到10月31日……你可能现在可以开始囤货了,或者只能继续等,等,等…… *叹气*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "如果你曾经购买过这件装备,但是现在失去了它,那么你可以从奖励栏中重新购买它。最初,你只能购买你当前职业的装备(默认职业是战士),但是不用担心,当你转换职业时,其他职业的装备你就可以购买了。", "candycaneSet": "拐杖糖 (法师)", "skiSet": "雪橇刺客 (盗贼)", diff --git a/website/common/locales/zh/loadingscreentips.json b/website/common/locales/zh/loadingscreentips.json index b03065a8e5..8123da412c 100644 --- a/website/common/locales/zh/loadingscreentips.json +++ b/website/common/locales/zh/loadingscreentips.json @@ -14,7 +14,7 @@ "tip12": "给你的待办增加清单,使它能够获得更多奖励!", "tip13": "点击任务页面的“过滤器”来使你因任务数量过多而难以管理的列表井井有条!", "tip14": "你可以添加标题或鼓舞人心的列表,比如没有(+/-)的习惯。", - "tip15": "完成所有的masterclasser任务线来了解habitica的秘密传说。", + "tip15": "完成所有的大师鉴别者任务线来了解Habitica的秘密传说。", "tip16": "点击页脚的“数据展示工具”链接,来获得有关你进步的宝贵见解。", "tip17": "使用手机APP来为你的任务设置提醒。", "tip18": "仅仅积极的,或仅仅消极的习惯会逐渐“淡化”并变成黄色。", diff --git a/website/common/locales/zh/quests.json b/website/common/locales/zh/quests.json index 3eb84e3634..31833266e9 100644 --- a/website/common/locales/zh/quests.json +++ b/website/common/locales/zh/quests.json @@ -6,7 +6,7 @@ "questsForSale": "购买任务", "petQuests": "宠物和坐骑任务", "unlockableQuests": "未解锁的任务", - "goldQuests": "Masterclasser任务线", + "goldQuests": "大师鉴别者任务线", "questDetails": "任务详情", "questDetailsTitle": "任务详情", "questDescription": "任务允许玩家们与他们的队伍成员关注在游戏中长期的目标。", diff --git a/website/common/locales/zh/questscontent.json b/website/common/locales/zh/questscontent.json index 2bbc7feed4..856b9c5152 100644 --- a/website/common/locales/zh/questscontent.json +++ b/website/common/locales/zh/questscontent.json @@ -508,15 +508,15 @@ "farmFriendsNotes": "Contains 'The Mootant Cow', 'Ride the Night-Mare', and 'The Thunder Ram'. Available until September 30.", "witchyFamiliarsText": "巫婆手下探索任务包", "witchyFamiliarsNotes": "Contains 'The Rat King', 'The Icy Arachnid', and 'Swamp of the Clutter Frog'. Available until October 31.", - "questGroupLostMasterclasser": "Masterclassers的秘密", + "questGroupLostMasterclasser": "大师鉴别者的秘密", "questUnlockLostMasterclasser": "To unlock this quest, complete the final quests of these quest chains: 'Dilatory Distress', 'Mayhem in Mistiflying', 'Stoïkalm Calamity', and 'Terror in the Taskwoods'.", - "questLostMasterclasser1Text": "Masterclassers的秘密,第1部分:字里行间", + "questLostMasterclasser1Text": "大师鉴别者的秘密,第1部分:字里行间", "questLostMasterclasser1Notes": "You’re unexpectedly summoned by @beffymaroo and @Lemoness to Habit Hall, where you’re astonished to find all four of Habitica’s Masterclassers awaiting you in the wan light of dawn. Even the Joyful Reaper looks somber.

“Oho, you’re here,” says the April Fool. “Now, we would not rouse you from your rest without a truly dire—”

“Help us investigate the recent bout of possessions,” interrupts Lady Glaciate. “All the victims blamed someone named Tzina.”

The April Fool is clearly affronted by the summary. “What about my speech?” he hisses to her. “With the fog and thunderstorm effects?”

“We’re in a hurry,” she mutters back. “And my mammoths are still soggy from your incessant practicing.”

“I’m afraid that the esteemed Master of Warriors is correct,” says King Manta. “Time is of the essence. Will you aid us?”

When you nod, he waves his hands to open a portal, revealing an underwater room. “Swim down with me to Dilatory, and we will scour my library for any references that might give us a clue.” At your look of confusion, he adds, “Don’t worry, the paper was enchanted long before Dilatory sank. None of the books are the slightest bit damp!” He winks.“Unlike Lady Glaciate’s mammoths.”

“I heard that, Manta.”

As you dive into the water after the Master of Mages, your legs magically fuse into fins. Though your body is buoyant, your heart sinks when you see the thousands of bookshelves. Better start reading…", "questLostMasterclasser1Completion": "After hours of poring through volumes, you still haven’t found any useful information.

“It seems impossible that there isn’t even the tiniest reference to anything relevant,” says head librarian @Tuqjoi, and their assistant @stefalupagus nods in frustration.

King Manta’s eyes narrow. “Not impossible…” he says. “Intentional.” For a moment, the water glows around his hands, and several of the books shudder. “Something is obscuring information,” he says. “Not just a static spell, but something with a will of its own. Something… alive.” He swims up from the table. “The Joyful Reaper needs to hear about this. Let’s pack a meal for the road.”", "questLostMasterclasser1CollectAncientTomes": "古老的書卷", "questLostMasterclasser1CollectForbiddenTomes": "被禁止的書卷", "questLostMasterclasser1CollectHiddenTomes": "被隐藏的書卷", - "questLostMasterclasser2Text": "Masterclassers的秘密,第2部分:组装the a'Voidant", + "questLostMasterclasser2Text": "大师鉴别者的秘密,第2部分:召唤the a'Voidant", "questLostMasterclasser2Notes": "The Joyful Reaper drums her bony fingers on some of the books that you brought. “Oh, dear,” the Master of Healers says. “There is a malevolent life essence at work. I might have guessed, considering the attacks by reanimated skulls during each incident.” Her assistant @tricksy.fox brings in a chest, and you are startled to see the contents that @beffymaroo unloads: the very same objects once used by this mysterious Tzina to possess people.

“I’m going to use resonant healing magic to try to make this creature manifest,” the Joyful Reaper says, reminding you that the skeleton is a somewhat unconventional Healer. “You’ll need to read the revealed information quickly, in case it breaks loose.”

As she concentrates, a twisting mist begins to siphon from the books and twine around the objects. Quickly, you flip through the pages, trying to read the new lines of text that are writhing into view. You catch only a few snippets: “Sands of the Timewastes” — “the Great Disaster” —“split into four”— “permanently corrupted”— before a single name catches your eye: Zinnya.

Abruptly, the pages wrench free from your fingers and shred themselves as a howling creature explodes into being, coalescing around the possessed objects.

“It’s an a’Voidant!” the Joyful Reaper shouts, throwing up a protection spell. “They’re ancient creatures of confusion and obscurity. If this Tzina can control one, she must have a frightening command over life magic. Quickly, attack it before it escapes back into the books!”

", "questLostMasterclasser2Completion": "The a’Voidant succumbs at last, and you share the snippets that you read.

“None of those references sound familiar, even for someone as old as I,” the Joyful Reaper says. “Except… the Timewastes are a distant desert at the most hostile edge of Habitica. Portals often fail nearby, but swift mounts could get you there in no time. Lady Glaciate will be glad to assist.” Her voice grows amused. “Which means that the enamored Master of Rogues will undoubtedly tag along.” She hands you the glimmering mask. “Perhaps you should try to track the lingering magic in these items to its source. I’ll go harvest some sustenance for your journey.”", "questLostMasterclasser2Boss": "The a'Voidant", @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/zh/subscriber.json b/website/common/locales/zh/subscriber.json index 369f41095f..3ac32c3359 100644 --- a/website/common/locales/zh/subscriber.json +++ b/website/common/locales/zh/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "飞毯驾驶员套装", "mysterySet201712": "蜡烛术士套装", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "蒸汽朋克标准套装", "mysterySet301405": "蒸汽朋克配饰套装", "mysterySet301703": "孔雀蒸汽朋克套装", diff --git a/website/common/locales/zh_TW/character.json b/website/common/locales/zh_TW/character.json index ad05c99b87..5bd1544602 100644 --- a/website/common/locales/zh_TW/character.json +++ b/website/common/locales/zh_TW/character.json @@ -64,6 +64,7 @@ "classBonusText": "Your class (Warrior, if you haven't unlocked or selected another class) uses its own equipment more effectively than gear from other classes. Equipped gear from your current class gets a 50% boost to the Stat bonus it grants.", "classEquipBonus": "職業加成", "battleGear": "戰鬥裝備", + "gear": "Gear", "battleGearText": "這是你穿上戰場的裝備,在你做任務時會影響一些數值。", "autoEquipBattleGear": "自動穿上新裝備", "costume": "服裝", diff --git a/website/common/locales/zh_TW/faq.json b/website/common/locales/zh_TW/faq.json index faf73ef289..bb1bc69c15 100644 --- a/website/common/locales/zh_TW/faq.json +++ b/website/common/locales/zh_TW/faq.json @@ -22,8 +22,8 @@ "webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.", "faqQuestion5": "要怎麼做才能夠跟朋友一起玩Habitica?", "iosFaqAnswer5": "最好的方法就是邀請他們加入你的隊伍!隊伍可以參加活動任務、跟魔王對抗、施放技能來支援彼此。如果你並沒有加入任一隊伍的話,可前往選單>隊伍,接著點選\"建立新隊伍\"。然後點選成員名單,就可以在右上角看到邀請朋友選項,輸入他們的使用者ID (UUID:一串由數字和英文字母組成的字串,每個人都可以在手機app中的設定 >帳號 ,或是網站裡的設定 >API 裡面找到自己的UUID。)在網站上,你還可以用電子郵件邀請朋友,而這項功能也會增加到之後的app更新中。\n\n在網站裡你可以和朋友加入公會,裡面有一個公共的聊天室。公會也會增加到之後的app更新中。", - "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", - "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitrpg.wikia.com/wiki/Party) and [Guilds](http://habitrpg.wikia.com/wiki/Guilds).", + "androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", + "webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](http://habitica.wikia.com/wiki/Party) and [Guilds](http://habitica.wikia.com/wiki/Guilds).", "faqQuestion6": "我要怎麼做才能得到寵物或是坐騎呢?", "iosFaqAnswer6": "當你等級升到3的時候,就會解鎖掉落系統。每當你完成任務時,你就會有一定的機率收到寵物蛋、孵化藥水,或是餵養寵物的食物。當你收到時系統就會自動存入「選單」>「物品」。\n\n想要孵化寵物,你需要同時擁有寵物蛋和孵化藥水各一。點選寵物蛋確認你要孵化的種類,接著點擊「孵化」,然後選擇孵化藥水就能夠確認寵物的顏色囉!孵化完成後你可以到「選單」>「寵物」將你的寵物裝備到角色上。\n\n你也可以用餵食的方式讓寵物進化成坐騎。點選寵物選擇「餵食」,你會看到一條綠色的狀態列隨著你餵食次數而增長,當狀態列額滿後就會進化成坐騎。這需要花點時間,不過如果你能找到寵物最喜歡的食物,就可以加速寵物進化的速度囉!請多多嘗試食物種類或者看這個[see the spoilers here]。(http://habitica.wikia.com/wiki/Food#Food_Preferences)\n當你擁有了一隻座騎,你可以到「選單」>「坐騎」將它裝備到角色上。\n\n當你完成某些任務捲軸時,你也可能收到任務寵物蛋。(你可以看看下面有一些關於任務捲軸的介紹)。", "androidFaqAnswer6": "At level 3, you will unlock the Drop System. Every time you complete a task, you'll have a random chance at receiving an egg, a hatching potion, or a piece of food. They will be stored in Menu > Items.\n\n To hatch a Pet, you'll need an egg and a hatching potion. Tap on the egg to determine the species you want to hatch, and select \"Hatch with potion.\" Then choose a hatching potion to determine its color! To equip your new Pet, go to Menu > Stable > Pets, select a species, click on the desired Pet, and select \"Use\"(Your avatar doesn't update to reflect the change). \n\n You can also grow your Pets into Mounts by feeding them under Menu > Stable [ > Pets ]. Tap on a Pet, and then select \"Feed\"! You'll have to feed a pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](http://habitica.wikia.com/wiki/Food#Food_Preferences). To equip your Mount, go to Menu > Stable > Mounts, select a species, click on the desired Mount, and select \"Use\"(Your avatar doesn't update to reflect the change).\n\n You can also get eggs for Quest Pets by completing certain Quests. (See below to learn more about Quests.)", diff --git a/website/common/locales/zh_TW/gear.json b/website/common/locales/zh_TW/gear.json index 706e95879e..129f432f28 100644 --- a/website/common/locales/zh_TW/gear.json +++ b/website/common/locales/zh_TW/gear.json @@ -612,6 +612,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "蒸汽龐克套裝", "armorMystery301404Notes": "精巧又瀟灑,哇嗚!沒有屬性加成。3015年1月訂閱者物品。", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -984,6 +986,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "華麗禮帽", "headMystery301404Notes": "上流社會佼佼者的華麗禮帽!3015年1月訂閱者物品。沒有屬性加成。", "headMystery301405Text": "基礎禮帽", @@ -1228,6 +1232,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "時鐘之盾", "shieldMystery301405Notes": "擁有這塊高聳的時鐘之盾,時間與你同在!沒有屬性加成。3015年6月訂閱者物品。", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/zh_TW/generic.json b/website/common/locales/zh_TW/generic.json index dc969d90ad..9eadd49074 100644 --- a/website/common/locales/zh_TW/generic.json +++ b/website/common/locales/zh_TW/generic.json @@ -136,6 +136,7 @@ "audioTheme_airuTheme": "Airu's Theme", "audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme", "audioTheme_arashiTheme": "Arashi's Theme", + "audioTheme_triumphTheme": "Triumph Theme", "audioTheme_lunasolTheme": "Lunasol Theme", "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", "audioTheme_maflTheme": "MAFL Theme", diff --git a/website/common/locales/zh_TW/groups.json b/website/common/locales/zh_TW/groups.json index 690282e44b..d2da024681 100644 --- a/website/common/locales/zh_TW/groups.json +++ b/website/common/locales/zh_TW/groups.json @@ -202,7 +202,6 @@ "partyOnName": "龐大隊伍參與", "partyUpText": "Joined a Party with another person! Have fun battling monsters and supporting each other.", "partyOnText": "Joined a Party with at least four people! Enjoy your increased accountability as you unite with your friends to vanquish your foes!", - "largeGroupNote": "Note: This Guild is now too large to support notifications! Be sure to check back every day to see new messages.", "groupIdRequired": "\"groupId\" must be a valid UUID", "groupNotFound": "Group not found or you don't have access.", "groupTypesRequired": "You must supply a valid \"type\" query string.", @@ -220,11 +219,11 @@ "inviteMissingUuid": "Missing user id in invite", "inviteMustNotBeEmpty": "Invite must not be empty.", "partyMustbePrivate": "Parties must be private", - "userAlreadyInGroup": "User already in that group.", + "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", "cannotInviteSelfToGroup": "You cannot invite yourself to a group.", - "userAlreadyInvitedToGroup": "User already invited to that group.", - "userAlreadyPendingInvitation": "User already pending invitation.", - "userAlreadyInAParty": "User already in a Party.", + "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", + "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", + "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", "userWithIDNotFound": "找不到玩家ID \"<%= userId %>\"", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "uuidsMustBeAnArray": "User ID invites must be an array.", @@ -417,11 +416,13 @@ "managerAdded": "Manager added successfully", "managerRemoved": "Manager removed successfully", "leaderChanged": "Leader has been changed", + "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", "whatIsWorldBoss": "What is a World Boss?", "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", "worldBossBullet1": "Complete tasks to damage the World Boss", "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", - "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks" + "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", + "worldBoss": "World Boss" } \ No newline at end of file diff --git a/website/common/locales/zh_TW/limited.json b/website/common/locales/zh_TW/limited.json index 8dd0dc67b4..59073ae51b 100644 --- a/website/common/locales/zh_TW/limited.json +++ b/website/common/locales/zh_TW/limited.json @@ -34,6 +34,7 @@ "seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!", "seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!", "seasonalShopFallTextBroken": "哦....歡迎來到季節商店...我們目前有秋季季節限定的商品,之類的...這裡的所有東西會在每年的秋季節慶活動中開放購買,但我們只開放到 10 月 31 日...我想你現在就該買起來,不然你就要一直等...一直等...一直等...*嘆氣*", + "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", "seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.", "candycaneSet": "拐杖糖 ( 法師 )", "skiSet": "滑雪杖 ( 盜賊 )", diff --git a/website/common/locales/zh_TW/loginincentives.json b/website/common/locales/zh_TW/loginincentives.json index b18ec92d9c..10e71e0a44 100644 --- a/website/common/locales/zh_TW/loginincentives.json +++ b/website/common/locales/zh_TW/loginincentives.json @@ -13,14 +13,14 @@ "checkinProgressTitle": "到下一次的進度", "incentiveBackgroundsUnlockedWithCheckins": "簡樸的背景可以透過每日簽到來解鎖", "checkinReceivedAllRewardsMessage": "You have received all the Check-In prizes available! Congratulations!", - "oneOfAllPetEggs": "one of each standard Pet Egg", - "twoOfAllPetEggs": "two of each standard Pet Egg", - "threeOfAllPetEggs": "three of each standard Pet Egg", + "oneOfAllPetEggs": "每種一顆標準型寵物蛋", + "twoOfAllPetEggs": "每種兩顆標準型寵物蛋", + "threeOfAllPetEggs": "每種三顆標準型寵物蛋", "oneOfAllHatchingPotions": "one of each standard Hatching Potion", "threeOfEachFood": "three of each standard Pet Food", "fourOfEachFood": "four of each standard Pet Food", - "twoSaddles": "two Saddles", - "threeSaddles": "three Saddles", + "twoSaddles": "兩個鞍子", + "threeSaddles": "三個鞍子", "incentiveAchievement": "the Royally Loyal achievement", "royallyLoyal": "Royally Loyal", "royallyLoyalText": "This user has checked in over 500 times, and has earned every Check-In Prize!", diff --git a/website/common/locales/zh_TW/questscontent.json b/website/common/locales/zh_TW/questscontent.json index d07d82541a..86c8dbd42b 100644 --- a/website/common/locales/zh_TW/questscontent.json +++ b/website/common/locales/zh_TW/questscontent.json @@ -570,7 +570,10 @@ "questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.", "questDysheartenerBossRageTitle": "Shattering Heartbreak", "questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!", - "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!", + "seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!", + "seasonalShopRageStrikeLead": "Leslie is Heartbroken!", + "seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!", "questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.", "questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!", "questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)", diff --git a/website/common/locales/zh_TW/subscriber.json b/website/common/locales/zh_TW/subscriber.json index 154163b398..f17b7b4e4a 100644 --- a/website/common/locales/zh_TW/subscriber.json +++ b/website/common/locales/zh_TW/subscriber.json @@ -139,6 +139,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "蒸氣龐克標準套裝", "mysterySet301405": "蒸氣龐克配件套裝", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/script/content/appearance/skin.js b/website/common/script/content/appearance/skin.js index 1de36e767a..ea23edd4ea 100644 --- a/website/common/script/content/appearance/skin.js +++ b/website/common/script/content/appearance/skin.js @@ -73,5 +73,5 @@ module.exports = prefill({ 'snowy': {price: 2, set: sets.winterySkins}, 'winterstar': {price: 2, set: sets.winterySkins}, - /* eslint-enable quote-props */ + /* eslint-enable quote-props */ }); diff --git a/website/common/script/content/gear/sets/mystery.js b/website/common/script/content/gear/sets/mystery.js index 41e714da78..6439cb46fe 100644 --- a/website/common/script/content/gear/sets/mystery.js +++ b/website/common/script/content/gear/sets/mystery.js @@ -187,6 +187,12 @@ let armor = { mystery: '201712', value: 0, }, + 201802: { + text: t('armorMystery201802Text'), + notes: t('armorMystery201802Notes'), + mystery: '201802', + value: 0, + }, 301404: { text: t('armorMystery301404Text'), notes: t('armorMystery301404Notes'), @@ -541,6 +547,12 @@ let head = { mystery: '201712', value: 0, }, + 201802: { + text: t('headMystery201802Text'), + notes: t('headMystery201802Notes'), + mystery: '201802', + value: 0, + }, 301404: { text: t('headMystery301404Text'), notes: t('headMystery301404Notes'), @@ -637,6 +649,12 @@ let shield = { mystery: '201709', value: 0, }, + 201802: { + text: t('shieldMystery201802Text'), + notes: t('shieldMystery201802Notes'), + mystery: '201802', + value: 0, + }, 301405: { text: t('shieldMystery301405Text'), notes: t('shieldMystery301405Notes'), diff --git a/website/common/script/content/gear/weapon.js b/website/common/script/content/gear/weapon.js index d893e001ce..62578e6310 100644 --- a/website/common/script/content/gear/weapon.js +++ b/website/common/script/content/gear/weapon.js @@ -60,6 +60,7 @@ for (let key in weapon) { return `${oldnotes(lang)} ${twoHandedText}`; }; + item.notes.i18nLangFunc = true; // See https://github.com/HabitRPG/habitica/blob/develop/website/common/script/content/translation.js#L8 } } diff --git a/website/common/script/content/mystery-sets.js b/website/common/script/content/mystery-sets.js index 58e010ac8b..8dbdcbbeb5 100644 --- a/website/common/script/content/mystery-sets.js +++ b/website/common/script/content/mystery-sets.js @@ -194,6 +194,10 @@ let mysterySets = { start: '2018-01-23', end: '2018-02-02', }, + 201802: { + start: '2018-02-22', + end: '2018-03-02', + }, 301404: { start: '3014-03-24', end: '3014-04-02', diff --git a/website/common/script/content/shop-featuredItems.js b/website/common/script/content/shop-featuredItems.js index 31010cb4e4..b1881440c4 100644 --- a/website/common/script/content/shop-featuredItems.js +++ b/website/common/script/content/shop-featuredItems.js @@ -37,7 +37,7 @@ const featuredItems = { ], seasonal: 'summerMage', timeTravelers: [ - // TODO + // TODO ], }; diff --git a/website/common/script/index.js b/website/common/script/index.js index d5de49a42b..57eaa890ca 100644 --- a/website/common/script/index.js +++ b/website/common/script/index.js @@ -86,9 +86,6 @@ api.gold = gold; import silver from './libs/silver'; api.silver = silver; -import taskClasses from './libs/taskClasses'; -api.taskClasses = taskClasses; - import noTags from './libs/noTags'; api.noTags = noTags; diff --git a/website/common/script/libs/taskClasses.js b/website/common/script/libs/taskClasses.js deleted file mode 100644 index a61a82dd75..0000000000 --- a/website/common/script/libs/taskClasses.js +++ /dev/null @@ -1,83 +0,0 @@ -import { - shouldDo, -} from '../cron'; -import moment from 'moment'; - -/* -Task classes given everything about the class -*/ - -// TODO move to the client - -module.exports = function taskClasses (task, filters = [], dayStart = 0, lastCron = Number(new Date()), showCompleted = false, main = false, processingYesterdailies = false) { - if (!task) { - return ''; - } - let type = task.type; - let completed = task.completed; - let value = task.value; - let priority = task.priority; - - if (main && !task._editing) { - for (let filter in filters) { - let enabled = filters[filter]; - if (!task.tags) task.tags = []; - if (enabled && task.tags.indexOf(filter) === -1) { - return 'hidden'; - } - } - } - - let classes = task.type; - if (task._editing) { - classes += ' beingEdited'; - } - - if (type === 'todo' || type === 'daily') { - let dayShouldDo = moment(); - if (processingYesterdailies) dayShouldDo.subtract(1, 'days'); - let notDue = !shouldDo(Number(dayShouldDo), task, { dayStart }); - let isNotDueDaily = type === 'daily' && notDue; - - if (completed || isNotDueDaily) { - classes += ' completed'; - } else { - classes += ' uncompleted'; - } - } else if (type === 'habit') { - if (task.down && task.up) { - classes += ' habit-wide'; - } - if (!task.down && !task.up) { - classes += ' habit-narrow'; - } - } - - if (priority === 0.1) { - classes += ' difficulty-trivial'; - } else if (priority === 1) { - classes += ' difficulty-easy'; - } else if (priority === 1.5) { - classes += ' difficulty-medium'; - } else if (priority === 2) { - classes += ' difficulty-hard'; - } - - if (value < -20) { - classes += ' color-worst'; - } else if (value < -10) { - classes += ' color-worse'; - } else if (value < -1) { - classes += ' color-bad'; - } else if (value < 1) { - classes += ' color-neutral'; - } else if (value < 5) { - classes += ' color-good'; - } else if (value < 10) { - classes += ' color-better'; - } else { - classes += ' color-best'; - } - - return classes; -}; diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/broad_armor_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/broad_armor_mystery_201802.png new file mode 100644 index 0000000000..6ad4bf8a5a Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/broad_armor_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/head_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/head_mystery_201802.png new file mode 100644 index 0000000000..83f1c882e0 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/head_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shield_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shield_mystery_201802.png new file mode 100644 index 0000000000..b910f1e4db Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shield_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_armor_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_armor_mystery_201802.png new file mode 100644 index 0000000000..8e88faa619 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_armor_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_head_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_head_mystery_201802.png new file mode 100644 index 0000000000..0bad684c41 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_head_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_set_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_set_mystery_201802.png new file mode 100644 index 0000000000..ceebabb67a Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_set_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_shield_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_shield_mystery_201802.png new file mode 100644 index 0000000000..27dd07f7fe Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_shield_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/slim_armor_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/slim_armor_mystery_201802.png new file mode 100644 index 0000000000..047160b69e Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/mystery_201802/slim_armor_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_habit_birthday_2018.png b/website/raw_sprites/spritesmith_large/promo_habit_birthday_2018.png deleted file mode 100644 index f7441d9dc0..0000000000 Binary files a/website/raw_sprites/spritesmith_large/promo_habit_birthday_2018.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/promo_ios.png b/website/raw_sprites/spritesmith_large/promo_ios.png deleted file mode 100644 index 37c8b890bf..0000000000 Binary files a/website/raw_sprites/spritesmith_large/promo_ios.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/promo_mystery_201801.png b/website/raw_sprites/spritesmith_large/promo_mystery_201801.png deleted file mode 100644 index 0b7fcacfb4..0000000000 Binary files a/website/raw_sprites/spritesmith_large/promo_mystery_201801.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/promo_mystery_201802.png b/website/raw_sprites/spritesmith_large/promo_mystery_201802.png new file mode 100644 index 0000000000..c08dd02f81 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_mystery_201802.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_seasonalshop_broken.png b/website/raw_sprites/spritesmith_large/promo_seasonalshop_broken.png new file mode 100644 index 0000000000..7f70478f32 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_seasonalshop_broken.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_starry_potions.png b/website/raw_sprites/spritesmith_large/promo_starry_potions.png deleted file mode 100644 index 289599e67c..0000000000 Binary files a/website/raw_sprites/spritesmith_large/promo_starry_potions.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/promo_winter_customizations.png b/website/raw_sprites/spritesmith_large/promo_winter_customizations.png deleted file mode 100644 index 9eec4c40c9..0000000000 Binary files a/website/raw_sprites/spritesmith_large/promo_winter_customizations.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/scene_coding.png b/website/raw_sprites/spritesmith_large/scene_coding.png new file mode 100644 index 0000000000..cdad452fa5 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/scene_coding.png differ diff --git a/website/raw_sprites/spritesmith_large/scene_lady_glaciate.png b/website/raw_sprites/spritesmith_large/scene_lady_glaciate.png deleted file mode 100644 index 4f3cecb8cc..0000000000 Binary files a/website/raw_sprites/spritesmith_large/scene_lady_glaciate.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/scene_setting_up_todos.png b/website/raw_sprites/spritesmith_large/scene_setting_up_todos.png deleted file mode 100644 index b8c52d399d..0000000000 Binary files a/website/raw_sprites/spritesmith_large/scene_setting_up_todos.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/scene_task_list.png b/website/raw_sprites/spritesmith_large/scene_task_list.png deleted file mode 100644 index a3ab8074f2..0000000000 Binary files a/website/raw_sprites/spritesmith_large/scene_task_list.png and /dev/null differ diff --git a/website/raw_sprites/spritesmith_large/scene_yesterdailies_repeatables.png b/website/raw_sprites/spritesmith_large/scene_yesterdailies_repeatables.png deleted file mode 100644 index d6218704ff..0000000000 Binary files a/website/raw_sprites/spritesmith_large/scene_yesterdailies_repeatables.png and /dev/null differ diff --git a/website/server/controllers/api-v3/auth.js b/website/server/controllers/api-v3/auth.js index 910568ed4a..542e77b081 100644 --- a/website/server/controllers/api-v3/auth.js +++ b/website/server/controllers/api-v3/auth.js @@ -247,7 +247,7 @@ api.loginLocal = { let username = req.body.username; let password = req.body.password; - if (validator.isEmail(username)) { + if (validator.isEmail(String(username))) { login = {'auth.local.email': username.toLowerCase()}; // Emails are stored lowercase } else { login = {'auth.local.username': username}; @@ -347,11 +347,11 @@ api.loginSocial = { // Clean previous email preferences if (savedUser.auth[network].emails && savedUser.auth[network].emails[0] && savedUser.auth[network].emails[0].value) { EmailUnsubscription - .remove({email: savedUser.auth[network].emails[0].value.toLowerCase()}) - .exec() - .then(() => { - if (!existingUser) sendTxnEmail(savedUser, 'welcome'); - }); // eslint-disable-line max-nested-callbacks + .remove({email: savedUser.auth[network].emails[0].value.toLowerCase()}) + .exec() + .then(() => { + if (!existingUser) sendTxnEmail(savedUser, 'welcome'); + }); // eslint-disable-line max-nested-callbacks } if (!existingUser) { @@ -410,7 +410,7 @@ api.pusherAuth = { } resourceId = resourceId.join('-'); // the split at the beginning had split resourceId too - if (!validator.isUUID(resourceId)) { + if (!validator.isUUID(String(resourceId))) { throw new BadRequest('Invalid Pusher resource id, must be a UUID.'); } diff --git a/website/server/controllers/api-v3/challenges.js b/website/server/controllers/api-v3/challenges.js index 7dbd7b0448..326a66d5e4 100644 --- a/website/server/controllers/api-v3/challenges.js +++ b/website/server/controllers/api-v3/challenges.js @@ -1,8 +1,6 @@ import { authWithHeaders, authWithSession } from '../../middlewares/auth'; import _ from 'lodash'; import cloneDeep from 'lodash/cloneDeep'; -import omit from 'lodash/omit'; -import uuid from 'uuid'; import { model as Challenge } from '../../models/challenge'; import { model as Group, @@ -24,77 +22,15 @@ import { createTasks, } from '../../libs/taskManager'; -const TASK_KEYS_TO_REMOVE = ['_id', 'completed', 'dateCompleted', 'history', 'id', 'streak', 'createdAt', 'challenge']; +import { + addUserJoinChallengeNotification, + getChallengeGroupResponse, + createChallenge, + cleanUpTask, +} from '../../libs/challenges'; let api = {}; -async function createChallenge (user, req, res) { - let groupId = req.body.group; - let prize = req.body.prize; - - let group = await Group.getGroup({user, groupId, fields: '-chat', mustBeMember: true}); - if (!group) throw new NotFound(res.t('groupNotFound')); - if (!group.isMember(user)) throw new NotAuthorized(res.t('mustBeGroupMember')); - - if (group.leaderOnly && group.leaderOnly.challenges && group.leader !== user._id) { - throw new NotAuthorized(res.t('onlyGroupLeaderChal')); - } - - if (group._id === TAVERN_ID && prize < 1) { - throw new NotAuthorized(res.t('tavChalsMinPrize')); - } - - if (prize > 0) { - let groupBalance = group.balance && group.leader === user._id ? group.balance : 0; - let prizeCost = prize / 4; - - if (prizeCost > user.balance + groupBalance) { - throw new NotAuthorized(res.t('cantAfford')); - } - - if (groupBalance >= prizeCost) { - // Group pays for all of prize - group.balance -= prizeCost; - } else if (groupBalance > 0) { - // User pays remainder of prize cost after group - let remainder = prizeCost - group.balance; - group.balance = 0; - user.balance -= remainder; - } else { - // User pays for all of prize - user.balance -= prizeCost; - } - } - - group.challengeCount += 1; - - if (!req.body.summary) { - req.body.summary = req.body.name; - } - req.body.leader = user._id; - req.body.official = user.contributor.admin && req.body.official ? true : false; - let challenge = new Challenge(Challenge.sanitize(req.body)); - - // First validate challenge so we don't save group if it's invalid (only runs sync validators) - let challengeValidationErrors = challenge.validateSync(); - if (challengeValidationErrors) throw challengeValidationErrors; - - // Add achievement if user's first challenge - if (!user.achievements.joinedChallenge) { - user.achievements.joinedChallenge = true; - user.addNotification('CHALLENGE_JOINED_ACHIEVEMENT'); - } - - let results = await Bluebird.all([challenge.save({ - validateBeforeSave: false, // already validate - }), group.save()]); - let savedChal = results[0]; - - await savedChal.syncToUser(user); // (it also saves the user) - - return {savedChal, group}; -} - /** * @apiDefine ChallengeLeader Challenge Leader * The leader of the challenge can use this route. @@ -264,12 +200,7 @@ api.createChallenge = { _id: user._id, profile: {name: user.profile.name}, }; - response.group = { // we already have the group data - _id: group._id, - name: group.name, - type: group.type, - privacy: group.privacy, - }; + response.group = getChallengeGroupResponse(group); res.analytics.track('challenge create', { uuid: user._id, @@ -320,22 +251,13 @@ api.joinChallenge = { challenge.memberCount += 1; - // Add achievement if user's first challenge - if (!user.achievements.joinedChallenge) { - user.achievements.joinedChallenge = true; - user.addNotification('CHALLENGE_JOINED_ACHIEVEMENT'); - } + addUserJoinChallengeNotification(user); // Add all challenge's tasks to user's tasks and save the challenge let results = await Bluebird.all([challenge.syncToUser(user), challenge.save()]); let response = results[1].toJSON(); - response.group = { // we already have the group data - _id: group._id, - name: group.name, - type: group.type, - privacy: group.privacy, - }; + response.group = getChallengeGroupResponse(group); let chalLeader = await User.findById(response.leader).select(nameFields).exec(); response.leader = chalLeader ? chalLeader.toJSON({minimize: true}) : null; @@ -434,11 +356,11 @@ api.getUserChallenges = { let challenges = await Challenge.find({ $or: orOptions, }) - .sort('-official -createdAt') - // see below why we're not using populate - // .populate('group', basicGroupFields) - // .populate('leader', nameFields) - .exec(); + .sort('-official -createdAt') + // see below why we're not using populate + // .populate('group', basicGroupFields) + // .populate('leader', nameFields) + .exec(); let resChals = challenges.map(challenge => challenge.toJSON()); // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 @@ -692,12 +614,7 @@ api.updateChallenge = { let savedChal = await challenge.save(); let response = savedChal.toJSON(); - response.group = { // we already have the group data - _id: group._id, - name: group.name, - type: group.type, - privacy: group.privacy, - }; + response.group = getChallengeGroupResponse(group); let chalLeader = await User.findById(response.leader).select(nameFields).exec(); response.leader = chalLeader ? chalLeader.toJSON({minimize: true}) : null; res.respond(200, response); @@ -798,23 +715,6 @@ api.selectChallengeWinner = { }, }; -function cleanUpTask (task) { - let cleansedTask = omit(task, TASK_KEYS_TO_REMOVE); - - // Copy checklists but reset to uncomplete and assign new id - if (!cleansedTask.checklist) cleansedTask.checklist = []; - cleansedTask.checklist.forEach((item) => { - item.completed = false; - item.id = uuid(); - }); - - if (cleansedTask.type !== 'reward') { - delete cleansedTask.value; - } - - return cleansedTask; -} - /** * @api {post} /api/v3/challenges/:challengeId/clone Clone a challenge * @apiName CloneChallenge diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index ae7c8c1234..67512a51bb 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -935,10 +935,10 @@ async function _inviteByUUID (uuid, group, inviter, req, res) { if (group.type === 'guild') { if (_.includes(userToInvite.guilds, group._id)) { - throw new NotAuthorized(res.t('userAlreadyInGroup')); + throw new NotAuthorized(res.t('userAlreadyInGroup', { userId: uuid, username: userToInvite.profile.name})); } if (_.find(userToInvite.invitations.guilds, {id: group._id})) { - throw new NotAuthorized(res.t('userAlreadyInvitedToGroup')); + throw new NotAuthorized(res.t('userAlreadyInvitedToGroup', { userId: uuid, username: userToInvite.profile.name})); } let guildInvite = { @@ -952,14 +952,14 @@ async function _inviteByUUID (uuid, group, inviter, req, res) { } else if (group.type === 'party') { // Do not add to invitations.parties array if the user is already invited to that party if (_.find(userToInvite.invitations.parties, {id: group._id})) { - throw new NotAuthorized(res.t('userAlreadyPendingInvitation')); + throw new NotAuthorized(res.t('userAlreadyPendingInvitation', { userId: uuid, username: userToInvite.profile.name})); } if (userToInvite.party._id) { let userParty = await Group.getGroup({user: userToInvite, groupId: 'party', fields: 'memberCount'}); // Allow user to be invited to a new party when they're partying solo - if (userParty && userParty.memberCount !== 1) throw new NotAuthorized(res.t('userAlreadyInAParty')); + if (userParty && userParty.memberCount !== 1) throw new NotAuthorized(res.t('userAlreadyInAParty', { userId: uuid, username: userToInvite.profile.name})); } let partyInvite = {id: group._id, name: group.name, inviter: inviter._id}; @@ -1018,9 +1018,9 @@ async function _inviteByEmail (invite, group, inviter, req, res) { if (!invite.email) throw new BadRequest(res.t('inviteMissingEmail')); let userToContact = await User.findOne({$or: [ - {'auth.local.email': invite.email}, - {'auth.facebook.emails.value': invite.email}, - {'auth.google.emails.value': invite.email}, + {'auth.local.email': invite.email}, + {'auth.facebook.emails.value': invite.email}, + {'auth.google.emails.value': invite.email}, ]}) .select({_id: true, 'preferences.emailNotifications': true}) .exec(); diff --git a/website/server/controllers/api-v3/hall.js b/website/server/controllers/api-v3/hall.js index af2b8bd104..5d836407b3 100644 --- a/website/server/controllers/api-v3/hall.js +++ b/website/server/controllers/api-v3/hall.js @@ -71,15 +71,15 @@ api.getPatrons = { const perPage = 50; let patrons = await User - .find({ - 'backer.tier': {$gt: 0}, - }) - .select('contributor backer profile.name') - .sort('-backer.tier') - .skip(page * perPage) - .limit(perPage) - .lean() - .exec(); + .find({ + 'backer.tier': {$gt: 0}, + }) + .select('contributor backer profile.name') + .sort('-backer.tier') + .skip(page * perPage) + .limit(perPage) + .lean() + .exec(); res.respond(200, patrons); }, @@ -123,13 +123,13 @@ api.getHeroes = { middlewares: [authWithHeaders()], async handler (req, res) { let heroes = await User - .find({ - 'contributor.level': {$gt: 0}, - }) - .select('contributor backer profile.name') - .sort('-contributor.level') - .lean() - .exec(); + .find({ + 'contributor.level': {$gt: 0}, + }) + .select('contributor backer profile.name') + .sort('-contributor.level') + .lean() + .exec(); res.respond(200, heroes); }, diff --git a/website/server/controllers/api-v3/i18n.js b/website/server/controllers/api-v3/i18n.js index ed1b744133..505df9b0fa 100644 --- a/website/server/controllers/api-v3/i18n.js +++ b/website/server/controllers/api-v3/i18n.js @@ -13,11 +13,11 @@ function geti18nBrowserScript (language) { return `(function () { if (!window) return; window['habitica-i18n'] = ${JSON.stringify({ - availableLanguages, - language, - strings: translations[langCode], - momentLang: momentLangs[language.momentLangCode], - })}; + availableLanguages, + language, + strings: translations[langCode], + momentLang: momentLangs[language.momentLangCode], + })}; })()`; } diff --git a/website/server/controllers/api-v3/members.js b/website/server/controllers/api-v3/members.js index b9e390891e..279f759ee7 100644 --- a/website/server/controllers/api-v3/members.js +++ b/website/server/controllers/api-v3/members.js @@ -408,8 +408,8 @@ api.getChallengeMemberProgress = { userId: memberId, 'challenge.id': challengeId, }) - .select('-tags') // We don't want to return the tags publicly TODO same for other data? - .exec(); + .select('-tags') // We don't want to return the tags publicly TODO same for other data? + .exec(); // manually call toJSON with minimize: true so empty paths aren't returned let response = member.toJSON({minimize: true}); diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index 4dba59a44d..19e2777876 100644 --- a/website/server/controllers/api-v3/news.js +++ b/website/server/controllers/api-v3/news.js @@ -3,7 +3,7 @@ import { authWithHeaders } from '../../middlewares/auth'; let api = {}; // @TODO export this const, cannot export it from here because only routes are exported from controllers -const LAST_ANNOUNCEMENT_TITLE = 'WORLD BOSS: THE DYSHEARTENER IS UNLEASHED'; +const LAST_ANNOUNCEMENT_TITLE = 'FEBRUARY SUBSCRIBER ITEMS AND BEHIND THE SCENES BLOG'; const worldDmg = { // @TODO bailey: false, }; @@ -32,23 +32,21 @@ api.getNews = {

${res.t('newStuff')}

-

2/14/2018 - ${LAST_ANNOUNCEMENT_TITLE}

+

2/22/2018 - ${LAST_ANNOUNCEMENT_TITLE}


-

Oh no, a World Boss is attacking Habitica! Head to the Tavern to see it now. If you're on mobile, make sure that you have the latest versions downloaded to get the full experience!

-
-

~*~

-

The sun is rising on Valentine's Day when a shocking crash splinters the air. A blaze of sickly pink light lances through all the buildings, and bricks crumble as a deep crack rips through Habit City's main street. An unearthly shrieking rises through the air, shattering windows as a hulking form slithers forth from the oozing earth.

-

Mandibles snap and a carapace glitters; legs upon legs unfurl in the air. The crowd begins to scream as the insectoid creature rears up, revealing itself to be none other than that cruelest of creatures: the fearsome Dysheartener itself. It howls in anticipation and lunges forward, hungering to gnaw on the hopes of hard-working Habiticans. With each rasping scrape of its spiny forelegs, you feel a vise of despair tightening in your chest.

-

"Take heart, everyone!" Lemoness shouts. "It probably thinks that we're easy targets because so many of us have daunting New Year's Resolutions, but it's about to discover that Habiticans know how to stick to their goals!"

-

AnnDeLune raises her staff. "Let's tackle our tasks and take this monster down!"

-

~*~

-

Complete Habits, Dailies and To-Dos to damage the World Boss! Incomplete Dailies fill the Rage Strike Bar. When the Rage Strike bar is full, the World Boss will attack one of Habitica's shopkeepers. A World Boss will never damage individual players or accounts in any way. Only active accounts who are not resting in the Inn will have their incomplete Dailies tallied.

-

*If you’d prefer not to see the World Boss due to a phobia, check out the Phobia Protection Extension (and set it to hide “Beetles”) :)

-
by Lemoness, Beffymaroo, SabreCat, viirus, Apollo, and piyorii
-
Art by AnnDeLune, Lemoness, and Beffymaroo
-
Written by Lemoness
-
Phobia Protection Extension by Alys
- +

February Subscriber Items Revealed!

+

The February Subscriber Items have been revealed: The Love Bug Set!! It's a special three-piece set in honor of our ongoing battle with the Dysheartener. You only have until February 28 to receive the item set when you subscribe. If you're already an active subscriber, reload the site and then head to Inventory > Items to claim your gear!

+

Subscribers also receive the ability to buy Gems for Gold -- the longer you subscribe, the more Gems you can buy per month! There are other perks as well, such as longer access to uncompressed data and a cute Jackalope pet. Best of all, subscriptions let us keep Habitica running. Thank you very much for your support -- it means a lot to us.

+
+
by Beffymaroo
+
+
+

Behind the Scenes: Bringing a World Boss to Life

+

There's a new Behind the Scenes post on the Habitica blog! Ever wonder what goes into bringing a World Boss to Habitica? Check out this post for a behind the scenes glimpse of how the team makes these events happen. It's all fun and no spoilers (we promise)!

+
by Beffymaroo
+
+
+
`, }); diff --git a/website/server/controllers/api-v3/quests.js b/website/server/controllers/api-v3/quests.js index bbc7c2497e..c9dab902ab 100644 --- a/website/server/controllers/api-v3/quests.js +++ b/website/server/controllers/api-v3/quests.js @@ -79,8 +79,8 @@ api.inviteToQuest = { 'party._id': group._id, _id: {$ne: user._id}, }) - .select('auth.facebook auth.local preferences.emailNotifications profile.name pushDevices') - .exec(); + .select('auth.facebook auth.local preferences.emailNotifications profile.name pushDevices') + .exec(); group.markModified('quest'); group.quest.key = questKey; diff --git a/website/server/controllers/api-v3/tasks.js b/website/server/controllers/api-v3/tasks.js index 0e46bb10e7..8b9672afd0 100644 --- a/website/server/controllers/api-v3/tasks.js +++ b/website/server/controllers/api-v3/tasks.js @@ -287,7 +287,7 @@ api.getUserTasks = { async handler (req, res) { let types = Tasks.tasksTypes.map(type => `${type}s`); types.push('completedTodos', '_allCompletedTodos'); // _allCompletedTodos is currently in BETA and is likely to be removed in future - req.checkQuery('type', res.t('invalidTaskType')).optional().isIn(types); + req.checkQuery('type', res.t('invalidTasksTypeExtra')).optional().isIn(types); let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; @@ -325,7 +325,7 @@ api.getChallengeTasks = { async handler (req, res) { req.checkParams('challengeId', res.t('challengeIdRequired')).notEmpty().isUUID(); let types = Tasks.tasksTypes.map(type => `${type}s`); - req.checkQuery('type', res.t('invalidTaskType')).optional().isIn(types); + req.checkQuery('type', res.t('invalidTasksType')).optional().isIn(types); let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index a340fb56ce..bec0740a8c 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -86,7 +86,7 @@ api.getGroupTasks = { middlewares: [authWithHeaders()], async handler (req, res) { req.checkParams('groupId', res.t('groupIdRequired')).notEmpty().isUUID(); - req.checkQuery('type', res.t('invalidTaskType')).optional().isIn(types); + req.checkQuery('type', res.t('invalidTasksType')).optional().isIn(types); let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; @@ -493,8 +493,8 @@ api.getGroupApprovals = { 'group.approval.approved': false, 'group.approval.requested': true, }, 'userId group text') - .populate('userId', 'profile') - .exec(); + .populate('userId', 'profile') + .exec(); res.respond(200, approvals); }, diff --git a/website/server/controllers/api-v3/user.js b/website/server/controllers/api-v3/user.js index c8c04ff565..5776c9ef73 100644 --- a/website/server/controllers/api-v3/user.js +++ b/website/server/controllers/api-v3/user.js @@ -1,16 +1,14 @@ import { authWithHeaders } from '../../middlewares/auth'; import common from '../../../common'; import { - NotFound, BadRequest, NotAuthorized, } from '../../libs/errors'; -import * as Tasks from '../../models/task'; import { basicFields as basicGroupFields, model as Group, } from '../../models/group'; -import { model as User } from '../../models/user'; +import * as Tasks from '../../models/task'; import Bluebird from 'bluebird'; import _ from 'lodash'; import * as passwordUtils from '../../libs/password'; @@ -524,239 +522,6 @@ api.getUserAnonymized = { }, }; -const partyMembersFields = 'profile.name stats achievements items.special'; - -async function castTaskSpell (res, req, targetId, user, spell) { - if (!targetId) throw new BadRequest(res.t('targetIdUUID')); - - const task = await Tasks.Task.findOne({ - _id: targetId, - userId: user._id, - }).exec(); - if (!task) throw new NotFound(res.t('taskNotFound')); - if (task.challenge.id) throw new BadRequest(res.t('challengeTasksNoCast')); - if (task.group.id) throw new BadRequest(res.t('groupTasksNoCast')); - - spell.cast(user, task, req); - - const results = await Bluebird.all([ - user.save(), - task.save(), - ]); - - return results; -} - -async function castMultiTaskSpell (req, user, spell) { - const tasks = await Tasks.Task.find({ - userId: user._id, - ...Tasks.taskIsGroupOrChallengeQuery, - }).exec(); - - spell.cast(user, tasks, req); - - const toSave = tasks - .filter(t => t.isModified()) - .map(t => t.save()); - toSave.unshift(user.save()); - const saved = await Bluebird.all(toSave); - - const response = { - tasks: saved, - user, - }; - - return response; -} - -async function castSelfSpell (req, user, spell) { - spell.cast(user, null, req); - await user.save(); -} - -async function castPartySpell (req, party, partyMembers, user, spell) { - if (!party) { - partyMembers = [user]; // Act as solo party - } else { - partyMembers = await User - .find({ - 'party._id': party._id, - _id: { $ne: user._id }, // add separately - }) - // .select(partyMembersFields) Selecting the entire user because otherwise when saving it'll save - // default values for non-selected fields and pre('save') will mess up thinking some values are missing - .exec(); - - partyMembers.unshift(user); - } - - spell.cast(user, partyMembers, req); - await Bluebird.all(partyMembers.map(m => m.save())); - - return partyMembers; -} - -async function castUserSpell (res, req, party, partyMembers, targetId, user, spell) { - if (!party && (!targetId || user._id === targetId)) { - partyMembers = user; - } else { - if (!targetId) throw new BadRequest(res.t('targetIdUUID')); - if (!party) throw new NotFound(res.t('partyNotFound')); - partyMembers = await User - .findOne({_id: targetId, 'party._id': party._id}) - // .select(partyMembersFields) Selecting the entire user because otherwise when saving it'll save - // default values for non-selected fields and pre('save') will mess up thinking some values are missing - .exec(); - } - - if (!partyMembers) throw new NotFound(res.t('userWithIDNotFound', {userId: targetId})); - - spell.cast(user, partyMembers, req); - - if (partyMembers !== user) { - await Bluebird.all([ - user.save(), - partyMembers.save(), - ]); - } else { - await partyMembers.save(); // partyMembers is user - } - - return partyMembers; -} - -/** - * @api {post} /api/v3/user/class/cast/:spellId Cast a skill (spell) on a target - * @apiName UserCast - * @apiGroup User - * - - * @apiParam (Path) {String=fireball, mpheal, earth, frost, smash, defensiveStance, valorousPresence, intimidate, pickPocket, backStab, toolsOfTrade, stealth, heal, protectAura, brightness, healAll} spellId The skill to cast. - * @apiParam (Query) {UUID} targetId Query parameter, necessary if the spell is cast on a party member or task. Not used if the spell is case on the user or the user's current party. - * @apiParamExample {json} Query example: - * Cast "Pickpocket" on a task: - * https://habitica.com/api/v3/user/class/cast/pickPocket?targetId=fd427623... - * - * Cast "Tools of the Trade" on the party: - * https://habitica.com/api/v3/user/class/cast/toolsOfTrade - * - * @apiSuccess data Will return the modified targets. For party members only the necessary fields will be populated. The user is always returned. - * - * @apiDescription Skill Key to Name Mapping - * Mage - * fireball: "Burst of Flames" - * mpheal: "Ethereal Surge" - * earth: "Earthquake" - * frost: "Chilling Frost" - * - * Warrior - * smash: "Brutal Smash" - * defensiveStance: "Defensive Stance" - * valorousPresence: "Valorous Presence" - * intimidate: "Intimidating Gaze" - * - * Rogue - * pickPocket: "Pickpocket" - * backStab: "Backstab" - * toolsOfTrade: "Tools of the Trade" - * stealth: "Stealth" - * - * Healer - * heal: "Healing Light" - * protectAura: "Protective Aura" - * brightness: "Searing Brightness" - * healAll: "Blessing" - * - * @apiError (400) {NotAuthorized} Not enough mana. - * @apiUse TaskNotFound - * @apiUse PartyNotFound - * @apiUse UserNotFound - */ -api.castSpell = { - method: 'POST', - middlewares: [authWithHeaders()], - url: '/user/class/cast/:spellId', - async handler (req, res) { - let user = res.locals.user; - let spellId = req.params.spellId; - let targetId = req.query.targetId; - - // optional because not required by all targetTypes, presence is checked later if necessary - req.checkQuery('targetId', res.t('targetIdUUID')).optional().isUUID(); - - let reqValidationErrors = req.validationErrors(); - if (reqValidationErrors) throw reqValidationErrors; - - let klass = common.content.spells.special[spellId] ? 'special' : user.stats.class; - let spell = common.content.spells[klass][spellId]; - - if (!spell) throw new NotFound(res.t('spellNotFound', {spellId})); - if (spell.mana > user.stats.mp) throw new NotAuthorized(res.t('notEnoughMana')); - if (spell.value > user.stats.gp && !spell.previousPurchase) throw new NotAuthorized(res.t('messageNotEnoughGold')); - if (spell.lvl > user.stats.lvl) throw new NotAuthorized(res.t('spellLevelTooHigh', {level: spell.lvl})); - - let targetType = spell.target; - - if (targetType === 'task') { - const results = await castTaskSpell(res, req, targetId, user, spell); - res.respond(200, { - user: results[0], - task: results[1], - }); - } else if (targetType === 'self') { - await castSelfSpell(req, user, spell); - res.respond(200, { user }); - } else if (targetType === 'tasks') { // new target type in v3: when all the user's tasks are necessary - const response = await castMultiTaskSpell(req, user, spell); - res.respond(200, response); - } else if (targetType === 'party' || targetType === 'user') { - const party = await Group.getGroup({groupId: 'party', user}); - // arrays of users when targetType is 'party' otherwise single users - let partyMembers; - - if (targetType === 'party') { - partyMembers = await castPartySpell(req, party, partyMembers, user, spell); - } else { - partyMembers = await castUserSpell(res, req, party, partyMembers, targetId, user, spell); - } - - let partyMembersRes = Array.isArray(partyMembers) ? partyMembers : [partyMembers]; - - // Only return some fields. - // See comment above on why we can't just select the necessary fields when querying - partyMembersRes = partyMembersRes.map(partyMember => { - return common.pickDeep(partyMember.toJSON(), common.$w(partyMembersFields)); - }); - - res.respond(200, { - partyMembers: partyMembersRes, - user, - }); - - if (party && !spell.silent) { - let message = `\`${user.profile.name} casts ${spell.text()}${targetType === 'user' ? ` on ${partyMembers.profile.name}` : ' for the party'}.\``; - if (targetType === 'user') { - party.sendChat(message, null, null, { - type: 'spell_cast_user', - user: user.profile.name, - class: klass, - spell: spellId, - target: partyMembers.profile.name, - }); - } else { - party.sendChat(message, null, null, { - type: 'spell_cast_party', - user: user.profile.name, - class: klass, - spell: spellId, - }); - } - await party.save(); - } - } - }, -}; - /** * @api {post} /api/v3/user/sleep Make the user start / stop sleeping (resting in the Inn) * @apiName UserSleep diff --git a/website/server/controllers/api-v3/user/spells.js b/website/server/controllers/api-v3/user/spells.js new file mode 100644 index 0000000000..7a4a397ae3 --- /dev/null +++ b/website/server/controllers/api-v3/user/spells.js @@ -0,0 +1,155 @@ +import { authWithHeaders } from '../../../middlewares/auth'; +import common from '../../../../common'; +import { + model as Group, +} from '../../../models/group'; +import { + NotAuthorized, + NotFound, +} from '../../../libs/errors'; +import { + castTaskSpell, + castMultiTaskSpell, + castSelfSpell, + castPartySpell, + castUserSpell, +} from '../../../libs/spells'; + +const partyMembersFields = 'profile.name stats achievements items.special'; + +let api = {}; + +/** + * @api {post} /api/v3/user/class/cast/:spellId Cast a skill (spell) on a target + * @apiName UserCast + * @apiGroup User + * + + * @apiParam (Path) {String=fireball, mpheal, earth, frost, smash, defensiveStance, valorousPresence, intimidate, pickPocket, backStab, toolsOfTrade, stealth, heal, protectAura, brightness, healAll} spellId The skill to cast. + * @apiParam (Query) {UUID} targetId Query parameter, necessary if the spell is cast on a party member or task. Not used if the spell is case on the user or the user's current party. + * @apiParamExample {json} Query example: + * Cast "Pickpocket" on a task: + * https://habitica.com/api/v3/user/class/cast/pickPocket?targetId=fd427623... + * + * Cast "Tools of the Trade" on the party: + * https://habitica.com/api/v3/user/class/cast/toolsOfTrade + * + * @apiSuccess data Will return the modified targets. For party members only the necessary fields will be populated. The user is always returned. + * + * @apiDescription Skill Key to Name Mapping + * Mage + * fireball: "Burst of Flames" + * mpheal: "Ethereal Surge" + * earth: "Earthquake" + * frost: "Chilling Frost" + * + * Warrior + * smash: "Brutal Smash" + * defensiveStance: "Defensive Stance" + * valorousPresence: "Valorous Presence" + * intimidate: "Intimidating Gaze" + * + * Rogue + * pickPocket: "Pickpocket" + * backStab: "Backstab" + * toolsOfTrade: "Tools of the Trade" + * stealth: "Stealth" + * + * Healer + * heal: "Healing Light" + * protectAura: "Protective Aura" + * brightness: "Searing Brightness" + * healAll: "Blessing" + * + * @apiError (400) {NotAuthorized} Not enough mana. + * @apiUse TaskNotFound + * @apiUse PartyNotFound + * @apiUse UserNotFound + */ +api.castSpell = { + method: 'POST', + middlewares: [authWithHeaders()], + url: '/user/class/cast/:spellId', + async handler (req, res) { + let user = res.locals.user; + let spellId = req.params.spellId; + let targetId = req.query.targetId; + const quantity = req.body.quantity || 1; + + // optional because not required by all targetTypes, presence is checked later if necessary + req.checkQuery('targetId', res.t('targetIdUUID')).optional().isUUID(); + + let reqValidationErrors = req.validationErrors(); + if (reqValidationErrors) throw reqValidationErrors; + + let klass = common.content.spells.special[spellId] ? 'special' : user.stats.class; + let spell = common.content.spells[klass][spellId]; + + if (!spell) throw new NotFound(res.t('spellNotFound', {spellId})); + if (spell.mana > user.stats.mp) throw new NotAuthorized(res.t('notEnoughMana')); + if (spell.value > user.stats.gp && !spell.previousPurchase) throw new NotAuthorized(res.t('messageNotEnoughGold')); + if (spell.lvl > user.stats.lvl) throw new NotAuthorized(res.t('spellLevelTooHigh', {level: spell.lvl})); + + let targetType = spell.target; + + if (targetType === 'task') { + const results = await castTaskSpell(res, req, targetId, user, spell, quantity); + res.respond(200, { + user: results[0], + task: results[1], + }); + } else if (targetType === 'self') { + await castSelfSpell(req, user, spell, quantity); + res.respond(200, { user }); + } else if (targetType === 'tasks') { // new target type in v3: when all the user's tasks are necessary + const response = await castMultiTaskSpell(req, user, spell, quantity); + res.respond(200, response); + } else if (targetType === 'party' || targetType === 'user') { + const party = await Group.getGroup({groupId: 'party', user}); + // arrays of users when targetType is 'party' otherwise single users + let partyMembers; + + if (targetType === 'party') { + partyMembers = await castPartySpell(req, party, partyMembers, user, spell, quantity); + } else { + partyMembers = await castUserSpell(res, req, party, partyMembers, targetId, user, spell, quantity); + } + + let partyMembersRes = Array.isArray(partyMembers) ? partyMembers : [partyMembers]; + + // Only return some fields. + // See comment above on why we can't just select the necessary fields when querying + partyMembersRes = partyMembersRes.map(partyMember => { + return common.pickDeep(partyMember.toJSON(), common.$w(partyMembersFields)); + }); + + res.respond(200, { + partyMembers: partyMembersRes, + user, + }); + + if (party && !spell.silent) { + let message = `\`${user.profile.name} casts ${spell.text()}${targetType === 'user' ? ` on ${partyMembers.profile.name}` : ' for the party'}.\``; + if (targetType === 'user') { + party.sendChat(message, null, null, { + type: 'spell_cast_user', + user: user.profile.name, + class: klass, + spell: spellId, + target: partyMembers.profile.name, + }); + } else { + party.sendChat(message, null, null, { + type: 'spell_cast_party', + user: user.profile.name, + class: klass, + spell: spellId, + }); + } + await party.save(); + } + } + }, +}; + +module.exports = api; diff --git a/website/server/controllers/top-level/dataexport.js b/website/server/controllers/top-level/dataexport.js index 817d252d29..9f075b27ab 100644 --- a/website/server/controllers/top-level/dataexport.js +++ b/website/server/controllers/top-level/dataexport.js @@ -144,7 +144,12 @@ api.exportUserDataXml = { 'Content-Type': 'text/xml', 'Content-disposition': 'attachment; filename=habitica-user-data.xml', }); - res.status(200).send(js2xml('user', userData)); + res.status(200).send(js2xml.parse('user', userData, { + cdataInvalidChars: true, + declaration: { + include: false, + }, + })); }, }; @@ -159,7 +164,7 @@ api.exportUserDataXml = { * * @apiUse UserNotFound */ - // @TODO fix +// @TODO fix api.exportUserAvatarHtml = { method: 'GET', url: '/export/avatar-:memberId.html', @@ -223,11 +228,11 @@ api.exportUserAvatarPng = { } let [stream] = await new Pageres() - .src(`${BASE_URL}/export/avatar-${memberId}.html`, ['140x147'], { - crop: true, - filename: filename.replace('.png', ''), - }) - .run(); + .src(`${BASE_URL}/export/avatar-${memberId}.html`, ['140x147'], { + crop: true, + filename: filename.replace('.png', ''), + }) + .run(); let s3upload = S3.upload({ Bucket: S3_BUCKET, diff --git a/website/server/libs/challenges/index.js b/website/server/libs/challenges/index.js new file mode 100644 index 0000000000..84be475b87 --- /dev/null +++ b/website/server/libs/challenges/index.js @@ -0,0 +1,110 @@ +// Currently this holds helpers for challenge api, but we should break this up into submodules as it expands +import omit from 'lodash/omit'; +import uuid from 'uuid'; +import Bluebird from 'bluebird'; +import { model as Challenge } from '../../models/challenge'; +import { + model as Group, + TAVERN_ID, +} from '../../models/group'; +import { + NotFound, + NotAuthorized, +} from '../errors'; + +const TASK_KEYS_TO_REMOVE = ['_id', 'completed', 'dateCompleted', 'history', 'id', 'streak', 'createdAt', 'challenge']; + +export function addUserJoinChallengeNotification (user) { + if (user.achievements.joinedChallenge) return; + user.achievements.joinedChallenge = true; + user.addNotification('CHALLENGE_JOINED_ACHIEVEMENT'); +} + +export function getChallengeGroupResponse (group) { + return { + _id: group._id, + name: group.name, + type: group.type, + privacy: group.privacy, + }; +} + +export async function createChallenge (user, req, res) { + let groupId = req.body.group; + let prize = req.body.prize; + + let group = await Group.getGroup({user, groupId, fields: '-chat', mustBeMember: true}); + if (!group) throw new NotFound(res.t('groupNotFound')); + if (!group.isMember(user)) throw new NotAuthorized(res.t('mustBeGroupMember')); + + if (group.leaderOnly && group.leaderOnly.challenges && group.leader !== user._id) { + throw new NotAuthorized(res.t('onlyGroupLeaderChal')); + } + + if (group._id === TAVERN_ID && prize < 1) { + throw new NotAuthorized(res.t('tavChalsMinPrize')); + } + + if (prize > 0) { + let groupBalance = group.balance && group.leader === user._id ? group.balance : 0; + let prizeCost = prize / 4; + + if (prizeCost > user.balance + groupBalance) { + throw new NotAuthorized(res.t('cantAfford')); + } + + if (groupBalance >= prizeCost) { + // Group pays for all of prize + group.balance -= prizeCost; + } else if (groupBalance > 0) { + // User pays remainder of prize cost after group + let remainder = prizeCost - group.balance; + group.balance = 0; + user.balance -= remainder; + } else { + // User pays for all of prize + user.balance -= prizeCost; + } + } + + group.challengeCount += 1; + + if (!req.body.summary) { + req.body.summary = req.body.name; + } + req.body.leader = user._id; + req.body.official = user.contributor.admin && req.body.official ? true : false; + let challenge = new Challenge(Challenge.sanitize(req.body)); + + // First validate challenge so we don't save group if it's invalid (only runs sync validators) + let challengeValidationErrors = challenge.validateSync(); + if (challengeValidationErrors) throw challengeValidationErrors; + + addUserJoinChallengeNotification(user); + + let results = await Bluebird.all([challenge.save({ + validateBeforeSave: false, // already validate + }), group.save()]); + let savedChal = results[0]; + + await savedChal.syncToUser(user); // (it also saves the user) + + return {savedChal, group}; +} + +export function cleanUpTask (task) { + let cleansedTask = omit(task, TASK_KEYS_TO_REMOVE); + + // Copy checklists but reset to uncomplete and assign new id + if (!cleansedTask.checklist) cleansedTask.checklist = []; + cleansedTask.checklist.forEach((item) => { + item.completed = false; + item.id = uuid(); + }); + + if (cleansedTask.type !== 'reward') { + delete cleansedTask.value; + } + + return cleansedTask; +} diff --git a/website/server/libs/email.js b/website/server/libs/email.js index ed53e7e315..330f2d2ac4 100644 --- a/website/server/libs/email.js +++ b/website/server/libs/email.js @@ -1,8 +1,8 @@ -import { createTransport } from 'nodemailer'; +import nodemailer from 'nodemailer'; import nconf from 'nconf'; import { TAVERN_ID } from '../models/group'; import { encrypt } from './encryption'; -import request from 'request'; +import got from 'got'; import logger from './logger'; import common from '../../common'; @@ -16,7 +16,7 @@ const EMAIL_SERVER = { }; const BASE_URL = nconf.get('BASE_URL'); -let smtpTransporter = createTransport({ +let smtpTransporter = nodemailer.createTransport({ service: nconf.get('SMTP_SERVICE'), auth: { user: nconf.get('SMTP_USER'), @@ -150,13 +150,10 @@ export function sendTxn (mailingInfoArray, emailType, variables, personalVariabl } if (IS_PROD && mailingInfoArray.length > 0) { - request.post({ - url: `${EMAIL_SERVER.url}/job`, - auth: { - user: EMAIL_SERVER.auth.user, - pass: EMAIL_SERVER.auth.password, - }, - json: { + got.post(`${EMAIL_SERVER.url}/job`, { + auth: `${EMAIL_SERVER.auth.user}:${EMAIL_SERVER.auth.password}`, + json: true, + body: { type: 'email', data: { emailType, @@ -170,6 +167,6 @@ export function sendTxn (mailingInfoArray, emailType, variables, personalVariabl backoff: {delay: 10 * 60 * 1000, type: 'fixed'}, }, }, - }, (err) => logger.error(err)); + }).catch((err) => logger.error(err)); } } diff --git a/website/server/libs/logger.js b/website/server/libs/logger.js index 9d1cd13aab..67bc4df2a7 100644 --- a/website/server/libs/logger.js +++ b/website/server/libs/logger.js @@ -22,10 +22,10 @@ if (IS_PROD) { prettyPrint: false, }); logger.add(winston.transports.Loggly, { - inputToken: nconf.get('LOGGLY:TOKEN'), - subdomain: nconf.get('LOGGLY:SUBDOMAIN'), - tags: ['Winston-NodeJS'], - json: true, + inputToken: nconf.get('LOGGLY:TOKEN'), + subdomain: nconf.get('LOGGLY:SUBDOMAIN'), + tags: ['Winston-NodeJS'], + json: true, }); } } else if (!IS_TEST || IS_TEST && ENABLE_LOGS_IN_TEST) { // Do not log anything when testing unless specified diff --git a/website/server/libs/password.js b/website/server/libs/password.js index c81c836e04..12d162f6ef 100644 --- a/website/server/libs/password.js +++ b/website/server/libs/password.js @@ -21,17 +21,17 @@ export function bcryptCompare (passwordToCheck, hashedPassword) { // Used for legacy passwords that have not yet been migrated to bcrypt export function sha1Encrypt (password, salt) { return crypto - .createHmac('sha1', salt) - .update(password) - .digest('hex'); + .createHmac('sha1', salt) + .update(password) + .digest('hex'); } // Create a salt, default length is 10 export function sha1MakeSalt (len = 10) { return crypto - .randomBytes(Math.ceil(len / 2)) - .toString('hex') - .substring(0, len); + .randomBytes(Math.ceil(len / 2)) + .toString('hex') + .substring(0, len); } // Compare the password for an user diff --git a/website/server/libs/payments.js b/website/server/libs/payments.js index 33ea4c2b39..c041e3c479 100644 --- a/website/server/libs/payments.js +++ b/website/server/libs/payments.js @@ -42,7 +42,7 @@ function revealMysteryItems (user) { moment().isBefore(shared.content.mystery[item.mystery].end) && !user.items.gear.owned[item.key] && user.purchased.plan.mysteryItems.indexOf(item.key) === -1 - ) { + ) { user.purchased.plan.mysteryItems.push(item.key); pushedItems.push(item.key); } @@ -511,9 +511,9 @@ api.cancelSubscription = async function cancelSubscription (data) { plan.dateTerminated = moment(nowStr, nowStrFormat) - .add({days: remaining}) - .add({days: extraDays}) - .toDate(); + .add({days: remaining}) + .add({days: extraDays}) + .toDate(); plan.extraMonths = 0; // clear extra time. If they subscribe again, it'll be recalculated from p.dateTerminated diff --git a/website/server/libs/pushNotifications.js b/website/server/libs/pushNotifications.js index ddd7f12667..7e31d76660 100644 --- a/website/server/libs/pushNotifications.js +++ b/website/server/libs/pushNotifications.js @@ -1,8 +1,7 @@ import _ from 'lodash'; import nconf from 'nconf'; -// TODO remove this lib and use directly the apn module +// @TODO remove this lib and use directly the apn module import pushNotify from 'push-notify'; -import apnLib from 'apn'; import logger from './logger'; import Bluebird from 'bluebird'; import { @@ -31,34 +30,22 @@ if (APN_ENABLED) { Key: 'apple_apn/key.pem', }).promise(), ]) - .then(([certObj, keyObj]) => { - let cert = certObj.Body.toString(); - let key = keyObj.Body.toString(); + .then(([certObj, keyObj]) => { + let cert = certObj.Body.toString(); + let key = keyObj.Body.toString(); - apn = pushNotify.apn({ - key, - cert, - }); + apn = pushNotify.apn({ + key, + cert, + }); - apn.on('error', err => logger.error('APN error', err)); - apn.on('transmissionError', (errorCode, notification, device) => { - logger.error('APN transmissionError', errorCode, notification, device); + apn.on('error', err => logger.error('APN error', err)); + apn.on('transmissionError', (errorCode, notification, device) => { + logger.error('APN transmissionError', errorCode, notification, device); + }); }); - - let feedback = new apnLib.Feedback({ - key, - cert, - batchFeedback: true, - interval: 3600, // Check for feedback once an hour - }); - - feedback.on('feedback', (devices) => { - if (devices && devices.length > 0) { - logger.info('Delivery of push notifications failed for some Apple devices.', devices); - } - }); - }); } + function sendNotification (user, details = {}) { if (!user) throw new Error('User is required.'); if (user.preferences.pushNotifications.unsubscribeFromAll === true) return; diff --git a/website/server/libs/spells.js b/website/server/libs/spells.js new file mode 100644 index 0000000000..ba728e3664 --- /dev/null +++ b/website/server/libs/spells.js @@ -0,0 +1,121 @@ +import Bluebird from 'bluebird'; + +import { model as User } from '../models/user'; +import * as Tasks from '../models/task'; +import { + NotFound, + BadRequest, +} from './errors'; + +// @TODO: After refactoring individual spells, move quantity to the calculations + +async function castTaskSpell (res, req, targetId, user, spell, quantity = 1) { + if (!targetId) throw new BadRequest(res.t('targetIdUUID')); + + const task = await Tasks.Task.findOne({ + _id: targetId, + userId: user._id, + }).exec(); + if (!task) throw new NotFound(res.t('taskNotFound')); + if (task.challenge.id) throw new BadRequest(res.t('challengeTasksNoCast')); + if (task.group.id) throw new BadRequest(res.t('groupTasksNoCast')); + + for (let i = 0; i < quantity; i += 1) { + spell.cast(user, task, req); + } + + const results = await Bluebird.all([ + user.save(), + task.save(), + ]); + + return results; +} + +async function castMultiTaskSpell (req, user, spell, quantity = 1) { + const tasks = await Tasks.Task.find({ + userId: user._id, + ...Tasks.taskIsGroupOrChallengeQuery, + }).exec(); + + for (let i = 0; i < quantity; i += 1) { + spell.cast(user, tasks, req); + } + + const toSave = tasks + .filter(t => t.isModified()) + .map(t => t.save()); + toSave.unshift(user.save()); + const saved = await Bluebird.all(toSave); + + const response = { + tasks: saved, + user, + }; + + return response; +} + +async function castSelfSpell (req, user, spell, quantity = 1) { + for (let i = 0; i < quantity; i += 1) { + spell.cast(user, null, req); + } + await user.save(); +} + +async function castPartySpell (req, party, partyMembers, user, spell, quantity = 1) { + if (!party) { + partyMembers = [user]; // Act as solo party + } else { + partyMembers = await User + .find({ + 'party._id': party._id, + _id: { $ne: user._id }, // add separately + }) + // .select(partyMembersFields) Selecting the entire user because otherwise when saving it'll save + // default values for non-selected fields and pre('save') will mess up thinking some values are missing + .exec(); + + partyMembers.unshift(user); + } + + for (let i = 0; i < quantity; i += 1) { + spell.cast(user, partyMembers, req); + } + await Bluebird.all(partyMembers.map(m => m.save())); + + return partyMembers; +} + +async function castUserSpell (res, req, party, partyMembers, targetId, user, spell, quantity = 1) { + if (!party && (!targetId || user._id === targetId)) { + partyMembers = user; + } else { + if (!targetId) throw new BadRequest(res.t('targetIdUUID')); + if (!party) throw new NotFound(res.t('partyNotFound')); + partyMembers = await User + .findOne({_id: targetId, 'party._id': party._id}) + // .select(partyMembersFields) Selecting the entire user because otherwise when saving it'll save + // default values for non-selected fields and pre('save') will mess up thinking some values are missing + .exec(); + } + + if (!partyMembers) throw new NotFound(res.t('userWithIDNotFound', {userId: targetId})); + + for (let i = 0; i < quantity; i += 1) { + spell.cast(user, partyMembers, req); + } + + if (partyMembers !== user) { + await Bluebird.all([ + user.save(), + partyMembers.save(), + ]); + } else { + await partyMembers.save(); // partyMembers is user + } + + return partyMembers; +} + +export {castTaskSpell, castMultiTaskSpell, castSelfSpell, castPartySpell, castUserSpell}; diff --git a/website/server/libs/webhook.js b/website/server/libs/webhook.js index bbe2ba8f45..4265abf9ba 100644 --- a/website/server/libs/webhook.js +++ b/website/server/libs/webhook.js @@ -1,21 +1,21 @@ -import { post } from 'request'; +import got from 'got'; import { isURL } from 'validator'; import logger from './logger'; +import nconf from 'nconf'; + +const IS_PRODUCTION = nconf.get('IS_PROD'); function sendWebhook (url, body) { - post({ - url, + got.post(url, { body, json: true, - }, (err) => { - if (err) { - logger.error(err); - } - }); + }).catch(err => logger.error(err)); } function isValidWebhook (hook) { - return hook.enabled && isURL(hook.url); + return hook.enabled && isURL(hook.url, { + require_tld: IS_PRODUCTION ? true : false, // eslint-disable-line camelcase + }); } export class WebhookSender { diff --git a/website/server/middlewares/analytics.js b/website/server/middlewares/analytics.js index f86becb773..2ab8b1fd7d 100644 --- a/website/server/middlewares/analytics.js +++ b/website/server/middlewares/analytics.js @@ -1,8 +1,8 @@ import nconf from 'nconf'; import { - track, - trackPurchase, - mockAnalyticsService, + track, + trackPurchase, + mockAnalyticsService, } from '../libs/analyticsService'; let service; diff --git a/website/server/middlewares/auth.js b/website/server/middlewares/auth.js index 012d52584a..b86f525d35 100644 --- a/website/server/middlewares/auth.js +++ b/website/server/middlewares/auth.js @@ -44,17 +44,17 @@ export function authWithHeaders (optional = false, userFieldProjection = '') { const findPromise = fields ? User.findOne(userQuery, fields) : User.findOne(userQuery); return findPromise - .exec() - .then((user) => { - if (!user) throw new NotAuthorized(res.t('invalidCredentials')); - if (user.auth.blocked) throw new NotAuthorized(res.t('accountSuspended', {communityManagerEmail: COMMUNITY_MANAGER_EMAIL, userId: user._id})); + .exec() + .then((user) => { + if (!user) throw new NotAuthorized(res.t('invalidCredentials')); + if (user.auth.blocked) throw new NotAuthorized(res.t('accountSuspended', {communityManagerEmail: COMMUNITY_MANAGER_EMAIL, userId: user._id})); - res.locals.user = user; + res.locals.user = user; - req.session.userId = user._id; - return next(); - }) - .catch(next); + req.session.userId = user._id; + return next(); + }) + .catch(next); }; } @@ -74,14 +74,14 @@ export function authWithSession (req, res, next) { return User.findOne({ _id: userId, }) - .exec() - .then((user) => { - if (!user) throw new NotAuthorized(res.t('invalidCredentials')); + .exec() + .then((user) => { + if (!user) throw new NotAuthorized(res.t('invalidCredentials')); - res.locals.user = user; - return next(); - }) - .catch(next); + res.locals.user = user; + return next(); + }) + .catch(next); } export function authWithUrl (req, res, next) { @@ -98,11 +98,11 @@ export function authWithUrl (req, res, next) { } return User.findOne({ _id: userId, apiToken }).exec() - .then((user) => { - if (!user) throw new NotAuthorized(res.t('invalidCredentials')); + .then((user) => { + if (!user) throw new NotAuthorized(res.t('invalidCredentials')); - res.locals.user = user; - return next(); - }) - .catch(next); + res.locals.user = user; + return next(); + }) + .catch(next); } diff --git a/website/server/middlewares/language.js b/website/server/middlewares/language.js index 50ef8a2b16..d5d6f2d96f 100644 --- a/website/server/middlewares/language.js +++ b/website/server/middlewares/language.js @@ -77,13 +77,13 @@ export function getUserLanguage (req, res, next) { return User.findOne({ _id: req.session.userId, }, 'preferences.language') - .lean() - .exec() - .then((user) => { - req.language = _getFromUser(user, req); - return next(); - }) - .catch(next); + .lean() + .exec() + .then((user) => { + req.language = _getFromUser(user, req); + return next(); + }) + .catch(next); } else { // Otherwise get from browser req.language = _getFromUser(null, req); return next(); diff --git a/website/server/models/group.js b/website/server/models/group.js index 323a3b7b10..6477ddb9d1 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -1106,16 +1106,16 @@ let tavernQ = {_id: TAVERN_ID, 'quest.key': {$ne: null}}; // we use process.nextTick because at this point the model is not yet available process.nextTick(() => { model // eslint-disable-line no-use-before-define - .findOne(tavernQ).exec() - .then(tavern => { - if (!tavern) return; // No tavern quest + .findOne(tavernQ).exec() + .then(tavern => { + if (!tavern) return; // No tavern quest - // Using _assign so we don't lose the reference to the exported tavernQuest - _.assign(tavernQuest, tavern.quest.toObject()); - }) - .catch(err => { - throw err; - }); + // Using _assign so we don't lose the reference to the exported tavernQuest + _.assign(tavernQuest, tavern.quest.toObject()); + }) + .catch(err => { + throw err; + }); }); // returns a promise diff --git a/website/server/models/task.js b/website/server/models/task.js index ee3bdc538e..866d3b5c68 100644 --- a/website/server/models/task.js +++ b/website/server/models/task.js @@ -144,7 +144,7 @@ TaskSchema.statics.findByIdOrAlias = async function findByIdOrAlias (identifier, let query = _.cloneDeep(additionalQueries); - if (validator.isUUID(identifier)) { + if (validator.isUUID(String(identifier))) { query._id = identifier; } else { query.userId = userId; diff --git a/website/server/models/webhook.js b/website/server/models/webhook.js index 19522bd491..7398592080 100644 --- a/website/server/models/webhook.js +++ b/website/server/models/webhook.js @@ -5,7 +5,9 @@ import shared from '../../common'; import {v4 as uuid} from 'uuid'; import _ from 'lodash'; import { BadRequest } from '../libs/errors'; +import nconf from 'nconf'; +const IS_PRODUCTION = nconf.get('IS_PROD'); const Schema = mongoose.Schema; const TASK_ACTIVITY_DEFAULT_OPTIONS = Object.freeze({ @@ -36,7 +38,11 @@ export let schema = new Schema({ url: { type: String, required: true, - validate: [validator.isURL, shared.i18n.t('invalidUrl')], + validate: [(v) => { + return validator.isURL(v, { + require_tld: IS_PRODUCTION ? true : false, // eslint-disable-line camelcase + }); + }, shared.i18n.t('invalidUrl')], }, enabled: { type: Boolean, required: true, default: true }, options: { @@ -72,7 +78,7 @@ schema.methods.formatOptions = function formatOptions (res) { } else if (this.type === 'groupChatReceived') { this.options = _.pick(this.options, 'groupId'); - if (!validator.isUUID(this.options.groupId)) { + if (!validator.isUUID(String(this.options.groupId))) { throw new BadRequest(res.t('groupIdRequired')); } }