Merge branch 'develop' into news-post-datetime
1
.gitignore
vendored
|
|
@ -1,6 +1,5 @@
|
|||
.DS_Store
|
||||
website/build
|
||||
website/raw_sprites/spritesmith
|
||||
website/transpiled-babel/
|
||||
website/common/transpiled-babel/
|
||||
node_modules
|
||||
|
|
|
|||
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "habitica-images"]
|
||||
path = habitica-images
|
||||
url = https://github.com/HabitRPG/habitica-images
|
||||
3
.slugignore
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Files not included in deployments to Heroku, to save on file size.
|
||||
|
||||
/habitica-images
|
||||
|
|
@ -32,8 +32,8 @@
|
|||
"LOGGLY_SUBDOMAIN": "example-subdomain",
|
||||
"LOGGLY_TOKEN": "example-token",
|
||||
"MAINTENANCE_MODE": "false",
|
||||
"NODE_DB_URI": "mongodb://localhost:27017/habitica-dev?replicaSet=rs",
|
||||
"TEST_DB_URI": "mongodb://localhost:27017/habitica-test?replicaSet=rs",
|
||||
"NODE_DB_URI": "mongodb://localhost:27017/habitica-dev",
|
||||
"TEST_DB_URI": "mongodb://localhost:27017/habitica-test",
|
||||
"MONGODB_POOL_SIZE": "10",
|
||||
"NODE_ENV": "development",
|
||||
"PATH": "bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import spritesmith from 'gulp.spritesmith';
|
|||
import clean from 'rimraf';
|
||||
import sizeOf from 'image-size';
|
||||
import mergeStream from 'merge-stream';
|
||||
import { basename } from 'path';
|
||||
import { sync } from 'glob';
|
||||
import { each } from 'lodash';
|
||||
import vinylBuffer from 'vinyl-buffer';
|
||||
|
|
@ -118,47 +117,12 @@ function createSpritesStream (name, src) {
|
|||
}
|
||||
|
||||
gulp.task('sprites:main', () => {
|
||||
const mainSrc = sync('website/raw_sprites/spritesmith/**/*.png');
|
||||
const mainSrc = sync('habitica-images/**/*.png');
|
||||
return createSpritesStream('main', mainSrc);
|
||||
});
|
||||
|
||||
gulp.task('sprites:largeSprites', () => {
|
||||
const largeSrc = sync('website/raw_sprites/spritesmith_large/**/*.png');
|
||||
return createSpritesStream('largeSprites', largeSrc);
|
||||
});
|
||||
|
||||
gulp.task('sprites:clean', done => {
|
||||
clean(`${IMG_DIST_PATH}spritesmith*,${CSS_DIST_PATH}spritesmith*}`, done);
|
||||
});
|
||||
|
||||
gulp.task('sprites:checkCompiledDimensions', gulp.series('sprites:main', 'sprites:largeSprites', done => {
|
||||
console.log('Verifiying that images do not exceed max dimensions'); // eslint-disable-line no-console
|
||||
|
||||
let numberOfSheetsThatAreTooBig = 0;
|
||||
|
||||
const distSpritesheets = sync(`${IMG_DIST_PATH}*.png`);
|
||||
|
||||
each(distSpritesheets, img => {
|
||||
const spriteSize = calculateImgDimensions(img);
|
||||
|
||||
if (spriteSize > MAX_SPRITESHEET_SIZE) {
|
||||
numberOfSheetsThatAreTooBig += 1;
|
||||
const name = basename(img, '.png');
|
||||
console.error(`WARNING: ${name} might be too big - ${spriteSize} > ${MAX_SPRITESHEET_SIZE}`); // eslint-disable-line no-console
|
||||
}
|
||||
});
|
||||
|
||||
if (numberOfSheetsThatAreTooBig > 0) {
|
||||
// https://github.com/HabitRPG/habitica/pull/6683#issuecomment-185462180
|
||||
console.error( // eslint-disable-line no-console
|
||||
`${numberOfSheetsThatAreTooBig} sheets might too big for mobile Safari to be able to handle
|
||||
them, but there is a margin of error in these calculations so it is probably okay. Mention
|
||||
this to an admin so they can test a staging site on mobile Safari after your PR is merged.`,
|
||||
);
|
||||
} else {
|
||||
console.log('All images are within the correct dimensions'); // eslint-disable-line no-console
|
||||
}
|
||||
done();
|
||||
}));
|
||||
|
||||
gulp.task('sprites:compile', gulp.series('sprites:clean', 'sprites:checkCompiledDimensions', done => done()));
|
||||
gulp.task('sprites:compile', gulp.series('sprites:clean', 'sprites:main', done => done()));
|
||||
|
|
|
|||
1
habitica-images
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 4ab9833a58bbc85b7b0ad8dff1ee01535270dcfe
|
||||
135
migrations/archive/2021/20211230_nye.js
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/* eslint-disable no-console */
|
||||
const MIGRATION_NAME = '20211230_nye';
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count++;
|
||||
|
||||
const set = { migration: MIGRATION_NAME };
|
||||
let push;
|
||||
|
||||
if (typeof user.items.gear.owned.head_special_nye2020 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2021'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2021',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye2019 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2020'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2020',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye2018 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2019'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2019',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye2017 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2018'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2018',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye2016 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2017'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2017',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2016'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2016',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2015'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2015',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') {
|
||||
set['items.gear.owned.head_special_nye2014'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye2014',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
} else {
|
||||
set['items.gear.owned.head_special_nye'] = false;
|
||||
push = [
|
||||
{
|
||||
type: 'marketGear',
|
||||
path: 'gear.flat.head_special_nye',
|
||||
_id: uuid(),
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
return await User.update({_id: user._id}, {$set: set, $push: {pinnedItems: {$each: push}}}).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
let query = {
|
||||
'auth.timestamps.loggedin': {$gt: new Date('2021-12-01')},
|
||||
migration: {$ne: MIGRATION_NAME},
|
||||
};
|
||||
|
||||
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
|
||||
}
|
||||
};
|
||||
2262
package-lock.json
generated
30
package.json
|
|
@ -1,25 +1,25 @@
|
|||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.214.4",
|
||||
"version": "4.218.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.16.0",
|
||||
"@babel/preset-env": "^7.16.4",
|
||||
"@babel/register": "^7.16.0",
|
||||
"@babel/core": "^7.16.12",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/register": "^7.16.9",
|
||||
"@google-cloud/trace-agent": "^5.1.6",
|
||||
"@parse/node-apn": "^5.1.0",
|
||||
"@slack/webhook": "^6.0.0",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
"accepts": "^1.3.5",
|
||||
"amazon-payments": "^0.2.9",
|
||||
"amplitude": "^5.2.0",
|
||||
"apidoc": "^0.50.2",
|
||||
"apidoc": "^0.50.3",
|
||||
"apple-auth": "^1.0.7",
|
||||
"bcrypt": "^5.0.1",
|
||||
"body-parser": "^1.19.1",
|
||||
"bootstrap": "^4.6.0",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-session": "^1.4.0",
|
||||
"cookie-session": "^2.0.0",
|
||||
"coupon-code": "^0.4.5",
|
||||
"csv-stringify": "^5.6.5",
|
||||
"cwait": "^1.1.1",
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.16.3",
|
||||
"express": "^4.17.2",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-validator": "^5.2.0",
|
||||
"glob": "^7.2.0",
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
"gulp.spritesmith": "^6.12.1",
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"helmet": "^4.6.0",
|
||||
"image-size": "^1.0.0",
|
||||
"image-size": "^1.0.1",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^4.0.2",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
|
|
@ -67,14 +67,14 @@
|
|||
"remove-markdown": "^0.3.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"short-uuid": "^4.2.0",
|
||||
"stripe": "^8.193.0",
|
||||
"superagent": "^6.1.0",
|
||||
"universal-analytics": "^0.5.2",
|
||||
"stripe": "^8.199.0",
|
||||
"superagent": "^7.1.1",
|
||||
"universal-analytics": "^0.5.3",
|
||||
"useragent": "^2.1.9",
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"winston": "^3.3.3",
|
||||
"winston": "^3.4.0",
|
||||
"winston-loggly-bulk": "^3.2.1",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
|
|
@ -110,7 +110,7 @@
|
|||
"apidoc": "gulp apidoc"
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.24.0",
|
||||
"axios": "^0.25.0",
|
||||
"chai": "^4.3.4",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-moment": "^0.1.0",
|
||||
|
|
@ -121,7 +121,7 @@
|
|||
"mocha": "^5.1.1",
|
||||
"monk": "^7.3.4",
|
||||
"require-again": "^2.0.0",
|
||||
"run-rs": "^0.7.5",
|
||||
"run-rs": "^0.7.6",
|
||||
"sinon": "^12.0.1",
|
||||
"sinon-chai": "^3.7.0",
|
||||
"sinon-stub-promise": "^4.0.0"
|
||||
|
|
|
|||
|
|
@ -247,11 +247,11 @@ describe('payments/index', () => {
|
|||
|
||||
context('No Active Promotion', () => {
|
||||
beforeEach(() => {
|
||||
sinon.stub(worldState, 'getCurrentEvent').returns(null);
|
||||
sinon.stub(worldState, 'getCurrentEventList').returns([]);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
worldState.getCurrentEvent.restore();
|
||||
worldState.getCurrentEventList.restore();
|
||||
});
|
||||
|
||||
it('sends a private message about the gift', async () => {
|
||||
|
|
@ -268,14 +268,14 @@ describe('payments/index', () => {
|
|||
|
||||
context('Active Promotion', () => {
|
||||
beforeEach(() => {
|
||||
sinon.stub(worldState, 'getCurrentEvent').returns({
|
||||
sinon.stub(worldState, 'getCurrentEventList').returns([{
|
||||
...common.content.events.winter2021Promo,
|
||||
event: 'winter2021',
|
||||
});
|
||||
}]);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
worldState.getCurrentEvent.restore();
|
||||
worldState.getCurrentEventList.restore();
|
||||
});
|
||||
|
||||
it('creates a gift subscription for purchaser and recipient if none exist', async () => {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
generateUser,
|
||||
requester,
|
||||
|
|
@ -9,15 +10,18 @@ describe('GET /user/auth/apple', () => {
|
|||
let api;
|
||||
let user;
|
||||
const appleEndpoint = '/user/auth/apple';
|
||||
|
||||
before(async () => {
|
||||
const expectedResult = { id: 'appleId', name: 'an apple user' };
|
||||
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
|
||||
});
|
||||
let randomAppleId = '123456';
|
||||
|
||||
beforeEach(async () => {
|
||||
api = requester();
|
||||
user = await generateUser();
|
||||
randomAppleId = generateUUID();
|
||||
const expectedResult = { id: randomAppleId, name: 'an apple user' };
|
||||
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
appleAuth.appleProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
|
|
@ -26,7 +30,7 @@ describe('GET /user/auth/apple', () => {
|
|||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal('appleId');
|
||||
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal(randomAppleId);
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('an apple user');
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import passport from 'passport';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
generateUser,
|
||||
requester,
|
||||
|
|
@ -10,14 +11,15 @@ describe('POST /user/auth/social', () => {
|
|||
let api;
|
||||
let user;
|
||||
const endpoint = '/user/auth/social';
|
||||
const randomAccessToken = '123456';
|
||||
const facebookId = 'facebookId';
|
||||
const googleId = 'googleId';
|
||||
let randomAccessToken = '123456';
|
||||
let randomFacebookId = 'facebookId';
|
||||
let randomGoogleId = 'googleId';
|
||||
let network = 'NoNetwork';
|
||||
|
||||
beforeEach(async () => {
|
||||
api = requester();
|
||||
user = await generateUser();
|
||||
randomAccessToken = generateUUID();
|
||||
});
|
||||
|
||||
it('fails if network is not supported', async () => {
|
||||
|
|
@ -32,12 +34,23 @@ describe('POST /user/auth/social', () => {
|
|||
});
|
||||
|
||||
describe('facebook', () => {
|
||||
before(async () => {
|
||||
const expectedResult = { id: facebookId, displayName: 'a facebook user' };
|
||||
beforeEach(async () => {
|
||||
randomFacebookId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+facebook@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
network = 'facebook';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
|
|
@ -51,7 +64,8 @@ describe('POST /user/auth/social', () => {
|
|||
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a facebook user');
|
||||
await expect(getProperty('users', response.id, 'auth.local.lowerCaseUsername')).to.exist;
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(facebookId);
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+facebook@example.com`);
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(randomFacebookId);
|
||||
});
|
||||
|
||||
it('logs an existing user in', async () => {
|
||||
|
|
@ -68,6 +82,57 @@ describe('POST /user/auth/social', () => {
|
|||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
|
|
@ -76,11 +141,28 @@ describe('POST /user/auth/social', () => {
|
|||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
|
|
@ -92,12 +174,23 @@ describe('POST /user/auth/social', () => {
|
|||
});
|
||||
|
||||
describe('google', () => {
|
||||
before(async () => {
|
||||
const expectedResult = { id: googleId, displayName: 'a google user' };
|
||||
beforeEach(async () => {
|
||||
randomGoogleId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+google@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
network = 'google';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.google.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
|
|
@ -107,7 +200,8 @@ describe('POST /user/auth/social', () => {
|
|||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(googleId);
|
||||
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(randomGoogleId);
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+google@example.com`);
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a google user');
|
||||
});
|
||||
|
||||
|
|
@ -125,6 +219,57 @@ describe('POST /user/auth/social', () => {
|
|||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.google.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.google.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
|
|
@ -133,11 +278,28 @@ describe('POST /user/auth/social', () => {
|
|||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
|
|
|
|||
|
|
@ -25,6 +25,19 @@ describe('POST /user/reset-password', async () => {
|
|||
expect(user.auth.local.hashed_password).to.not.eql(previousPassword);
|
||||
});
|
||||
|
||||
it('resets password for social users', async () => {
|
||||
const email = `${user.auth.local.username}+google@example.com`;
|
||||
await user.update({ 'auth.google.emails': [{ value: email }] });
|
||||
await user.sync();
|
||||
const previousPassword = user.auth.local.passwordResetCode;
|
||||
const response = await user.post(endpoint, {
|
||||
email,
|
||||
});
|
||||
expect(response).to.eql({ data: {}, message: t('passwordReset') });
|
||||
await user.sync();
|
||||
expect(user.auth.local.passwordResetCode).to.not.eql(previousPassword);
|
||||
});
|
||||
|
||||
it('same message on error as on success', async () => {
|
||||
const response = await user.post(endpoint, {
|
||||
email: 'nonExistent@email.com',
|
||||
|
|
|
|||
3409
website/client/package-lock.json
generated
|
|
@ -13,26 +13,26 @@
|
|||
"storybook:serve": "vue-cli-service storybook:serve -p 6006 -c config/storybook"
|
||||
},
|
||||
"dependencies": {
|
||||
"@storybook/addons": "6.4.9",
|
||||
"@storybook/addon-actions": "6.4.9",
|
||||
"@storybook/addons": "6.4.14",
|
||||
"@storybook/addon-actions": "6.4.14",
|
||||
"@storybook/addon-knobs": "6.2.9",
|
||||
"@storybook/addon-links": "6.4.9",
|
||||
"@storybook/addon-links": "6.4.14",
|
||||
"@storybook/addon-notes": "5.3.21",
|
||||
"@storybook/vue": "6.3.12",
|
||||
"@storybook/vue": "6.3.13",
|
||||
"@vue/cli-plugin-babel": "^4.5.15",
|
||||
"@vue/cli-plugin-eslint": "^4.5.15",
|
||||
"@vue/cli-plugin-router": "^4.5.15",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.5.15",
|
||||
"@vue/cli-service": "^4.5.15",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^8.13.1",
|
||||
"axios": "^0.24.0",
|
||||
"amplitude-js": "^8.16.0",
|
||||
"axios": "^0.25.0",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"bootstrap-vue": "^2.21.2",
|
||||
"chai": "^4.3.4",
|
||||
"core-js": "^3.19.3",
|
||||
"core-js": "^3.20.3",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
|
|
@ -64,6 +64,6 @@
|
|||
"webpack": "^4.46.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.16.0"
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.16.7"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -232,583 +232,583 @@
|
|||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_midnight_castle {
|
||||
.background_meteor_shower {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -568px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_midnight_clouds {
|
||||
.background_midnight_castle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -710px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_midnight_lake {
|
||||
.background_midnight_clouds {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -852px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mist_shrouded_mountain {
|
||||
.background_midnight_lake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mistiflying_circus {
|
||||
.background_mist_shrouded_mountain {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_monster_makers_workshop {
|
||||
.background_mistiflying_circus {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mountain_lake {
|
||||
.background_monster_makers_workshop {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mountain_pyramid {
|
||||
.background_mountain_lake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mystical_observatory {
|
||||
.background_mountain_pyramid {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_night_dunes {
|
||||
.background_mystical_observatory {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: 0px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_ocean_sunrise {
|
||||
.background_night_dunes {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -142px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_old_fashioned_bakery {
|
||||
.background_ocean_sunrise {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -284px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_on_tree_branch {
|
||||
.background_old_fashioned_bakery {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -426px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_open_waters {
|
||||
.background_on_tree_branch {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -568px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_orchard {
|
||||
.background_open_waters {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -710px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_pagodas {
|
||||
.background_orchard {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -852px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_park_with_statue {
|
||||
.background_pagodas {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_pirate_flag {
|
||||
.background_palm_tree_with_fairy_lights {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_pixelists_workshop {
|
||||
.background_park_with_statue {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_potion_shop {
|
||||
.background_pirate_flag {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_productivity_plaza {
|
||||
.background_pixelists_workshop {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_pumpkin_carriage {
|
||||
.background_potion_shop {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_pumpkin_patch {
|
||||
.background_productivity_plaza {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_purple {
|
||||
.background_pumpkin_carriage {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_pyramids {
|
||||
.background_pumpkin_patch {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: 0px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_raging_river {
|
||||
.background_purple {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -142px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainbow_meadow {
|
||||
.background_pyramids {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -284px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainbows_end {
|
||||
.background_raging_river {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -426px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainforest {
|
||||
.background_rainbow_meadow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -568px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainy_barnyard {
|
||||
.background_rainbows_end {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -710px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainy_city {
|
||||
.background_rainforest {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -852px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_red {
|
||||
.background_rainy_barnyard {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_relaxation_river {
|
||||
.background_rainy_city {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_resting_in_the_inn {
|
||||
.background_red {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_river_of_lava {
|
||||
.background_relaxation_river {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rolling_hills {
|
||||
.background_resting_in_the_inn {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rope_bridge {
|
||||
.background_river_of_lava {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rose_garden {
|
||||
.background_rolling_hills {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rowboat {
|
||||
.background_rope_bridge {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_salt_lake {
|
||||
.background_rose_garden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_sandcastle {
|
||||
.background_rowboat {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_school_of_fish {
|
||||
.background_salt_lake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: 0px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_scribes_workshop {
|
||||
.background_sandcastle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -142px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_seafarer_ship {
|
||||
.background_school_of_fish {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -284px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_seaside_cliffs {
|
||||
.background_scribes_workshop {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -426px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_shimmering_ice_prism {
|
||||
.background_seafarer_ship {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -568px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_shimmery_bubbles {
|
||||
.background_seaside_cliffs {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -710px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_slimy_swamp {
|
||||
.background_shimmering_ice_prism {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -852px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowglobe {
|
||||
.background_shimmery_bubbles {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowman_army {
|
||||
.background_slimy_swamp {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowy_day_fireplace {
|
||||
.background_snowglobe {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowy_pines {
|
||||
.background_snowman_army {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowy_sunrise {
|
||||
.background_snowy_day_fireplace {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_south_pole {
|
||||
.background_snowy_farm {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_sparkling_snowflake {
|
||||
.background_snowy_pines {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spider_web {
|
||||
.background_snowy_sunrise {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spiral_staircase {
|
||||
.background_south_pole {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_splash_in_a_puddle {
|
||||
.background_sparkling_snowflake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spooky_hotel {
|
||||
.background_spider_web {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spooky_scarecrow_field {
|
||||
.background_spiral_staircase {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spring_rain {
|
||||
.background_splash_in_a_puddle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: 0px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spring_thaw {
|
||||
.background_spooky_hotel {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -142px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stable {
|
||||
.background_spooky_scarecrow_field {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -284px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stained_glass {
|
||||
.background_spring_rain {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -426px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_starry_skies {
|
||||
.background_spring_thaw {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -568px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_starry_winter_night {
|
||||
.background_stable {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -710px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stoikalm_volcanoes {
|
||||
.background_stained_glass {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -852px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stone_circle {
|
||||
.background_starry_skies {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stone_tower {
|
||||
.background_starry_winter_night {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stormy_rooftops {
|
||||
.background_stoikalm_volcanoes {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stormy_ship {
|
||||
.background_stone_circle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_strange_sewers {
|
||||
.background_stone_tower {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_strawberry_patch {
|
||||
.background_stormy_rooftops {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_succulent_garden {
|
||||
.background_stormy_ship {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_summer_fireworks {
|
||||
.background_strange_sewers {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -444px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_sunken_ship {
|
||||
.background_strawberry_patch {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -592px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_sunset_meadow {
|
||||
.background_succulent_garden {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -740px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_sunset_oasis {
|
||||
.background_summer_fireworks {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -888px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_sunset_savannah {
|
||||
.background_sunken_ship {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -1036px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_swarming_darkness {
|
||||
.background_sunset_meadow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -1184px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_swimming_among_jellyfish {
|
||||
.background_sunset_oasis {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -1332px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tar_pits {
|
||||
.background_sunset_savannah {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: 0px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tavern {
|
||||
.background_swarming_darkness {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -142px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tea_party {
|
||||
.background_swimming_among_jellyfish {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -284px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_terraced_rice_field {
|
||||
.background_tar_pits {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -426px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_throne_room {
|
||||
.background_tavern {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -568px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_thunderstorm {
|
||||
.background_tea_party {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -710px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tide_pool {
|
||||
.background_terraced_rice_field {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -852px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tornado {
|
||||
.background_throne_room {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -994px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_toymakers_workshop {
|
||||
.background_thunderstorm {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1136px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_training_grounds {
|
||||
.background_tide_pool {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1278px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_treasure_room {
|
||||
.background_tornado {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1420px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tree_roots {
|
||||
.background_toymakers_workshop {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1562px -1480px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_treehouse {
|
||||
.background_training_grounds {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1704px 0px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tulip_garden {
|
||||
.background_treasure_room {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1704px -148px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_twinkly_lights {
|
||||
.background_tree_roots {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1704px -296px;
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_twinkly_party_lights {
|
||||
.background_treehouse {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-1.png');
|
||||
background-position: -1704px -444px;
|
||||
width: 141px;
|
||||
|
|
|
|||
|
|
@ -1,126 +1,198 @@
|
|||
.quest_bunny {
|
||||
.quest_alligator {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -1546px;
|
||||
width: 210px;
|
||||
height: 186px;
|
||||
background-position: -1322px -1112px;
|
||||
width: 201px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_butterfly {
|
||||
.quest_amber {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_cheetah {
|
||||
.quest_armadillo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_cow {
|
||||
.quest_atom1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1760px 0px;
|
||||
width: 174px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_dilatory {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dilatoryDistress1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -222px -1332px;
|
||||
width: 210px;
|
||||
height: 210px;
|
||||
}
|
||||
.quest_dilatoryDistress2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1760px -422px;
|
||||
width: 150px;
|
||||
background-position: -1082px -1332px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_dilatoryDistress3 {
|
||||
.quest_atom2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
background-position: -642px -1534px;
|
||||
width: 207px;
|
||||
height: 138px;
|
||||
}
|
||||
.quest_dilatory_derby {
|
||||
.quest_atom3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -211px -1534px;
|
||||
width: 216px;
|
||||
height: 180px;
|
||||
}
|
||||
.quest_axolotl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dolphin {
|
||||
.quest_badger {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_basilist {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -191px -1721px;
|
||||
width: 189px;
|
||||
height: 141px;
|
||||
}
|
||||
.quest_beetle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -1332px;
|
||||
width: 204px;
|
||||
height: 201px;
|
||||
}
|
||||
.quest_blackPearl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px 0px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_bronze {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_bunny {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -1534px;
|
||||
width: 210px;
|
||||
height: 186px;
|
||||
}
|
||||
.quest_butterfly {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dustbunnies {
|
||||
.quest_cheetah {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_egg {
|
||||
.quest_cow {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1760px -214px;
|
||||
width: 165px;
|
||||
height: 207px;
|
||||
background-position: -1757px 0px;
|
||||
width: 174px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_evilsanta {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1760px -724px;
|
||||
width: 118px;
|
||||
height: 131px;
|
||||
}
|
||||
.quest_evilsanta2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_falcon {
|
||||
.quest_dilatory {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_ferret {
|
||||
.quest_dilatoryDistress1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px -1085px;
|
||||
width: 210px;
|
||||
height: 210px;
|
||||
}
|
||||
.quest_dilatoryDistress2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1757px -422px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_dilatoryDistress3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_fluorite {
|
||||
.quest_dilatory_derby {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dolphin {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_frog {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -1332px;
|
||||
width: 221px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_ghost_stag {
|
||||
.quest_dustbunnies {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight1 {
|
||||
.quest_egg {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1757px -214px;
|
||||
width: 165px;
|
||||
height: 207px;
|
||||
}
|
||||
.quest_evilsanta {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1757px -724px;
|
||||
width: 118px;
|
||||
height: 131px;
|
||||
}
|
||||
.quest_evilsanta2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_falcon {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_ferret {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_fluorite {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_frog {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px -1112px;
|
||||
width: 221px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_ghost_stag {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -211px -1546px;
|
||||
background-position: -1333px -1332px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
|
|
@ -132,259 +204,193 @@
|
|||
}
|
||||
.quest_gryphon {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -876px -1332px;
|
||||
background-position: -648px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_guineapig {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px -440px;
|
||||
background-position: -880px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_harpy {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -672px;
|
||||
background-position: -1100px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_hedgehog {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -433px -1332px;
|
||||
background-position: -205px -1332px;
|
||||
width: 219px;
|
||||
height: 186px;
|
||||
}
|
||||
.quest_hippo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -672px;
|
||||
background-position: -1100px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_horse {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -672px;
|
||||
background-position: -1100px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kangaroo {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px -672px;
|
||||
background-position: -1100px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kraken {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1093px -1332px;
|
||||
background-position: -865px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_lostMasterclasser1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px -672px;
|
||||
background-position: 0px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_lostMasterclasser2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px 0px;
|
||||
background-position: -220px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_lostMasterclasser3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px -220px;
|
||||
background-position: -440px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_mayhemMistiflying1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1760px -573px;
|
||||
background-position: -1757px -573px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_mayhemMistiflying2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px -440px;
|
||||
background-position: -660px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_mayhemMistiflying3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px -660px;
|
||||
background-position: -880px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_monkey {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -892px;
|
||||
background-position: -1100px -892px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px -220px;
|
||||
background-position: -1540px -217px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_moon2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -892px;
|
||||
background-position: -1320px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -892px;
|
||||
background-position: -1320px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone1 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px -892px;
|
||||
background-position: -1320px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone2 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px -892px;
|
||||
background-position: -1320px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone3 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px -892px;
|
||||
background-position: -1320px -880px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_nudibranch {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px -437px;
|
||||
background-position: -1540px -434px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_octopus {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -653px -1332px;
|
||||
background-position: -425px -1332px;
|
||||
width: 222px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_onyx {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1320px 0px;
|
||||
background-position: 0px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_owl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1320px -220px;
|
||||
background-position: -220px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_peacock {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px -654px;
|
||||
background-position: -1540px -651px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_penguin {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -1733px;
|
||||
background-position: 0px -1721px;
|
||||
width: 190px;
|
||||
height: 183px;
|
||||
}
|
||||
.quest_pterodactyl {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1320px -440px;
|
||||
background-position: -440px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_rat {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1320px -660px;
|
||||
background-position: -660px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_robot {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1320px -880px;
|
||||
background-position: -880px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_rock {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px -871px;
|
||||
background-position: -1540px -868px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_rooster {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1527px -1332px;
|
||||
background-position: -428px -1534px;
|
||||
width: 213px;
|
||||
height: 174px;
|
||||
}
|
||||
.quest_ruby {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: 0px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sabretooth {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -220px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_seaserpent {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -440px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sheep {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -660px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_silver {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -880px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_slime {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1100px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sloth {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1320px -1112px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_snail {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px -1088px;
|
||||
width: 219px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_snake {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1310px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_spider {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -462px -1546px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_squirrel {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-main-15.png');
|
||||
background-position: -1540px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 465 KiB After Width: | Height: | Size: 464 KiB |
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 414 KiB After Width: | Height: | Size: 390 KiB |
|
Before Width: | Height: | Size: 265 KiB After Width: | Height: | Size: 331 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 588 KiB After Width: | Height: | Size: 597 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 183 KiB After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 124 KiB |
|
|
@ -20,8 +20,8 @@
|
|||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="form-group row text-center"
|
||||
v-if="!registering"
|
||||
class="form-group row text-center"
|
||||
>
|
||||
<div class="col-12 col-md-12">
|
||||
<div
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@
|
|||
v-if="editing"
|
||||
class="menu-container col-2"
|
||||
:class="{active: activeTopPage === 'backgrounds'}"
|
||||
@click="changeTopPage('backgrounds', '2021')"
|
||||
@click="changeTopPage('backgrounds', '2022')"
|
||||
>
|
||||
<div class="menu-item">
|
||||
<div
|
||||
|
|
@ -1184,7 +1184,7 @@ export default {
|
|||
},
|
||||
],
|
||||
|
||||
bgSubMenuItems: ['2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
|
||||
bgSubMenuItems: ['2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
|
||||
id: y,
|
||||
label: y,
|
||||
})),
|
||||
|
|
@ -1212,6 +1212,7 @@ export default {
|
|||
2019: [],
|
||||
2020: [],
|
||||
2021: [],
|
||||
2022: [],
|
||||
};
|
||||
|
||||
// Hack to force update for now until we restructure the data
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
@keydown.tab="handleTab($event)"
|
||||
@keydown.up="selectPreviousAutocomplete($event)"
|
||||
@keydown.down="selectNextAutocomplete($event)"
|
||||
@keydown.enter="selectAutocomplete($event)"
|
||||
@keypress.enter="selectAutocomplete($event)"
|
||||
@keydown.esc="handleEscape($event)"
|
||||
@paste="disableMessageSendShortcut()"
|
||||
></textarea>
|
||||
|
|
@ -247,8 +247,13 @@ export default {
|
|||
|
||||
selectAutocomplete (e) {
|
||||
if (this.$refs.autocomplete.searchActive) {
|
||||
e.preventDefault();
|
||||
this.$refs.autocomplete.makeSelection();
|
||||
if (this.$refs.autocomplete.selected !== null) {
|
||||
e.preventDefault();
|
||||
this.$refs.autocomplete.makeSelection();
|
||||
} else {
|
||||
// no autocomplete selected, newline instead
|
||||
this.$refs.autocomplete.cancel();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@
|
|||
</style>
|
||||
|
||||
<script>
|
||||
import find from 'lodash/find';
|
||||
import { mapState } from '@/libs/store';
|
||||
import BaseBanner from './base';
|
||||
|
||||
|
|
@ -98,8 +99,11 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentEvent: 'worldState.data.currentEvent',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
currentEvent () {
|
||||
return find(this.currentEventList, event => Boolean(event.gemsPromo));
|
||||
},
|
||||
eventName () {
|
||||
return this.currentEvent && this.currentEvent.event;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@
|
|||
</style>
|
||||
|
||||
<script>
|
||||
import find from 'lodash/find';
|
||||
import { mapState } from '@/libs/store';
|
||||
import BaseBanner from './base';
|
||||
|
||||
|
|
@ -74,8 +75,11 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentEvent: 'worldState.data.currentEvent',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
currentEvent () {
|
||||
return find(this.currentEventList, event => Boolean(event.promo));
|
||||
},
|
||||
eventName () {
|
||||
return this.currentEvent && this.currentEvent.event;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -178,12 +178,12 @@ import sword from '@/assets/svg/sword.svg';
|
|||
import { worldStateMixin } from '@/mixins/worldState';
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
worldStateMixin,
|
||||
],
|
||||
components: {
|
||||
BaseNotification,
|
||||
},
|
||||
mixins: [
|
||||
worldStateMixin,
|
||||
],
|
||||
data () {
|
||||
const questData = quests.quests.dysheartener;
|
||||
|
||||
|
|
|
|||
|
|
@ -194,7 +194,10 @@
|
|||
<h4 class="popover-content-title">
|
||||
{{ context.item.text }}
|
||||
</h4>
|
||||
<questInfo :quest="context.item" :purchased="true" />
|
||||
<questInfo
|
||||
:quest="context.item"
|
||||
:purchased="true"
|
||||
/>
|
||||
</div>
|
||||
<div v-else>
|
||||
<h4 class="popover-content-title">
|
||||
|
|
|
|||
|
|
@ -364,6 +364,7 @@
|
|||
</style>
|
||||
|
||||
<script>
|
||||
import find from 'lodash/find';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import markdown from '@/directives/markdown';
|
||||
|
|
@ -408,8 +409,11 @@ export default {
|
|||
...mapState({
|
||||
user: 'user.data',
|
||||
originalGemsBlocks: 'content.gems',
|
||||
currentEvent: 'worldState.data.currentEvent',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
currentEvent () {
|
||||
return find(this.currentEventList, event => Boolean(event.gemsPromo) || Boolean(event.promo));
|
||||
},
|
||||
eventName () {
|
||||
return this.currentEvent && this.currentEvent.event;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -210,6 +210,7 @@
|
|||
|
||||
<script>
|
||||
import debounce from 'lodash/debounce';
|
||||
import find from 'lodash/find';
|
||||
import isUUID from 'validator/lib/isUUID';
|
||||
import { mapState } from '@/libs/store';
|
||||
import closeIcon from '@/assets/svg/close.svg';
|
||||
|
|
@ -227,8 +228,11 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentEvent: 'worldState.data.currentEvent',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
currentEvent () {
|
||||
return find(this.currentEventList, event => Boolean(event.gemsPromo) || Boolean(event.promo));
|
||||
},
|
||||
searchCannotSubmit () {
|
||||
if (this.userSearchTerm.length < 1) return true;
|
||||
return typeof this.foundUser._id === 'undefined';
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@
|
|||
</style>
|
||||
|
||||
<script>
|
||||
import find from 'lodash/find';
|
||||
import { mapState } from '@/libs/store';
|
||||
import SecondaryMenu from '@/components/secondaryMenu';
|
||||
import gifts from '@/assets/svg/gifts-vertical.svg';
|
||||
|
|
@ -128,8 +129,11 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentEvent: 'worldState.data.currentEvent',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
currentEvent () {
|
||||
return find(this.currentEventList, event => Boolean(event.promo));
|
||||
},
|
||||
promo () {
|
||||
if (!this.currentEvent || !this.currentEvent.promo) return 'none';
|
||||
return this.currentEvent.promo;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,17 @@
|
|||
<template>
|
||||
<div class="notification-animation-holder">
|
||||
<div class="notification-holder"
|
||||
@click="handleOnClick()">
|
||||
<div v-if="notification.type === 'drop'"
|
||||
class="icon-item">
|
||||
<div :class="notification.icon" class="icon-negative-margin"></div>
|
||||
<div
|
||||
class="notification-holder"
|
||||
@click="handleOnClick()"
|
||||
>
|
||||
<div
|
||||
v-if="notification.type === 'drop'"
|
||||
class="icon-item"
|
||||
>
|
||||
<div
|
||||
:class="notification.icon"
|
||||
class="icon-negative-margin"
|
||||
></div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
|
|
@ -32,7 +39,10 @@
|
|||
class="svg-icon"
|
||||
v-html="icons.gold"
|
||||
></div>
|
||||
<div class="icon-text" v-html="notification.text"></div>
|
||||
<div
|
||||
class="icon-text"
|
||||
v-html="notification.text"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
|
@ -63,7 +73,10 @@
|
|||
class="svg-icon"
|
||||
v-html="icons.mana"
|
||||
></div>
|
||||
<div class="icon-text" v-html="notification.text"></div>
|
||||
<div
|
||||
class="icon-text"
|
||||
v-html="notification.text"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
|
@ -78,7 +91,10 @@
|
|||
class="svg-icon"
|
||||
v-html="icons.sword"
|
||||
></div>
|
||||
<div class="icon-text" v-html="notification.text"></div>
|
||||
<div
|
||||
class="icon-text"
|
||||
v-html="notification.text"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
|
@ -98,7 +114,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@
|
|||
|
||||
<script>
|
||||
import debounce from 'lodash/debounce';
|
||||
import find from 'lodash/find';
|
||||
|
||||
import { mapState } from '@/libs/store';
|
||||
import notification from './notification';
|
||||
|
|
@ -80,12 +81,12 @@ const DELAY_DELETE_AND_NEW = 60;
|
|||
const DELAY_FILLING_ENTRIES = 240;
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
worldStateMixin,
|
||||
],
|
||||
components: {
|
||||
notification,
|
||||
},
|
||||
mixins: [
|
||||
worldStateMixin,
|
||||
],
|
||||
props: {
|
||||
preventQueue: {
|
||||
type: Boolean,
|
||||
|
|
@ -111,8 +112,11 @@ export default {
|
|||
...mapState({
|
||||
notificationStore: 'notificationStore',
|
||||
userSleeping: 'user.data.preferences.sleep',
|
||||
currentEvent: 'worldState.data.currentEvent',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
currentEvent () {
|
||||
return find(this.currentEventList, event => Boolean(event.gemsPromo) || Boolean(event.promo));
|
||||
},
|
||||
isEventActive () {
|
||||
return Boolean(this.currentEvent?.event);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -105,5 +105,6 @@
|
|||
"achievementSkeletonCrewText": "Posbíral/a všechna kostnatá zvířata.",
|
||||
"achievementLegendaryBestiaryModalText": "Posbíral/a jsi všechny mytické mazlíčky!",
|
||||
"achievementLegendaryBestiaryText": "Posbíral/a všechny mytické mazlíčky: draka, létající prase, gryfona, mořského hada a jednorožce!",
|
||||
"achievementLegendaryBestiary": "Legendární bestiář"
|
||||
"achievementLegendaryBestiary": "Legendární bestiář",
|
||||
"achievementSeasonalSpecialist": "Sezónní specialista"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -660,5 +660,9 @@
|
|||
"backgroundFrozenPolarWatersNotes": "Erforsche gefrorene Polargewässer.",
|
||||
"backgrounds122021": "Set 91: Veröffentlicht im Dezember 2021",
|
||||
"backgroundWinterCanyonShopText": "Winterliche Schlucht",
|
||||
"backgroundIcePalaceShopNotes": "Herrsche in einem Eispalast."
|
||||
"backgroundIcePalaceShopNotes": "Herrsche in einem Eispalast.",
|
||||
"backgroundWinterCanyonText": "Winterliche Schlucht",
|
||||
"backgroundWinterCanyonNotes": "Wage ein Abenteuer in einer winterlichen Schlucht!",
|
||||
"backgroundIcePalaceText": "Eispalast",
|
||||
"backgroundIcePalaceNotes": "Herrsche in einem Eispalast."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2476,7 +2476,7 @@
|
|||
"armorSpecialFall2021MageNotes": "Kragen mit vielen spitzen Spitzen sind besonders Beliebt bei Basisbösewichten. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"armorSpecialFall2021HealerText": "Roben des Erweckens",
|
||||
"armorSpecialFall2021HealerNotes": "Hergestellt aus flammen-resistentem Material sind diese Roben besonders geeignet um heilende Flammen und reinige Feuer anzuwenden. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"armorArmoireBagpipersKiltNotes": "Ein robuster, langlebiger Kilt wird Dir gute Dienste erweisen. Erhöht Ausdauer um <%= con %>. Sackpfeifer Set (Gegenstand 2 von 3).",
|
||||
"armorArmoireBagpipersKiltNotes": "Ein robuster, langlebiger Kilt wird Dir gute Dienste erweisen. Erhöht Ausdauer um <%= con %>. Dudelsackpfeiferset (Gegenstand 2 von 3).",
|
||||
"armorArmoireHeraldsTunicText": "Tunika des Herolds",
|
||||
"armorArmoireSoftBlackSuitText": "Weicher Schwarzer Anzug",
|
||||
"headSpecialFall2021RogueNotes": "Tja, Du steckst fest. Jetzt bist Du dazu verdonnert alte Verliese heimzusuchen und allerlei Unrat mit dir aufzusammeln. Ohweh! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
|
|
@ -2492,5 +2492,63 @@
|
|||
"weaponArmoireSkullLanternNotes": "Lasse ihr Leuchten deinen Weg durch die tiefste Finsternis erhellen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank:Unabhängiger Gegenstand.",
|
||||
"offHandCapitalized": "Schildhand-Gegenstand",
|
||||
"armorMystery202112Text": "Antarktischer Nixenschwanz",
|
||||
"armorMystery202112Notes": "Gleite mit diesem schimmerden Schwanz durch eisige Gewässser ohne jegliche Kälte zu spühren. Gewährt keinen Attributbonus. Dezember 2021 Abonnentengegenstand."
|
||||
"armorMystery202112Notes": "Gleite mit diesem schimmerden Schwanz durch eisige Gewässser ohne jegliche Kälte zu spühren. Gewährt keinen Attributbonus. Dezember 2021 Abonnentengegenstand.",
|
||||
"headArmoireGlengarryText": "Hochlandmütze",
|
||||
"shieldArmoireBagpipesNotes": "Unbarmherzige mögen sagen, Du planst mit diesem Dudelsack die Toten zu wecken – aber Du weißt, dass Du lediglich Deine Party zum Erfolg motivierst! Erhöht Stärke um <%= str %>. Verzauberter Schrank: Dudelsackpfeifenset (Gegenstand 3 von 3).",
|
||||
"weaponArmoireRegalSceptreText": "Majestätisches Szepter",
|
||||
"headArmoireRegalCrownText": "Majestätische Krone",
|
||||
"headArmoireBlackFloppyHatNotes": "Viele Zauber wurden in diese einfache Mütze genäht, um diese schwungvolle schwarze Farbe zu erreichen. Erhöht Ausdauer, Wahrnehmung und Sträke um jeweils <%= attrs %>. Verzauberter Schrank: Schwarzes Wohlfühl-Set (Gegenstand 1 von 3).",
|
||||
"shieldSpecialFall2021WarriorText": "Kürbislaternen-Schild",
|
||||
"weaponArmoireRegalSceptreNotes": "Mit diesem mit Edelsteinen und Juwelen geschmückten Stab in der Hand stellst Du Deine majestätische Autorität zur Schau. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Majestätisches Set (Gegenstand 2 von 2).",
|
||||
"shieldArmoireSoftBlackPillowNotes": "Mutige Kampfkünstler nehmen auf jede Expedition ein Kissen mit. Schütze Dich vor ermüdenden Aufgaben … auch, während einem Nickerchen. Erhöht Intelligenz und Wahrnehmung um je <%= attrs %>. Verzauberter Schrank: Schwarzes Wohlfühl-Set (Gegenstand 3 von 3).",
|
||||
"headMystery202112Text": "Antarktische Nixenkrone",
|
||||
"shieldSpecialFall2021WarriorNotes": "Dieses festliche Schild mit seinem schiefen Lächeln wird Dich beschützen und Dir in einer dunklen Nacht den Weg erleuchten. Es eignet sich auch gut als Kopf, solltest Du einen brauchen! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"headArmoireRegalCrownNotes": "Alle Herrschenden wären glücklich, so eine hoheitsvolle, elegante Krone zu besitzen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Majestätisches Set (Gegenstand 1 von 2).",
|
||||
"headMystery202112Notes": "Diese gefrorene Krone schimmert wie die versteckten Tiefen eines Eisbergs. Gewährt keinen Attributbonus. Dezember 2021 Abonnentengegenstand.",
|
||||
"headArmoireGlengarryNotes": "Eine traditionelle Mütze voller Stolz und Geschichte. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Dudelsackpfeifenset (Gegenstand 1 von 3).",
|
||||
"headArmoireHeraldsCapText": "Heroldsmütze",
|
||||
"headMystery202110Notes": "Das erschreckende Antlitz dieses steinernen Helms wehrt zuverlässig böswillige Mächte und schlechte Gewohnheiten ab! Gewährt keinen Attributbonus. Oktober 2021 Abonnentengegenstand.",
|
||||
"headArmoireBlackFloppyHatText": "Schwarzer Schlapphut",
|
||||
"shieldSpecialFall2021HealerNotes": "Ein ätherisches Wesen steigt aus Deinen magischen Flammen, um Dir zusätzlichen Schutz zu gewähren. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"shieldArmoireBagpipesText": "Dudelsack",
|
||||
"headAccessoryMystery202109Text": "Mondschmetterlings-Fühler",
|
||||
"backMystery202109Notes": "Gleite sanft und lautlos durch das Licht der Dämmerung. Gewährt keinen Attributbonus. September 2021 Abonnentengegenstand.",
|
||||
"headAccessoryMystery202109Notes": "Fange den Blumenduft der Brise oder ein, oder den Geruch des Wandels im Wind. Gewährt keinen Attributbonus. September 2021 Abonnentengegenstand.",
|
||||
"eyewearMystery202108Notes": "Starre Deine Feinde (oder Deine schwierigsten Aufgaben!) nieder – sie werden Deinem Blick nicht standhalten können. Gewährt keinen Attributbonus August 2021 Abonnentengegenstand.",
|
||||
"eyewearMystery202108Text": "Feuerrote Augen",
|
||||
"shieldArmoireSoftBlackPillowText": "Weiches Schwarzes Kissen",
|
||||
"weaponSpecialWinter2022WarriorText": "Zuckerstangen-Schwert",
|
||||
"weaponSpecialWinter2022WarriorNotes": "Wie oft musst Du schlecken, damit aus dieser Zuckerstange ein scharfes Schwert wird? Erhöht Stärke um <%= str %>. Limitierte Ausrüstung 2021–2022 Winterausrüstung.",
|
||||
"weaponSpecialWinter2022MageText": "Granatapfelstab",
|
||||
"weaponSpecialWinter2022HealerText": "Kristallklarer Zauberstab aus Eis",
|
||||
"weaponSpecialWinter2022HealerNotes": "Berühre einen Freund mit diesem Werkzeug aus festgefrorenem Wasser am Nacken, und er wird aus dem Sessel springen! Aber sich danach auch besser fühlen. Hoffentlich. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"armorSpecialWinter2022RogueText": "Strahlende Explosion",
|
||||
"armorSpecialWinter2022WarriorText": "Samtiger Strumpf",
|
||||
"armorSpecialWinter2022MageText": "Granatapfel-Schutzrüstung",
|
||||
"armorSpecialWinter2022HealerText": "Kristallklare Rüstung aus Eis",
|
||||
"armorSpecialWinter2022HealerNotes": "Gleite wie auf Schlittschuhen knapp über dem Boden – eine ätherisch-glitzernde Gestalt, gekommen, um Geduld und Gelassenheit zu verbreiten. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialWinter2022WarriorText": "Samtige Bommelmütze",
|
||||
"headSpecialWinter2022WarriorNotes": "In dem festlichen Grün mit der roten Borte hält Dich diese Mütze garantiert den ganzen Winter warm. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialWinter2022MageText": "Granatapfelhelm",
|
||||
"headSpecialWinter2022HealerText": "Kristallklare Krone aus Eis",
|
||||
"weaponSpecialWinter2022RogueText": "Sternschnuppenfeuerwerk",
|
||||
"armorSpecialWinter2022RogueNotes": "Sagen wir es einmal so: Wenn sie Sterne sehen, sehen sie Dich nicht! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"armorSpecialWinter2022WarriorNotes": "Wer sagt, dass Du es nicht geborgen und gemütlich haben kannst, während Du mit alltäglichen Aufgaben kämpfst? Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"armorSpecialWinter2022MageNotes": "Wenn Du Dich näherst, müssen sich Deine Feinde sich vor Fruchtsaft-Flecken in Acht nehmen! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialWinter2022RogueText": "Donnerndes Finale",
|
||||
"headSpecialWinter2022MageNotes": "Dank seiner dicken Hülse ist dieser festliche, fruchtige Helm beerenstark. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"weaponSpecialWinter2022RogueNotes": "Schurken lieben Silber und Gold, stimmt's? Das passt perfekt. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"weaponSpecialWinter2022MageNotes": "Die Beeren auf diesem Stab beinhalten alte Magie, die besonders im Winter hervortritt. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialWinter2022RogueNotes": "Hm? Was? Wo soll ein Schurke sein? Tut mir Leid, wegen der Feuerwerke kann ich nichts hören! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialWinter2022HealerNotes": "Winzige Fehler und Fremdkörper lassen die Arme dieses Kopfschmucks in unvorhersehbare Richtungen sprießen. Das ist symbolisch! Und auch sehr, sehr hübsch. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"shieldSpecialWinter2022WarriorText": "Jingle Bell Schild",
|
||||
"shieldSpecialWinter2022HealerText": "Beständiger Eiskristall",
|
||||
"shieldSpecialWinter2022HealerNotes": "Obwohl es in Deiner Hand schmilzt, füllt sich die elementare Kraft des Eises immer wieder aufs Neue von Innen auf. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"shieldSpecialWinter2022WarriorNotes": "Das ist ein Jingle Bell, Jingle Bell, Jingle Bell Schild. Jingle Bell beschützt und Jingle Bell behütet. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialNye2021Text": "Absurder Partyhut",
|
||||
"weaponMystery202201Notes": "Setze eine Wolke aus silbernem und goldenem Glitter frei, wenn die Uhr Mitternacht schlägt. Frohes neues Jahr! Und wer räumt das jetzt auf? Gewährt keinen Attributbonus. Jänner 2022 Abonnentengegenstand.",
|
||||
"headSpecialNye2021Notes": "Du hast einen Absurden Partyhut erhalten! Trag ihn mit Stolz, während Du das neue Jahr einläutest! Gewährt keinen Attributbonus.",
|
||||
"eyewearMystery202201Text": "Mitternächtliche Spaßvogel-Maske",
|
||||
"eyewearMystery202201Notes": "Läute das neue Jahr in dieser eleganten, mit Federn geschmückten Maske ein, die Dir ein geheimnissvolles Auftreten verleiht. Gewährt keinen Attributbonus. Jänner 2022 Abonnentengegenstand.",
|
||||
"weaponMystery202201Text": "Mitternachts-Konfettikanone"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -202,5 +202,16 @@
|
|||
"finish": "Abschliessen",
|
||||
"congratulations": "Gratulation!",
|
||||
"onboardingAchievs": "Einstiegserfolge",
|
||||
"askQuestion": "Stell eine Frage"
|
||||
"askQuestion": "Stell eine Frage",
|
||||
"reportEmailPlaceholder": "Deine E-Mail-Adresse",
|
||||
"reportSent": "Fehlermeldung gesendet!",
|
||||
"reportBugHeaderDescribe": "Bitte beschreibe den Fehler, auf den Du gestoßen bist, und unser Team wird sich bei Dir melden.",
|
||||
"reportSentDescription": "Vielen Dank für Deine Fehlermeldung. Wir werden uns sobald wie möglich bei Dir melden.",
|
||||
"reportEmailText": "Diese wird nur benutzt, um Dich bezüglich der Fehlermeldung zu kontaktieren.",
|
||||
"reportEmailError": "Bitte gib eine gültige E-Mail-Adresse an",
|
||||
"emptyReportBugMessage": "Keine Fehlermeldungs-Nachricht vorhanden",
|
||||
"reportDescription": "Beschreibung",
|
||||
"reportDescriptionText": "Füge hilfreiche Screenshots oder Fehlermeldungen der Javascript-Konsole ein.",
|
||||
"reportDescriptionPlaceholder": "Beschreibe den Fehler hier im Detail",
|
||||
"submitBugReport": "Sende eine Fehlermeldung"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@
|
|||
"septemberYYYY": "September <%= year %>",
|
||||
"royalPurpleJackolantern": "Purpurne Kürbislaterne",
|
||||
"novemberYYYY": "November <%= year %>",
|
||||
"g1g1Limitations": "Dies ist eine Zeit-beschränkte Aktion und startet am 17. Dezember um 13:00 Uhr (GMT) und wird am 7. Januar um 01:00 Nachts (GMT) enden. Dieses Angebot ist nur gültig wenn Du einen anderen Habitikianer beschenkst. Wenn Du, oder die beschenkte Person, bereits ein Abo haben wird dieses, sobald es abläuft oder gekündigt wird, um die Zeit des Geschenkes verlängert werden.",
|
||||
"g1g1Limitations": "Dies ist eine zeitlich beschränkte Aktion, die am 16. Dezember um 13:00 Uhr (GMT) startet und am 6. Januar um 01:00 Nachts (GMT) endet. Dieses Angebot ist nur gültig, wenn Du einen anderen Habitikianer beschenkst. Wenn Du oder die beschenkte Person bereits ein Abo haben, wird dieses, sobald es abläuft oder gekündigt wird, um die Zeit des Geschenkes verlängert werden.",
|
||||
"limitations": "Einschränkungen",
|
||||
"g1g1HowItWorks": "Gebe den Account-Namen ein, welchem Du das Geschenk machen willst. Dann wähle die Länge des Abos, das du verschenken möchtest und schließe den Vorgang ab. Dein Account wird automatisch mit dem selben Abo belohnt, das Du gerade verschenkt hast.",
|
||||
"howItWorks": "So funktioniert es",
|
||||
|
|
@ -211,5 +211,10 @@
|
|||
"fall2021HeadlessWarriorSet": "Kopflos (Krieger)",
|
||||
"fall2021BrainEaterMageSet": "Gehirnesser (Magier)",
|
||||
"fall2021FlameSummonerHealerSet": "Flammenbote (Heiler)",
|
||||
"fall2021OozeRogueSet": "Schlamm (Schurke)"
|
||||
"fall2021OozeRogueSet": "Schlamm (Schurke)",
|
||||
"winter2022FireworksRogueSet": "Feuerwerk (Schurke)",
|
||||
"winter2022StockingWarriorSet": "Strumpf (Krieger)",
|
||||
"winter2022IceCrystalHealerSet": "Eiskristall (Heiler)",
|
||||
"winter2022PomegranateMageSet": "Granatapfel (Magier)",
|
||||
"januaryYYYY": "Januar <%= year %>"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,60 +5,60 @@
|
|||
"noBackground": "No Background Selected",
|
||||
|
||||
"backgrounds062014": "SET 1: Released June 2014",
|
||||
"backgroundBeachText":"Beach",
|
||||
"backgroundBeachNotes":"Lounge upon a warm beach.",
|
||||
"backgroundFairyRingText":"Fairy Ring",
|
||||
"backgroundFairyRingNotes":"Dance in a fairy ring.",
|
||||
"backgroundForestText":"Forest",
|
||||
"backgroundForestNotes":"Stroll through a summer forest.",
|
||||
"backgroundBeachText": "Beach",
|
||||
"backgroundBeachNotes": "Lounge upon a warm beach.",
|
||||
"backgroundFairyRingText": "Fairy Ring",
|
||||
"backgroundFairyRingNotes": "Dance in a fairy ring.",
|
||||
"backgroundForestText": "Forest",
|
||||
"backgroundForestNotes": "Stroll through a summer forest.",
|
||||
|
||||
"backgrounds072014": "SET 2: Released July 2014",
|
||||
"backgroundCoralReefText":"Coral Reef",
|
||||
"backgroundCoralReefNotes":"Swim in a coral reef.",
|
||||
"backgroundOpenWatersText":"Open Waters",
|
||||
"backgroundOpenWatersNotes":"Enjoy the open waters.",
|
||||
"backgroundSeafarerShipText":"Seafarer Ship",
|
||||
"backgroundSeafarerShipNotes":"Sail aboard a Seafarer Ship.",
|
||||
"backgroundCoralReefText": "Coral Reef",
|
||||
"backgroundCoralReefNotes": "Swim in a coral reef.",
|
||||
"backgroundOpenWatersText": "Open Waters",
|
||||
"backgroundOpenWatersNotes": "Enjoy the open waters.",
|
||||
"backgroundSeafarerShipText": "Seafarer Ship",
|
||||
"backgroundSeafarerShipNotes": "Sail aboard a Seafarer Ship.",
|
||||
|
||||
"backgrounds082014": "SET 3: Released August 2014",
|
||||
"backgroundCloudsText":"Clouds",
|
||||
"backgroundCloudsNotes":"Soar through the Clouds.",
|
||||
"backgroundDustyCanyonsText":"Dusty Canyon",
|
||||
"backgroundDustyCanyonsNotes":"Wander through a Dusty Canyon.",
|
||||
"backgroundVolcanoText":"Volcano",
|
||||
"backgroundVolcanoNotes":"Heat up inside a Volcano.",
|
||||
"backgroundCloudsText": "Clouds",
|
||||
"backgroundCloudsNotes": "Soar through the Clouds.",
|
||||
"backgroundDustyCanyonsText": "Dusty Canyon",
|
||||
"backgroundDustyCanyonsNotes": "Wander through a Dusty Canyon.",
|
||||
"backgroundVolcanoText": "Volcano",
|
||||
"backgroundVolcanoNotes": "Heat up inside a Volcano.",
|
||||
|
||||
"backgrounds092014": "SET 4: Released September 2014",
|
||||
"backgroundThunderstormText":"Thunderstorm",
|
||||
"backgroundThunderstormNotes":"Conduct lightning in a Thunderstorm.",
|
||||
"backgroundAutumnForestText":"Autumn Forest",
|
||||
"backgroundAutumnForestNotes":"Stroll through an Autumn Forest.",
|
||||
"backgroundHarvestFieldsText":"Harvest Fields",
|
||||
"backgroundHarvestFieldsNotes":"Cultivate your Harvest Fields.",
|
||||
"backgroundThunderstormText": "Thunderstorm",
|
||||
"backgroundThunderstormNotes": "Conduct lightning in a Thunderstorm.",
|
||||
"backgroundAutumnForestText": "Autumn Forest",
|
||||
"backgroundAutumnForestNotes": "Stroll through an Autumn Forest.",
|
||||
"backgroundHarvestFieldsText": "Harvest Fields",
|
||||
"backgroundHarvestFieldsNotes": "Cultivate your Harvest Fields.",
|
||||
|
||||
"backgrounds102014": "SET 5: Released October 2014",
|
||||
"backgroundGraveyardText":"Graveyard",
|
||||
"backgroundGraveyardNotes":"Visit a Creepy Graveyard.",
|
||||
"backgroundHauntedHouseText":"Haunted House",
|
||||
"backgroundHauntedHouseNotes":"Sneak through a Haunted House.",
|
||||
"backgroundPumpkinPatchText":"Pumpkin Patch",
|
||||
"backgroundPumpkinPatchNotes":"Carve jack-o-lanterns in a Pumpkin Patch.",
|
||||
"backgroundGraveyardText": "Graveyard",
|
||||
"backgroundGraveyardNotes": "Visit a Creepy Graveyard.",
|
||||
"backgroundHauntedHouseText": "Haunted House",
|
||||
"backgroundHauntedHouseNotes": "Sneak through a Haunted House.",
|
||||
"backgroundPumpkinPatchText": "Pumpkin Patch",
|
||||
"backgroundPumpkinPatchNotes": "Carve jack-o-lanterns in a Pumpkin Patch.",
|
||||
|
||||
"backgrounds112014": "SET 6: Released November 2014",
|
||||
"backgroundHarvestFeastText":"Harvest Feast",
|
||||
"backgroundHarvestFeastNotes":"Enjoy a Harvest Feast.",
|
||||
"backgroundStarrySkiesText":"Starry Skies",
|
||||
"backgroundStarrySkiesNotes":"Gaze at the Starry Skies.",
|
||||
"backgroundSunsetMeadowText":"Sunset Meadow",
|
||||
"backgroundSunsetMeadowNotes":"Admire a Sunset Meadow.",
|
||||
"backgroundHarvestFeastText": "Harvest Feast",
|
||||
"backgroundHarvestFeastNotes": "Enjoy a Harvest Feast.",
|
||||
"backgroundStarrySkiesText": "Starry Skies",
|
||||
"backgroundStarrySkiesNotes": "Gaze at the Starry Skies.",
|
||||
"backgroundSunsetMeadowText": "Sunset Meadow",
|
||||
"backgroundSunsetMeadowNotes": "Admire a Sunset Meadow.",
|
||||
|
||||
"backgrounds122014": "SET 7: Released December 2014",
|
||||
"backgroundIcebergText":"Iceberg",
|
||||
"backgroundIcebergNotes":"Drift upon an Iceberg.",
|
||||
"backgroundTwinklyLightsText":"Winter Twinkly Lights",
|
||||
"backgroundTwinklyLightsNotes":"Stroll between trees bedecked in festive lights.",
|
||||
"backgroundSouthPoleText":"South Pole",
|
||||
"backgroundSouthPoleNotes":"Visit the icy South Pole.",
|
||||
"backgroundIcebergText": "Iceberg",
|
||||
"backgroundIcebergNotes": "Drift upon an Iceberg.",
|
||||
"backgroundTwinklyLightsText": "Winter Twinkly Lights",
|
||||
"backgroundTwinklyLightsNotes": "Stroll between trees bedecked in festive lights.",
|
||||
"backgroundSouthPoleText": "South Pole",
|
||||
"backgroundSouthPoleNotes": "Visit the icy South Pole.",
|
||||
|
||||
"backgrounds012015": "SET 8: Released January 2015",
|
||||
"backgroundIceCaveText": "Ice Cave",
|
||||
|
|
@ -746,6 +746,14 @@
|
|||
"backgroundFrozenPolarWatersText": "Frozen Polar Waters",
|
||||
"backgroundFrozenPolarWatersNotes": "Explore Frozen Polar Waters.",
|
||||
|
||||
"backgrounds012022": "SET 92: Released January 2022",
|
||||
"backgroundMeteorShowerText": "Meteor Shower",
|
||||
"backgroundMeteorShowerNotes": "Observe the dazzling nighttime display of a Meteor Shower.",
|
||||
"backgroundPalmTreeWithFairyLightsText": "Palm Tree with Fairy Lights",
|
||||
"backgroundPalmTreeWithFairyLightsNotes": "Pose by a Palm Tree bedecked with Fairy Lights.",
|
||||
"backgroundSnowyFarmText": "Snowy Farm",
|
||||
"backgroundSnowyFarmNotes": "Check that everyone is well and warm on your Snowy Farm.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@
|
|||
"unsupportedNetwork": "This network is not currently supported.",
|
||||
"cantDetachSocial": "Account lacks another authentication method; can't detach this authentication method.",
|
||||
"onlySocialAttachLocal": "Local authentication can be added to only a social account.",
|
||||
"socialAlreadyExists": "This social login is already linked to an existing Habitica account.",
|
||||
"invalidReqParams": "Invalid request parameters.",
|
||||
"memberIdRequired": "\"member\" must be a valid UUID.",
|
||||
"heroIdRequired": "\"heroId\" must be a valid UUID.",
|
||||
|
|
|
|||
|
|
@ -416,6 +416,18 @@
|
|||
"weaponSpecialFall2021HealerText": "Summoning Wand",
|
||||
"weaponSpecialFall2021HealerNotes": "Use this wand to summon healing flames and a ghostly creature to help you. Increases Intelligence by <%= int %>. Limited Edition 2021 Autumn Gear.",
|
||||
|
||||
"weaponSpecialWinter2022RogueText": "Shooting Star Firework",
|
||||
"weaponSpecialWinter2022RogueNotes": "Silver and gold are beloved of Rogues, right? These are totally on theme. Increases Strength by <%= str %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"weaponSpecialWinter2022WarriorText": "Candy Cane Sword",
|
||||
"weaponSpecialWinter2022WarriorNotes": "How many licks does it take to sharpen this candy cane into the perfect sword? Increases Strength by <%= str %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"weaponSpecialWinter2022MageText": "Pomegranate Staff",
|
||||
"weaponSpecialWinter2022MageNotes": "The berries on this staff contain an ancient magic to be wielded in winter. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"weaponSpecialWinter2022HealerText": "Crystalline Ice Wand",
|
||||
"weaponSpecialWinter2022HealerNotes": "Touch this solid-water implement to a friend's neck and they'll jump out of their chair! But they'll feel better afterward. Hopefully. Increases Intelligence by <%= int %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
|
||||
"headSpecialNye2021Text": "Preposterous Party Hat",
|
||||
"headSpecialNye2021Notes": "You've received a Preposterous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||
|
||||
"weaponMystery201411Text": "Pitchfork of Feasting",
|
||||
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
|
||||
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
|
||||
|
|
@ -438,6 +450,8 @@
|
|||
"weaponMystery202104Notes": "Your enemies had better look out- you've got powerful and prickly defenses! Confers no benefit. April 2021 Subscriber Item.",
|
||||
"weaponMystery202111Text": "Chronomancer's Staff",
|
||||
"weaponMystery202111Notes": "Shape the flow of time with this mysterious and powerful staff. Confers no benefit. November 2021 Subscriber Item.",
|
||||
"weaponMystery202201Text": "Midnight Confetti Cannon",
|
||||
"weaponMystery202201Notes": "Unleash a cloud of gold and silver glitter when the clock strikes midnight. Happy New Year! Now who's cleaning this up? Confers no benefit. January 2022 Subscriber Item.",
|
||||
"weaponMystery301404Text": "Steampunk Cane",
|
||||
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
|
||||
|
||||
|
|
@ -599,6 +613,8 @@
|
|||
"weaponArmoirePotionGoldenNotes": "With this potion, your pet can have a heart of gold… and ears of gold… and a tail of gold… Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Potion Set (Item 10 of 10)",
|
||||
"weaponArmoireRegalSceptreText": "Regal Sceptre",
|
||||
"weaponArmoireRegalSceptreNotes": "Display your regal authority by taking this bejeweled staff in hand. Increases Perception by <%= per %>. Enchanted Armoire: Regal Set (Item 2 of 2).",
|
||||
"weaponArmoireShootingStarSpellText": "Stardust Sparkles",
|
||||
"weaponArmoireShootingStarSpellNotes": "Surround yourself in a spell of stardust magic to help you make all your wishes come true. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Stardust Set (Item 3 of 3).",
|
||||
|
||||
"armor": "armor",
|
||||
"armorCapitalized": "Armor",
|
||||
|
|
@ -996,6 +1012,15 @@
|
|||
"armorSpecialFall2021HealerText": "Summoner's Robes",
|
||||
"armorSpecialFall2021HealerNotes": "Made of durable, flame-resistant fabric, these robes are perfect to wear when conjuring healing flames. Increases Constitution by <%= con %>. Limited Edition 2021 Autumn Gear.",
|
||||
|
||||
"armorSpecialWinter2022RogueText": "Dazzling Explosion",
|
||||
"armorSpecialWinter2022RogueNotes": "If they're seeing stars, they're not seeing you! Yes, let's go with that. Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"armorSpecialWinter2022WarriorText": "Fuzzy Stocking",
|
||||
"armorSpecialWinter2022WarriorNotes": "Who says you can’t be snug and cozy while doing battle with everyday tasks? Increases Constitution by <%= con %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"armorSpecialWinter2022MageText": "Pomegranate Protection",
|
||||
"armorSpecialWinter2022MageNotes": "Enemies should watch out for fruit juice stains when you approach! Increases Intelligence by <%= int %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"armorSpecialWinter2022HealerText": "Crystalline Ice Armor",
|
||||
"armorSpecialWinter2022HealerNotes": "Glide as if skating, just above the ground, a glittering ethereal figure come to bring cool and calm. Increases Constitution by <%= con %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
|
||||
"armorMystery201402Text": "Messenger Robes",
|
||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||
"armorMystery201403Text": "Forest Walker Armor",
|
||||
|
|
@ -1269,6 +1294,8 @@
|
|||
"armorArmoireHeraldsTunicNotes": "Get ready to spread good news far and wide in this colorful, royal outfit. Increases Constitution by <%= con %>. Enchanted Armoire: Herald Set (Item 1 of 4).",
|
||||
"armorArmoireSoftBlackSuitText": "Soft Black Suit",
|
||||
"armorArmoireSoftBlackSuitNotes": "Black is a mysterious colour. It’s sure to inspire the most interesting dreams. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Black Loungewear Set (Item 2 of 3).",
|
||||
"armorArmoireShootingStarCostumeText": "Star Gown",
|
||||
"armorArmoireShootingStarCostumeNotes": "Rumored to have been spun out of the night sky itself, this flowy gown lets you rise above all obstacles in your path. Increases Constitution by <%= con %>. Enchanted Armoire: Stardust Set (Item 2 of 3).",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
|
|
@ -1665,6 +1692,15 @@
|
|||
"headSpecialFall2021HealerText": "Summoner's Mask",
|
||||
"headSpecialFall2021HealerNotes": "Your own magic turns your hair into shocking, bright flames when you don this mask. Increases Intelligence by <%= int %>. Limited Edition 2021 Autumn Gear.",
|
||||
|
||||
"headSpecialWinter2022RogueText": "Thundering Finale",
|
||||
"headSpecialWinter2022RogueNotes": "What? Huh? There's a Rogue where? I'm sorry, I can't hear anything over these fireworks! Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"headSpecialWinter2022WarriorText": "Fuzzy Stocking Cap",
|
||||
"headSpecialWinter2022WarriorNotes": "In festive green with soft red trim, this hat is guaranteed to keep you warm all winter. Increases Strength by <%= str %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"headSpecialWinter2022MageText": "Pomegranate Helm",
|
||||
"headSpecialWinter2022MageNotes": "Due to its thick husk, this festive, fruity helmet is berry strong. Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"headSpecialWinter2022HealerText": "Crystalline Ice Crown",
|
||||
"headSpecialWinter2022HealerNotes": "Minute imperfections and impurities send the arms of this headdress branching out in unpredictable directions. It's symbolic! And also very, very pretty. Increases Intelligence by <%= int %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
|
||||
"headSpecialGaymerxText": "Rainbow Warrior Helm",
|
||||
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
|
||||
|
||||
|
|
@ -1963,6 +1999,8 @@
|
|||
"headArmoireBlackFloppyHatNotes": "Many spells have been sewn into this simple hat, giving it a bold black color. Increases Constitution, Perception, and Strength by <%= attrs %> each. Enchanted Armoire: Black Loungewear Set (Item 1 of 3).",
|
||||
"headArmoireRegalCrownText": "Regal Crown",
|
||||
"headArmoireRegalCrownNotes": "Any monarch would be lucky to have such a majestic, smart-looking crown. Increases Intelligence by <%= int %>. Enchanted Armoire: Regal Set (Item 1 of 2).",
|
||||
"headArmoireShootingStarCrownText": "Star Crown",
|
||||
"headArmoireShootingStarCrownNotes": "With this brightly shining headpiece, you will literally be the star of your own adventure! Increases Perception by <%= per %>. Enchanted Armoire: Stardust Set (Item 1 of 3).",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
|
|
@ -2185,6 +2223,11 @@
|
|||
"shieldSpecialFall2021HealerText": "Summoned Creature",
|
||||
"shieldSpecialFall2021HealerNotes": "An ethereal being rises from your magical flames to grant you extra protection. Increases Constitution by <%= con %>. Limited Edition 2021 Autumn Gear.",
|
||||
|
||||
"shieldSpecialWinter2022WarriorText": "Jingle Bell Shield",
|
||||
"shieldSpecialWinter2022WarriorNotes": "This is a jingle bell, jingle bell, jingle bell shield. Jingle bell protect and jingle bell deflect. Increases Constitution by <%= con %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
"shieldSpecialWinter2022HealerText": "Enduring Ice Crystal",
|
||||
"shieldSpecialWinter2022HealerNotes": "Though it melts in your hand, the power of elemental ice replenishes it from within. Increases Constitution by <%= con %>. Limited Edition 2021-2022 Winter Gear.",
|
||||
|
||||
"shieldMystery201601Text": "Resolution Slayer",
|
||||
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
|
||||
"shieldMystery201701Text": "Time-Freezer Shield",
|
||||
|
|
@ -2660,6 +2703,8 @@
|
|||
"eyewearMystery201907Notes": "Look awesome while protecting your eyes from harmful UV rays! Confers no benefit. July 2019 Subscriber Item.",
|
||||
"eyewearMystery202108Text": "Fiery Eyes",
|
||||
"eyewearMystery202108Notes": "Stare down your enemies (or your biggest tasks!) with these and they don't stand a chance. Confers no benefit. August 2021 Subscriber Item.",
|
||||
"eyewearMystery202201Text": "Midnight Merrymaker's Mask",
|
||||
"eyewearMystery202201Notes": "Ring in the new year with an air of mystery in this stylish feathered mask. Confers no benefit. January 2022 Subscriber Item.",
|
||||
"eyewearMystery301404Text": "Eyewear Goggles",
|
||||
"eyewearMystery301404Notes": "No eyewear could be fancier than a pair of goggles - except, perhaps, for a monocle. Confers no benefit. April 3015 Subscriber Item.",
|
||||
"eyewearMystery301405Text": "Monocle",
|
||||
|
|
|
|||
|
|
@ -175,6 +175,10 @@
|
|||
"fall2021HeadlessWarriorSet": "Headless (Warrior)",
|
||||
"fall2021BrainEaterMageSet": "Brain Eater (Mage)",
|
||||
"fall2021FlameSummonerHealerSet": "Flame Summoner (Healer)",
|
||||
"winter2022FireworksRogueSet": "Fireworks (Rogue)",
|
||||
"winter2022StockingWarriorSet": "Stocking (Warrior)",
|
||||
"winter2022PomegranateMageSet": "Pomegranate (Mage)",
|
||||
"winter2022IceCrystalHealerSet": "Ice Crystal (Healer)",
|
||||
"eventAvailability": "Available for purchase until <%= date(locale) %>.",
|
||||
"eventAvailabilityReturning": "Available for purchase until <%= availableDate(locale) %>. This potion was last available in <%= previousDate(locale) %>.",
|
||||
"dateEndMarch": "April 30",
|
||||
|
|
@ -188,6 +192,7 @@
|
|||
"mayYYYY": "May <%= year %>",
|
||||
"juneYYYY": "June <%= year %>",
|
||||
"novemberYYYY": "November <%= year %>",
|
||||
"januaryYYYY": "January <%= year %>",
|
||||
"dateEndJuly": "July 31",
|
||||
"dateEndAugust": "August 31",
|
||||
"dateEndSeptember": "September 21",
|
||||
|
|
@ -207,6 +212,6 @@
|
|||
"howItWorks": "How it Works",
|
||||
"g1g1HowItWorks": "Type in the username of the account you’d like to gift to. From there, pick the sub length you’d like to gift and check out. Your account will automatically be rewarded with the same level of subscription you just gifted.",
|
||||
"limitations": "Limitations",
|
||||
"g1g1Limitations": "This is a limited time event that starts on December 17th at 8:00 AM ET (13:00 UTC) and will end January 7th at 8:00 PM ET (1:00 UTC). This promotion only applies when you gift to another Habitican. If you or your gift recipient already have a subscription, the gifted subscription will add months of credit that will only be used after the current subscription is canceled or expires.",
|
||||
"g1g1Limitations": "This is a limited time event that starts on December 16th at 8:00 AM ET (13:00 UTC) and will end January 6th at 8:00 PM ET (1:00 UTC). This promotion only applies when you gift to another Habitican. If you or your gift recipient already have a subscription, the gifted subscription will add months of credit that will only be used after the current subscription is canceled or expires.",
|
||||
"noLongerAvailable": "This item is no longer available."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@
|
|||
"mysterySet202110": "Mossy Gargoyle Set",
|
||||
"mysterySet202111": "Cosmic Chronomancer Set",
|
||||
"mysterySet202112": "Antarctic Undine Set",
|
||||
"mysterySet202201": "Midnight Merrymaker Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
"onwards": "¡Adelante!",
|
||||
"levelup": "¡Por alcanzar tus metas de la vida real, has subido de nivel y te has curado por completo!",
|
||||
"reachedLevel": "Has alcanzado el nivel <%= level %>",
|
||||
"achievementLostMasterclasser": "Completador de Misiones: Serie Maestros de Clases",
|
||||
"achievementLostMasterclasser": "Completista de misiones: Serie Maestro de Clases",
|
||||
"achievementLostMasterclasserText": "¡Completó las dieciséis misiones de la Serie Maestros de Clases y resolvió el misterio de la Maestra de la Clase Perdida!",
|
||||
"achievementLostMasterclasserModalText": "¡Completaste las dieciséis misiones en la Serie Maestros de Clases y resolviste el misterio de la Maestra de la Clase Perdida!",
|
||||
"achievementMindOverMatter": "Mente sobre Materia",
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
"achievementJustAddWaterText": "Ha completado las misiones de mascota de Pulpo, Caballito de Mar, Ballena, Tortuga, Nudibranquia, Serpiente Marina, y Delfín.",
|
||||
"achievementJustAddWaterModalText": "¡Completaste las misiones de mascota de Pulpo, Caballito de Mar, Ballena, Tortuga, Nudibranquia, Serpiente Marina y Delfín!",
|
||||
"achievementBackToBasics": "De vuelta a lo básico",
|
||||
"achievementBackToBasicsText": "Ha coleccionado todas las Mascotas Base.",
|
||||
"achievementBackToBasicsText": "Ha coleccionado todas las Mascotas Básicas.",
|
||||
"achievementBackToBasicsModalText": "¡Coleccionaste todas las Mascotas Base!",
|
||||
"achievementAllYourBase": "Toda tu Base",
|
||||
"achievementAllYourBaseText": "Ha domado todas las Monturas Base.",
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
"earnedAchievement": "¡Has conseguido un logro!",
|
||||
"viewAchievements": "Ver los Logros",
|
||||
"letsGetStarted": "¡Comencemos!",
|
||||
"onboardingProgress": "<%= percentage %>% de progreso",
|
||||
"onboardingProgress": "<%= Porcentaje%>% de progreso",
|
||||
"gettingStartedDesc": "¡Completa estas tareas de integración y conseguirás <strong>5 logros</strong> y <strong class=\"gold-amount\">100 Oro</strong> en cuanto acabes!",
|
||||
"achievementCompletedTaskText": "Completó su primera tarea.",
|
||||
"achievementCompletedTask": "Completa una tarea",
|
||||
|
|
|
|||