Merge remote-tracking branch 'upstream/develop' into develop
|
|
@ -1,3 +1,2 @@
|
|||
node_modules
|
||||
.git
|
||||
website
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
FROM node:12
|
||||
WORKDIR /code
|
||||
COPY package*.json /code/
|
||||
RUN npm install
|
||||
|
||||
# Install global packages
|
||||
RUN npm install -g gulp-cli mocha
|
||||
|
||||
# Copy Habitica code into container and install dependencies
|
||||
WORKDIR /usr/src/habitica
|
||||
COPY . /usr/src/habitica
|
||||
|
||||
RUN npm install
|
||||
RUN npm run postinstall
|
||||
|
|
|
|||
126
migrations/archive/2019/20191127_harvest_feast.js
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/* eslint-disable no-console */
|
||||
const MIGRATION_NAME = '20191127_harvest_feast';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count++;
|
||||
|
||||
const set = {};
|
||||
let inc;
|
||||
let push;
|
||||
|
||||
set.migration = MIGRATION_NAME;
|
||||
|
||||
if (typeof user.items.gear.owned.head_special_turkeyHelmGilded !== 'undefined') {
|
||||
inc = {
|
||||
'items.food.Pie_Base': 1,
|
||||
'items.food.Pie_CottonCandyBlue': 1,
|
||||
'items.food.Pie_CottonCandyPink': 1,
|
||||
'items.food.Pie_Desert': 1,
|
||||
'items.food.Pie_Golden': 1,
|
||||
'items.food.Pie_Red': 1,
|
||||
'items.food.Pie_Shade': 1,
|
||||
'items.food.Pie_Skeleton': 1,
|
||||
'items.food.Pie_Zombie': 1,
|
||||
'items.food.Pie_White': 1,
|
||||
}
|
||||
} else if (typeof user.items.gear.owned.armor_special_turkeyArmorBase !== 'undefined') {
|
||||
set['items.gear.owned.head_special_turkeyHelmGilded'] = false;
|
||||
set['items.gear.owned.armor_special_turkeyArmorGilded'] = false;
|
||||
set['items.gear.owned.back_special_turkeyTailGilded'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_turkeyHelmGilded',
|
||||
_id: uuid(),
|
||||
},
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.armor_special_turkeyArmorGilded',
|
||||
_id: uuid(),
|
||||
},
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.back_special_turkeyTailGilded',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (user.items && user.items.mounts && user.items.mounts['Turkey-Gilded']) {
|
||||
set['items.gear.owned.head_special_turkeyHelmBase'] = false;
|
||||
set['items.gear.owned.armor_special_turkeyArmorBase'] = false;
|
||||
set['items.gear.owned.back_special_turkeyTailBase'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_turkeyHelmBase',
|
||||
_id: uuid(),
|
||||
},
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.armor_special_turkeyArmorBase',
|
||||
_id: uuid(),
|
||||
},
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.back_special_turkeyTailBase',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (user.items && user.items.pets && user.items.pets['Turkey-Gilded']) {
|
||||
set['items.mounts.Turkey-Gilded'] = true;
|
||||
} else if (user.items && user.items.mounts && user.items.mounts['Turkey-Base']) {
|
||||
set['items.pets.Turkey-Gilded'] = 5;
|
||||
} else if (user.items && user.items.pets && user.items.pets['Turkey-Base']) {
|
||||
set['items.mounts.Turkey-Base'] = true;
|
||||
} else {
|
||||
set['items.pets.Turkey-Base'] = 5;
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
if (inc) {
|
||||
return await User.update({_id: user._id}, {$inc: inc, $set: set}).exec();
|
||||
} else if (push) {
|
||||
return await User.update({_id: user._id}, {$set: set, $push: {pinnedItems: {$each: push}}}).exec();
|
||||
} else {
|
||||
return await User.update({_id: user._id}, {$set: set}).exec();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = async function processUsers () {
|
||||
let query = {
|
||||
migration: {$ne: MIGRATION_NAME},
|
||||
'auth.timestamps.loggedin': {$gt: new Date('2019-11-01')},
|
||||
};
|
||||
|
||||
const fields = {
|
||||
_id: 1,
|
||||
items: 1,
|
||||
};
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({_id: 1})
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (users.length === 0) {
|
||||
console.warn('All appropriate users found and modified.');
|
||||
console.warn(`\n${count} users processed\n`);
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1],
|
||||
};
|
||||
}
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
import monk from 'monk';
|
||||
import nconf from 'nconf';
|
||||
|
||||
const migrationName = 'mystery-items-201808.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_201810', 'head_mystery_201810'];
|
||||
const CONNECTION_STRING = nconf.get('MIGRATION_CONNECT_STRING');
|
||||
|
||||
let dbUsers = monk(CONNECTION_STRING).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;
|
||||
|
|
@ -16,7 +16,7 @@ async function updateUser (user) {
|
|||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
sendTxn(
|
||||
await sendTxn(
|
||||
user,
|
||||
EMAIL_SLUG,
|
||||
[{ name: 'BASE_URL', content: BASE_URL }], // Add variables from template
|
||||
|
|
|
|||
|
|
@ -1,72 +0,0 @@
|
|||
/* eslint-disable no-console */
|
||||
import { model as User } from '../../website/server/models/user';
|
||||
import { model as UserNotification } from '../../website/server/models/userNotification';
|
||||
|
||||
const MIGRATION_NAME = 'mystery_items_201910';
|
||||
const MYSTERY_ITEMS = ['armor_mystery_201910', 'head_mystery_201910'];
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count += 1;
|
||||
|
||||
const addToSet = {
|
||||
'purchased.plan.mysteryItems': {
|
||||
$each: MYSTERY_ITEMS,
|
||||
},
|
||||
};
|
||||
const push = {
|
||||
notifications: (new UserNotification({
|
||||
type: 'NEW_MYSTERY_ITEMS',
|
||||
data: {
|
||||
MYSTERY_ITEMS,
|
||||
},
|
||||
})).toJSON(),
|
||||
};
|
||||
const set = {
|
||||
migration: MIGRATION_NAME,
|
||||
};
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
return User.update({ _id: user._id }, { $set: set, $push: push, $addToSet: addToSet }).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
const query = {
|
||||
migration: { $ne: MIGRATION_NAME },
|
||||
'purchased.plan.customerId': { $ne: null },
|
||||
$or: [
|
||||
{ 'purchased.plan.dateTerminated': { $gte: new Date() } },
|
||||
{ 'purchased.plan.dateTerminated': { $exists: false } },
|
||||
{ 'purchased.plan.dateTerminated': { $eq: null } },
|
||||
],
|
||||
};
|
||||
|
||||
const fields = {
|
||||
_id: 1,
|
||||
};
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({ _id: 1 })
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (users.length === 0) {
|
||||
console.warn('All appropriate users found and modified.');
|
||||
console.warn(`\n${count} users processed\n`);
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1],
|
||||
};
|
||||
}
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
}
|
||||
1172
package-lock.json
generated
27
package.json
|
|
@ -1,21 +1,21 @@
|
|||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.121.0",
|
||||
"version": "4.125.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.7.2",
|
||||
"@babel/preset-env": "^7.7.1",
|
||||
"@babel/register": "^7.7.0",
|
||||
"@google-cloud/trace-agent": "^4.2.2",
|
||||
"@babel/core": "^7.7.4",
|
||||
"@babel/preset-env": "^7.7.4",
|
||||
"@babel/register": "^7.7.4",
|
||||
"@google-cloud/trace-agent": "^4.2.3",
|
||||
"@slack/client": "^3.8.1",
|
||||
"accepts": "^1.3.5",
|
||||
"amazon-payments": "^0.2.7",
|
||||
"amplitude": "^3.5.0",
|
||||
"apidoc": "^0.17.5",
|
||||
"apn": "^2.2.0",
|
||||
"aws-sdk": "^2.568.0",
|
||||
"bcrypt": "^3.0.6",
|
||||
"aws-sdk": "^2.580.0",
|
||||
"bcrypt": "^3.0.7",
|
||||
"body-parser": "^1.18.3",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-session": "^1.3.3",
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
"csv-stringify": "^5.1.0",
|
||||
"cwait": "^1.1.1",
|
||||
"domain-middleware": "~0.1.0",
|
||||
"eslint": "^6.6.0",
|
||||
"eslint": "^6.7.2",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.16.3",
|
||||
|
|
@ -33,10 +33,10 @@
|
|||
"got": "^9.0.0",
|
||||
"gulp": "^4.0.0",
|
||||
"gulp-babel": "^8.0.0",
|
||||
"gulp-imagemin": "^6.1.1",
|
||||
"gulp-imagemin": "^6.2.0",
|
||||
"gulp-nodemon": "^2.4.1",
|
||||
"gulp.spritesmith": "^6.9.0",
|
||||
"habitica-markdown": "^1.3.0",
|
||||
"habitica-markdown": "^1.3.2",
|
||||
"helmet": "^3.21.2",
|
||||
"image-size": "^0.8.3",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
|
|
@ -46,7 +46,7 @@
|
|||
"method-override": "^3.0.0",
|
||||
"moment": "^2.24.0",
|
||||
"moment-recur": "^1.0.7",
|
||||
"mongoose": "^5.7.9",
|
||||
"mongoose": "^5.7.13",
|
||||
"morgan": "^1.7.0",
|
||||
"nconf": "^0.10.0",
|
||||
"node-gcm": "^1.0.2",
|
||||
|
|
@ -59,10 +59,11 @@
|
|||
"paypal-rest-sdk": "^1.8.1",
|
||||
"ps-tree": "^1.0.0",
|
||||
"regenerator-runtime": "^0.13.3",
|
||||
"remove-markdown": "^0.3.0",
|
||||
"rimraf": "^3.0.0",
|
||||
"short-uuid": "^3.0.0",
|
||||
"stripe": "^7.13.0",
|
||||
"superagent": "^5.0.2",
|
||||
"stripe": "^7.14.0",
|
||||
"superagent": "^5.1.2",
|
||||
"universal-analytics": "^0.4.17",
|
||||
"useragent": "^2.1.9",
|
||||
"uuid": "^3.3.3",
|
||||
|
|
|
|||
|
|
@ -24,7 +24,13 @@ async function deleteAmplitudeData (userId, email) {
|
|||
console.log(err.response.data);
|
||||
});
|
||||
|
||||
if (response) console.log(`${response.status} ${response.statusText}`);
|
||||
if (response) {
|
||||
if (response.status === 200) {
|
||||
console.log(`${userId} (${email}) Amplitude deletion request OK.`);
|
||||
} else {
|
||||
console.log(`${userId} (${email}) Amplitude response: ${response.status} ${response.statusText}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteHabiticaData (user, email) {
|
||||
|
|
@ -54,39 +60,46 @@ async function deleteHabiticaData (user, email) {
|
|||
});
|
||||
|
||||
if (response) {
|
||||
console.log(`${response.status} ${response.statusText}`);
|
||||
if (response.status === 200) console.log(`${user._id} (${email}) removed. Last login: ${user.auth.timestamps.loggedin}`);
|
||||
if (response.status === 200) {
|
||||
console.log(`${user._id} (${email}) removed from Habitica. Last login: ${user.auth.timestamps.loggedin}`);
|
||||
} else {
|
||||
console.log(`${user._id} (${email}) Habitica response: ${response.status} ${response.statusText}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function processEmailAddress (email) {
|
||||
const emailRegex = new RegExp(`^${email}$`, 'i');
|
||||
const users = await User.find({
|
||||
$or: [
|
||||
const localUsers = await User.find(
|
||||
{ 'auth.local.email': emailRegex },
|
||||
{ 'auth.facebook.emails.value': emailRegex },
|
||||
{ 'auth.google.emails.value': emailRegex },
|
||||
{ _id: 1, apiToken: 1, auth: 1 },
|
||||
).exec();
|
||||
|
||||
const socialUsers = await User.find(
|
||||
{
|
||||
$or: [
|
||||
{ 'auth.facebook.emails.value': email },
|
||||
{ 'auth.google.emails.value': email },
|
||||
],
|
||||
},
|
||||
{
|
||||
_id: 1,
|
||||
apiToken: 1,
|
||||
auth: 1,
|
||||
}).exec();
|
||||
{ _id: 1, apiToken: 1, auth: 1 },
|
||||
).collation(
|
||||
{ locale: 'en', strength: 1 },
|
||||
).exec();
|
||||
|
||||
const users = localUsers.concat(socialUsers);
|
||||
|
||||
if (users.length < 1) {
|
||||
console.log(`No users found with email address ${email}`);
|
||||
} else {
|
||||
Promise.all(users.map(user => (async () => {
|
||||
return console.log(`No users found with email address ${email}`);
|
||||
}
|
||||
|
||||
return Promise.all(users.map(user => (async () => {
|
||||
await deleteAmplitudeData(user._id, email); // eslint-disable-line no-await-in-loop
|
||||
await deleteHabiticaData(user, email); // eslint-disable-line no-await-in-loop
|
||||
})()));
|
||||
}
|
||||
}
|
||||
|
||||
function deleteUserData (emails) {
|
||||
export default function deleteUserData (emails) {
|
||||
const emailPromises = emails.map(processEmailAddress);
|
||||
return Promise.all(emailPromises);
|
||||
}
|
||||
|
||||
module.exports = deleteUserData;
|
||||
|
|
|
|||
|
|
@ -88,6 +88,28 @@ describe('cron', () => {
|
|||
user.purchased.plan.dateUpdated = moment().subtract(1, 'months').toDate();
|
||||
});
|
||||
|
||||
it('awards current mystery items to subscriber', () => {
|
||||
user.purchased.plan.dateUpdated = new Date('2018-12-11');
|
||||
clock = sinon.useFakeTimers(new Date('2019-01-29'));
|
||||
cron({
|
||||
user, tasksByType, daysMissed, analytics,
|
||||
});
|
||||
expect(user.purchased.plan.mysteryItems.length).to.eql(2);
|
||||
const filteredNotifications = user.notifications.filter(n => n.type === 'NEW_MYSTERY_ITEMS');
|
||||
expect(filteredNotifications.length).to.equal(1);
|
||||
});
|
||||
|
||||
it('awards multiple mystery item sets if user skipped months between logins', () => {
|
||||
user.purchased.plan.dateUpdated = new Date('2018-11-11');
|
||||
clock = sinon.useFakeTimers(new Date('2019-01-29'));
|
||||
cron({
|
||||
user, tasksByType, daysMissed, analytics,
|
||||
});
|
||||
expect(user.purchased.plan.mysteryItems.length).to.eql(4);
|
||||
const filteredNotifications = user.notifications.filter(n => n.type === 'NEW_MYSTERY_ITEMS');
|
||||
expect(filteredNotifications.length).to.equal(1);
|
||||
});
|
||||
|
||||
it('resets plan.gemsBought on a new month', () => {
|
||||
user.purchased.plan.gemsBought = 10;
|
||||
cron({
|
||||
|
|
|
|||
|
|
@ -439,31 +439,6 @@ describe('payments/index', () => {
|
|||
fakeClock.restore();
|
||||
});
|
||||
|
||||
it('does not awards mystery items when not within the timeframe for a mystery item', async () => {
|
||||
const noMysteryItemTimeframe = 1462183920000; // May 2nd 2016
|
||||
const fakeClock = sinon.useFakeTimers(noMysteryItemTimeframe);
|
||||
data = { paymentMethod: 'PaymentMethod', user, sub: { key: 'basic_3mo' } };
|
||||
|
||||
await api.createSubscription(data);
|
||||
|
||||
expect(user.purchased.plan.mysteryItems).to.have.a.lengthOf(0);
|
||||
|
||||
fakeClock.restore();
|
||||
});
|
||||
|
||||
it('does not add a notification for mystery items if none was awarded', async () => {
|
||||
const noMysteryItemTimeframe = 1462183920000; // May 2nd 2016
|
||||
const fakeClock = sinon.useFakeTimers(noMysteryItemTimeframe);
|
||||
data = { paymentMethod: 'PaymentMethod', user, sub: { key: 'basic_3mo' } };
|
||||
|
||||
await api.createSubscription(data);
|
||||
|
||||
expect(user.purchased.plan.mysteryItems).to.have.a.lengthOf(0);
|
||||
expect(user.notifications.find(n => n.type === 'NEW_MYSTERY_ITEMS')).to.be.undefined;
|
||||
|
||||
fakeClock.restore();
|
||||
});
|
||||
|
||||
it('does not award mystery item when user already owns the item', async () => {
|
||||
const mayMysteryItemTimeframe = 1464725113000; // May 31st 2016
|
||||
const fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe);
|
||||
|
|
|
|||
|
|
@ -1317,7 +1317,7 @@ describe('Group Model', () => {
|
|||
|
||||
it('formats message', () => {
|
||||
const chatMessage = party.sendChat({
|
||||
message: 'a new message',
|
||||
message: 'a _new_ message with *markdown*',
|
||||
user: {
|
||||
_id: 'user-id',
|
||||
profile: { name: 'user name' },
|
||||
|
|
@ -1336,7 +1336,8 @@ describe('Group Model', () => {
|
|||
|
||||
const chat = chatMessage;
|
||||
|
||||
expect(chat.text).to.eql('a new message');
|
||||
expect(chat.text).to.eql('a _new_ message with *markdown*');
|
||||
expect(chat.unformattedText).to.eql('a new message with markdown');
|
||||
expect(validator.isUUID(chat.id)).to.eql(true);
|
||||
expect(chat.timestamp).to.be.a('date');
|
||||
expect(chat.likes).to.eql({});
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ import {
|
|||
|
||||
describe('POST /members/send-private-message', () => {
|
||||
let userToSendMessage;
|
||||
const messageToSend = 'Test Private Message';
|
||||
const messageToSend = 'Test *Private* Message';
|
||||
const unformattedMessage = 'Test Private Message';
|
||||
|
||||
beforeEach(async () => {
|
||||
userToSendMessage = await generateUser();
|
||||
|
|
@ -110,7 +111,9 @@ describe('POST /members/send-private-message', () => {
|
|||
|
||||
const sendersMessageInReceiversInbox = _.find(
|
||||
updatedReceiver.inbox.messages,
|
||||
message => message.uuid === userToSendMessage._id && message.text === messageToSend,
|
||||
message => message.uuid === userToSendMessage._id
|
||||
&& message.text === messageToSend
|
||||
&& message.unformattedText === unformattedMessage,
|
||||
);
|
||||
|
||||
const sendersMessageInSendersInbox = _.find(
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ module.exports = {
|
|||
extends: [
|
||||
'habitrpg/lib/vue',
|
||||
],
|
||||
ignorePatterns: ['dist/', 'node_modules/'],
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# new_client
|
||||
# Habitica Client
|
||||
|
||||
## Project setup
|
||||
```
|
||||
|
|
@ -27,3 +27,31 @@ npm run lint
|
|||
|
||||
### Customize configuration
|
||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
||||
|
||||
## Storybook
|
||||
|
||||
Storybook is mainly used while working on UI-Components to see changes faster instead of using the website.
|
||||
|
||||
### Start Storybook
|
||||
|
||||
```
|
||||
npm run storybook:serve
|
||||
```
|
||||
|
||||
This will start the storybook process, every `*.stories.js`-File is searched and added to the storybook overview.
|
||||
|
||||
### Storybook Worklow
|
||||
|
||||
Usually when you working on `component-name.vue` you also create a `component-name.stories.js` file.
|
||||
|
||||
Example of the stories structure - [Storybook Docs][StorybookDocsExample] - [CountBadge][CountBadgeExample]
|
||||
|
||||
[StorybookDocsExample]: https://storybook.js.org/docs/guides/guide-vue/#step-4-write-your-stories
|
||||
[CountBadgeExample]: src/components/ui/countBadge.stories.js
|
||||
|
||||
Each function or example of this component will be put after `storiesOf('Your Component', module)`,
|
||||
in a separate `.add('function of component', ...`
|
||||
|
||||
### Storybook Build
|
||||
|
||||
After each client build, storybook build is also triggered and will be available in `dist/storybook`
|
||||
|
|
|
|||
5
website/client/config/storybook/addons.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
import '@storybook/addon-actions/register';
|
||||
import '@storybook/addon-knobs/register';
|
||||
import '@storybook/addon-links/register';
|
||||
import '@storybook/addon-notes/register';
|
||||
11
website/client/config/storybook/config.js
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
import { configure } from '@storybook/vue';
|
||||
import '../../src/assets/scss/index.scss';
|
||||
|
||||
const req = require.context('../../src', true, /.stories.js$/);
|
||||
|
||||
function loadStories () {
|
||||
req.keys().forEach(filename => req(filename));
|
||||
}
|
||||
|
||||
configure(loadStories, module);
|
||||
5831
website/client/package-lock.json
generated
|
|
@ -5,30 +5,37 @@
|
|||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js",
|
||||
"lint": "vue-cli-service lint .",
|
||||
"lint-no-fix": "vue-cli-service lint --no-fix .",
|
||||
"postinstall": "node ./scripts/npm-postinstall.js"
|
||||
"postinstall": "node ./scripts/npm-postinstall.js",
|
||||
"storybook:build": "vue-cli-service storybook:build -c config/storybook -o dist/storybook",
|
||||
"storybook:serve": "vue-cli-service storybook:serve -p 6006 -c config/storybook",
|
||||
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vue/cli-plugin-babel": "^4.0.5",
|
||||
"@vue/cli-plugin-eslint": "^4.0.5",
|
||||
"@vue/cli-plugin-router": "^4.0.5",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.0.5",
|
||||
"@vue/cli-service": "^4.0.5",
|
||||
"@vue/cli-plugin-babel": "^4.1.1",
|
||||
"@vue/cli-plugin-eslint": "^4.1.1",
|
||||
"@vue/cli-plugin-router": "^4.1.1",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.1.1",
|
||||
"@vue/cli-service": "^4.1.1",
|
||||
"@storybook/addon-actions": "^5.0.0",
|
||||
"@storybook/addon-knobs": "^5.0.0",
|
||||
"@storybook/addon-links": "^5.0.0",
|
||||
"@storybook/addon-notes": "^5.0.0",
|
||||
"@storybook/vue": "^5.2.5",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^5.6.0",
|
||||
"amplitude-js": "^5.7.0",
|
||||
"axios": "^0.19.0",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"bootstrap": "^4.3.1",
|
||||
"bootstrap-vue": "^2.0.4",
|
||||
"bootstrap": "^4.4.1",
|
||||
"bootstrap-vue": "^2.1.0",
|
||||
"chai": "^4.1.2",
|
||||
"core-js": "^3.4.0",
|
||||
"eslint": "^6.6.0",
|
||||
"core-js": "^3.4.5",
|
||||
"eslint": "^6.7.2",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
"eslint-plugin-vue": "^6.0.0",
|
||||
"eslint-plugin-vue": "^6.0.1",
|
||||
"habitica-markdown": "^1.3.0",
|
||||
"hellojs": "^1.18.1",
|
||||
"inspectpack": "^4.2.2",
|
||||
|
|
@ -37,16 +44,17 @@
|
|||
"lodash": "^4.17.15",
|
||||
"moment": "^2.24.0",
|
||||
"nconf": "^0.10.0",
|
||||
"sass": "^1.23.3",
|
||||
"sass": "^1.23.7",
|
||||
"sass-loader": "^8.0.0",
|
||||
"smartbanner.js": "^1.14.5",
|
||||
"smartbanner.js": "^1.15.0",
|
||||
"svg-inline-loader": "^0.8.0",
|
||||
"svg-url-loader": "^3.0.2",
|
||||
"svg-url-loader": "^3.0.3",
|
||||
"svgo": "^1.3.2",
|
||||
"svgo-loader": "^2.2.1",
|
||||
"uuid": "^3.3.3",
|
||||
"validator": "^11.1.0",
|
||||
"vue": "^2.6.10",
|
||||
"vue-cli-plugin-storybook": "^0.6.1",
|
||||
"vue-mugen-scroll": "^0.2.6",
|
||||
"vue-router": "^3.0.6",
|
||||
"vue-template-compiler": "^2.6.10",
|
||||
|
|
|
|||
|
|
@ -6,4 +6,8 @@ if (process.env.NODE_ENV === 'production') {
|
|||
execSync('npm run build', {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
|
||||
execSync('npm run storybook:build', {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,36 +1,42 @@
|
|||
.promo_armoire_backgrounds_201911 {
|
||||
.promo_armoire_backgrounds_201912 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -451px;
|
||||
background-position: 0px -752px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_costume_achievement {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -747px;
|
||||
background-position: -1175px -296px;
|
||||
width: 144px;
|
||||
height: 156px;
|
||||
}
|
||||
.promo_delightful_dinos {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -424px -451px;
|
||||
background-position: -424px -752px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_ember_thunderstorm_potions {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -599px;
|
||||
background-position: -928px 0px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_mystery_201910 {
|
||||
.promo_harvest_feast {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -424px -599px;
|
||||
background-position: -928px -296px;
|
||||
width: 246px;
|
||||
height: 168px;
|
||||
}
|
||||
.promo_mystery_201912 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -928px -148px;
|
||||
width: 282px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_take_this {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -451px -365px;
|
||||
background-position: -1211px -148px;
|
||||
width: 96px;
|
||||
height: 69px;
|
||||
}
|
||||
|
|
@ -40,9 +46,21 @@
|
|||
width: 450px;
|
||||
height: 450px;
|
||||
}
|
||||
.scene_office {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -421px -451px;
|
||||
width: 360px;
|
||||
height: 240px;
|
||||
}
|
||||
.scene_seaserpent {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -451px 0px;
|
||||
width: 476px;
|
||||
height: 364px;
|
||||
}
|
||||
.scene_yarn_boss {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -451px;
|
||||
width: 420px;
|
||||
height: 300px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -994,163 +994,163 @@
|
|||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_ice_cave {
|
||||
.background_holiday_market {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -426px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_iceberg {
|
||||
.background_holiday_wreath {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -284px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_idyllic_cabin {
|
||||
.background_ice_cave {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -142px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_in_a_classroom {
|
||||
.background_iceberg {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: 0px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_in_an_ancient_tomb {
|
||||
.background_idyllic_cabin {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -710px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_island_waterfalls {
|
||||
.background_in_a_classroom {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -710px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_kelp_forest {
|
||||
.background_in_an_ancient_tomb {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -710px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_lake_with_floating_lanterns {
|
||||
.background_island_waterfalls {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -710px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_lighthouse_shore {
|
||||
.background_kelp_forest {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -568px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_lilypad {
|
||||
.background_lake_with_floating_lanterns {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -426px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_magic_beanstalk {
|
||||
.background_lighthouse_shore {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -284px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_magical_candles {
|
||||
.background_lilypad {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -142px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_magical_museum {
|
||||
.background_magic_beanstalk {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: 0px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_marble_temple {
|
||||
.background_magical_candles {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -568px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_market {
|
||||
.background_magical_museum {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -568px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_meandering_cave {
|
||||
.background_marble_temple {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -568px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_medieval_kitchen {
|
||||
.background_market {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -426px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_midnight_castle {
|
||||
.background_meandering_cave {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -284px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_midnight_clouds {
|
||||
.background_medieval_kitchen {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -142px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_midnight_lake {
|
||||
.background_midnight_castle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: 0px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mist_shrouded_mountain {
|
||||
.background_midnight_clouds {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -426px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mistiflying_circus {
|
||||
.background_midnight_lake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -426px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_monster_makers_workshop {
|
||||
.background_mist_shrouded_mountain {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -284px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mountain_lake {
|
||||
.background_mistiflying_circus {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -142px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mountain_pyramid {
|
||||
.background_monster_makers_workshop {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: 0px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_night_dunes {
|
||||
.background_mountain_lake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -284px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_ocean_sunrise {
|
||||
.background_mountain_pyramid {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
|
||||
background-position: -142px 0px;
|
||||
width: 141px;
|
||||
|
|
|
|||
|
|
@ -1,330 +1,492 @@
|
|||
.weapon_warrior_3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1893px -1361px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_warrior_4 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1893px -1270px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_warrior_5 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -1452px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_warrior_6 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1893px -1452px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_0 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -1543px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1893px -1543px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1893px -997px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -1088px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_4 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1893px -1088px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_5 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -1179px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_wizard_6 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -1270px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.Pet_Currency_Gem {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1269px;
|
||||
background-position: -1921px -444px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.Pet_Currency_Gem1x {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1992px -592px;
|
||||
background-position: -1957px -676px;
|
||||
width: 15px;
|
||||
height: 13px;
|
||||
}
|
||||
.Pet_Currency_Gem2x {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1766px -1474px;
|
||||
background-position: -1960px -766px;
|
||||
width: 30px;
|
||||
height: 26px;
|
||||
}
|
||||
.PixelPaw-Gold {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1929px -711px;
|
||||
background-position: -1688px -1436px;
|
||||
width: 51px;
|
||||
height: 51px;
|
||||
}
|
||||
.PixelPaw {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -1474px;
|
||||
background-position: -1740px -1436px;
|
||||
width: 51px;
|
||||
height: 51px;
|
||||
}
|
||||
.PixelPaw002 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1614px;
|
||||
background-position: -220px -203px;
|
||||
width: 51px;
|
||||
height: 51px;
|
||||
}
|
||||
.avatar_floral_healer {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1887px -576px;
|
||||
width: 99px;
|
||||
height: 99px;
|
||||
}
|
||||
.avatar_floral_rogue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -697px;
|
||||
width: 99px;
|
||||
height: 99px;
|
||||
}
|
||||
.avatar_floral_warrior {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -897px;
|
||||
width: 99px;
|
||||
height: 99px;
|
||||
}
|
||||
.avatar_floral_wizard {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -797px;
|
||||
width: 99px;
|
||||
height: 99px;
|
||||
}
|
||||
.empty_bottles {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1921px -513px;
|
||||
width: 64px;
|
||||
height: 54px;
|
||||
}
|
||||
.ghost {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1802px -997px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.inventory_present {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1935px -854px;
|
||||
background-position: -1696px -608px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_01 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1902px -797px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_02 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1902px -897px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_03 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -470px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_04 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -539px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_05 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1696px -539px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_06 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -884px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_07 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1696px -884px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_08 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -953px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_09 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1696px -1367px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_10 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1902px -697px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_11 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1200px;
|
||||
background-position: -1696px -470px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_present_12 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1269px;
|
||||
background-position: -1627px -608px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_birthday {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -993px;
|
||||
background-position: -1627px -746px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_congrats {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1338px;
|
||||
background-position: -1696px -746px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_fortify {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1407px;
|
||||
background-position: -1627px -815px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_getwell {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1476px;
|
||||
background-position: -1696px -953px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_goodluck {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1929px -642px;
|
||||
background-position: -1627px -1367px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_greeting {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1935px -763px;
|
||||
background-position: -1696px -1298px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_nye {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1062px;
|
||||
background-position: -1627px -1298px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_opaquePotion {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1131px;
|
||||
background-position: -1696px -1229px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_seafoam {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1338px;
|
||||
background-position: -1627px -1229px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_shinySeed {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1545px;
|
||||
background-position: -1696px -1160px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_snowball {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1614px;
|
||||
background-position: -1627px -1160px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_spookySparkles {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -993px;
|
||||
background-position: -1696px -1091px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_thankyou {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1062px;
|
||||
background-position: -1627px -1091px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_trinket {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1131px;
|
||||
background-position: -1696px -1022px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_special_valentine {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1200px;
|
||||
background-position: -1627px -1022px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.knockout {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -945px;
|
||||
background-position: -1627px -422px;
|
||||
width: 120px;
|
||||
height: 47px;
|
||||
}
|
||||
.pet_key {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1545px;
|
||||
background-position: -1696px -815px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.rebirth_orb {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1476px;
|
||||
background-position: -1696px -677px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.seafoam_star {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -854px;
|
||||
background-position: -1893px -1179px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.shop_armoire {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1913px -1407px;
|
||||
background-position: -1627px -677px;
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.snowman {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -763px;
|
||||
background-position: -1802px -1361px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.zzz {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1963px -551px;
|
||||
background-position: -220px -255px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
.zzz_light {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1963px -510px;
|
||||
background-position: -1748px -422px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
.notif_inventory_present_01 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1981px -711px;
|
||||
background-position: -1953px -229px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_02 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1965px -945px;
|
||||
background-position: -1953px -200px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_03 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1965px -1614px;
|
||||
background-position: -1953px -171px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_04 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -1683px;
|
||||
background-position: -1953px -142px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_05 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1873px -1683px;
|
||||
background-position: -1931px -766px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_06 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1902px -1683px;
|
||||
background-position: -1902px -766px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_07 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1737px -1474px;
|
||||
background-position: -1953px -409px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_08 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1960px -1683px;
|
||||
background-position: -1953px -380px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_09 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1679px -1474px;
|
||||
background-position: -1953px -351px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_10 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1963px -592px;
|
||||
background-position: -1953px -322px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_11 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1708px -1474px;
|
||||
background-position: -1953px -258px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_present_12 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1931px -1683px;
|
||||
background-position: -1953px -293px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_inventory_special_birthday {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -1131px;
|
||||
background-position: -1971px -797px;
|
||||
width: 20px;
|
||||
height: 24px;
|
||||
}
|
||||
.notif_inventory_special_congrats {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -1156px;
|
||||
background-position: -1927px -866px;
|
||||
width: 20px;
|
||||
height: 22px;
|
||||
}
|
||||
.notif_inventory_special_getwell {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1981px -740px;
|
||||
background-position: -1948px -866px;
|
||||
width: 20px;
|
||||
height: 22px;
|
||||
}
|
||||
.notif_inventory_special_goodluck {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -1020px;
|
||||
background-position: -1971px -697px;
|
||||
width: 20px;
|
||||
height: 26px;
|
||||
}
|
||||
.notif_inventory_special_greeting {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -1200px;
|
||||
background-position: -1969px -866px;
|
||||
width: 20px;
|
||||
height: 22px;
|
||||
}
|
||||
.notif_inventory_special_nye {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -993px;
|
||||
background-position: -1902px -866px;
|
||||
width: 24px;
|
||||
height: 26px;
|
||||
}
|
||||
.notif_inventory_special_thankyou {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -1087px;
|
||||
background-position: -1971px -724px;
|
||||
width: 20px;
|
||||
height: 24px;
|
||||
}
|
||||
.notif_inventory_special_valentine {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1982px -1062px;
|
||||
background-position: -1971px -822px;
|
||||
width: 20px;
|
||||
height: 24px;
|
||||
}
|
||||
.npc_bailey {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -220px -203px;
|
||||
background-position: -1627px -1436px;
|
||||
width: 60px;
|
||||
height: 72px;
|
||||
}
|
||||
.npc_justin {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -642px;
|
||||
background-position: -1802px -576px;
|
||||
width: 84px;
|
||||
height: 120px;
|
||||
}
|
||||
.npc_matt {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1155px -1315px;
|
||||
background-position: -208px -1529px;
|
||||
width: 195px;
|
||||
height: 138px;
|
||||
}
|
||||
|
|
@ -336,22 +498,28 @@
|
|||
}
|
||||
.banner_flair_dysheartener {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1935px -832px;
|
||||
background-position: -1887px -676px;
|
||||
width: 69px;
|
||||
height: 18px;
|
||||
}
|
||||
.phobia_dysheartener {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -1278px;
|
||||
background-position: -307px -220px;
|
||||
width: 201px;
|
||||
height: 195px;
|
||||
}
|
||||
.quest_alligator {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -862px;
|
||||
background-position: -967px -660px;
|
||||
width: 201px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_amber {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1187px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_armadillo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -527px 0px;
|
||||
|
|
@ -360,73 +528,73 @@
|
|||
}
|
||||
.quest_atom1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -445px -1315px;
|
||||
background-position: -1335px -1315px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_atom2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -947px -1315px;
|
||||
background-position: 0px -1529px;
|
||||
width: 207px;
|
||||
height: 138px;
|
||||
}
|
||||
.quest_atom3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -967px -660px;
|
||||
background-position: -433px -1315px;
|
||||
width: 216px;
|
||||
height: 180px;
|
||||
}
|
||||
.quest_axolotl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: 0px -655px;
|
||||
background-position: -660px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_badger {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -880px -875px;
|
||||
background-position: 0px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_basilist {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -191px -1529px;
|
||||
background-position: -1802px 0px;
|
||||
width: 189px;
|
||||
height: 141px;
|
||||
}
|
||||
.quest_beetle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -1076px;
|
||||
background-position: -747px -440px;
|
||||
width: 204px;
|
||||
height: 201px;
|
||||
}
|
||||
.quest_bronze {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1187px -660px;
|
||||
background-position: -880px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_bunny {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1187px -880px;
|
||||
background-position: -222px -1315px;
|
||||
width: 210px;
|
||||
height: 186px;
|
||||
}
|
||||
.quest_butterfly {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1407px 0px;
|
||||
background-position: -1187px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_cheetah {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1407px -660px;
|
||||
background-position: 0px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_cow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -307px -220px;
|
||||
background-position: -1627px 0px;
|
||||
width: 174px;
|
||||
height: 213px;
|
||||
}
|
||||
|
|
@ -438,31 +606,31 @@
|
|||
}
|
||||
.quest_dilatoryDistress1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -651px;
|
||||
background-position: -1187px -880px;
|
||||
width: 210px;
|
||||
height: 210px;
|
||||
}
|
||||
.quest_dilatoryDistress2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -208px;
|
||||
background-position: -1802px -293px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_dilatoryDistress3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1100px -1095px;
|
||||
background-position: -1407px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dilatory_derby {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1407px -440px;
|
||||
background-position: -880px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dolphin {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -880px -1095px;
|
||||
background-position: -1407px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
|
@ -474,31 +642,31 @@
|
|||
}
|
||||
.quest_egg {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px 0px;
|
||||
background-position: -1627px -214px;
|
||||
width: 165px;
|
||||
height: 207px;
|
||||
}
|
||||
.quest_evilsanta {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -510px;
|
||||
background-position: -1802px -444px;
|
||||
width: 118px;
|
||||
height: 131px;
|
||||
}
|
||||
.quest_evilsanta2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -440px -1095px;
|
||||
background-position: -1407px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_falcon {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -220px -1095px;
|
||||
background-position: -1100px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_ferret {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: 0px -1095px;
|
||||
background-position: -440px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
|
@ -510,19 +678,19 @@
|
|||
}
|
||||
.quest_ghost_stag {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1187px -440px;
|
||||
background-position: -440px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1187px -220px;
|
||||
background-position: -220px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -696px -1315px;
|
||||
background-position: -1084px -1315px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
|
|
@ -534,49 +702,49 @@
|
|||
}
|
||||
.quest_gryphon {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -747px -440px;
|
||||
background-position: -867px -1315px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_guineapig {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1407px -880px;
|
||||
background-position: -1187px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_harpy {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -660px -875px;
|
||||
background-position: -1187px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_hedgehog {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1407px -1100px;
|
||||
background-position: -527px -220px;
|
||||
width: 219px;
|
||||
height: 186px;
|
||||
}
|
||||
.quest_hippo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -440px -875px;
|
||||
background-position: -660px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_horse {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -220px -875px;
|
||||
background-position: -307px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kangaroo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: 0px -875px;
|
||||
background-position: -220px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kraken {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -527px -220px;
|
||||
background-position: -650px -1315px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
|
|
@ -600,31 +768,31 @@
|
|||
}
|
||||
.quest_mayhemMistiflying1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1844px -359px;
|
||||
background-position: -1802px -142px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_mayhemMistiflying2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -660px -655px;
|
||||
background-position: -440px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_mayhemMistiflying3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -440px -655px;
|
||||
background-position: -220px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_monkey {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -220px -655px;
|
||||
background-position: 0px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -217px;
|
||||
background-position: -1407px -880px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
|
|
@ -660,37 +828,7 @@
|
|||
}
|
||||
.quest_nudibranch {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px -434px;
|
||||
background-position: -1407px -1097px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_octopus {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -222px -1315px;
|
||||
width: 222px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_owl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -307px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_peacock {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1627px 0px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_penguin {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: 0px -1529px;
|
||||
width: 190px;
|
||||
height: 183px;
|
||||
}
|
||||
.quest_pterodactyl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-12.png');
|
||||
background-position: -1187px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 481 KiB After Width: | Height: | Size: 476 KiB |
|
Before Width: | Height: | Size: 669 KiB After Width: | Height: | Size: 679 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 369 KiB After Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 318 KiB After Width: | Height: | Size: 322 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 126 KiB |
|
|
@ -30,10 +30,10 @@
|
|||
</button>
|
||||
<div class="checkbox">
|
||||
<input
|
||||
id="user-preferences-suppressModals-streak"
|
||||
v-model="user.preferences.suppressModals.streak"
|
||||
type="checkbox"
|
||||
@change="suppressModals"
|
||||
id="user-preferences-suppressModals-streak"
|
||||
>
|
||||
<label for="user-preferences-suppressModals-streak">{{ $t('dontShowAgain') }}</label>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -151,7 +151,13 @@ export default {
|
|||
'blackTopFrame', 'blueTopFrame', 'greenTopFrame', 'pinkTopFrame', 'redTopFrame', 'whiteTopFrame', 'yellowTopFrame',
|
||||
'blackHalfMoon', 'blueHalfMoon', 'greenHalfMoon', 'pinkHalfMoon', 'redHalfMoon', 'whiteHalfMoon', 'yellowHalfMoon',
|
||||
];
|
||||
const options = keys.map(key => {
|
||||
const noneOption = this.createGearItem(0, 'eyewear', 'base');
|
||||
noneOption.none = true;
|
||||
const options = [
|
||||
noneOption,
|
||||
];
|
||||
|
||||
for (const key of keys) {
|
||||
const newKey = `eyewear_special_${key}`;
|
||||
const option = {};
|
||||
option.key = key;
|
||||
|
|
@ -164,8 +170,9 @@ export default {
|
|||
|
||||
return this.equip(newKey, type);
|
||||
};
|
||||
return option;
|
||||
});
|
||||
options.push(option);
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
freeShirts () {
|
||||
|
|
@ -179,20 +186,18 @@ export default {
|
|||
},
|
||||
headbands () {
|
||||
const keys = ['blackHeadband', 'blueHeadband', 'greenHeadband', 'pinkHeadband', 'redHeadband', 'whiteHeadband', 'yellowHeadband'];
|
||||
const options = keys.map(key => {
|
||||
const newKey = `headAccessory_special_${key}`;
|
||||
const option = {};
|
||||
option.key = key;
|
||||
option.active = this.user.preferences.costume
|
||||
? this.user.items.gear.costume.headAccessory === newKey
|
||||
: this.user.items.gear.equipped.headAccessory === newKey;
|
||||
option.class = `headAccessory_special_${option.key} headband`;
|
||||
option.click = () => {
|
||||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
return this.equip(newKey, type);
|
||||
};
|
||||
return option;
|
||||
});
|
||||
const noneOption = this.createGearItem(0, 'headAccessory', 'base', 'headband');
|
||||
noneOption.none = true;
|
||||
const options = [
|
||||
noneOption,
|
||||
];
|
||||
|
||||
for (const key of keys) {
|
||||
const option = this.createGearItem(key, 'headAccessory', 'special', 'headband');
|
||||
|
||||
options.push(option);
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
chairs () {
|
||||
|
|
@ -234,7 +239,14 @@ export default {
|
|||
// user purchases object, this is not recomputed. Hack for now
|
||||
let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line
|
||||
const keys = this.animalItemKeys[category];
|
||||
const options = keys.map(key => {
|
||||
|
||||
const noneOption = this.createGearItem(0, category, 'base', category);
|
||||
noneOption.none = true;
|
||||
const options = [
|
||||
noneOption,
|
||||
];
|
||||
|
||||
for (const key of keys) {
|
||||
const newKey = `${category}_special_${key}`;
|
||||
const userPurchased = this.user.items.gear.owned[newKey];
|
||||
|
||||
|
|
@ -265,8 +277,10 @@ export default {
|
|||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
return this.equip(newKey, type);
|
||||
};
|
||||
return option;
|
||||
});
|
||||
|
||||
options.push(option);
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
animalItemsUnlockString (category) {
|
||||
|
|
@ -285,6 +299,44 @@ export default {
|
|||
});
|
||||
return own;
|
||||
},
|
||||
createGearItem (key, gearType, subGearType, additionalClass) {
|
||||
const newKey = `${gearType}_${subGearType ? `${subGearType}_` : ''}${key}`;
|
||||
const option = {};
|
||||
option.key = key;
|
||||
const visibleGearType = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
const currentlyEquippedValue = this.user.items.gear[visibleGearType][gearType];
|
||||
|
||||
option.active = currentlyEquippedValue === newKey;
|
||||
|
||||
if (key === 0) {
|
||||
// if key is the "none" option check if a property
|
||||
// doesn't have a value and mark it as active
|
||||
option.active = option.active || !currentlyEquippedValue;
|
||||
}
|
||||
|
||||
option.class = `${newKey} ${additionalClass}`;
|
||||
option.click = () => {
|
||||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
const currentlyEquipped = this.user.items.gear[type][gearType];
|
||||
|
||||
// no need to call api/equip-op if its already selected
|
||||
if (currentlyEquipped === newKey || (key === 0 && !currentlyEquipped)) {
|
||||
return;
|
||||
}
|
||||
|
||||
let keyToEquip = newKey;
|
||||
|
||||
if (option.none) {
|
||||
// you need to "equip" the current selected AGAIN in order to un-equip it
|
||||
// the "none-key" isn't allowed to be sent
|
||||
keyToEquip = currentlyEquipped;
|
||||
}
|
||||
|
||||
this.equip(keyToEquip, type);
|
||||
};
|
||||
|
||||
return option;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
<template>
|
||||
<div class="row">
|
||||
<challenge-modal @updatedChallenge="updatedChallenge" />
|
||||
<leave-challenge-modal :challenge-id="challenge._id" />
|
||||
<leave-challenge-modal
|
||||
:challenge-id="challenge._id"
|
||||
@update-challenge="updateChallenge"
|
||||
/>
|
||||
<close-challenge-modal
|
||||
:members="members"
|
||||
:challenge-id="challenge._id"
|
||||
|
|
@ -493,12 +496,20 @@ export default {
|
|||
},
|
||||
async joinChallenge () {
|
||||
this.user.challenges.push(this.searchId);
|
||||
await this.$store.dispatch('challenges:joinChallenge', { challengeId: this.searchId });
|
||||
this.challenge = await this.$store.dispatch('challenges:joinChallenge', { challengeId: this.searchId });
|
||||
this.members = await this
|
||||
.loadMembers({ challengeId: this.searchId, includeAllPublicFields: true });
|
||||
|
||||
await this.$store.dispatch('tasks:fetchUserTasks', { forceLoad: true });
|
||||
},
|
||||
async leaveChallenge () {
|
||||
this.$root.$emit('bv::show::modal', 'leave-challenge-modal');
|
||||
},
|
||||
async updateChallenge () {
|
||||
this.challenge = await this.$store.dispatch('challenges:getChallenge', { challengeId: this.searchId });
|
||||
this.members = await this
|
||||
.loadMembers({ challengeId: this.searchId, includeAllPublicFields: true });
|
||||
},
|
||||
closeChallenge () {
|
||||
this.$root.$emit('bv::show::modal', 'close-challenge-modal');
|
||||
},
|
||||
|
|
|
|||
|
|
@ -595,7 +595,7 @@ export default {
|
|||
this.$root.$emit('bv::hide::modal', 'challenge-modal');
|
||||
this.$router.push(`/challenges/${challenge._id}`);
|
||||
},
|
||||
updateChallenge () {
|
||||
async updateChallenge () {
|
||||
const categoryKeys = this.workingChallenge.categories;
|
||||
const serverCategories = [];
|
||||
categoryKeys.forEach(key => {
|
||||
|
|
@ -610,10 +610,8 @@ export default {
|
|||
const challengeDetails = clone(this.workingChallenge);
|
||||
challengeDetails.categories = serverCategories;
|
||||
|
||||
this.$emit('updatedChallenge', {
|
||||
challenge: challengeDetails,
|
||||
});
|
||||
this.$store.dispatch('challenges:updateChallenge', { challenge: challengeDetails });
|
||||
const challenge = await this.$store.dispatch('challenges:updateChallenge', { challenge: challengeDetails });
|
||||
this.$emit('updatedChallenge', { challenge });
|
||||
this.resetWorkingChallenge();
|
||||
this.$root.$emit('bv::hide::modal', 'challenge-modal');
|
||||
},
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ export default {
|
|||
this.close();
|
||||
},
|
||||
close () {
|
||||
this.$emit('update-challenge');
|
||||
this.$root.$emit('bv::hide::modal', 'leave-challenge-modal');
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -655,7 +655,7 @@ export default {
|
|||
memberId: member._id,
|
||||
groupId: this.groupId,
|
||||
});
|
||||
this.viewMembers();
|
||||
if (this.invites.length === 0) this.viewMembers();
|
||||
},
|
||||
async promoteToLeader (member) {
|
||||
const groupData = { ...this.group };
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ export default {
|
|||
openStatus: undefined,
|
||||
actionableNotifications: [
|
||||
'GUILD_INVITATION', 'PARTY_INVITATION', 'CHALLENGE_INVITATION',
|
||||
'QUEST_INVITATION', 'GROUP_TASK_NEEDS_WORK', 'GROUP_TASK_APPROVAL',
|
||||
'QUEST_INVITATION', 'GROUP_TASK_NEEDS_WORK',
|
||||
],
|
||||
// A list of notifications handled by this component,
|
||||
// listed in the order they should appear in the notifications panel.
|
||||
|
|
|
|||
|
|
@ -1437,6 +1437,10 @@ export default {
|
|||
this.task.group.sharedCompletion = this.sharedCompletion;
|
||||
}
|
||||
|
||||
if (this.task.type === 'reward' && this.task.value === '') {
|
||||
this.task.value = 0;
|
||||
}
|
||||
|
||||
if (this.purpose === 'create') {
|
||||
if (this.challengeId) {
|
||||
const response = await this.$store.dispatch('tasks:createChallengeTasks', {
|
||||
|
|
|
|||
27
website/client/src/components/ui/countBadge.stories.js
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
import { storiesOf } from '@storybook/vue';
|
||||
|
||||
import CountBadge from './countBadge.vue';
|
||||
|
||||
storiesOf('Count Badge', module)
|
||||
.add('simple', () => ({
|
||||
components: { CountBadge },
|
||||
template: `
|
||||
<div style="position: absolute; margin: 20px">
|
||||
<count-badge :count="2" :show="true"></count-badge>
|
||||
</div>
|
||||
`,
|
||||
}))
|
||||
.add('bind count', () => ({
|
||||
components: { CountBadge },
|
||||
template: `
|
||||
<div style="position: absolute; margin: 20px">
|
||||
<count-badge :count="count" :show="true"></count-badge>
|
||||
</div>
|
||||
`,
|
||||
data () {
|
||||
return {
|
||||
count: 3,
|
||||
};
|
||||
},
|
||||
}));
|
||||
|
|
@ -3,8 +3,8 @@
|
|||
"challengeDetails": "Challenges are community events in which players compete and earn prizes by completing a group of related tasks.",
|
||||
"brokenChaLink": "Broken Challenge Link",
|
||||
"brokenTask": "Broken Challenge Link: this task was part of a challenge, but has been removed from it. What would you like to do?",
|
||||
"keepIt": "Keep It",
|
||||
"removeIt": "Remove It",
|
||||
"keepIt": "এটি রাখুন",
|
||||
"removeIt": "এটি মুছে ফেলুন",
|
||||
"brokenChallenge": "Broken Challenge Link: this task was part of a challenge, but the challenge (or group) has been deleted. What to do with the orphan tasks?",
|
||||
"keepThem": "Keep Tasks",
|
||||
"removeThem": "Remove Tasks",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"frequentlyAskedQuestions": "Frequently Asked Questions",
|
||||
"frequentlyAskedQuestions": "বারবার জিজ্ঞাসিত প্রশ্ন",
|
||||
"faqQuestion0": "I'm confused. Where do I get an overview?",
|
||||
"iosFaqAnswer0": "First, you'll set up tasks that you want to do in your everyday life. Then, as you complete the tasks in real life and check them off, you'll earn experience and gold. Gold is used to buy equipment and some items, as well as custom rewards. Experience causes your character to level up and unlock content such as Pets, Skills, and Quests! You can customize your character under Menu > Customize Avatar.\n\n Some basic ways to interact: click the (+) in the upper-right-hand corner to add a new task. Tap on an existing task to edit it, and swipe left on a task to delete it. You can sort tasks using Tags in the upper-left-hand corner, and expand and contract checklists by clicking on the checklist bubble.",
|
||||
"androidFaqAnswer0": "First, you'll set up tasks that you want to do in your everyday life. Then, as you complete the tasks in real life and check them off, you'll earn experience and gold. Gold is used to buy equipment and some items, as well as custom rewards. Experience causes your character to level up and unlock content such as Pets, Skills, and Quests! You can customize your character under Menu > [Inventory >] Avatar.\n\n Some basic ways to interact: click the (+) in the lower-right-hand corner to add a new task. Tap on an existing task to edit it, and swipe left on a task to delete it. You can sort tasks using Tags in the upper-right-hand corner, and expand and contract checklists by clicking on the checklist count box.",
|
||||
|
|
@ -8,11 +8,11 @@
|
|||
"iosFaqAnswer1": "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 avatar 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.",
|
||||
"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.",
|
||||
"faqQuestion2": "What are some sample tasks?",
|
||||
"faqQuestion2": "করণীয় কাজের কিছু নমুনা কী হতে পারে?",
|
||||
"iosFaqAnswer2": "The wiki has four lists of sample tasks to use as inspiration:\n<br><br>\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": "The wiki has four lists of sample tasks to use as inspiration:\n<br><br>\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)",
|
||||
"webFaqAnswer2": "The wiki has four lists of sample tasks to use as inspiration:\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": "Why do my tasks change color?",
|
||||
"faqQuestion3": "আমার করণীয় কাজগুলো রঙ পরিবর্তন করছে কেন?",
|
||||
"iosFaqAnswer3": "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": "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.",
|
||||
"webFaqAnswer3": "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.",
|
||||
|
|
|
|||
|
|
@ -1,45 +1,45 @@
|
|||
{
|
||||
"languageName": "English",
|
||||
"languageName": "ইংরেজি",
|
||||
"stringNotFound": "String '<%= string %>' not found.",
|
||||
"titleIndex": "Habitica | Your Life The Role Playing Game",
|
||||
"habitica": "Habitica",
|
||||
"habiticaLink": "<a href='http://habitica.wikia.com/wiki/Habitica' target='_blank'>Habitica</a>",
|
||||
"onward": "Onward!",
|
||||
"done": "Done",
|
||||
"gotIt": "Got it!",
|
||||
"gotIt": "বুঝতে পেরেছি!",
|
||||
"titleTasks": "Tasks",
|
||||
"titleAvatar": "Avatar",
|
||||
"titleBackgrounds": "Backgrounds",
|
||||
"titleStats": "Stats",
|
||||
"titleAchievs": "Achievements",
|
||||
"titleAchievs": "অর্জন",
|
||||
"titleProfile": "Profile",
|
||||
"titleInbox": "Inbox",
|
||||
"titleTavern": "Tavern",
|
||||
"titleTavern": "সরাইখানা",
|
||||
"titleParty": "Party",
|
||||
"titleHeroes": "Hall of Heroes",
|
||||
"titlePatrons": "Hall of Patrons",
|
||||
"titleGuilds": "Guilds",
|
||||
"titleChallenges": "Challenges",
|
||||
"titleDrops": "Market",
|
||||
"titleDrops": "বাজার",
|
||||
"titleQuests": "Quests",
|
||||
"titlePets": "Pets",
|
||||
"titlePets": "পোষা প্রাণী",
|
||||
"titleMounts": "Mounts",
|
||||
"titleEquipment": "Equipment",
|
||||
"titleTimeTravelers": "Time Travelers",
|
||||
"titleSeasonalShop": "Seasonal Shop",
|
||||
"titleSettings": "Settings",
|
||||
"saveEdits": "Save Edits",
|
||||
"showMore": "Show More",
|
||||
"showLess": "Show Less",
|
||||
"showMore": "আরো দেখান",
|
||||
"showLess": "কম দেখান",
|
||||
"expandToolbar": "Expand Toolbar",
|
||||
"collapseToolbar": "Collapse Toolbar",
|
||||
"markdownHelpLink": "Markdown formatting help",
|
||||
"showFormattingHelp": "Show formatting help",
|
||||
"hideFormattingHelp": "Hide formatting help",
|
||||
"youType": "You type:",
|
||||
"youSee": "You see:",
|
||||
"italics": "*Italics*",
|
||||
"bold": "**Bold**",
|
||||
"youType": "আপনি লিখুন:",
|
||||
"youSee": "আপনি দেখুন:",
|
||||
"italics": "*ইটালিক*",
|
||||
"bold": "**গাঢ়**",
|
||||
"strikethrough": "~~Strikethrough~~",
|
||||
"emojiExample": ":smile:",
|
||||
"markdownLinkEx": "[Habitica is great!](https://habitica.com)",
|
||||
|
|
@ -290,5 +290,9 @@
|
|||
"selected": "Selected",
|
||||
"howManyToBuy": "How many would you like to buy?",
|
||||
"habiticaHasUpdated": "There is a new Habitica update. Refresh to get the latest version!",
|
||||
"contactForm": "Contact the Moderation Team"
|
||||
"contactForm": "Contact the Moderation Team",
|
||||
"loadEarlierMessages": "আগের বার্তাগুলো লোড করুন",
|
||||
"demo": "ডেমো",
|
||||
"options": "Options",
|
||||
"finish": "সমাপ্ত"
|
||||
}
|
||||
|
|
@ -143,7 +143,7 @@
|
|||
"dateEndAugust": "August 31",
|
||||
"dateEndSeptember": "September 21",
|
||||
"dateEndOctober": "October 31",
|
||||
"dateEndNovember": "December 3",
|
||||
"dateEndNovember": "৩০ নভেম্বর",
|
||||
"dateEndJanuary": "January 31",
|
||||
"dateEndFebruary": "February 28",
|
||||
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION AND GET ONE FREE!",
|
||||
|
|
@ -151,5 +151,8 @@
|
|||
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",
|
||||
"discountBundle": "bundle",
|
||||
"g1g1Announcement": "Gift a Subscription, Get a Subscription Free event going on now!",
|
||||
"g1g1Details": "Gift a sub to a friend from their profile and you’ll receive the same sub for free!"
|
||||
"g1g1Details": "Gift a sub to a friend from their profile and you’ll receive the same sub for free!",
|
||||
"spring2019RobinHealerSet": "রবিন (চিকিৎসক)",
|
||||
"spring2019AmberMageSet": "অ্যাম্বার (জাদুকর)",
|
||||
"spring2019OrchidWarriorSet": "অর্কিড (যোদ্ধা)"
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"clearCompleted": "Delete Completed",
|
||||
"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?",
|
||||
|
|
|
|||
|
|
@ -134,7 +134,6 @@
|
|||
"changeClass": "Change Class, Refund Stat Points",
|
||||
"lvl10ChangeClass": "To change class you must be at least 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.",
|
||||
"unallocated": "Unallocated Stat Points",
|
||||
"haveUnallocated": "You have <%= points %> unallocated Stat Point(s)",
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@
|
|||
"allocatePerPop": "Přidat bod k vnímání",
|
||||
"allocateInt": "Body přiřazené k Inteligenci:",
|
||||
"allocateIntPop": "Přidat bod k inteligenci",
|
||||
"noMoreAllocate": "Nyní, když jsi dosáhl úrovně 100, už nebudeš dostávat žádné body atributů. Můžeš pokračovat v dosahování dalších úrovní, nebo můžeš začít nové dobrodružství na úrovni 1, když použiješ <a href='http://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Orb Znovuzrození</a>, který nyní najdeš zdarma na Trhu.",
|
||||
"noMoreAllocate": "Nyní, když jsi dosáhl úrovně 100, už nebudeš dostávat žádné body atributů. Můžeš pokračovat v dosahování dalších úrovní, nebo můžeš začít nové dobrodružství na úrovni 1, když použiješ <a href='http://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Orb Znovuzrození</a>!",
|
||||
"stats": "Statistiky",
|
||||
"achievs": "Úspěchy",
|
||||
"strength": "Síla",
|
||||
|
|
|
|||
|
|
@ -350,5 +350,6 @@
|
|||
"questEggDolphinAdjective": "radostný",
|
||||
"questEggDolphinMountText": "Delfín",
|
||||
"questEggDolphinText": "Delfín",
|
||||
"hatchingPotionShadow": "Stín"
|
||||
"hatchingPotionShadow": "Stín",
|
||||
"premiumPotionUnlimitedNotes": "Nepoužitelné na vejce z výprav."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1762,5 +1762,52 @@
|
|||
"weaponSpecialSpring2019WarriorNotes": "Špatné návyky se schovávají před tímto zeleným ostřím. Zvýší sílu o <%= str %>. Limitovaná edice Jarní výzbroj 2019.",
|
||||
"weaponSpecialSpring2019RogueNotes": "Tyto zbraně obsahují sílu nebe a deště. Doporučujeme, že je nebudeš používat ve vodě. Zvýší sílu o <%= str %>. Limitovaná edice Jarní výstroj 2019.",
|
||||
"weaponSpecialKS2019Notes": "Zakulacená jako zobák a drápy gryfona, ti tato zbraň připomene Tvou sílu, když se úkol před tebou zdá skličujicí. Zvýší tvou sílu o <%= str %>.",
|
||||
"weaponSpecialKS2019Text": "Mytická gryfonní halapartna"
|
||||
"weaponSpecialKS2019Text": "Mytická gryfonní halapartna",
|
||||
"eyewearSpecialYellowHalfMoonNotes": "Brýle s žlutým rámečkem a čočkami ve tvaru půlměsíce. Nepřináší žádnou výhodu.",
|
||||
"eyewearSpecialWhiteHalfMoonNotes": "Brýle s bílým rámečkem a čočkami ve tvaru půlměsíce. Nepřináší žádnou výhodu.",
|
||||
"eyewearSpecialRedHalfMoonNotes": "Brýle s červeným rámečkem a čočkami ve tvaru půlměsíce. Nepřináší žádnou výhodu.",
|
||||
"eyewearSpecialPinkHalfMoonNotes": "Brýle s růžovým rámečkem a čočkami ve tvaru půlměsíce. Nepřináší žádnou výhodu.",
|
||||
"eyewearSpecialGreenHalfMoonNotes": "Brýle se zeleným rámečkem a čočkami ve tvaru půlměsíce. Nepřináší žádnou výhodu.",
|
||||
"shieldArmoireAlchemistsScaleText": "Alchymistova stupnice",
|
||||
"shieldArmoirePolishedPocketwatchText": "Leštěné kapesní hodinky",
|
||||
"shieldArmoireTrustyUmbrellaText": "Spolehlivý deštník",
|
||||
"shieldArmoireMightyPizzaText": "Mocná pizza",
|
||||
"shieldSpecialSummer2019MageText": "Kapky čisté vody",
|
||||
"shieldSpecialSpring2019HealerText": "Štít z vaječné skořápky",
|
||||
"shieldSpecialPiDayText": "Pí štít",
|
||||
"headArmoireAlchemistsHatText": "Alchymistický klobouk",
|
||||
"headMystery201907Text": "Zpětná čepice",
|
||||
"headSpecialFall2019HealerText": "Tmavá mitra",
|
||||
"headSpecialFall2019RogueText": "Antický operní klobouk",
|
||||
"headSpecialSummer2019HealerText": "Škeblí koruna",
|
||||
"headSpecialSummer2019WarriorText": "Želví helma",
|
||||
"headSpecialSummer2019RogueText": "Kladivounova helma",
|
||||
"headSpecialPiDayText": "Pí klobouk",
|
||||
"armorArmoireNephriteArmorText": "Nefritová zbroj",
|
||||
"armorArmoireChefsJacketText": "Šéfkuchařská bunda",
|
||||
"armorMystery201908Notes": "Tyto nohy byly určeny pro tanec! A přesně to udělají. Nepřináší žádnou výhodu. Srpen 2019 Subscriber Item.",
|
||||
"armorMystery201907Notes": "Zůstaňte v pohodě a vypadejte skvěle i v nejteplejším letním dni. Nepřináší žádnou výhodu. Odběratelská položka z července 2019.",
|
||||
"armorMystery201907Text": "Květinová košile",
|
||||
"armorSpecialFall2019HealerText": "Róba temnoty",
|
||||
"armorSpecialFall2019WarriorText": "Křídla noci",
|
||||
"armorSpecialSummer2019HealerText": "Ocas tropických přílivů",
|
||||
"armorSpecialSummer2019MageText": "Květinové šátečky",
|
||||
"armorSpecialSummer2019WarriorText": "Krunýřové brnění",
|
||||
"armorSpecialSummer2019RogueText": "Ocas žraloka kladivouna",
|
||||
"armorSpecialKS2019Text": "Mýtické zbroje Gryfa",
|
||||
"weaponArmoireResplendentRapierText": "Úžasný rapír",
|
||||
"weaponArmoireFloridFanText": "Květinový vějíř",
|
||||
"weaponArmoireMagnifyingGlassText": "Zvětšovací sklo",
|
||||
"weaponArmoireAstronomersTelescopeText": "Astronomův dalekohled",
|
||||
"weaponArmoireBambooCaneText": "Bambusová třtina",
|
||||
"weaponArmoireNephriteBowText": "Nefritový luk",
|
||||
"weaponArmoireSlingshotText": "Prak",
|
||||
"weaponArmoireJugglingBallsText": "Žonglovácí míče",
|
||||
"weaponArmoireVernalTaperText": "Jarní svíce",
|
||||
"weaponArmoireChefsSpoonText": "Šéfkuchařská lžíce",
|
||||
"weaponSpecialFall2019HealerText": "Hrůzná fylakterie",
|
||||
"weaponSpecialFall2019MageText": "Jednooká hůl",
|
||||
"weaponSpecialFall2019WarriorText": "Pařátový trojzubec",
|
||||
"weaponSpecialFall2019RogueText": "Notový pult",
|
||||
"weaponSpecialSummer2019HealerText": "Bublinová hůlka"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@
|
|||
"dateEndAugust": "Srpen 31",
|
||||
"dateEndSeptember": "21. Září",
|
||||
"dateEndOctober": "Říjen 31",
|
||||
"dateEndNovember": "December 3",
|
||||
"dateEndNovember": "30. listopadu",
|
||||
"dateEndJanuary": "Leden 31",
|
||||
"dateEndFebruary": "Únor 28",
|
||||
"winterPromoGiftHeader": "DARUJ PŘEDPLATNÉ A ZÍSKEJ JEDNO ZDARMA!",
|
||||
|
|
@ -167,5 +167,6 @@
|
|||
"spring2019CloudRogueSet": "Mrak (Tulák)",
|
||||
"spring2019RobinHealerSet": "Červenka (Léčitel)",
|
||||
"spring2019AmberMageSet": "Jantar (Mág)",
|
||||
"spring2019OrchidWarriorSet": "Orchidej (válečník)"
|
||||
"spring2019OrchidWarriorSet": "Orchidej (válečník)",
|
||||
"augustYYYY": "Srpen <%=rok %>"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
"sleepDescription": "Potřebuješ pauzu? Ubytuj se v Danielově krčmě pro pauznutí některých z těžších herních mechanismů země Habitica:",
|
||||
"sleepBullet1": "Promeškané denní úkoly tě nezraní",
|
||||
"sleepBullet2": "Úkoly neztratí sérii a barva zůstane nezměněna",
|
||||
"sleepBullet3": "Bossové ti neublíží za tvé zmeškané denní úkoly",
|
||||
"sleepBullet3": "Bossové ti neublíží za tvé vlastní zmeškané denní úkoly",
|
||||
"sleepBullet4": "Tvé poškození bossům nebo sbírka předmětů na Výpravě zůstanou vypnuty, dokud se z krčmy neodhlásíš",
|
||||
"pauseDailies": "Pauznout poškození",
|
||||
"unpauseDailies": "Odpauznout poškození",
|
||||
|
|
@ -107,11 +107,11 @@
|
|||
"amazonInstructions": "Klikni pro zaplacení přes Amazon platby",
|
||||
"paymentMethods": "Platební metody",
|
||||
"paymentSuccessful": "Your payment was successful!",
|
||||
"paymentYouReceived": "You received:",
|
||||
"paymentYouReceived": "Obdržel jsi:",
|
||||
"paymentYouSentGems": "You sent <strong><%= name %></strong>:",
|
||||
"paymentYouSentSubscription": "You sent <strong><%= name %></strong> a <%= months %>-months Habitica subscription.",
|
||||
"paymentSubBilling": "Your subscription will be billed <strong>$<%= amount %></strong> every <strong><%= months %> months</strong>.",
|
||||
"success": "Success!",
|
||||
"success": "Úspěch!",
|
||||
"classGear": "Vybavení pro tvé povolání",
|
||||
"classGearText": "Gratuluji k vybrání povolání! Přidal jsem ti základní zbraň do tvého inventáře. Podívej se dolů a vybav se!",
|
||||
"classStats": "Toto jsou dovednosti tvé postavy; mají vliv na hru.\nPokaždé když se dostaneš na novou úroveň, získáš jeden bod, který můžeš přiřadit k určité dovednosti. Najeď na každou dovednost pro více informací.",
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
"individualSub": "Osobní předplatné",
|
||||
"subscribe": "Předplatit",
|
||||
"subscribed": "Předplaceno",
|
||||
"nowSubscribed": "You are now subscribed to Habitica!",
|
||||
"nowSubscribed": "Nyní jste přihlášeni k odběru Habitica!",
|
||||
"manageSub": "Klikni pro správu předplatného",
|
||||
"cancelSub": "Zrušit předplatné",
|
||||
"cancelSubInfoGoogle": "Please go to the \"Account\" > \"Subscriptions\" section of the Google Play Store app to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
|
||||
|
|
@ -73,10 +73,10 @@
|
|||
"subCanceled": "Předplatné bude neaktivní od",
|
||||
"buyGemsGoldTitle": "koupit drahokamy za zlato",
|
||||
"becomeSubscriber": "Staň se předplatitelem",
|
||||
"subGemPop": "Because you subscribe to Habitica, you can purchase a number of Gems each month using Gold.",
|
||||
"subGemPop": "Protože se přihlašujete k odběru Habitica, můžete si každý měsíc zakoupit drahokamy pomocí zlata.",
|
||||
"subGemName": "Drahokamy předplatitele",
|
||||
"freeGemsTitle": "Získej Drahokamy zadarmoq",
|
||||
"maxBuyGems": "You have bought all the Gems you can this month. More become available within the first three days of each month. Thanks for subscribing!",
|
||||
"maxBuyGems": "Tento měsíc jste koupili všechny drahokamy. Více bude k dispozici během prvních tří dnů každého měsíce. Díky za přihlášení!",
|
||||
"buyGemsAllow1": "Můžeš si koupit",
|
||||
"buyGemsAllow2": "Více drahokamů tento měsíc",
|
||||
"purchaseGemsSeparately": "Koupit si další drahokamy",
|
||||
|
|
@ -86,7 +86,7 @@
|
|||
"timeTravelersTitleNoSub": "<%= linkStartTyler %>Tyler<%= linkEnd %> a <%= linkStartVicky %>Vicky<%= linkEnd %>",
|
||||
"timeTravelersTitle": "Záhadní cestovatelé časem",
|
||||
"timeTravelersPopoverNoSub": "Abys svolal záhadné cestovatele časem, potřebuješ mystické přesýpací hodiny! <%= linkStart %>Předplatitelé<%= linkEnd %> dostanou jedny mystické přesýpací hodiny za každé tři měsíce nepřetržitého předplaceného období. Vrať se až budeš mít mystické přesýpací hodiny a cestovatelé časem ti přinesou vzácného mazlíčka, zvíře, nebo se předmětů pro předplatitele z minulosti.... anebo i z budoucnosti.",
|
||||
"timeTravelersPopoverNoSubMobile": "Looks like you’ll need a Mystic Hourglass to open the time portal and summon the Mysterious Time Travelers.",
|
||||
"timeTravelersPopoverNoSubMobile": "Vypadá to, že budete potřebovat Mystické přesýpací hodiny, abyste mohli otevřít časový portál a svolat Mysterious Time Travelers.",
|
||||
"timeTravelersPopover": "Your Mystic Hourglass has opened our time portal! Choose what you’d like us to fetch from the past or future.",
|
||||
"timeTravelersAlreadyOwned": "Gratulujeme! Teď máš vše, co cestovatelé časem nabízejí. Děkujeme za podporu stránek!",
|
||||
"mysticHourglassPopover": "Díky Mystickým Přesýpacím hodinám si můžeš koupit limitované předměty, jako záhadné předměty měsíce nebo odměny z boje se světovými příšerami, z minulosti!",
|
||||
|
|
@ -134,16 +134,16 @@
|
|||
"mysterySet201704": "Vílí set",
|
||||
"mysterySet201705": "Set Opeřeného bojovníka",
|
||||
"mysterySet201706": "Set Pirátského pionýra",
|
||||
"mysterySet201707": "Jellymancer Set",
|
||||
"mysterySet201707": "Jellymancer Sada",
|
||||
"mysterySet201708": "Set Lávového válečníka",
|
||||
"mysterySet201709": "Set Studenta kouzel",
|
||||
"mysterySet201710": "Imperious Imp Set",
|
||||
"mysterySet201710": "Imperious Imp Sada",
|
||||
"mysterySet201711": "Set Jezdce koberců",
|
||||
"mysterySet201712": "Candlemancer Set",
|
||||
"mysterySet201712": "Candlemancer Sada",
|
||||
"mysterySet201801": "Set Mrazivého skřítka",
|
||||
"mysterySet201802": "Set Zamilovaného brouka",
|
||||
"mysterySet201803": "Daring Dragonfly Set",
|
||||
"mysterySet201804": "Spiffy Squirrel Set",
|
||||
"mysterySet201803": "Daring Dragonfly Sada",
|
||||
"mysterySet201804": "Spiffy Squirrel Sada",
|
||||
"mysterySet201805": "Phenomenal Peacock Set",
|
||||
"mysterySet201806": "Alluring Anglerfish Set",
|
||||
"mysterySet201807": "Sea Serpent Set",
|
||||
|
|
@ -187,31 +187,31 @@
|
|||
"couponCodeRequired": "Je požadován kód kupónu.",
|
||||
"paypalCanceled": "Your subscription has been canceled",
|
||||
"earnGemsMonthly": "Earn up to **<%= cap %> Gems** per month",
|
||||
"receiveMysticHourglass": "Receive a Mystic Hourglass!",
|
||||
"receiveMysticHourglass": "Obdržíte mystický přesýpací hodiny!",
|
||||
"receiveMysticHourglasses": "Receive **<%= amount %> Mystic Hourglasses**!",
|
||||
"everyMonth": "Every Month",
|
||||
"everyMonth": "Každý měsíc",
|
||||
"everyXMonths": "Every <%= interval %> Months",
|
||||
"everyYear": "Every Year",
|
||||
"choosePaymentMethod": "Choose your payment method",
|
||||
"subscribeSupportsDevs": "Subscribing supports the developers and helps keep Habitica running",
|
||||
"buyGemsSupportsDevs": "Purchasing Gems supports the developers and helps keep Habitica running",
|
||||
"everyYear": "Každý rok",
|
||||
"choosePaymentMethod": "Vyberte platební metodu",
|
||||
"subscribeSupportsDevs": "Předplatné podporuje vývojáře a pomáhá udržovat Habitica v chodu",
|
||||
"buyGemsSupportsDevs": "Zakoupení drahokamů podporuje vývojáře a pomáhá udržovat Habitica v chodu",
|
||||
"support": "SUPPORT",
|
||||
"gemBenefitLeadin": "Gems allow you to buy fun extras for your account, including:",
|
||||
"gemBenefit1": "Unique and fashionable costumes for your avatar.",
|
||||
"gemBenefit2": "Backgrounds to immerse your avatar in the world of Habitica!",
|
||||
"gemBenefitLeadin": "Drahokamy vám umožní koupit zábavné doplňky pro váš účet, včetně:",
|
||||
"gemBenefit1": "Unikátní a módní kostýmy pro váš avatar.",
|
||||
"gemBenefit2": "Pozadí pro ponoření vašeho avatara do světa Habitica!",
|
||||
"gemBenefit3": "Exciting Quest chains that drop pet eggs.",
|
||||
"gemBenefit4": "Reset your avatar's Stat Points and change its Class.",
|
||||
"subscriptionBenefitLeadin": "Support Habitica by becoming a subscriber and you'll receive these useful benefits!",
|
||||
"subscriptionBenefitLeadin": "Podpořte Habitica tím, že se stanete odběratelem, a získáte tyto užitečné výhody!",
|
||||
"subscriptionBenefit1": "Alexander the Merchant will sell you Gems, for 20 Gold each!",
|
||||
"subscriptionBenefit2": "Completed To-Dos and task history are available for longer.",
|
||||
"subscriptionBenefit3": "Discover more items in Habitica with a doubled daily drop cap.",
|
||||
"subscriptionBenefit4": "Unique cosmetic items for your avatar each month.",
|
||||
"subscriptionBenefit4": "Unikátní kosmetické výrobky pro váš avatar každý měsíc.",
|
||||
"subscriptionBenefit5": "Receive the exclusive Royal Purple Jackalope pet!",
|
||||
"subscriptionBenefit6": "Earn Mystic Hourglasses for use in the Time Travelers' Shop!",
|
||||
"haveCouponCode": "Do you have a coupon code?",
|
||||
"subscriptionAlreadySubscribedLeadIn": "Thanks for subscribing!",
|
||||
"haveCouponCode": "Máte kuponový kód?",
|
||||
"subscriptionAlreadySubscribedLeadIn": "Díky za přihlášení!",
|
||||
"subscriptionAlreadySubscribed1": "To see your subscription details and cancel, renew, or change your subscription, please go to <a href='/user/settings/subscription'>User icon > Settings > Subscription</a>.",
|
||||
"purchaseAll": "Purchase Set",
|
||||
"purchaseAll": "Koupit sadu",
|
||||
"gemsPurchaseNote": "Předplatitelé mohou zakoupit drahokamy za zlato na Trhu! Pro jednoduchý přístup si můžeš drahokamy také připnout do tvého sloupečku s Odměnami.",
|
||||
"gemsRemaining": "zbývající drahokamy",
|
||||
"notEnoughGemsToBuy": "Nemůžeš zakoupit toto množství drahokamů",
|
||||
|
|
@ -225,5 +225,7 @@
|
|||
"mysterySet201903": "Egg-squisite sada",
|
||||
"mysterySet201902": "Cryptic Crush sada",
|
||||
"subWillBecomeInactive": "Stane se neaktivní",
|
||||
"confirmCancelSub": "Opravdu chcete zrušit předplatné? Ztratíte všechny své předplacené benefity."
|
||||
"confirmCancelSub": "Opravdu chcete zrušit předplatné? Ztratíte všechny své předplacené benefity.",
|
||||
"mysterySet201911": "Sada Křišťálového zaklínače",
|
||||
"mysterySet201910": "Sada Záhadného ohně"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,5 +17,13 @@
|
|||
"achievementBackToBasicsModalText": "Du har samlet alle Almindelige kæledyr!",
|
||||
"achievementAllYourBase": "Alle almindelige",
|
||||
"achievementAllYourBaseText": "Har tæmmet alle Almindelige ridedyr.",
|
||||
"achievementAllYourBaseModalText": "Du har tæmmet alle Almindelige ridedyr!"
|
||||
"achievementAllYourBaseModalText": "Du har tæmmet alle Almindelige ridedyr!",
|
||||
"achievementMonsterMagusModalText": "Du har samlet all zombie dyr!",
|
||||
"achievementMonsterMagusText": "Har samlet all zombie dyr.",
|
||||
"achievementPartyOn": "Dit hold vokset til 4 medlemmer!",
|
||||
"achievementAridAuthorityModalText": "Du har tæmmet all ørken dyr!",
|
||||
"achievementAridAuthorityText": "Har tæmmet all ørken dyr.",
|
||||
"achievementDustDevilModalText": "Du har samlet alle ørken dyr!",
|
||||
"achievementDustDevilText": "Har samlet alle ørken dyr.",
|
||||
"achievementDustDevil": "Støv djævel"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,18 +129,18 @@
|
|||
"questEggArmadilloMountText": "Gürteltier",
|
||||
"questEggArmadilloAdjective": "ein gepanzertes",
|
||||
"questEggCowText": "Kalb",
|
||||
"questEggCowMountText": "Kuh-Reittier",
|
||||
"questEggCowMountText": "Rind",
|
||||
"questEggCowAdjective": "ein muhendes",
|
||||
"questEggBeetleText": "Käferchen",
|
||||
"questEggBeetleMountText": "Käfer-Reittier",
|
||||
"questEggBeetleAdjective": "ein unschlagbares",
|
||||
"questEggFerretText": "Frettchen",
|
||||
"questEggFerretMountText": "Frettchen",
|
||||
"questEggFerretText": "Frettchen-Haustier",
|
||||
"questEggFerretMountText": "Frettchen-Reittier",
|
||||
"questEggFerretAdjective": "ein pelziges",
|
||||
"questEggSlothText": "Faultier",
|
||||
"questEggSlothMountText": "Faultier",
|
||||
"questEggSlothText": "Faultier-Haustier",
|
||||
"questEggSlothMountText": "Faultier-Reittier",
|
||||
"questEggSlothAdjective": "ein flinkes",
|
||||
"questEggTriceratopsText": "Triceratops-Jungtier",
|
||||
"questEggTriceratopsText": "Triceratops-Haustier",
|
||||
"questEggTriceratopsMountText": "Triceratops-Reittier",
|
||||
"questEggTriceratopsAdjective": "ein trickreiches",
|
||||
"questEggGuineaPigText": "Meerschweinchen",
|
||||
|
|
@ -152,33 +152,33 @@
|
|||
"questEggButterflyText": "Raupen-Haustier",
|
||||
"questEggButterflyMountText": "Schmetterling-Reittier",
|
||||
"questEggButterflyAdjective": "ein süßes",
|
||||
"questEggNudibranchText": "Nacktkiemerschnecken-Jungtier",
|
||||
"questEggNudibranchText": "Nacktkiemerschnecken-Haustier",
|
||||
"questEggNudibranchMountText": "Nacktkiemerschnecken-Reittier",
|
||||
"questEggNudibranchAdjective": "ein raffiniertes",
|
||||
"questEggHippoText": "Nilpferd",
|
||||
"questEggHippoMountText": "Nilpferd",
|
||||
"questEggHippoText": "Nilpferd-Haustier",
|
||||
"questEggHippoMountText": "Nilpferd-Reittier",
|
||||
"questEggHippoAdjective": "ein glückliches",
|
||||
"questEggYarnText": "Wollknäuel",
|
||||
"questEggYarnMountText": "Fliegendes Teppichwesen",
|
||||
"questEggYarnAdjective": "wolliges",
|
||||
"questEggPterodactylText": "Pterodactylus-Jungtier",
|
||||
"questEggPterodactylText": "Pterodactylus-Haustier",
|
||||
"questEggPterodactylMountText": "Pterodactylus-Reittier",
|
||||
"questEggPterodactylAdjective": "ein zutrauliches",
|
||||
"questEggBadgerText": "Dachs-Jungtier",
|
||||
"questEggBadgerText": "Dachs-Haustier",
|
||||
"questEggBadgerMountText": "Dachs-Reittier",
|
||||
"questEggBadgerAdjective": "ein geschäftiges",
|
||||
"questEggSquirrelText": "Eichhörnchen-Jungtier",
|
||||
"questEggSquirrelMountText": "Eichörnchen-Jungtier",
|
||||
"questEggSquirrelText": "Eichhörnchen-Haustier",
|
||||
"questEggSquirrelMountText": "Eichhörnchen-Reittier",
|
||||
"questEggSquirrelAdjective": "ein buschschwanziges",
|
||||
"questEggSeaSerpentText": "Seeschlangen-Jungtier",
|
||||
"questEggSeaSerpentText": "Seeschlangen-Haustier",
|
||||
"questEggSeaSerpentMountText": "Seeschlangen-Reittier",
|
||||
"questEggSeaSerpentAdjective": "ein schimmerndes",
|
||||
"questEggKangarooText": "Känguru-Jungtier",
|
||||
"questEggKangarooText": "Känguru-Haustier",
|
||||
"questEggKangarooMountText": "Känguru-Reittier",
|
||||
"questEggKangarooAdjective": "ein eifriges",
|
||||
"questEggAlligatorText": "Alligator-Jungtier",
|
||||
"questEggAlligatorText": "Alligator-Haustier",
|
||||
"questEggAlligatorMountText": "Alligator-Reittier",
|
||||
"questEggAlligatorAdjective": "gerissener",
|
||||
"questEggAlligatorAdjective": "gerissenes",
|
||||
"questEggVelociraptorText": "Velociraptor-Haustier",
|
||||
"questEggVelociraptorMountText": "Velociraptor-Reittier",
|
||||
"questEggVelociraptorAdjective": "ein cleveres",
|
||||
|
|
@ -206,10 +206,10 @@
|
|||
"hatchingPotionShimmer": "Schimmerndes",
|
||||
"hatchingPotionFairy": "Feenhaftes",
|
||||
"hatchingPotionStarryNight": "Sternenklare Nacht",
|
||||
"hatchingPotionRainbow": "Regenbogen",
|
||||
"hatchingPotionGlass": "Glas",
|
||||
"hatchingPotionRainbow": "Regenbogenfarbiges",
|
||||
"hatchingPotionGlass": "Glasiges",
|
||||
"hatchingPotionGlow": "Fluoreszierendes",
|
||||
"hatchingPotionFrost": "Frost",
|
||||
"hatchingPotionFrost": "Frostiges",
|
||||
"hatchingPotionIcySnow": "Eisschnee",
|
||||
"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. Zum Kauf verfügbar bis <%= date(locale) %>.",
|
||||
|
|
@ -266,7 +266,7 @@
|
|||
"foodCakeGoldenA": "ein Stück Honigkuchen",
|
||||
"foodCakeZombie": "Verrotteter Kuchen",
|
||||
"foodCakeZombieThe": "den verrotteten Kuchen",
|
||||
"foodCakeZombieA": "einen verrotteten Kuchen",
|
||||
"foodCakeZombieA": "ein Stück verrotteter Kuchen",
|
||||
"foodCakeDesert": "Sandkuchen",
|
||||
"foodCakeDesertThe": "den Sandkuchen",
|
||||
"foodCakeDesertA": "ein Stück Sandkuchen",
|
||||
|
|
@ -307,19 +307,19 @@
|
|||
"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?",
|
||||
"foodNotes": "Verfüttere das an ein Haustier und es wächst bald zu einem kräftigen Reittier heran.",
|
||||
"hatchingPotionRoseQuartz": "Rosenquarz",
|
||||
"hatchingPotionCelestial": "Himmlisch",
|
||||
"foodPieSkeleton": "Knochenmark Topfkuchen",
|
||||
"foodPieSkeletonThe": "der Knochenmark Topfkuchen",
|
||||
"foodPieSkeletonA": "ein Stück Knochenmark Topfkuchen",
|
||||
"foodPieBase": "regulär Apfelkuchen",
|
||||
"foodPieBaseThe": "der regulär Apfelkuchen",
|
||||
"foodPieBaseA": "ein Stück regulär Apfelkuchen",
|
||||
"hatchingPotionRoseQuartz": "Rosenquarziges",
|
||||
"hatchingPotionCelestial": "Himmlisches",
|
||||
"foodPieSkeleton": "Knochenmark-Topfkuchen",
|
||||
"foodPieSkeletonThe": "den Knochenmark-Topfkuchen",
|
||||
"foodPieSkeletonA": "ein Stück Knochenmark-Topfkuchen",
|
||||
"foodPieBase": "regulärer Apfelkuchen",
|
||||
"foodPieBaseThe": "den regulären Apfelkuchen",
|
||||
"foodPieBaseA": "ein Stück regulärer Apfelkuchen",
|
||||
"foodPieCottonCandyBlue": "Heidelbeerkuchen",
|
||||
"foodPieCottonCandyBlueThe": "der Heidelbeerkuchen",
|
||||
"foodPieCottonCandyBlueThe": "den Heidelbeerkuchen",
|
||||
"foodPieCottonCandyBlueA": "ein Stück Heidelbeerkuchen",
|
||||
"foodPieCottonCandyPink": "Rosarhabarberkuchen",
|
||||
"foodPieCottonCandyPinkThe": "der Rosarhabarberkuchen",
|
||||
"foodPieCottonCandyPinkThe": "den Rosarhabarberkuchen",
|
||||
"foodPieCottonCandyPinkA": "ein Stück Rosarhabarberkuchen",
|
||||
"foodPieShade": "dunkle Schokoladentorte",
|
||||
"foodPieShadeThe": "die dunkle Schokoladentorte",
|
||||
|
|
@ -331,25 +331,26 @@
|
|||
"foodPieGoldenThe": "die Goldenebananencremetorte",
|
||||
"foodPieGoldenA": "ein Stück Goldenebananencremetorte",
|
||||
"foodPieZombie": "Fauler Kuchen",
|
||||
"foodPieZombieThe": "der Fauler Kuchen",
|
||||
"foodPieZombieThe": "den Faulen Kuchen",
|
||||
"foodPieZombieA": "ein Stück Fauler Kuchen",
|
||||
"foodPieDesert": "Wüstenfarbene Desserttorte",
|
||||
"foodPieDesertThe": "die wüstenfarbene Desserttorte",
|
||||
"foodPieDesertA": "ein Stück wüstenfarbene Desserttorte",
|
||||
"foodPieRed": "Roter Kirschkuchen",
|
||||
"foodPieRedThe": "der rote Kirschkuchen",
|
||||
"foodPieRedThe": "den roten Kirschkuchen",
|
||||
"foodPieRedA": "ein Stück roter Kirschkuchen",
|
||||
"hatchingPotionVeggie": "Garten",
|
||||
"hatchingPotionVeggie": "Garten-",
|
||||
"questEggDolphinText": "Delfin-Haustier",
|
||||
"questEggDolphinMountText": "Delfin-Reittier",
|
||||
"questEggDolphinAdjective": "ein munteres",
|
||||
"hatchingPotionSunshine": "Sonnenschein",
|
||||
"hatchingPotionBronze": "Bronze",
|
||||
"hatchingPotionWatery": "Wässrig",
|
||||
"hatchingPotionSilver": "Silber",
|
||||
"questEggRobotAdjective": "ein futuristischer",
|
||||
"questEggRobotMountText": "Roboter",
|
||||
"questEggRobotText": "Roboter",
|
||||
"hatchingPotionSunshine": "Sonnenschein-",
|
||||
"hatchingPotionBronze": "Bronzenes",
|
||||
"hatchingPotionWatery": "Wässriges",
|
||||
"hatchingPotionSilver": "Silbernes",
|
||||
"questEggRobotAdjective": "ein futuristisches",
|
||||
"questEggRobotMountText": "Roboter-Reittier",
|
||||
"questEggRobotText": "Roboter-Haustier",
|
||||
"hatchingPotionShadow": "Schatten",
|
||||
"premiumPotionUnlimitedNotes": "Nicht auf Eier von Quest-Haustieren anwendbar."
|
||||
"premiumPotionUnlimitedNotes": "Nicht auf Eier von Quest-Haustieren anwendbar.",
|
||||
"hatchingPotionAmber": "Bernstein"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1960,7 +1960,7 @@
|
|||
"headSpecialFall2019WarriorNotes": "Die dunklen Augenhöhlen dieses Schädelhelms werden auch die Mutigsten Deiner Feinde abschrecken.Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2019 Herbstausrüstung.",
|
||||
"headSpecialKS2019Notes": "Dieser glorreiche Helm, der mit einem Greifenbild und Gefieder geschmückt ist, symbolisiert die Art und Weise, wie Deine Fähigkeiten und Deine Haltung als Vorbild für andere stehen. Erhöht Intelligenz um <%= int %>.",
|
||||
"armorSpecialFall2019RogueNotes": "Dieses Outfit wird komplett mit weißen Handschuhen geliefert und ist ideal, um in Deiner Privatloge über der Bühne zu brüten oder überraschende Auftritte auf der großen Treppe zu machen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2019 Herbstausrüstung.",
|
||||
"headMystery201910Notes": "Diese Flammen offenbaren obskure Geheimnisse vor Deinen Augen! Gewährt keinen Attributbonus. Oktober 2019 Abonnentengegenstand.",
|
||||
"headMystery201910Notes": "Diese Flammen offenbaren obskure Geheimnisse vor Deinen Augen! Gewährt keinen Attributbonus. Abonnentengegenstand, Oktober 2019.",
|
||||
"headMystery201910Text": "Rätselhafte Flamme",
|
||||
"armorMystery201910Notes": "Diese schillernde Rüstung wird Dich vor sichtbaren und unsichtbaren Schrecken schützen. Gewährt keinen Attributbonus. Oktober 2019 Abonnentengegenstand.",
|
||||
"armorMystery201910Text": "Rätselhafte Rüstung",
|
||||
|
|
@ -1971,5 +1971,13 @@
|
|||
"armorArmoireAlchemistsRobeNotes": "Jede Menge gefährlicher Elixiere sind an der Herstellung arkaner Metalle und Edelsteine beteiligt. Diese schwere Robe schützt Dich vor Schaden und unbeabsichtigter Nebenwirkungen! Erhöht Konstitution um <%= con%> und Wahrnehmung um <%= per%>. Verzauberter Schrank: Alchemisten-Set (Gegenstand 1 von 4).",
|
||||
"weaponArmoireAlchemistsDistillerText": "Distilliergerät der Alchemisten",
|
||||
"armorArmoireAlchemistsRobeText": "Robe der Alchemisten",
|
||||
"weaponArmoireAlchemistsDistillerNotes": "Reinige Metalle und andere magische Verbindungen mit diesem glänzenden Messinginstrument. Erhöht Stärke um <%= str%> und Intelligenz um <%= int%>. Verzauberter Schrank: Alchemisten-Set (Gegenstand 3 von 4)."
|
||||
"weaponArmoireAlchemistsDistillerNotes": "Reinige Metalle und andere magische Verbindungen mit diesem glänzenden Messinginstrument. Erhöht Stärke um <%= str%> und Intelligenz um <%= int%>. Verzauberter Schrank: Alchemisten-Set (Gegenstand 3 von 4).",
|
||||
"headMystery201911Text": "Verzauberter Kristallhut",
|
||||
"weaponMystery201911Text": "Verzauberter Kristallstab",
|
||||
"weaponMystery201911Notes": "Die Kristallkugel auf der Spitze dieses Stabes kann Dir die Zukunft zeigen, aber pass auf! Derart gefährliches Wissen zu nutzen kann einen in unerwarteter Weise verändern. Gewährt keinen Attributbonus. Abonnentengegenstand, November 2019.",
|
||||
"headMystery201911Notes": "Jede Kristallspitze an diesem Hut verleiht Dir eine besondere Kraft: mystisches Hellsehen, arkane Weisheit und... hexerisches Tellerdrehen? Na dann... Gewährt keinen Attributbonus. Abonnentengegenstand, November 2019.",
|
||||
"backMystery201912Notes": "Gleite leise über glänzende Schneefelder und schimmernde Berge mit diesen eisigen Flügeln. Gewährt keinen Attributbonus. Abonnentengegenstand, Dezember 2019.",
|
||||
"backMystery201912Text": "Frostige Feenflügel",
|
||||
"headMystery201912Notes": "Diese glitzernde Schneeflocke verleiht Dir Resistenz gegen die beißende Kälte, unabhängig davon wie hoch Du fliegst! Gewährt keinen Attributbonus. Abonnentengegenstand, Dezember 2019.",
|
||||
"headMystery201912Text": "Frostige Feenkrone"
|
||||
}
|
||||
|
|
|
|||