Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
688190ac4a | ||
|
|
4909a3b537 | ||
|
|
64e2150f44 | ||
|
|
3f7abc459c | ||
|
|
618cdafd10 | ||
|
|
e7b37d0378 | ||
|
|
3f3e2525d2 | ||
|
|
765e08f999 | ||
|
|
598bc29647 | ||
|
|
39ccddfb1c | ||
|
|
108214a217 | ||
|
|
271f40e355 | ||
|
|
e801547580 | ||
|
|
fc11941186 | ||
|
|
882fad3113 | ||
|
|
6168492711 | ||
|
|
2aade9aaa6 | ||
|
|
4789946c4e | ||
|
|
a69d8877c9 | ||
|
|
7cc0c3bc57 | ||
|
|
fb78495a1b | ||
|
|
22def5111f | ||
|
|
6e91d51def | ||
|
|
f3b8a4e931 | ||
|
|
69afa52beb | ||
|
|
f09a39d27c | ||
|
|
2e71963fbf | ||
|
|
f740a92fb7 | ||
|
|
21e7ddea16 | ||
|
|
923d90cf22 | ||
|
|
b386a1917d | ||
|
|
4a5427b2b2 | ||
|
|
1f2397b81a | ||
|
|
60d5aaaaa6 | ||
|
|
f506b840ed | ||
|
|
f357750d88 | ||
|
|
a2dbe68338 | ||
|
|
491d2cfab1 | ||
|
|
fa91abb739 | ||
|
|
6b46d04537 | ||
|
|
a6ff8e095a | ||
|
|
ffd2b4b76f | ||
|
|
c50ed843fb | ||
|
|
850ae5114f | ||
|
|
8b3267458b | ||
|
|
bccfaab350 | ||
|
|
753f12979e |
18
README.md
@@ -1,14 +1,20 @@
|
||||
Habitica  [](https://codeclimate.com/github/HabitRPG/habitrpg) [](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE)
|
||||
Habitica 
|
||||
===============
|
||||
|
||||
[Habitica](https://habitica.com) is an open-source habit-building program that treats your life like a role-playing game. Level up as you succeed, lose HP as you fail, and earn money to buy weapons and armor.
|
||||
[Habitica](https://habitica.com) is an open-source habit-building program that treats your life like a role-playing game. Level up as you succeed, lose HP as you fail, and earn Gold to buy weapons and armor!
|
||||
|
||||
**We need more programmers!** Your assistance will be greatly appreciated. The wiki pages below and the additional pages they link to will tell you how to get started on contributing code and where you can go to seek further help or ask questions:
|
||||
**Want to contribute code to Habitica?** We're always looking for assistance on any issues in our repo with the "Help Wanted" label. The wiki pages below and the additional linked pages will tell you how to start contributing code and where you can seek further help or ask questions:
|
||||
* [Guidance for Blacksmiths](https://habitica.fandom.com/wiki/Guidance_for_Blacksmiths) - an introduction to the technologies used and how the software is organized.
|
||||
* [Setting up Habitica Locally](https://habitica.fandom.com/wiki/Setting_up_Habitica_Locally) - how to set up a local install of Habitica for development and testing on various platforms.
|
||||
* [Setting up Habitica Locally](https://github.com/HabitRPG/habitica/wiki/Setting-Up-Habitica-for-Local-Development) - how to set up a local install of Habitica for development and testing.
|
||||
|
||||
**Interested in contributing to Habitica’s mobile apps?** Visit the links below for our mobile repositories.
|
||||
* **Android:** https://github.com/HabitRPG/habitica-android
|
||||
* **iOS:** https://github.com/HabitRPG/habitica-ios
|
||||
|
||||
Habitica's code is licensed as described at https://github.com/HabitRPG/habitica/blob/develop/LICENSE
|
||||
|
||||
**Found a bug?** Please report it to [admin email](mailto:admin@habitica.com) rather than creating an issue (an admin will advise you if a new issue is necessary; usually it is not).
|
||||
**Found a bug?** Please report it to [admin email](mailto:admin@habitica.com) rather than create an issue (an admin will advise you if a new issue is necessary; usually it is not).
|
||||
|
||||
**Have any questions about Habitica or its community?** See the links in the [habitica.com](https://habitica.com) website's Help menu or drop in to [Guilds > Tavern Chat](https://habitica.com/groups/tavern) to ask questions or chat socially!
|
||||
**Creating a third-party tool?** Please review our [API Usage Guidelines](https://github.com/HabitRPG/habitica/wiki/API-Usage-Guidelines) to ensure that your tool is compliant and maintains the best experience for Habitica players.
|
||||
|
||||
**Have any questions about Habitica or contributing?** See the links in the [Habitica](https://habitica.com) website's Help menu. There’s FAQ’s, guides, and the option to reach out to us with any further questions!
|
||||
|
||||
@@ -42,10 +42,41 @@ function cssVarMap (sprite) {
|
||||
}
|
||||
}
|
||||
|
||||
function createSpritesStream (name, src) {
|
||||
function filterFile (file) {
|
||||
if (file.relative.indexOf('Mount_Icon_') !== -1) {
|
||||
return false;
|
||||
}
|
||||
if (file.path.indexOf('shop/') !== -1) {
|
||||
return false;
|
||||
}
|
||||
if (file.path.indexOf('stable/eggs') !== -1) {
|
||||
return false;
|
||||
}
|
||||
if (file.path.indexOf('stable/food') !== -1) {
|
||||
return false;
|
||||
}
|
||||
if (file.path.indexOf('stable/potions') !== -1) {
|
||||
return false;
|
||||
}
|
||||
if (file.relative.indexOf('shop_') === 0) {
|
||||
return false;
|
||||
}
|
||||
if (file.relative.indexOf('icon_background') === 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
async function createSpritesStream (name, src) {
|
||||
const stream = mergeStream();
|
||||
// need to import this way bc of weird dependency things
|
||||
// eslint-disable-next-line global-require
|
||||
const filter = require('gulp-filter');
|
||||
|
||||
const f = filter(filterFile);
|
||||
|
||||
const spriteData = gulp.src(src)
|
||||
.pipe(f)
|
||||
.pipe(spritesmith({
|
||||
imgName: `spritesmith-${name}.png`,
|
||||
cssName: `spritesmith-${name}.css`,
|
||||
@@ -63,7 +94,7 @@ function createSpritesStream (name, src) {
|
||||
return stream;
|
||||
}
|
||||
|
||||
gulp.task('sprites:main', () => {
|
||||
gulp.task('sprites:main', async () => {
|
||||
const mainSrc = sync('habitica-images/**/*.png');
|
||||
return createSpritesStream('main', mainSrc);
|
||||
});
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
/* eslint-disable no-console */
|
||||
const MIGRATION_NAME = '20230731_naming_day';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
import { model as User } from '../../website/server/models/user';
|
||||
|
||||
const MIGRATION_NAME = '20240731_naming_day';
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count++;
|
||||
count += 1;
|
||||
|
||||
let set;
|
||||
let push;
|
||||
@@ -115,16 +113,16 @@ async function updateUser (user) {
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
if (push) {
|
||||
return await user.updateOne({ $set: set, $inc: inc, $push: push }).exec();
|
||||
} else {
|
||||
return await user.updateOne({ $set: set, $inc: inc }).exec();
|
||||
return user.updateOne({ $set: set, $inc: inc, $push: push }).exec();
|
||||
}
|
||||
|
||||
return user.updateOne({ $set: set, $inc: inc }).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
let query = {
|
||||
const query = {
|
||||
migration: { $ne: MIGRATION_NAME },
|
||||
'auth.timestamps.loggedin': { $gt: new Date('2023-07-01') },
|
||||
'auth.timestamps.loggedin': { $gt: new Date('2024-07-01') },
|
||||
};
|
||||
|
||||
const fields = {
|
||||
@@ -136,7 +134,7 @@ export default async function processUsers () {
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({_id: 1})
|
||||
.sort({ _id: 1 })
|
||||
.select(fields)
|
||||
.exec();
|
||||
|
||||
@@ -152,4 +150,4 @@ export default async function processUsers () {
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
}
|
||||
78
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "5.26.1",
|
||||
"version": "5.27.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "habitica",
|
||||
"version": "5.26.1",
|
||||
"version": "5.27.1",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -40,6 +40,7 @@
|
||||
"got": "^11.8.6",
|
||||
"gulp": "^4.0.0",
|
||||
"gulp-babel": "^8.0.0",
|
||||
"gulp-filter": "^7.0.0",
|
||||
"gulp-imagemin": "^7.1.0",
|
||||
"gulp-nodemon": "^2.5.0",
|
||||
"gulp.spritesmith": "^6.13.0",
|
||||
@@ -4360,6 +4361,14 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/array-differ": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
|
||||
"integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/array-each": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
|
||||
@@ -9721,9 +9730,9 @@
|
||||
"integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w=="
|
||||
},
|
||||
"node_modules/fast-xml-parser": {
|
||||
"version": "4.3.4",
|
||||
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz",
|
||||
"integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==",
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
|
||||
"integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@@ -11493,6 +11502,31 @@
|
||||
"@babel/core": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/gulp-filter": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-7.0.0.tgz",
|
||||
"integrity": "sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==",
|
||||
"dependencies": {
|
||||
"multimatch": "^5.0.0",
|
||||
"plugin-error": "^1.0.1",
|
||||
"streamfilter": "^3.0.0",
|
||||
"to-absolute-glob": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"gulp": ">=4"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"gulp": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/gulp-imagemin": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz",
|
||||
@@ -15043,6 +15077,29 @@
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"node_modules/multimatch": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
|
||||
"integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
|
||||
"dependencies": {
|
||||
"@types/minimatch": "^3.0.3",
|
||||
"array-differ": "^3.0.0",
|
||||
"array-union": "^2.1.0",
|
||||
"arrify": "^2.0.1",
|
||||
"minimatch": "^3.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/multimatch/node_modules/@types/minimatch": {
|
||||
"version": "3.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
|
||||
"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="
|
||||
},
|
||||
"node_modules/mute-stdout": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
|
||||
@@ -19468,6 +19525,17 @@
|
||||
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
|
||||
"integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="
|
||||
},
|
||||
"node_modules/streamfilter": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz",
|
||||
"integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==",
|
||||
"dependencies": {
|
||||
"readable-stream": "^3.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/strict-uri-encode": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "5.26.1",
|
||||
"version": "5.27.1",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -35,6 +35,7 @@
|
||||
"got": "^11.8.6",
|
||||
"gulp": "^4.0.0",
|
||||
"gulp-babel": "^8.0.0",
|
||||
"gulp-filter": "^7.0.0",
|
||||
"gulp-imagemin": "^7.1.0",
|
||||
"gulp-nodemon": "^2.5.0",
|
||||
"gulp.spritesmith": "^6.13.0",
|
||||
|
||||
@@ -10,7 +10,7 @@ import { TooManyRequests } from '../../../../website/server/libs/errors';
|
||||
import { apiError } from '../../../../website/server/libs/apiError';
|
||||
import logger from '../../../../website/server/libs/logger';
|
||||
|
||||
describe.only('rateLimiter middleware', () => {
|
||||
describe('rateLimiter middleware', () => {
|
||||
const pathToRateLimiter = '../../../../website/server/middlewares/rateLimiter';
|
||||
|
||||
let res; let req; let next; let nconfGetStub;
|
||||
@@ -54,7 +54,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
|
||||
it('does not throw when there are available points', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
@@ -72,7 +71,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
|
||||
it('does not throw when an unknown error is thrown by the rate limiter', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
sandbox.stub(logger, 'error');
|
||||
sandbox.stub(RateLimiterMemory.prototype, 'consume')
|
||||
.returns(Promise.reject(new Error('Unknown error.')));
|
||||
@@ -106,7 +104,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
it('limits when LIVELINESS_PROBE_KEY is incorrect', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('abc');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
req.query.liveliness = 'das';
|
||||
@@ -123,7 +120,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
it('limits when LIVELINESS_PROBE_KEY is not set', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns(undefined);
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
await attachRateLimiter(req, res, next);
|
||||
@@ -139,7 +135,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
it('throws when LIVELINESS_PROBE_KEY is blank', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
req.query.liveliness = '';
|
||||
@@ -155,7 +150,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
|
||||
it('throws when there are no available points remaining', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
// call for 31 times
|
||||
@@ -179,7 +173,6 @@ describe.only('rateLimiter middleware', () => {
|
||||
|
||||
it('uses the user id if supplied or the ip address', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
req.ip = 1;
|
||||
@@ -206,71 +199,4 @@ describe.only('rateLimiter middleware', () => {
|
||||
'X-RateLimit-Reset': sinon.match(Date),
|
||||
});
|
||||
});
|
||||
|
||||
it('applies increased cost for registration calls with and without user id', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_REGISTRATION_COST').returns(3);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
req.path = '/api/v4/user/auth/local/register';
|
||||
|
||||
req.ip = 1;
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
req.headers['x-api-user'] = 'user-1';
|
||||
await attachRateLimiter(req, res, next);
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
// user id an ip are counted as separate sources
|
||||
expect(res.set).to.have.been.calledWithMatch({
|
||||
'X-RateLimit-Limit': 30,
|
||||
'X-RateLimit-Remaining': 27, // 2 calls with user id
|
||||
'X-RateLimit-Reset': sinon.match(Date),
|
||||
});
|
||||
|
||||
req.headers['x-api-user'] = undefined;
|
||||
await attachRateLimiter(req, res, next);
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
expect(res.set).to.have.been.calledWithMatch({
|
||||
'X-RateLimit-Limit': 30,
|
||||
'X-RateLimit-Remaining': 24, // 3 calls with only ip
|
||||
'X-RateLimit-Reset': sinon.match(Date),
|
||||
});
|
||||
});
|
||||
|
||||
it('applies increased cost for unauthenticated API calls', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(10);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
req.ip = 1;
|
||||
await attachRateLimiter(req, res, next);
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
expect(res.set).to.have.been.calledWithMatch({
|
||||
'X-RateLimit-Limit': 30,
|
||||
'X-RateLimit-Remaining': 10,
|
||||
'X-RateLimit-Reset': sinon.match(Date),
|
||||
});
|
||||
});
|
||||
|
||||
describe('authentication rate limiting', async () => {
|
||||
it('applies cost for failed login attempts', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
|
||||
req.path = '/api/v4/user/auth/local/login';
|
||||
|
||||
req.ip = 1;
|
||||
await attachRateLimiter(req, res, next);
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
expect(res.set).to.have.been.calledWithMatch({
|
||||
'X-RateLimit-Limit': 30,
|
||||
'X-RateLimit-Remaining': 28,
|
||||
'X-RateLimit-Reset': sinon.match(Date),
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { model as Group } from '../../../../../website/server/models/group';
|
||||
|
||||
describe('GET /groups/:groupId/chat', () => {
|
||||
let user;
|
||||
@@ -37,4 +38,34 @@ describe('GET /groups/:groupId/chat', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('public Guild', () => {
|
||||
let group;
|
||||
before(async () => {
|
||||
({ group } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: 'test group',
|
||||
type: 'guild',
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
upgradeToGroupPlan: true,
|
||||
chat: [
|
||||
'Hello',
|
||||
'Welcome to the Guild',
|
||||
],
|
||||
}));
|
||||
|
||||
// Creation API is shut down, we need to simulate an extant public group
|
||||
await Group.updateOne({ _id: group._id }, { $set: { privacy: 'public' }, $unset: { 'purchased.plan': 1 } }).exec();
|
||||
});
|
||||
|
||||
it('returns error if user attempts to fetch a sunset Guild', async () => {
|
||||
await expect(user.get(`/groups/${group._id}/chat`)).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('featureRetired'),
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { model as Group } from '../../../../../website/server/models/group';
|
||||
|
||||
describe('POST /chat/:chatId/like', () => {
|
||||
let user;
|
||||
@@ -111,4 +112,18 @@ describe('POST /chat/:chatId/like', () => {
|
||||
message: t('groupNotFound'),
|
||||
});
|
||||
});
|
||||
|
||||
it('does not like a message that belongs to a sunset public group', async () => {
|
||||
const message = await anotherUser.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
||||
|
||||
// Creation API is shut down, we need to simulate an extant public group
|
||||
await Group.updateOne({ _id: groupWithChat._id }, { $set: { privacy: 'public' }, $unset: { 'purchased.plan': 1 } }).exec();
|
||||
|
||||
await expect(user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('featureRetired'),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -123,7 +123,7 @@ describe('GET /world-state', () => {
|
||||
|
||||
const res = await requester().get('/world-state');
|
||||
|
||||
expect(res.npcImageSuffix).to.equal('winter');
|
||||
expect(res.npcImageSuffix).to.equal('fall');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -341,6 +341,16 @@ describe('shops', () => {
|
||||
const backgrounds = shopCategories.find(cat => cat.identifier === 'backgrounds').items;
|
||||
expect(backgrounds.length).to.be.greaterThan(0);
|
||||
});
|
||||
|
||||
it('does not add an end date to steampunk gear', () => {
|
||||
const categories = shopCategories.filter(cat => cat.identifier.startsWith('30'));
|
||||
categories.forEach(category => {
|
||||
expect(category.end).to.not.exist;
|
||||
category.items.forEach(item => {
|
||||
expect(item.end).to.not.exist;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('customizationShop', () => {
|
||||
|
||||
@@ -233,6 +233,17 @@ describe('shared.ops.purchase', () => {
|
||||
expect(user.items.hatchingPotions[key]).to.eql(1);
|
||||
});
|
||||
|
||||
it('purchases event hatching potion', async () => {
|
||||
clock.restore();
|
||||
clock = sandbox.useFakeTimers(moment('2022-04-10').valueOf());
|
||||
const type = 'hatchingPotions';
|
||||
const key = 'Veggie';
|
||||
|
||||
await purchase(user, { params: { type, key } });
|
||||
|
||||
expect(user.items.hatchingPotions[key]).to.eql(1);
|
||||
});
|
||||
|
||||
it('purchases hatching potion if user completed quest', async () => {
|
||||
const type = 'hatchingPotions';
|
||||
const key = 'Bronze';
|
||||
|
||||
@@ -47,7 +47,7 @@ describe('content index', () => {
|
||||
const junePets = content.petInfo;
|
||||
expect(junePets['Chameleon-Base']).to.not.exist;
|
||||
clock.restore();
|
||||
clock = sinon.useFakeTimers(new Date('2024-07-10'));
|
||||
clock = sinon.useFakeTimers(new Date('2024-07-20'));
|
||||
const julyPets = content.petInfo;
|
||||
expect(julyPets['Chameleon-Base']).to.exist;
|
||||
expect(Object.keys(junePets).length, '').to.equal(Object.keys(julyPets).length - 10);
|
||||
@@ -58,7 +58,7 @@ describe('content index', () => {
|
||||
const juneMounts = content.mountInfo;
|
||||
expect(juneMounts['Chameleon-Base']).to.not.exist;
|
||||
clock.restore();
|
||||
clock = sinon.useFakeTimers(new Date('2024-07-10'));
|
||||
clock = sinon.useFakeTimers(new Date('2024-07-20'));
|
||||
const julyMounts = content.mountInfo;
|
||||
expect(julyMounts['Chameleon-Base']).to.exist;
|
||||
expect(Object.keys(juneMounts).length, '').to.equal(Object.keys(julyMounts).length - 10);
|
||||
|
||||
@@ -123,12 +123,18 @@ describe('Content Schedule', () => {
|
||||
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2024-06-21T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
|
||||
});
|
||||
|
||||
it('sets the end date for a winter gala', () => {
|
||||
const date = new Date('2024-12-22');
|
||||
const matchers = getAllScheduleMatchingGroups(date);
|
||||
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2025-03-21T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
|
||||
});
|
||||
|
||||
it('contains content for repeating events', () => {
|
||||
const date = new Date('2024-04-15');
|
||||
const matchers = getAllScheduleMatchingGroups(date);
|
||||
expect(matchers.premiumHatchingPotions).to.exist;
|
||||
expect(matchers.premiumHatchingPotions.items.length).to.equal(4);
|
||||
expect(matchers.premiumHatchingPotions.items.indexOf('Garden')).to.not.equal(-1);
|
||||
expect(matchers.premiumHatchingPotions.items.length).to.equal(5);
|
||||
expect(matchers.premiumHatchingPotions.items.indexOf('Veggie')).to.not.equal(-1);
|
||||
expect(matchers.premiumHatchingPotions.items.indexOf('Porcelain')).to.not.equal(-1);
|
||||
});
|
||||
|
||||
@@ -245,27 +251,33 @@ describe('Content Schedule', () => {
|
||||
it('allows sets matching the month', () => {
|
||||
const date = new Date('2024-07-08');
|
||||
const matcher = getAllScheduleMatchingGroups(date).timeTravelers;
|
||||
expect(matcher.match('202307')).to.be.true;
|
||||
expect(matcher.match('202207')).to.be.true;
|
||||
expect(matcher.match('202307'), '202307').to.be.true;
|
||||
expect(matcher.match('202207'), '202207').to.be.true;
|
||||
});
|
||||
|
||||
it('disallows sets not matching the month', () => {
|
||||
const date = new Date('2024-07-08');
|
||||
const matcher = getAllScheduleMatchingGroups(date).timeTravelers;
|
||||
expect(matcher.match('202306')).to.be.false;
|
||||
expect(matcher.match('202402')).to.be.false;
|
||||
expect(matcher.match('202306'), '202306').to.be.false;
|
||||
expect(matcher.match('202402'), '202402').to.be.false;
|
||||
});
|
||||
|
||||
it('disallows sets from current month', () => {
|
||||
const date = new Date('2024-07-08');
|
||||
const matcher = getAllScheduleMatchingGroups(date).timeTravelers;
|
||||
expect(matcher.match('202407')).to.be.false;
|
||||
expect(matcher.match('202407'), '202407').to.be.false;
|
||||
});
|
||||
|
||||
it('disallows sets from the future', () => {
|
||||
const date = new Date('2024-07-08');
|
||||
const matcher = getAllScheduleMatchingGroups(date).backgrounds;
|
||||
expect(matcher.match('202507')).to.be.false;
|
||||
const matcher = getAllScheduleMatchingGroups(date).timeTravelers;
|
||||
expect(matcher.match('202507'), '202507').to.be.false;
|
||||
});
|
||||
|
||||
it('matches sets released in the earlier half of the year', () => {
|
||||
const date = new Date('2024-07-08');
|
||||
const matcher = getAllScheduleMatchingGroups(date).timeTravelers;
|
||||
expect(matcher.match('202401'), '202401').to.be.true;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
BIN
website/client/public/static/npc/birthday/customizations_npc.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
BIN
website/client/public/static/npc/fall/customizations_npc.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
BIN
website/client/public/static/npc/nye/customizations_npc.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
BIN
website/client/public/static/npc/spring/customizations_npc.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
BIN
website/client/public/static/npc/summer/customizations_npc.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
BIN
website/client/public/static/npc/winter/customizations_npc.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
@@ -23,16 +23,14 @@
|
||||
{{ $t('foundNewItems') }}
|
||||
</h2>
|
||||
<div class="d-flex justify-content-center">
|
||||
<div
|
||||
<Sprite
|
||||
class="item-box ml-auto mr-3"
|
||||
:class="eggClass"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
:image-name="eggClass"
|
||||
/>
|
||||
<Sprite
|
||||
class="item-box mr-auto"
|
||||
:class="potionClass"
|
||||
>
|
||||
</div>
|
||||
:image-name="potionClass"
|
||||
/>
|
||||
</div>
|
||||
<p
|
||||
v-once
|
||||
@@ -103,8 +101,12 @@
|
||||
|
||||
<script>
|
||||
import closeIcon from '@/assets/svg/close.svg';
|
||||
import Sprite from '@/components/ui/sprite.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
</div>
|
||||
<div class="inner-content">
|
||||
<div class="achievement-background d-flex align-items-center">
|
||||
<div
|
||||
<Sprite
|
||||
class="icon"
|
||||
:class="achievementClass"
|
||||
></div>
|
||||
:image-name="achievementClass"
|
||||
/>
|
||||
</div>
|
||||
<h4
|
||||
class="title"
|
||||
@@ -99,8 +99,12 @@
|
||||
import achievements from '@/../../common/script/content/achievements';
|
||||
import { mapState } from '@/libs/store';
|
||||
import svgClose from '@/assets/svg/close.svg';
|
||||
import Sprite from '@/components/ui/sprite.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
props: ['data'],
|
||||
data () {
|
||||
return {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<div
|
||||
v-for="option in items"
|
||||
:key="option.key"
|
||||
:id="option.imageName"
|
||||
class="outer-option-background"
|
||||
:class="{
|
||||
premium: Boolean(option.gem),
|
||||
@@ -14,18 +15,28 @@
|
||||
hide: option.hide }"
|
||||
@click="option.click(option)"
|
||||
>
|
||||
<b-popover
|
||||
:target="option.imageName"
|
||||
triggers="hover focus"
|
||||
placement="bottom"
|
||||
:prevent-overflow="false"
|
||||
>
|
||||
<strong> {{ option.text }} </strong>
|
||||
</b-popover>
|
||||
<div class="option">
|
||||
<div
|
||||
class="sprite customize-option"
|
||||
:class="option.class"
|
||||
>
|
||||
<Sprite
|
||||
v-if="!option.none"
|
||||
class="sprite"
|
||||
:prefix="option.isGear ? 'shop' : 'icon'"
|
||||
:imageName="option.imageName"
|
||||
:image-name="option.imageName"
|
||||
/>
|
||||
<div
|
||||
v-if="option.none"
|
||||
v-else
|
||||
class="redline-outer"
|
||||
>
|
||||
<div class="redline"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -35,8 +46,12 @@
|
||||
import gem from '@/assets/svg/gem.svg';
|
||||
import gold from '@/assets/svg/gold.svg';
|
||||
import { avatarEditorUtilities } from '../../mixins/avatarEditUtilities';
|
||||
import Sprite from '@/components/ui/sprite.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
mixins: [
|
||||
avatarEditorUtilities,
|
||||
],
|
||||
@@ -75,7 +90,7 @@ export default {
|
||||
cursor: pointer;
|
||||
|
||||
&.premium {
|
||||
height: 112px;
|
||||
height: 120px;
|
||||
width: 96px;
|
||||
margin-left: 8px;
|
||||
margin-right: 8px;
|
||||
@@ -92,21 +107,9 @@ export default {
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
background-color: $white;
|
||||
|
||||
.sprite.customize-option.shirt {
|
||||
margin-left: -3px !important;
|
||||
// otherwise its overriden by the .outer-option-background:not(.none) { rules
|
||||
}
|
||||
|
||||
.sprite.customize-option.skin {
|
||||
margin-left: -8px !important;
|
||||
// otherwise its overriden by the .outer-option-background:not(.none) { rules
|
||||
}
|
||||
|
||||
.option {
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
padding-left: 6px;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@@ -132,14 +135,14 @@ export default {
|
||||
}
|
||||
|
||||
.redline-outer {
|
||||
height: 60px;
|
||||
width: 60px;
|
||||
height: 68px;
|
||||
width: 68px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
margin: 0 auto 0 0;
|
||||
|
||||
.redline {
|
||||
width: 60px;
|
||||
width: 68px;
|
||||
height: 4px;
|
||||
display: block;
|
||||
background: red;
|
||||
@@ -148,7 +151,6 @@ export default {
|
||||
top: 0;
|
||||
margin-top: 30px;
|
||||
margin-bottom: 20px;
|
||||
margin-left: -1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -164,10 +166,9 @@ export default {
|
||||
}
|
||||
.option {
|
||||
vertical-align: bottom;
|
||||
height: 64px;
|
||||
width: 64px;
|
||||
height: 76px;
|
||||
width: 76px;
|
||||
|
||||
margin: 12px 8px;
|
||||
border: 4px solid transparent;
|
||||
border-radius: 10px;
|
||||
position: relative;
|
||||
@@ -182,44 +183,6 @@ export default {
|
||||
.sprite.customize-option {
|
||||
margin-top: 0;
|
||||
margin-left: 0;
|
||||
|
||||
&.skin {
|
||||
margin-top: -4px;
|
||||
margin-left: -4px;
|
||||
}
|
||||
&.chair {
|
||||
margin-left: -1px;
|
||||
margin-top: -1px;
|
||||
|
||||
&.button_chair_black {
|
||||
// different sprite margin?
|
||||
margin-top: -3px;
|
||||
}
|
||||
|
||||
&.handleless {
|
||||
margin-left: -5px;
|
||||
margin-top: -5px;
|
||||
}
|
||||
}
|
||||
&.color, &.bangs, &.beard, &.flower, &.mustache {
|
||||
background-position-x: -6px;
|
||||
background-position-y: -12px;
|
||||
}
|
||||
|
||||
&.hair.base {
|
||||
background-position-x: -6px;
|
||||
background-position-y: -4px;
|
||||
}
|
||||
|
||||
&.headAccessory {
|
||||
margin-top: 0;
|
||||
margin-left: -4px;
|
||||
}
|
||||
|
||||
&.headband {
|
||||
margin-top: -6px;
|
||||
margin-left: -27px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
|
||||
<script>
|
||||
import appearance from '@/../../common/script/content/appearance';
|
||||
import upperFirst from 'lodash/upperFirst';
|
||||
import { subPageMixin } from '../../mixins/subPage';
|
||||
import { userStateMixin } from '../../mixins/userState';
|
||||
import { avatarEditorUtilities } from '../../mixins/avatarEditUtilities';
|
||||
@@ -82,9 +83,6 @@ import customizeBanner from './customize-banner';
|
||||
import customizeOptions from './customize-options';
|
||||
import subMenu from './sub-menu';
|
||||
|
||||
const freeShirtKeys = Object.keys(appearance.shirt).filter(k => appearance.shirt[k].price === 0);
|
||||
const specialShirtKeys = Object.keys(appearance.shirt).filter(k => appearance.shirt[k].price !== 0);
|
||||
|
||||
export default {
|
||||
components: {
|
||||
customizeBanner,
|
||||
@@ -106,17 +104,6 @@ export default {
|
||||
headAccessory: ['bearEars', 'cactusEars', 'foxEars', 'lionEars', 'pandaEars', 'pigEars', 'tigerEars', 'wolfEars'],
|
||||
},
|
||||
chairKeys: ['none', 'black', 'blue', 'green', 'pink', 'red', 'yellow', 'handleless_black', 'handleless_blue', 'handleless_green', 'handleless_pink', 'handleless_red', 'handleless_yellow'],
|
||||
specialShirtKeys,
|
||||
items: [
|
||||
{
|
||||
id: 'size',
|
||||
label: this.$t('size'),
|
||||
},
|
||||
{
|
||||
id: 'shirt',
|
||||
label: this.$t('shirt'),
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -167,6 +154,7 @@ export default {
|
||||
];
|
||||
const noneOption = this.createGearItem(0, 'eyewear', 'base');
|
||||
noneOption.none = true;
|
||||
noneOption.text = this.$t('none');
|
||||
const options = [
|
||||
noneOption,
|
||||
];
|
||||
@@ -178,42 +166,36 @@ export default {
|
||||
option.active = this.user.preferences.costume
|
||||
? this.user.items.gear.costume.eyewear === newKey
|
||||
: this.user.items.gear.equipped.eyewear === newKey;
|
||||
option.class = `eyewear_special_${key}`;
|
||||
option.imageName = `eyewear_special_${key}`;
|
||||
option.isGear = true;
|
||||
option.click = () => {
|
||||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
|
||||
return this.equip(newKey, type);
|
||||
};
|
||||
option.text = this.$t(`eyewearSpecial${upperFirst(key)}Text`);
|
||||
options.push(option);
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
freeShirts () {
|
||||
return freeShirtKeys.map(s => this.mapKeysToFreeOption(s, 'shirt'));
|
||||
},
|
||||
specialShirts () {
|
||||
let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line
|
||||
const keys = this.specialShirtKeys;
|
||||
const options = keys.map(key => this.mapKeysToOption(key, 'shirt'));
|
||||
return options;
|
||||
},
|
||||
headbands () {
|
||||
const keys = ['blackHeadband', 'blueHeadband', 'greenHeadband', 'pinkHeadband', 'redHeadband', 'whiteHeadband', 'yellowHeadband'];
|
||||
const noneOption = this.createGearItem(0, 'headAccessory', 'base', 'headband');
|
||||
const noneOption = this.createGearItem(0, 'headAccessory', 'base');
|
||||
noneOption.none = true;
|
||||
noneOption.text = this.$t('none');
|
||||
const options = [
|
||||
noneOption,
|
||||
];
|
||||
|
||||
for (const key of keys) {
|
||||
const option = this.createGearItem(key, 'headAccessory', 'special', 'headband');
|
||||
const option = this.createGearItem(key, 'headAccessory', 'special');
|
||||
const newKey = `headAccessory_special_${key}`;
|
||||
option.click = () => {
|
||||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
return this.equip(newKey, type);
|
||||
};
|
||||
|
||||
option.text = this.$t(`headAccessory${upperFirst(key)}Text`);
|
||||
options.push(option);
|
||||
}
|
||||
|
||||
@@ -227,8 +209,9 @@ export default {
|
||||
option.none = true;
|
||||
}
|
||||
option.active = this.user.preferences.chair === key;
|
||||
option.class = `button_chair_${key} chair ${key.includes('handleless_') ? 'handleless' : ''}`;
|
||||
option.imageName = `chair_${key}`;
|
||||
option.click = () => this.set({ 'preferences.chair': key });
|
||||
option.text = appearance.chair[key].text();
|
||||
return option;
|
||||
});
|
||||
return options;
|
||||
@@ -242,8 +225,11 @@ export default {
|
||||
option.none = true;
|
||||
}
|
||||
option.active = this.user.preferences.hair.flower === key;
|
||||
option.class = `icon_hair_flower_${key} flower`;
|
||||
if (key !== 0) {
|
||||
option.imageName = `hair_flower_${key}`;
|
||||
}
|
||||
option.click = () => this.set({ 'preferences.hair.flower': key });
|
||||
option.text = appearance.hair.flower[key].text();
|
||||
return option;
|
||||
});
|
||||
return options;
|
||||
@@ -271,6 +257,7 @@ export default {
|
||||
|
||||
const noneOption = this.createGearItem(0, category, 'base', category);
|
||||
noneOption.none = true;
|
||||
noneOption.text = this.$t('none');
|
||||
const options = [
|
||||
noneOption,
|
||||
];
|
||||
@@ -284,10 +271,15 @@ export default {
|
||||
option.active = this.user.preferences.costume
|
||||
? this.user.items.gear.costume[category] === newKey
|
||||
: this.user.items.gear.equipped[category] === newKey;
|
||||
option.class = `headAccessory_special_${option.key} ${category}`;
|
||||
|
||||
if (category === 'back') {
|
||||
option.class = `icon_back_special_${option.key} back`;
|
||||
option.text = this.$t(`back${upperFirst(key)}Text`);
|
||||
option.imageName = `back_special_${option.key}`;
|
||||
} else {
|
||||
option.text = this.$t(`headAccessory${upperFirst(key)}Text`);
|
||||
option.imageName = `headAccessory_special_${option.key}`;
|
||||
}
|
||||
option.isGear = true;
|
||||
option.click = () => {
|
||||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
return this.equip(newKey, type);
|
||||
@@ -303,7 +295,7 @@ export default {
|
||||
|
||||
return keys.join(',');
|
||||
},
|
||||
createGearItem (key, gearType, subGearType, additionalClass) {
|
||||
createGearItem (key, gearType, subGearType) {
|
||||
const newKey = `${gearType}_${subGearType ? `${subGearType}_` : ''}${key}`;
|
||||
const option = {};
|
||||
option.key = key;
|
||||
@@ -311,6 +303,7 @@ export default {
|
||||
const currentlyEquippedValue = this.user.items.gear[visibleGearType][gearType];
|
||||
|
||||
option.active = currentlyEquippedValue === newKey;
|
||||
option.isGear = true;
|
||||
|
||||
if (key === 0) {
|
||||
// if key is the "none" option check if a property
|
||||
@@ -318,7 +311,7 @@ export default {
|
||||
option.active = option.active || !currentlyEquippedValue;
|
||||
}
|
||||
|
||||
option.class = `${newKey} ${additionalClass}`;
|
||||
option.imageName = `${newKey}`;
|
||||
option.click = () => {
|
||||
const type = this.user.preferences.costume ? 'costume' : 'equipped';
|
||||
const currentlyEquipped = this.user.items.gear[type][gearType];
|
||||
|
||||
@@ -220,10 +220,10 @@
|
||||
:class="{selected: bg.key === user.preferences.background}"
|
||||
@click="unlock('background.' + bg.key)"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="background"
|
||||
:class="`icon_background_${bg.key}`"
|
||||
></div>
|
||||
:image-name="`icon_background_${bg.key}`"
|
||||
/>
|
||||
<b-popover
|
||||
:target="bg.key"
|
||||
triggers="hover focus"
|
||||
@@ -254,10 +254,10 @@
|
||||
:class="{selected: bg.key === user.preferences.background}"
|
||||
@click="unlock('background.' + bg.key)"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="background"
|
||||
:class="`icon_background_${bg.key}`"
|
||||
></div>
|
||||
:image-name="`icon_background_${bg.key}`"
|
||||
/>
|
||||
<b-popover
|
||||
:target="bg.key"
|
||||
triggers="hover focus"
|
||||
@@ -286,10 +286,10 @@
|
||||
:class="{selected: bg.key === user.preferences.background}"
|
||||
@click="unlock('background.' + bg.key)"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="background"
|
||||
:class="`icon_background_${bg.key}`"
|
||||
></div>
|
||||
:image-name="`icon_background_${bg.key}`"
|
||||
/>
|
||||
<b-popover
|
||||
:target="bg.key"
|
||||
triggers="hover focus"
|
||||
@@ -818,9 +818,10 @@
|
||||
|
||||
.background {
|
||||
border-radius: 4px;
|
||||
object-position: -4px -4px;
|
||||
object-fit: none;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background-position: -4px -4px;
|
||||
}
|
||||
|
||||
.deselect {
|
||||
@@ -1013,6 +1014,7 @@ import arrowRight from '@/assets/svg/arrow_right.svg';
|
||||
import arrowLeft from '@/assets/svg/arrow_left.svg';
|
||||
import svgClose from '@/assets/svg/close.svg';
|
||||
import { avatarEditorUtilities } from '../mixins/avatarEditUtilities';
|
||||
import Sprite from './ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -1024,6 +1026,7 @@ export default {
|
||||
hairSettings,
|
||||
skinSettings,
|
||||
usernameForm,
|
||||
Sprite,
|
||||
},
|
||||
mixins: [guide, notifications, avatarEditorUtilities],
|
||||
data () {
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
<slot
|
||||
name="itemBadge"
|
||||
:item="item"
|
||||
></slot><span
|
||||
></slot><Sprite
|
||||
class="item-content"
|
||||
:class="itemContentClass"
|
||||
></span>
|
||||
:image-name="itemContentClass"
|
||||
/>
|
||||
</div><span
|
||||
v-if="label"
|
||||
class="item-label"
|
||||
@@ -46,8 +46,12 @@
|
||||
|
||||
<script>
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
|
||||
113
website/client/src/components/inventory/itemPopover.vue
Normal file
@@ -0,0 +1,113 @@
|
||||
<template>
|
||||
<div
|
||||
ref="root"
|
||||
v-if="draggedItem"
|
||||
class="draggedItemInfo mouse"
|
||||
v-mousePosition="30"
|
||||
@mouseMoved="mouseMoved($event)">
|
||||
<Sprite
|
||||
class="dragging-icon"
|
||||
:image-name="imageName()"
|
||||
/>
|
||||
<div class="popover">
|
||||
<div
|
||||
class="popover-content"
|
||||
>
|
||||
{{ $t(popoverTextKey, { [translationKey]: itemText() }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.draggedItemInfo {
|
||||
position: absolute;
|
||||
left: -500px;
|
||||
|
||||
z-index: 1080;
|
||||
|
||||
&.mouse {
|
||||
position: fixed;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.dragging-icon {
|
||||
width: 68px;
|
||||
margin: 0 auto 8px;
|
||||
display: block;
|
||||
transform: scale(1.5);
|
||||
}
|
||||
|
||||
.popover {
|
||||
position: static;
|
||||
width: 180px;
|
||||
}
|
||||
|
||||
.popover-content {
|
||||
color: white;
|
||||
margin: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
import MouseMoveDirective from '@/directives/mouseposition.directive';
|
||||
|
||||
export default {
|
||||
name: 'ItemPopover',
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
directives: {
|
||||
mousePosition: MouseMoveDirective,
|
||||
},
|
||||
props: {
|
||||
draggedItem: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
popoverTextKey: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
translationKey: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
imageName () {
|
||||
if (this.draggedItem) {
|
||||
if (this.draggedItem.class) {
|
||||
return this.draggedItem.class;
|
||||
}
|
||||
if (this.draggedItem.target) {
|
||||
return `Pet_Food_${this.draggedItem.key}`;
|
||||
}
|
||||
}
|
||||
return '';
|
||||
},
|
||||
mouseMoved ($event) {
|
||||
if (this.$refs.root) {
|
||||
this.$refs.root.style.left = `${$event.x - 60}px`;
|
||||
this.$refs.root.style.top = `${$event.y + 10}px`;
|
||||
}
|
||||
},
|
||||
itemText () {
|
||||
if (this.draggedItem) {
|
||||
if (this.draggedItem.text) {
|
||||
if (typeof this.draggedItem.text === 'function') {
|
||||
return this.draggedItem.text();
|
||||
}
|
||||
return this.draggedItem.text;
|
||||
}
|
||||
return this.draggedItem.class;
|
||||
}
|
||||
return '';
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
</script>
|
||||
@@ -1,8 +1,6 @@
|
||||
<template>
|
||||
<div
|
||||
v-mousePosition="30"
|
||||
class="row"
|
||||
@mouseMoved="mouseMoved($event)"
|
||||
>
|
||||
<div class="standard-sidebar d-none d-sm-block">
|
||||
<filter-sidebar>
|
||||
@@ -99,7 +97,7 @@
|
||||
{{ context.item.text }}
|
||||
</h4>
|
||||
<div
|
||||
v-if="currentDraggingPotion == null"
|
||||
v-if="!currentDraggingPotion"
|
||||
class="popover-content-text"
|
||||
>
|
||||
{{ context.item.notes }}
|
||||
@@ -148,7 +146,7 @@
|
||||
<h4 class="popover-content-title">
|
||||
{{ context.item.text }}
|
||||
</h4>
|
||||
<div class="popover-content-text">
|
||||
<div class="popover-content-text" v-if="!currentDraggingEgg">
|
||||
{{ context.item.notes }}
|
||||
</div>
|
||||
</template>
|
||||
@@ -224,120 +222,24 @@
|
||||
</div>
|
||||
</div>
|
||||
<hatchedPetDialog />
|
||||
<div
|
||||
ref="draggingEggInfo"
|
||||
class="eggInfo"
|
||||
>
|
||||
<div v-if="currentDraggingEgg != null">
|
||||
<div
|
||||
class="potion-icon"
|
||||
:class="`Pet_Egg_${currentDraggingEgg.key}`"
|
||||
></div>
|
||||
<div class="popover">
|
||||
<div class="popover-content">
|
||||
{{ $t('dragThisEgg', {eggName: currentDraggingEgg.text }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="eggClickMode"
|
||||
ref="clickEggInfo"
|
||||
class="eggInfo mouse"
|
||||
>
|
||||
<div v-if="currentDraggingEgg != null">
|
||||
<div
|
||||
class="potion-icon"
|
||||
:class="`Pet_Egg_${currentDraggingEgg.key}`"
|
||||
></div>
|
||||
<div class="popover">
|
||||
<div
|
||||
class="popover-content"
|
||||
>
|
||||
{{ $t('clickOnPotionToHatch', {eggName: currentDraggingEgg.text }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
ref="draggingPotionInfo"
|
||||
class="hatchingPotionInfo"
|
||||
>
|
||||
<div v-if="currentDraggingPotion != null">
|
||||
<div
|
||||
class="potion-icon"
|
||||
:class="`Pet_HatchingPotion_${currentDraggingPotion.key}`"
|
||||
></div>
|
||||
<div class="popover">
|
||||
<div
|
||||
class="popover-content"
|
||||
>
|
||||
{{ $t('dragThisPotion', {potionName: currentDraggingPotion.text }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="potionClickMode"
|
||||
ref="clickPotionInfo"
|
||||
class="hatchingPotionInfo mouse"
|
||||
>
|
||||
<div v-if="currentDraggingPotion != null">
|
||||
<div
|
||||
class="potion-icon"
|
||||
:class="`Pet_HatchingPotion_${currentDraggingPotion.key}`"
|
||||
></div>
|
||||
<div class="popover">
|
||||
<div
|
||||
class="popover-content"
|
||||
>
|
||||
{{ $t('clickOnEggToHatch', {potionName: currentDraggingPotion.text }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ItemPopover
|
||||
:dragged-item="currentDraggingEgg"
|
||||
popoverTextKey="clickOnPotionToHatch"
|
||||
translationKey="eggName" />
|
||||
<ItemPopover
|
||||
:dragged-item="currentDraggingPotion"
|
||||
popoverTextKey="clickOnEggToHatch"
|
||||
translationKey="potionName" />
|
||||
<questDetailModal :group="user.party" />
|
||||
<cards-modal :card-options="cardOptions" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
.eggInfo, .hatchingPotionInfo {
|
||||
position: absolute;
|
||||
left: -500px;
|
||||
|
||||
z-index: 1080;
|
||||
|
||||
&.mouse {
|
||||
position: fixed;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.potion-icon {
|
||||
margin: 0 auto 8px;
|
||||
transform: scale(1.5);
|
||||
}
|
||||
|
||||
.popover {
|
||||
position: inherit;
|
||||
width: 180px;
|
||||
}
|
||||
|
||||
.popover-content {
|
||||
color: white;
|
||||
margin: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import each from 'lodash/each';
|
||||
import throttle from 'lodash/throttle';
|
||||
import moment from 'moment';
|
||||
import ItemPopover from '@/components/inventory/itemPopover';
|
||||
import Item from '@/components/inventory/item';
|
||||
import ItemRows from '@/components/ui/itemRows';
|
||||
import CountBadge from '@/components/ui/countBadge';
|
||||
@@ -354,7 +256,6 @@ import { createAnimal } from '@/libs/createAnimal';
|
||||
|
||||
import notifications from '@/mixins/notifications';
|
||||
import DragDropDirective from '@/directives/dragdrop.directive';
|
||||
import MouseMoveDirective from '@/directives/mouseposition.directive';
|
||||
import FilterGroup from '@/components/ui/filterGroup';
|
||||
import Checkbox from '@/components/ui/checkbox';
|
||||
import SelectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
|
||||
@@ -375,8 +276,6 @@ const groups = [
|
||||
allowedItems,
|
||||
}));
|
||||
|
||||
let lastMouseMoveEvent = {};
|
||||
|
||||
export default {
|
||||
name: 'Items',
|
||||
components: {
|
||||
@@ -391,10 +290,10 @@ export default {
|
||||
cardsModal,
|
||||
QuestInfo,
|
||||
FilterSidebar,
|
||||
ItemPopover,
|
||||
},
|
||||
directives: {
|
||||
drag: DragDropDirective,
|
||||
mousePosition: MouseMoveDirective,
|
||||
},
|
||||
mixins: [notifications],
|
||||
data () {
|
||||
@@ -405,9 +304,7 @@ export default {
|
||||
sortBy: 'quantity', // or 'AZ'
|
||||
|
||||
currentDraggingEgg: null,
|
||||
eggClickMode: false,
|
||||
currentDraggingPotion: null,
|
||||
potionClickMode: false,
|
||||
cardOptions: {
|
||||
cardType: '',
|
||||
messageOptions: 0,
|
||||
@@ -567,22 +464,13 @@ export default {
|
||||
}
|
||||
|
||||
this.currentDraggingPotion = null;
|
||||
this.potionClickMode = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.currentDraggingEgg === null || this.currentDraggingEgg !== egg) {
|
||||
this.currentDraggingEgg = egg;
|
||||
this.eggClickMode = true;
|
||||
|
||||
// Wait for the div.eggInfo.mouse node to be added to the DOM before
|
||||
// changing its position.
|
||||
this.$nextTick(() => {
|
||||
this.mouseMoved(lastMouseMoveEvent);
|
||||
});
|
||||
} else {
|
||||
this.currentDraggingEgg = null;
|
||||
this.eggClickMode = false;
|
||||
}
|
||||
},
|
||||
onPotionClicked ($event, potion) {
|
||||
@@ -592,21 +480,12 @@ export default {
|
||||
}
|
||||
|
||||
this.currentDraggingEgg = null;
|
||||
this.eggClickMode = false;
|
||||
return;
|
||||
}
|
||||
if (this.currentDraggingPotion === null || this.currentDraggingPotion !== potion) {
|
||||
this.currentDraggingPotion = potion;
|
||||
this.potionClickMode = true;
|
||||
|
||||
// Wait for the div.hatchingPotionInfo.mouse node to be added to the
|
||||
// DOM before changing its position.
|
||||
this.$nextTick(() => {
|
||||
this.mouseMoved(lastMouseMoveEvent);
|
||||
});
|
||||
} else {
|
||||
this.currentDraggingPotion = null;
|
||||
this.potionClickMode = false;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -640,23 +519,6 @@ export default {
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
mouseMoved ($event) {
|
||||
// Keep track of the last mouse position even in click mode so that we
|
||||
// know where to position the dragged potion/egg info on item click.
|
||||
lastMouseMoveEvent = $event;
|
||||
|
||||
// Update the potion/egg popover if we are already dragging it.
|
||||
if (this.potionClickMode) {
|
||||
// dragging potioninfo is 180px wide (90 would be centered)
|
||||
this.$refs.clickPotionInfo.style.left = `${$event.x - 60}px`;
|
||||
this.$refs.clickPotionInfo.style.top = `${$event.y + 10}px`;
|
||||
} else if (this.eggClickMode) {
|
||||
// dragging eggInfo is 180px wide (90 would be centered)
|
||||
this.$refs.clickEggInfo.style.left = `${$event.x - 60}px`;
|
||||
this.$refs.clickEggInfo.style.top = `${$event.y + 10}px`;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
:show="true"
|
||||
:count="itemCount"
|
||||
/>
|
||||
<span
|
||||
<Sprite
|
||||
v-drag.food="item.key"
|
||||
class="item-content"
|
||||
:class="`Pet_Food_${item.key}`"
|
||||
:image-name="`Pet_Food_${item.key}`"
|
||||
@itemDragEnd="dragend($event)"
|
||||
@itemDragStart="dragstart($event)"
|
||||
></span>
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<b-popover
|
||||
@@ -41,12 +41,14 @@
|
||||
<script>
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import DragDropDirective from '@/directives/dragdrop.directive';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
import CountBadge from '@/components/ui/countBadge';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CountBadge,
|
||||
Sprite,
|
||||
},
|
||||
directives: {
|
||||
drag: DragDropDirective,
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</div>
|
||||
<div class="inner-content">
|
||||
<div class="pet-background d-flex align-items-center">
|
||||
<div :class="pet.class"></div>
|
||||
<Sprite :image-name="pet.imageName" />
|
||||
</div>
|
||||
<h4 class="title">
|
||||
{{ pet.name }}
|
||||
@@ -76,10 +76,11 @@
|
||||
height: 112px;
|
||||
border-radius: 4px;
|
||||
background-color: $gray-700;
|
||||
}
|
||||
|
||||
.Pet {
|
||||
margin: auto;
|
||||
img {
|
||||
transform: scale(1.5);
|
||||
margin: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.dialog-header {
|
||||
@@ -103,8 +104,12 @@
|
||||
<script>
|
||||
import markdownDirective from '@/directives/markdown';
|
||||
import svgClose from '@/assets/svg/close.svg';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
directives: {
|
||||
markdown: markdownDirective,
|
||||
},
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
>
|
||||
<div class="potionEggGroup">
|
||||
<div class="potionEggBackground">
|
||||
<div :class="`Pet_HatchingPotion_${hatchablePet.potionKey}`"></div>
|
||||
<Sprite :image-name="`Pet_HatchingPotion_${hatchablePet.potionKey}`" />
|
||||
</div>
|
||||
<div class="potionEggBackground">
|
||||
<div :class="`Pet_Egg_${hatchablePet.eggKey}`"></div>
|
||||
<Sprite :image-name="`Pet_Egg_${hatchablePet.eggKey}`" />
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="title">
|
||||
@@ -105,7 +105,7 @@
|
||||
margin-right: 24px;
|
||||
}
|
||||
|
||||
div {
|
||||
img {
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
@@ -116,8 +116,12 @@
|
||||
import svgClose from '@/assets/svg/close.svg';
|
||||
|
||||
import petMixin from '@/mixins/petMixin';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
mixins: [petMixin],
|
||||
props: ['hatchablePet'],
|
||||
data () {
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
<template>
|
||||
<div
|
||||
v-mousePosition="30"
|
||||
class="row stable"
|
||||
@mouseMoved="mouseMoved($event)"
|
||||
>
|
||||
<div class="standard-sidebar d-none d-sm-block">
|
||||
<filter-sidebar>
|
||||
@@ -265,43 +263,10 @@
|
||||
</inventoryDrawer>
|
||||
</div>
|
||||
<hatchedPetDialog :hide-text="true" />
|
||||
<div
|
||||
ref="dragginFoodInfo"
|
||||
class="foodInfo"
|
||||
>
|
||||
<div v-if="currentDraggingFood != null">
|
||||
<div
|
||||
class="food-icon"
|
||||
:class="`Pet_Food_${currentDraggingFood.key}`"
|
||||
></div>
|
||||
<div class="popover">
|
||||
<div
|
||||
class="popover-content"
|
||||
>
|
||||
{{ $t('dragThisFood', {foodName: currentDraggingFood.text() }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="foodClickMode"
|
||||
ref="clickFoodInfo"
|
||||
class="foodInfo mouse"
|
||||
>
|
||||
<div v-if="currentDraggingFood != null">
|
||||
<div
|
||||
class="food-icon"
|
||||
:class="`Pet_Food_${currentDraggingFood.key}`"
|
||||
></div>
|
||||
<div class="popover">
|
||||
<div
|
||||
class="popover-content"
|
||||
>
|
||||
{{ $t('clickOnPetToFeed', {foodName: currentDraggingFood.text() }) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ItemPopover
|
||||
:dragged-item="currentDraggingFood"
|
||||
popoverTextKey="clickOnPetToFeed"
|
||||
translationKey="foodName" />
|
||||
<mount-raised-modal />
|
||||
<welcome-modal />
|
||||
<hatching-modal :hatchable-pet.sync="hatchablePet" />
|
||||
@@ -364,34 +329,6 @@
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.foodInfo {
|
||||
position: absolute;
|
||||
left: -500px;
|
||||
|
||||
z-index: 1080;
|
||||
|
||||
&.mouse {
|
||||
position: fixed;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.food-icon {
|
||||
margin: 0 auto 8px;
|
||||
transform: scale(1.5);
|
||||
}
|
||||
|
||||
.popover {
|
||||
position: inherit;
|
||||
width: 180px;
|
||||
}
|
||||
|
||||
.popover-content {
|
||||
color: white;
|
||||
margin: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.hatchablePopover {
|
||||
width: 180px;
|
||||
|
||||
@@ -428,6 +365,7 @@ import _throttle from 'lodash/throttle';
|
||||
import groupBy from 'lodash/groupBy';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
import ItemPopover from '@/components/inventory/itemPopover';
|
||||
import PetItem from './petItem';
|
||||
import MountItem from './mountItem.vue';
|
||||
import FoodItem from './foodItem';
|
||||
@@ -440,7 +378,6 @@ import InventoryDrawer from '@/components/shared/inventoryDrawer';
|
||||
|
||||
import ResizeDirective from '@/directives/resize.directive';
|
||||
import DragDropDirective from '@/directives/dragdrop.directive';
|
||||
import MouseMoveDirective from '@/directives/mouseposition.directive';
|
||||
|
||||
import { createAnimal } from '@/libs/createAnimal';
|
||||
|
||||
@@ -482,11 +419,11 @@ export default {
|
||||
WelcomeModal,
|
||||
HatchingModal,
|
||||
InventoryDrawer,
|
||||
ItemPopover,
|
||||
},
|
||||
directives: {
|
||||
resize: ResizeDirective,
|
||||
drag: DragDropDirective,
|
||||
mousePosition: MouseMoveDirective,
|
||||
},
|
||||
mixins: [notifications, openedItemRowsMixin, petMixin, seasonalNPC],
|
||||
data () {
|
||||
|
||||
@@ -13,10 +13,11 @@
|
||||
name="itemBadge"
|
||||
:item="item"
|
||||
></slot>
|
||||
<span
|
||||
<Sprite
|
||||
class="item-content"
|
||||
:class="itemClass()"
|
||||
></span>
|
||||
:image-name="imageName()"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<b-popover
|
||||
@@ -37,8 +38,12 @@
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { mapState } from '@/libs/store';
|
||||
import { isOwned } from '../../../libs/createAnimal';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
@@ -70,7 +75,10 @@ export default {
|
||||
return isOwned('mount', this.item, this.userItems);
|
||||
},
|
||||
itemClass () {
|
||||
return this.isOwned() ? `Mount_Icon_${this.item.key}` : 'PixelPaw GreyedOut';
|
||||
return this.isOwned() ? '' : 'GreyedOut';
|
||||
},
|
||||
imageName () {
|
||||
return this.isOwned() ? `stable_Mount_Icon_${this.item.key}` : 'PixelPaw';
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
</div>
|
||||
<div class="inner-content">
|
||||
<div class="pet-background">
|
||||
<div
|
||||
<Sprite
|
||||
class="mount"
|
||||
:class="`Mount_Icon_${mount.key}`"
|
||||
></div>
|
||||
:image-name="`Mount_Icon_${mount.key}`"
|
||||
/>
|
||||
</div>
|
||||
<h4 class="title">
|
||||
{{ mount.text() }}
|
||||
@@ -82,8 +82,12 @@
|
||||
<script>
|
||||
import stable from '@/../../common/script/content/stable';
|
||||
import markdownDirective from '@/directives/markdown';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
directives: {
|
||||
markdown: markdownDirective,
|
||||
},
|
||||
|
||||
@@ -13,19 +13,23 @@
|
||||
name="itemBadge"
|
||||
:item="item"
|
||||
></slot><span
|
||||
v-if="mountOwned() && isHatchable() && !item.isSpecial()"
|
||||
v-if="isHatchable() && !item.isSpecial()"
|
||||
class="item-content hatchAgain"
|
||||
><span
|
||||
><Sprite
|
||||
class="egg"
|
||||
:class="eggClass"
|
||||
></span><span
|
||||
:image-name="eggClass"
|
||||
/><Sprite
|
||||
class="potion"
|
||||
:class="potionClass"
|
||||
></span></span><span
|
||||
v-else
|
||||
:image-name="potionClass"
|
||||
/>
|
||||
</span>
|
||||
<Sprite
|
||||
v-else
|
||||
class="item-content"
|
||||
:class="getPetItemClass()"
|
||||
></span><span
|
||||
:class="itemClass()"
|
||||
:image-name="imageName()"
|
||||
/>
|
||||
<span
|
||||
v-if="isAllowedToFeed() && progress() > 0"
|
||||
class="pet-progress-background"
|
||||
><div
|
||||
@@ -52,9 +56,9 @@
|
||||
v-html="$t('haveHatchablePet', { potion: item.potionName, egg: item.eggName })"
|
||||
></div><div class="potionEggGroup">
|
||||
<div class="potionEggBackground">
|
||||
<div :class="potionClass"></div>
|
||||
<Sprite :image-name="potionClass" />
|
||||
</div><div class="potionEggBackground">
|
||||
<div :class="eggClass"></div>
|
||||
<Sprite :image-name="eggClass" />
|
||||
</div>
|
||||
</div>
|
||||
</div><div v-else>
|
||||
@@ -118,8 +122,12 @@ import foolPet from '@/mixins/foolPet';
|
||||
import {
|
||||
isAllowedToFeed, isHatchable, isOwned, isSpecial,
|
||||
} from '../../../libs/createAnimal';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
mixins: [foolPet],
|
||||
props: {
|
||||
item: {
|
||||
@@ -168,22 +176,28 @@ export default {
|
||||
isAllowedToFeed () {
|
||||
return isAllowedToFeed(this.item, this.userItems);
|
||||
},
|
||||
getPetItemClass () {
|
||||
itemClass () {
|
||||
if (this.isOwned() || this.isHatchable()) {
|
||||
return '';
|
||||
}
|
||||
return 'GreyedOut';
|
||||
},
|
||||
imageName () {
|
||||
if (this.isOwned() && some(
|
||||
this.currentEventList,
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'Fungi',
|
||||
)) {
|
||||
if (this.isSpecial()) return `Pet ${this.foolPet(this.item.key)}`;
|
||||
if (this.isSpecial()) return `stable_${this.foolPet(this.item.key)}`;
|
||||
const petString = `${this.item.eggKey}-${this.item.key}`;
|
||||
return `Pet ${this.foolPet(petString)}`;
|
||||
return `stable_${this.foolPet(petString)}`;
|
||||
}
|
||||
|
||||
if (this.isOwned() || (this.mountOwned() && this.isHatchable())) {
|
||||
return `Pet Pet-${this.item.key} ${this.item.eggKey}`;
|
||||
return `stable_Pet-${this.item.key}`;
|
||||
}
|
||||
|
||||
if (!this.isOwned() && this.isSpecial()) {
|
||||
return 'GreyedOut PixelPaw';
|
||||
return 'PixelPaw';
|
||||
}
|
||||
|
||||
if (this.isHatchable()) {
|
||||
@@ -191,11 +205,11 @@ export default {
|
||||
}
|
||||
|
||||
if (this.mountOwned()) {
|
||||
return `GreyedOut Pet Pet-${this.item.key} ${this.item.eggKey}`;
|
||||
return `stable_Pet-${this.item.key}`;
|
||||
}
|
||||
|
||||
// Can't hatch
|
||||
return 'GreyedOut PixelPaw';
|
||||
return 'PixelPaw';
|
||||
},
|
||||
progress () {
|
||||
return this.userItems.pets[this.item.key];
|
||||
|
||||
@@ -56,11 +56,11 @@
|
||||
class="list-group-item"
|
||||
ng-init="inv.gear[item.key] = user.items.gear.owned[item.key]"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'shop_' + item.key"
|
||||
:imageName="'shop_' + item.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
/>
|
||||
{{ item.text() }}
|
||||
<div class="clearfix">
|
||||
<label class="radio-inline">
|
||||
@@ -330,9 +330,9 @@
|
||||
class="list-group-item"
|
||||
ng-init="inv.mounts[mount] = user.items.mounts[mount]"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Mount_Icon_' + mount"
|
||||
:imageName="mount.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
{{ mount }}
|
||||
@@ -363,9 +363,9 @@
|
||||
class="list-group-item"
|
||||
ng-init="inv.mounts[mount] = user.items.mounts[mount]"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Mount_Icon_' + mount"
|
||||
:imageName="mount.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
{{ mount }}
|
||||
@@ -396,9 +396,9 @@
|
||||
class="list-group-item"
|
||||
ng-init="inv.mounts[mount] = user.items.mounts[mount]"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Mount_Icon_' + mount"
|
||||
:imageName="mount.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
{{ mount }}
|
||||
@@ -429,9 +429,9 @@
|
||||
class="list-group-item"
|
||||
ng-init="inv.mounts[mount] = user.items.mounts[mount]"
|
||||
>
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Mount_Icon_' + mount"
|
||||
:imageName="mount.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
{{ mount }}
|
||||
@@ -503,11 +503,11 @@
|
||||
ng-init="inv.hatchingPotions[item.key] = user.items.hatchingPotions[item.key]"
|
||||
>
|
||||
<div class="form-inline clearfix">
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Pet_HatchingPotion_' + item.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
/>
|
||||
<p>{{ item.text() }}</p>
|
||||
<input
|
||||
class="form-control"
|
||||
@@ -565,11 +565,11 @@
|
||||
ng-init="inv.eggs[item.key] = user.items.eggs[item.key]"
|
||||
>
|
||||
<div class="form-inline clearfix">
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Pet_Egg_' + item.key"
|
||||
:image-name="'Pet_Egg_' + item.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
/>
|
||||
<p>{{ item.text() }}</p>
|
||||
<input
|
||||
class="form-control"
|
||||
@@ -627,11 +627,11 @@
|
||||
ng-init="inv.food[item.key] = user.items.food[item.key]"
|
||||
>
|
||||
<div class="form-inline clearfix">
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'Pet_Food_' + item.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
/>
|
||||
<p>{{ item.text() }}</p>
|
||||
<input
|
||||
class="form-control"
|
||||
@@ -690,11 +690,11 @@
|
||||
ng-if="item.category !== 'world'"
|
||||
>
|
||||
<div class="form-inline clearfix">
|
||||
<div
|
||||
<Sprite
|
||||
class="pull-left"
|
||||
:class="'inventory_quest_scroll_' + item.key"
|
||||
style="margin-right: 10px"
|
||||
></div>
|
||||
/>
|
||||
<p>{{ item.text() }}</p>
|
||||
<input
|
||||
class="form-control"
|
||||
@@ -730,9 +730,13 @@
|
||||
import axios from 'axios';
|
||||
|
||||
import Content from '@/../../common/script/content';
|
||||
import Sprite from '@/components/ui/sprite.vue';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
data () {
|
||||
const showInv = {};
|
||||
const inv = {
|
||||
|
||||
@@ -46,10 +46,10 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-2">
|
||||
<div
|
||||
:class="currentMysterySet"
|
||||
<Sprite
|
||||
:image-name="currentMysterySet"
|
||||
class="mt-n1"
|
||||
></div>
|
||||
/>
|
||||
</div>
|
||||
<div class="col-10">
|
||||
<h3> {{ $t('monthlyMysteryItems') }} </h3>
|
||||
@@ -628,6 +628,7 @@ import paymentsMixin from '../../mixins/payments';
|
||||
import notificationsMixin from '../../mixins/notifications';
|
||||
|
||||
import subscriptionOptions from './subscriptionOptions.vue';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
import amazonPayLogo from '@/assets/svg/amazonpay.svg';
|
||||
import applePayLogo from '@/assets/svg/apple-pay-logo.svg';
|
||||
@@ -648,6 +649,7 @@ import subscriberHourglasses from '@/assets/svg/subscriber-hourglasses.svg';
|
||||
export default {
|
||||
components: {
|
||||
subscriptionOptions,
|
||||
Sprite,
|
||||
},
|
||||
mixins: [paymentsMixin, notificationsMixin],
|
||||
data () {
|
||||
|
||||
@@ -715,6 +715,12 @@ export default {
|
||||
if (this.item.notes instanceof Function) {
|
||||
return this.item.notes();
|
||||
}
|
||||
if (this.item.items) {
|
||||
if (this.item.items[0].notes instanceof Function) {
|
||||
return this.item.items[0].notes();
|
||||
}
|
||||
return this.item.items[0].notes;
|
||||
}
|
||||
return this.item.notes;
|
||||
},
|
||||
gemsLeft () {
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import find from 'lodash/find';
|
||||
import shops from '@/../../common/script/libs/shops';
|
||||
import throttle from 'lodash/throttle';
|
||||
import { mapState } from '@/libs/store';
|
||||
@@ -145,9 +146,16 @@ export default {
|
||||
return Object.values(this.viewOptions).some(g => g.selected);
|
||||
},
|
||||
imageURLs () {
|
||||
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
|
||||
if (!currentEvent) {
|
||||
return {
|
||||
background: 'url(/static/npc/normal/customizations_background.png)',
|
||||
npc: 'url(/static/npc/normal/customizations_npc.png)',
|
||||
};
|
||||
}
|
||||
return {
|
||||
background: 'url(/static/npc/normal/customizations_background.png)',
|
||||
npc: 'url(/static/npc/normal/customizations_npc.png)',
|
||||
background: `url(/static/npc/${currentEvent.season}/customizations_background.png)`,
|
||||
npc: `url(/static/npc/${currentEvent.season}/customizations_npc.png)`,
|
||||
};
|
||||
},
|
||||
categories () {
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
:emptyItem="emptyItem"
|
||||
></slot>
|
||||
<div class="image">
|
||||
<div
|
||||
<Sprite
|
||||
v-once
|
||||
:class="item.class"
|
||||
></div>
|
||||
:image-name="item.class"
|
||||
/>
|
||||
<slot
|
||||
name="itemImage"
|
||||
:item="item"
|
||||
@@ -157,9 +157,11 @@
|
||||
|
||||
<script>
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Sprite,
|
||||
},
|
||||
props: {
|
||||
item: {
|
||||
|
||||
@@ -38,26 +38,6 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
.key_to_pets {
|
||||
background-image: url('~@/assets/images/keys/key-to-the-pet-kennels.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
|
||||
.key_to_mounts {
|
||||
background-image: url('~@/assets/images/keys/key-to-the-mount-kennels.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
|
||||
.key_to_both {
|
||||
background-image: url('~@/assets/images/keys/keys-to-the-kennels.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import { beastCount, mountMasterProgress } from '@/../../common/script/count';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
:item="item"
|
||||
:abbreviated="true"
|
||||
/>
|
||||
<div
|
||||
v-if="item.addlNotes"
|
||||
class="mx-4 mb-3"
|
||||
>
|
||||
{{ item.addlNotes }}
|
||||
</div>
|
||||
<quest-rewards :quest="item" />
|
||||
<div
|
||||
v-if="!item.locked"
|
||||
@@ -52,12 +58,6 @@
|
||||
<div class="how-many-to-buy">
|
||||
<strong>{{ $t('howManyToBuy') }}</strong>
|
||||
</div>
|
||||
<div
|
||||
v-if="item.addlNotes"
|
||||
class="mb-3"
|
||||
>
|
||||
{{ item.addlNotes }}
|
||||
</div>
|
||||
<div>
|
||||
<number-increment
|
||||
@updateQuantity="selectedAmountToBuy = $event"
|
||||
@@ -82,7 +82,7 @@
|
||||
v-if="priceType === 'gems'
|
||||
&& !enoughCurrency(priceType, item.value * selectedAmountToBuy)
|
||||
&& !item.locked"
|
||||
class="btn btn-primary"
|
||||
class="btn btn-primary mb-3"
|
||||
@click="purchaseGems()"
|
||||
>
|
||||
{{ $t('purchaseGems') }}
|
||||
@@ -177,7 +177,6 @@
|
||||
|
||||
.inner-content {
|
||||
margin: 33px auto auto;
|
||||
padding: 0px 24px;
|
||||
}
|
||||
|
||||
.item-notes {
|
||||
@@ -233,8 +232,6 @@
|
||||
}
|
||||
|
||||
.purchase-amount {
|
||||
margin-top: 24px;
|
||||
|
||||
.how-many-to-buy {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
@@ -501,38 +498,6 @@ export default {
|
||||
hideDialog () {
|
||||
this.$root.$emit('bv::hide::modal', 'buy-quest-modal');
|
||||
},
|
||||
getDropIcon (drop) {
|
||||
switch (drop.type) {
|
||||
case 'gear':
|
||||
return `shop_${drop.key}`;
|
||||
case 'hatchingPotions':
|
||||
return `Pet_HatchingPotion_${drop.key}`;
|
||||
case 'food':
|
||||
return `Pet_Food_${drop.key}`;
|
||||
case 'eggs':
|
||||
return `Pet_Egg_${drop.key}`;
|
||||
case 'quests':
|
||||
return `inventory_quest_scroll_${drop.key}`;
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
},
|
||||
getDropName (drop) {
|
||||
switch (drop.type) {
|
||||
case 'gear':
|
||||
return this.content.gear.flat[drop.key].text();
|
||||
case 'quests':
|
||||
return this.content.quests[drop.key].text();
|
||||
case 'hatchingPotions':
|
||||
return this.$t('namedHatchingPotion', { type: this.content.hatchingPotions[drop.key].text() });
|
||||
case 'food':
|
||||
return this.content.food[drop.key].text();
|
||||
case 'eggs':
|
||||
return this.content.eggs[drop.key].text();
|
||||
default:
|
||||
return `Unknown type: ${drop.type}`;
|
||||
}
|
||||
},
|
||||
purchaseGems () {
|
||||
this.$root.$emit('bv::show::modal', 'buy-gems');
|
||||
},
|
||||
|
||||
@@ -19,9 +19,9 @@ export const QuestHelperMixin = {
|
||||
case 'quests':
|
||||
return `inventory_quest_scroll_${drop.key}`;
|
||||
case 'mounts':
|
||||
return `rewards_mount Mount_Icon_${drop.key}`;
|
||||
return `Mount_Icon_${drop.key}`;
|
||||
case 'pets':
|
||||
return `rewards_pet Pet-${drop.key}`;
|
||||
return `stable_Pet-${drop.key}`;
|
||||
default:
|
||||
return `shop_${drop.key}`;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="quest-content">
|
||||
<div
|
||||
class="quest-image"
|
||||
:class="'quest_' + item.key"
|
||||
:class="item.purchaseType === 'bundles' ? `quest_bundle_${item.key}` : `quest_${item.key}`"
|
||||
></div>
|
||||
<h3 class="text-center">
|
||||
{{ itemText }}
|
||||
@@ -17,7 +17,7 @@
|
||||
<user-label :user="leader" />
|
||||
</div>
|
||||
<div
|
||||
class="text"
|
||||
class="mx-4"
|
||||
v-html="itemNotes"
|
||||
></div>
|
||||
<questInfo
|
||||
@@ -42,12 +42,6 @@
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.text {
|
||||
margin: 16px 16px;
|
||||
overflow-y: auto;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.leader-label {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<div
|
||||
class="row"
|
||||
class="row mt-3"
|
||||
>
|
||||
<div
|
||||
v-if="quest.collect"
|
||||
@@ -25,7 +25,10 @@
|
||||
<dt>{{ $t('bossHP') + ':' }}</dt>
|
||||
<dd>{{ quest.boss.hp }}</dd>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div
|
||||
class="table-row"
|
||||
v-if="quest.purchaseType !== 'bundles'"
|
||||
>
|
||||
<dt>{{ $t('difficulty') + ':' }}</dt>
|
||||
<dd>
|
||||
<div
|
||||
@@ -39,7 +42,6 @@
|
||||
</div>
|
||||
<div
|
||||
v-if="quest.end && !abbreviated"
|
||||
class="m-auto"
|
||||
>
|
||||
{{ limitedString }}
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="quest.drop"
|
||||
class="quest-rewards"
|
||||
class="quest-rewards mb-3"
|
||||
>
|
||||
<div
|
||||
class="header d-flex align-items-center"
|
||||
@@ -39,7 +39,7 @@
|
||||
label-class="purple"
|
||||
>
|
||||
<div slot="itemImage">
|
||||
<div :class="getDropIcon(drop)"></div>
|
||||
<Sprite :image-name="getDropIcon(drop)" />
|
||||
</div>
|
||||
<div slot="popoverContent">
|
||||
<quest-popover :item="drop" />
|
||||
@@ -92,7 +92,7 @@
|
||||
:count="drop.amount"
|
||||
/>
|
||||
<div slot="itemImage">
|
||||
<div :class="getDropIcon(drop)"></div>
|
||||
<Sprite :image-name="getDropIcon(drop)" />
|
||||
</div>
|
||||
<div slot="popoverContent">
|
||||
<equipmentAttributesPopover
|
||||
@@ -133,6 +133,7 @@ import { QuestHelperMixin } from './quest-helper.mixin';
|
||||
import EquipmentAttributesPopover from '@/components/inventory/equipment/attributesPopover';
|
||||
import QuestPopover from './questPopover';
|
||||
import CountBadge from '../../ui/countBadge';
|
||||
import Sprite from '../../ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -141,6 +142,7 @@ export default {
|
||||
ItemWithLabel,
|
||||
SectionButton,
|
||||
EquipmentAttributesPopover,
|
||||
Sprite,
|
||||
},
|
||||
mixins: [QuestHelperMixin],
|
||||
props: ['quest'],
|
||||
|
||||
@@ -480,7 +480,7 @@ export default {
|
||||
});
|
||||
|
||||
await this.triggerGetWorldState();
|
||||
this.currentEvent = _find(this.currentEventList, event => Boolean(['winter', 'spring', 'summer', 'fall'].includes(event.season)));
|
||||
this.currentEvent = _find(this.currentEventList, event => Boolean(event.season));
|
||||
this.imageURLs.background = `url(/static/npc/${this.currentEvent.season}/seasonal_shop_opened_background.png)`;
|
||||
this.imageURLs.npc = `url(/static/npc/${this.currentEvent.season}/seasonal_shop_opened_npc.png)`;
|
||||
},
|
||||
|
||||
@@ -41,10 +41,10 @@
|
||||
class="suggestedDot"
|
||||
></span>
|
||||
<div class="image">
|
||||
<div
|
||||
<Sprite
|
||||
v-once
|
||||
:class="item.class"
|
||||
></div>
|
||||
:image-name="item.class"
|
||||
/>
|
||||
<slot
|
||||
name="itemImage"
|
||||
:item="item"
|
||||
@@ -281,11 +281,13 @@ import svgClock from '@/assets/svg/clock.svg';
|
||||
import EquipmentAttributesPopover from '@/components/inventory/equipment/attributesPopover';
|
||||
|
||||
import QuestInfo from './quests/questInfo.vue';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
EquipmentAttributesPopover,
|
||||
QuestInfo,
|
||||
Sprite,
|
||||
},
|
||||
props: {
|
||||
item: {
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
v-if="notification.type === 'drop'"
|
||||
class="icon-item"
|
||||
>
|
||||
<div
|
||||
:class="notification.icon"
|
||||
<Sprite
|
||||
:image-name="notification.icon"
|
||||
class="icon-negative-margin"
|
||||
></div>
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
@@ -231,9 +231,13 @@ import star from '@/assets/svg/star.svg';
|
||||
import mana from '@/assets/svg/mana.svg';
|
||||
import sword from '@/assets/svg/sword.svg';
|
||||
import CloseIcon from '../shared/closeIcon';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: { CloseIcon },
|
||||
components: {
|
||||
CloseIcon,
|
||||
Sprite,
|
||||
},
|
||||
props: ['notification', 'visibleAmount'],
|
||||
data () {
|
||||
return {
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
<div class="spell">
|
||||
<div class="spell-border">
|
||||
<div class="mana">
|
||||
<div
|
||||
class="img"
|
||||
:class="`shop_${spell.key} shop-sprite item-img`"
|
||||
></div>
|
||||
<Sprite
|
||||
class="img"
|
||||
:imageName="`shop_${spell.key}`"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="details">
|
||||
@@ -75,10 +75,9 @@
|
||||
class="spell"
|
||||
>
|
||||
<div class="details">
|
||||
<div
|
||||
class="img"
|
||||
:class="`shop_${skill.key} shop-sprite item-img`"
|
||||
></div>
|
||||
<Sprite
|
||||
:imageName="`shop_${skill.key}`"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="user.stats.lvl < skill.lvl"
|
||||
@@ -401,10 +400,12 @@ import {
|
||||
setLocalSetting,
|
||||
getLocalSetting,
|
||||
} from '@/libs/userlocalManager';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Drawer,
|
||||
Sprite,
|
||||
},
|
||||
directives: {
|
||||
mousePosition: MouseMoveDirective,
|
||||
|
||||
50
website/client/src/components/ui/sprite.vue
Normal file
@@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<img
|
||||
class="pixel-art"
|
||||
v-if="imageName && imageName !== ''"
|
||||
:src="imageUrl()"
|
||||
>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.pixel-art {
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import GIF_SPRITES from '@/../../common/script/content/constants/gifSprites';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
imageName: {
|
||||
type: String,
|
||||
},
|
||||
prefix: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
getFileType (name) {
|
||||
if (GIF_SPRITES.includes(name)) {
|
||||
return 'gif';
|
||||
}
|
||||
return 'png';
|
||||
},
|
||||
imageUrl () {
|
||||
if (!this.imageName) {
|
||||
return '';
|
||||
}
|
||||
let name = this.imageName;
|
||||
if (name.indexOf(' ') !== -1) {
|
||||
const components = name.split(' ');
|
||||
name = components[components.length - 1];
|
||||
}
|
||||
if (this.prefix) {
|
||||
name = `${this.prefix}_${name}`;
|
||||
}
|
||||
return `https://habitica-assets.s3.amazonaws.com/mobileApp/images/${name}.${this.getFileType(name)}`;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -18,9 +18,9 @@
|
||||
v-if="label !== 'skip'"
|
||||
:id="key"
|
||||
class="gear box"
|
||||
:class="{white: equippedItems[key] && equippedItems[key].indexOf('base_0') === -1}"
|
||||
:class="{white: isUsed(equippedItems, key)}"
|
||||
>
|
||||
<div :class="`shop_${equippedItems[key]}`"></div>
|
||||
<Sprite v-if="isUsed(equippedItems, key)" :image-name="`shop_${equippedItems[key]}`"/>
|
||||
</div>
|
||||
<b-popover
|
||||
v-if="label !== 'skip'
|
||||
@@ -64,9 +64,9 @@
|
||||
v-if="label !== 'skip'"
|
||||
:id="key + 'C'"
|
||||
class="gear box"
|
||||
:class="{white: costumeItems[key] && costumeItems[key].indexOf('base_0') === -1}"
|
||||
:class="{white: isUsed(costumeItems, key)}"
|
||||
>
|
||||
<div :class="`shop_${costumeItems[key]}`"></div>
|
||||
<Sprite v-if="isUsed(costumeItems, key)" :image-name="`shop_${costumeItems[key]}`"/>
|
||||
</div>
|
||||
<!-- Show background on 8th tile rather than a piece of equipment.-->
|
||||
<div
|
||||
@@ -75,7 +75,7 @@
|
||||
:class="{white: user.preferences.background}"
|
||||
style="overflow:hidden"
|
||||
>
|
||||
<div :class="'icon_background_' + user.preferences.background"></div>
|
||||
<Sprite :image-name="'icon_background_' + user.preferences.background" />
|
||||
</div>
|
||||
<b-popover
|
||||
v-if="label !== 'skip'
|
||||
@@ -124,10 +124,10 @@
|
||||
class="box"
|
||||
:class="{white: user.items.currentPet}"
|
||||
>
|
||||
<div
|
||||
class="Pet"
|
||||
:class="`Pet-${user.items.currentPet}`"
|
||||
></div>
|
||||
<Sprite
|
||||
:image-name="user.items.currentPet ?
|
||||
`stable_Pet-${user.items.currentPet}` : ''"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pet-mount-well-text">
|
||||
@@ -156,10 +156,10 @@
|
||||
class="box"
|
||||
:class="{white: user.items.currentMount}"
|
||||
>
|
||||
<div
|
||||
class="mount"
|
||||
:class="`Mount_Icon_${user.items.currentMount}`"
|
||||
></div>
|
||||
<Sprite
|
||||
:image-name="user.items.currentMount ?
|
||||
`stable_Mount_Icon_${user.items.currentMount}` : ''"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pet-mount-well-text">
|
||||
@@ -330,6 +330,7 @@ import statsComputed from '@/../../common/script/libs/statsComputed';
|
||||
import { mapState } from '@/libs/store';
|
||||
import attributesGrid from '@/components/inventory/equipment/attributesGrid';
|
||||
import toggleSwitch from '@/components/ui/toggleSwitch';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
|
||||
const DROP_ANIMALS = keys(Content.pets);
|
||||
const TOTAL_NUMBER_OF_DROP_ANIMALS = DROP_ANIMALS.length;
|
||||
@@ -337,6 +338,7 @@ export default {
|
||||
components: {
|
||||
toggleSwitch,
|
||||
attributesGrid,
|
||||
Sprite,
|
||||
},
|
||||
props: ['user', 'showAllocation'],
|
||||
data () {
|
||||
@@ -417,6 +419,9 @@ export default {
|
||||
|
||||
},
|
||||
methods: {
|
||||
isUsed (items, key) {
|
||||
return items[key] && items[key].indexOf('base_0') === -1;
|
||||
},
|
||||
getGearTitle (key) {
|
||||
return this.flatGear[key].text();
|
||||
},
|
||||
|
||||
@@ -37,6 +37,7 @@ export function createAnimal (egg, potion, type, _content, userItems) {
|
||||
return {
|
||||
key: animalKey,
|
||||
class: type === 'pet' ? `Pet Pet-${animalKey}` : `Mount_Icon_${animalKey}`,
|
||||
imageName: type === 'pet' ? `stable_Pet-${animalKey}` : `stable_Mount_Icon_${animalKey}`,
|
||||
eggKey: egg.key,
|
||||
eggName: getText(egg.text),
|
||||
potionKey: potion.key,
|
||||
|
||||
@@ -5,6 +5,7 @@ import unlock from '@/../../common/script/ops/unlock';
|
||||
import buy from '@/../../common/script/ops/buy/buy';
|
||||
|
||||
import appearanceSets from '@/../../common/script/content/appearance/sets';
|
||||
import appearances from '@/../../common/script/content/appearance';
|
||||
import { getScheduleMatchingGroup } from '@/../../common/script/content/constants/schedule';
|
||||
|
||||
import { userStateMixin } from './userState';
|
||||
@@ -31,8 +32,11 @@ export const avatarEditorUtilities = { // eslint-disable-line import/prefer-defa
|
||||
option.key = key;
|
||||
option.pathKey = pathKey;
|
||||
option.active = userPreference === key;
|
||||
option.class = this.createClass(type, subType, key);
|
||||
option.imageName = this.createImageName(type, subType, key);
|
||||
option.click = optionParam => (option.gemLocked ? this.unlock(`${optionParam.pathKey}.${key}`) : this.set({ [`preferences.${optionParam.pathKey}`]: optionParam.key }));
|
||||
option.text = subType ? appearances[type][subType][key].text()
|
||||
: appearances[type][key].text();
|
||||
|
||||
return option;
|
||||
},
|
||||
mapKeysToOption (key, type, subType, set) {
|
||||
@@ -56,8 +60,8 @@ export const avatarEditorUtilities = { // eslint-disable-line import/prefer-defa
|
||||
|
||||
return option;
|
||||
},
|
||||
createClass (type, subType, key) {
|
||||
let str = `${type} ${subType} `;
|
||||
createImageName (type, subType, key) {
|
||||
let str = '';
|
||||
|
||||
switch (type) {
|
||||
case 'shirt': {
|
||||
@@ -70,14 +74,14 @@ export const avatarEditorUtilities = { // eslint-disable-line import/prefer-defa
|
||||
}
|
||||
case 'hair': {
|
||||
if (subType === 'color') {
|
||||
str += `icon_hair_bangs_${this.user.preferences.hair.bangs || 1}_${key}`;
|
||||
str += `color_hair_bangs_${this.user.preferences.hair.bangs || 1}_${key}`;
|
||||
} else {
|
||||
str += `icon_hair_${subType}_${key}_${this.user.preferences.hair.color}`;
|
||||
str += `hair_${subType}_${key}_${this.user.preferences.hair.color}`;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'skin': {
|
||||
str += `skin skin_${key}`;
|
||||
str += `skin_${key}`;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
"paymentSubBillingWithMethod": "Tvé předplatné <strong>$<%= amount %> bude účtováno </strong> každé/CZ <strong><%= months %> měsíce/ů </strong> skrze <strong><%= paymentMethod %></strong>.",
|
||||
"invalidUnlockSet": "Tento set předmětů je prošlý a nemůže být odemčen.",
|
||||
"amountExp": "<%= amount %> Zk",
|
||||
"limitedAvailabilityDays": "K získání na <%= dny %>d <%= hodin%>h <%= minut %>m",
|
||||
"limitedAvailabilityDays": "K získání na <%= day %>d <%= hours%>h <%= minutes %>m",
|
||||
"nGemsGift": "<%= nGems %> Drahokamy (Dárek)",
|
||||
"nMonthsSubscriptionGift": "<%= nMonths %> Měsíční odběr (Dárek)",
|
||||
"nGems": "<%= nGems %> Drahokamy",
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
"backgroundStormyRooftopsNotes": "Schleiche über stürmische Hausdächer.",
|
||||
"backgroundWindyAutumnText": "Windiger Herbst",
|
||||
"backgroundWindyAutumnNotes": "Jage Laub an einem windigen Herbsttag.",
|
||||
"incentiveBackgrounds": "Einfaches Hintergründe-Set",
|
||||
"incentiveBackgrounds": "Standard Hintergründe",
|
||||
"backgroundVioletText": "Violett",
|
||||
"backgroundVioletNotes": "Ein vital-violetter Hintergrund.",
|
||||
"backgroundBlueText": "Blau",
|
||||
@@ -871,5 +871,12 @@
|
||||
"backgroundPottersStudioText": "Töpfer Atelier",
|
||||
"backgroundPottersStudioNotes": "Erschaffe Kunst im Töpfer Atelier.",
|
||||
"backgrounds052024": "SET 120: Veröffentlicht im Mai 2024",
|
||||
"backgroundDragonsBackNotes": "Segle durch den Himmel auf einem Drachenrücken."
|
||||
"backgroundDragonsBackNotes": "Segle durch den Himmel auf einem Drachenrücken.",
|
||||
"backgrounds062024": "SET 121: Veröffentlicht im Juni 2024",
|
||||
"backgroundShellGateText": "Muscheltor",
|
||||
"backgroundShellGateNotes": "Spaziere durch das korallenverzierte Muscheltor.",
|
||||
"backgrounds072024": "SET 122: Veröffentlicht im Juli 2024",
|
||||
"backgroundRiverBottomText": "Flussgrund",
|
||||
"backgroundRiverBottomNotes": "Erkunde den Grund eines Flusses.",
|
||||
"monthlyBackgrounds": "Hintergrund des Monats"
|
||||
}
|
||||
|
||||
@@ -189,5 +189,10 @@
|
||||
"notEnoughGold": "Nicht genügend Gold.",
|
||||
"chatCastSpellPartyTimes": "<%= username %> verwendet <%= spell %> <%= times %> Male für Deine Party <%= times %>.",
|
||||
"chatCastSpellUserTimes": "<%= username %> spricht <%= times %> mal <%= spell %> auf <%= target %>.",
|
||||
"nextReward": "Nächste Anmelde-Belohnung"
|
||||
"nextReward": "Nächste Anmelde-Belohnung",
|
||||
"skins": "Hautfarben",
|
||||
"titleHaircolor": "Haarfarben",
|
||||
"titleFacialHair": "Bärte",
|
||||
"titleHairbase": "Frisuren",
|
||||
"customizations": "Individualisierungen"
|
||||
}
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
"commGuideHeadingInteractions": "Interaktionen in Habitica",
|
||||
"commGuidePara015": "Habitica hat verschiedene Orte wo du mit anderen Spielern in Kontakt kommen kannst. Darunter sind die Chats (Privatnachrichten oder Party Chats) und außerdem die Möglichkeit nach Parties und Herausforderungen zu suchen.",
|
||||
"commGuidePara016": "Wenn Du dich durch die sozialen Aspekte von Habitica bewegst, gibt es ein paar allgemeine Regeln, damit jeder sicher und glücklich ist.",
|
||||
"commGuideList02A": "<strong>Respektiert einander</strong>. Sei höflich, freundlich und hilfsbereit. Vergiss nicht: Habiticaner kommen aus den verschiedensten Hintergründen und haben sehr unterschiedliche Erfahrungen gemacht. Das macht Habitica so eigenartig! Es ist wichtig, dass man beim Aufbauen einer Community seine Unterschiede und Ähnlichkeiten respektieren, aber natürlich auch feiern kann.",
|
||||
"commGuideList02A": "<strong>Respektiert einander</strong>. Sei höflich, freundlich und hilfsbereit. Vergiss nicht: Habiticaner kommen aus den verschiedensten Hintergründen und haben sehr unterschiedliche Erfahrungen gemacht.",
|
||||
"commGuideList02B": "<strong>Halte Dich an die <a href='/static/terms' target='_blank'>allgemeinen Geschäftsbedingungen</a></strong>, sowohl in öffentlichen als auch in privaten Bereichen.",
|
||||
"commGuideList02C": "<strong>Poste keine Bilder oder Texte, die Gewalt darstellen, andere einschüchtern, oder eindeutig/indirekt sexuell sind, die Diskriminierung, Fanatismus, Rassismus, Sexismus, Hass, Belästigungen oder Hetze gegen jedwede Individuen oder Gruppen beinhalten.</strong> Auch nicht als Scherz oder Meme. Das bezieht sowohl Sprüche als auch Stellungnahmen mit ein. Nicht jeder hat den gleichen Humor, etwas, was Du als Witz wahrnimmst, kann für jemand anderen verletzend sein.",
|
||||
"commGuideList02D": "<strong>Halte die Diskussionen für alle Altersgruppen angemessen</strong>. Das heißt, Erwachsenenthemen in öffentlichen Bereichen zu vermeiden. Viele junge Habiticaner und Menschen mit verschiedenen Hintergründen nutzen diese Seite. Wir wollen unsere Gemeinschaft so angenehm und inklusiv wie möglich gestalten.",
|
||||
"commGuideList02D": "<strong>Sei dir bewusst, dass Habiticaner Menschen unterschiedlichen Alters und mit verschiedenen Hintergründen sind.</strong> Wettbewerbe und Spielerprofile sollten den Jugendschutz beachten, sowie Schimpfwörter, Streitigkeiten und Konflikte vermeiden.",
|
||||
"commGuideList02E": "<strong>Vermeide vulgäre Ausdrücke. Dazu gehören auch mildere, religiöse Ausdrücke, die anderswo möglicherweise akzeptiert werden, oder verschleierte Schimpfwörter</strong>. Unter uns sind Menschen aus allen religiösen und kulturellen Hintergründen und wir wollen, dass sich alle im öffentlichen Raum wohl fühlen. <strong>Wenn Dir ein Moderator oder Mitarbeiter mitteilt, dass ein bestimmter Ausdruck in Habitica nicht erlaubt ist, selbst wenn er Dir vielleicht nicht problematisch vorkommt, ist diese Entscheidung endgültig</strong>. Zusätzlich werden verbale Angriffe jeder Art strenge Konsequenzen haben, da sie auch unsere Nutzungsbedingungen verletzen.",
|
||||
"commGuideList02F": "Vermeide längere Diskussionen über spaltende Themen in der Taverne und wenn sie außerhalb des Themenbereichs liegen. Wenn jemand etwas sagt, das zwar von den Richtlinien her erlaubt ist, das Dich aber verletzt, dann ist es in Ordnung, diese Person höflich darauf hinzuweisen. Wenn Dir eine Person sagt, dass ihr Dein Verhalten unangenehm ist, nimm Dir Zeit, darüber zu reflektieren, anstatt im Zorn zu antworten. Aber wenn Du das Gefühl hast, dass ein Gespräch hitzig, übermäßig emotional, oder verletzend wird, dann <strong>lass dich nicht darauf ein. Melde stattdessen die Beiträge, um uns darüber in Kenntnis zu setzen.</strong> Moderatoren werden so schnell wie möglich antworten. Du kannst auch eine E-Mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> senden und gegebenenfalls Screenshots anhängen.",
|
||||
"commGuideList02G": "<strong>Erfülle alle Mitarbeitenden-Anfragen sofort</strong>. Diese könnten Folgendes beinhalten, ist aber nicht darauf beschränkt: Dich aufzufordern, deine Beiträge in einem bestimmten Bereich zu begrenzen, dein Profil zu bearbeiten, um ungeeignete Inhalte zu entfernen, dich zu bitten, deine Diskussion in einen geeigneteren Bereich zu verschieben, etc. Diskutiere nicht mit Mitarbeitenden. Solltest du mit einer Entscheidung unzufrieden sein, oder anderes Feedback zur Mitarbeitenden haben, sende eine E-mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> um unseren Community Manager zu kontaktieren.",
|
||||
"commGuideList02G": "<strong>Erfülle alle Mitarbeitenden-Anfragen sofort</strong>. Diese könnten Folgendes beinhalten, ist aber nicht darauf beschränkt: Dich aufzufordern, deine Beiträge in einem bestimmten Bereich zu begrenzen, dein Profil zu bearbeiten, um ungeeignete Inhalte zu entfernen, etc. Diskutiere nicht mit Mitarbeitenden. Solltest du mit einer Entscheidung unzufrieden sein, oder anderes Feedback zur Mitarbeitenden haben, sende eine E-mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>, um unseren Community Manager zu kontaktieren.",
|
||||
"commGuideList02J": "<strong>Poste keinen Spam</strong>. Spamming kann Folgendes beinhalten, ist aber nicht beschränkt auf: das Posten desselben Kommentars oder derselben Frage an mehreren Stellen, <strong>das Posten von Links ohne Erklärung oder Kontext</strong>, das Posten unsinniger Nachrichten, das Posten mehrerer Werbebotschaften für eine Gilde, Party, oder Herausforderung, oder das Posten vieler Nachrichten hintereinander. Wenn Du irgendeinen Nutzen daraus ziehst, wenn jemand auf einen Link klickt, musst Du das im Text Deiner Nachricht offenlegen, sonst wird sie auch als Spam betrachtet. Mods können gegebenenfalls nach ihrem Ermessen entscheiden, was Spam ausmacht.",
|
||||
"commGuideList02K": "<strong>Bitte vermeide große Überschriften in öffentlichen Chats, vor allem in der Taverne.</strong> Ähnlich wie bei GROSSBUCHSTABEN liest sich der Text, als ob Du schreien würdest, und beeinträchtigt die gemütliche Atmosphäre.",
|
||||
"commGuideList02L": "<strong>Wir raten Dir dringend davon ab, persönliche Informationen - besonders solche, mit denen Du identifiziert werden könntest - in öffentlichen Chats zu teilen.</strong> Zu den identifizierenden Informationen gehören unter anderem: Deine Adresse, Deine E-Mail-Adresse und Dein API-Token/Passwort. Dies dient nur Deiner Sicherheit! Mitarbeiter oder Moderatoren werden solche Beiträge nach eigenem Ermessen entfernen. Wenn Du nach persönlichen Informationen in einer privaten Gilde, Party oder per PN gefragt wirst, empfehlen wir dringend, dass Du höflich ablehnst und Mitarbeiter und Moderatoren informierst, indem Du entweder 1) den Beitrag über das Fähnchen meldest, oder 2) eine E-Mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> schreibst und Screenshots anhängst.",
|
||||
@@ -130,7 +130,7 @@
|
||||
"commGuideList02M": "Frage nicht nach oder bettle nicht um Edelsteine, Abonnements oder die Mitgliedschaft in Gruppenplänen. Wenn Du ungewollte Nachrichten erhältst, in denen man Dich um bezahlte Artikel fragt, melde sie bitte. Wiederholte Betteleien nach Edelsteinen oder Abonnements, vor allem nachdem bereits eine Warnung ausgesprochen wurde, können zu einer Kontosperre führen.",
|
||||
"commGuideList09D": "Entfernung oder Herabstufung des Mitwirkenden-Ranges",
|
||||
"commGuideList05H": "Schwerwiegende oder wiederholte Versuche, andere Spielende zu betrügen oder zu bedrängen, um an Gegenstände zu kommen, die echtes Geld kosten",
|
||||
"commGuideList02N": "<strong>Markiere und melde Nachrichten, in denen diese Richtlinien oder die Nutzungsbedingungen nicht eingehalten werden.</strong> Wir werden uns so schnell wie möglich darum kümmern. Alternativ kannst du Mitarbeiter:innen über <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> benachrichtigen, doch die Markierung ist der schnellste Weg, um Hilfe zu erhalten.",
|
||||
"commGuideList02N": "<strong>Melde Nachrichten, in denen diese Richtlinien oder die Nutzungsbedingungen nicht eingehalten werden.</strong> Melde eine Nachricht direkt oder informiere Mitarbeiter:innen über <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>, um Verstöße in Profilen oder Wettbewerben zu melden. Wir werden uns schnellstmöglich darum kümmern. Kontaktiere uns in deiner Muttersprache, wenn dir das leichter fällt. Es kann sein, dass wir Google Translate nutzen müssen, aber wir wollen, dass du dich sicher fühlst, uns zu kontaktieren, falls bei dir ein Problem auftreten sollte.",
|
||||
"commGuideList02H": "<strong>Alle Anzeigenamen und @Benutzernamen müssen den Service-Bedingungen entsprechen</strong>. Um deinen Anzeigenamen und/oder @Benutzernamen zu ändern: wähle in der mobilen App Menü > Einstellungen > Account. Auf der Webseite navigierst du über das Benutzer-Icon in der oberen Navigationsleiste.",
|
||||
"commGuideList02I": "<strong>Namen von Herausforderungen sollten für alle Bereiche angemessen sein, weil sie im öffentlichen Profil der Gewinner erscheinen</strong>. Behalte das in Erinnerung beim Erstellen von Herausforderungen, weil wir gezwungen sein könnten, den Eintrag in ihrem Profil zu ändern, falls es eine Meldung gibt.",
|
||||
"commGuideList02P": "<strong>Wir raten davon ab, unaufgefordert private Nachrichten zu verschicken</strong>. Wenn du ungewollt eine Nachricht empfängst, die dir unangenehm ist, oder die gegen diese Richtlinien oder die Nutzungsbedingungen verstößt, sperre bitte den Absender und melde sie, um den Mitarbeiterstab darauf aufmerksam zu machen.",
|
||||
|
||||
@@ -376,5 +376,12 @@
|
||||
"hatchingPotionRoseGold": "Rotgold",
|
||||
"hatchingPotionPinkMarble": "Pink Marmor",
|
||||
"hatchingPotionTeaShop": "Teeladen",
|
||||
"hatchingPotionFungi": "Fungus"
|
||||
"hatchingPotionFungi": "Fungus",
|
||||
"questEggGiraffeMountText": "Giraffe",
|
||||
"questEggChameleonText": "Chamäleon",
|
||||
"questEggChameleonMountText": "Chamäleon",
|
||||
"hatchingPotionKoi": "Koi",
|
||||
"questEggGiraffeText": "Giraffe",
|
||||
"questEggGiraffeAdjective": "eine riesengroße",
|
||||
"questEggChameleonAdjective": "ein chaotisches"
|
||||
}
|
||||
|
||||
@@ -2887,5 +2887,43 @@
|
||||
"armorSpecialFall2023RogueText": "Verfluchter Hexenkessel",
|
||||
"armorSpecialFall2023RogueNotes": "Du wurdest mit dem Versprechen einer schönen, heissen Trinkerei gelockt... der Spaß geht auf deine Kosten! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2023 Herbstausrüstung.",
|
||||
"armorSpecialFall2023WarriorText": "Videorekorder Rüstung",
|
||||
"armorSpecialFall2023WarriorNotes": "Spielt sie DVDs ab? VHS?? Was für Kabel benötigt dieses Ding, um es mit dem TV zu verbinden?! Wie sich herausstellt, ist dies der beängstigendste Aspekt an der Sache. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2023 Sommerausrüstung."
|
||||
"armorSpecialFall2023WarriorNotes": "Spielt sie DVDs ab? VHS?? Was für Kabel benötigt dieses Ding, um es mit dem TV zu verbinden?! Wie sich herausstellt, ist dies der beängstigendste Aspekt an der Sache. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2023 Sommerausrüstung.",
|
||||
"gearItemsCompleted": "Du besitzt alle <%= klass %> Ausrüstungsteile! Neue Ausrüstung wird während den saisonalen Galas veröffentlicht.",
|
||||
"moreArmoireGearAvailable": "Bis dahin kannst du <%= armoireCount %> Ausrüstungsteile im Verzauberten Schrank finden!",
|
||||
"moreArmoireGearComing": "Der Verzauberte Schrank bekommt jeden Monat neuen Vorrat!",
|
||||
"weaponSpecialSummer2024RogueText": "Nacktkiemerschnecke Dreizack",
|
||||
"weaponSpecialSummer2024RogueNotes": "Wende die scharfen Stacheln anderer gegen sie selbst! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
|
||||
"weaponSpecialSummer2024WarriorText": "Walhai-Zahn Schneider",
|
||||
"weaponSpecialSummer2024WarriorNotes": "Einige ausgefallene Haizähne verwandeln dies in eine Waffe, die aus jeder Richtung Schaden verursachen kann. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
|
||||
"weaponSpecialSummer2024HealerText": "Meeresschnecken Stab",
|
||||
"weaponSpecialSummer2024MageText": "Seeanemonen Zauberstab",
|
||||
"weaponSpecialSummer2024MageNotes": "Diese grandiosen Tentakel können Magie gleichzeitig abhalten, ablenken und steuern. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
|
||||
"weaponSpecialSummer2024HealerNotes": "Du wirst erstaunt sein zu entdecken, wie hart die Muschel am Ende des Stabs ist. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
|
||||
"weaponArmoireCorsairsBladeNotes": "Ob du sie zum Plündern oder zum Schutz trägst - du kannst froh sein, daß du diese grimmige Klinge mit dir zur See gebracht hast. Achte nur darauf, daß sie sicher verstaut ist, wenn nicht in Benutzung. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Korsaren Set (Gegenstand 3 von 3)",
|
||||
"weaponArmoireCorsairsBladeText": "Korsarenklinge",
|
||||
"armorSpecialFall2023MageText": "Scharlachrote Hexenmeister Robe",
|
||||
"armorSpecialFall2023MageNotes": "Mit scharlachrotem Garn und goldenen Akzenten ist dieses Outfit ein Wunder für die Sinne. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2023 Herbstausrüstung.",
|
||||
"weaponArmoireRollingPinText": "Wellholz",
|
||||
"weaponArmoireRollingPinNotes": "Rolle deinen Teig zwischendrin so dünn wie du möchtest, während du schlechte Gewohnheiten auf den Kopf haust, sobald sie um dich herum aufploppen, wie bei einem gewissen Nagetier-Kloppen Spiel. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Küchenwerkzeugset 2 (Gegenstand 2 von 2).",
|
||||
"armorSpecialFall2023HealerText": "Sumpfkreatur-Body",
|
||||
"armorSpecialFall2023HealerNotes": "Mit Moos, Fels, Holz und Sumpfwasser reingemischt, ist dieses Outfit manchmal tough und manchmal schwammig (aber immer einschüchternd). Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2023 Herbstausrüstung.",
|
||||
"armorSpecialWinter2024RogueText": "Verschneite Eulen Roben",
|
||||
"armorSpecialWinter2024RogueNotes": "Wuuuuu wer wirst du sein, wenn du diese Roben trägst? In Federn und Flaum gehüllt, wirst du sowohl warm als auch getarnt sein! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2023-2024 Winterausrüstung.",
|
||||
"armorSpecialWinter2024WarriorNotes": "Es stellt sich heraus, daß Schokolade, Pfefferminz und Zuckerguß stabilere Materialien sind, als man denkt. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2023-2024 Winterausrüstung.",
|
||||
"armorSpecialWinter2024WarriorText": "Pfefferminz Plätzchen Rüstung",
|
||||
"armorSpecialWinter2024MageNotes": "Sowohl praktisch als auch hübsch, werden diese Roben dich angenehm warm halten, während du deine magischen Fähigkeiten draußen in der Kälte ausübst. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2023-2024 Winterausrüstung.",
|
||||
"armorSpecialWinter2024MageText": "Narwal Zauberer Roben",
|
||||
"armorSpecialWinter2024HealerText": "Gefrorene Rüstung",
|
||||
"armorSpecialWinter2024HealerNotes": "Dieser glitzernde Block aus magischem Eis ist zumindest schützend, während du deine Flucht ausknobelst. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2023-2024 Winterausrüstung.",
|
||||
"armorSpecialSpring2024RogueNotes": "Diese rustikale Robe verbirgt dich, sogar wenn die Jahreszeiten rings um dich herum wechseln. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2024 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2024RogueText": "Schmelzende Schnee Robe",
|
||||
"armorSpecialSpring2024WarriorText": "Fluorit Rüstung",
|
||||
"armorSpecialSpring2024WarriorNotes": "Diese stabilisierende Steinrüstung wird helfen, dich zu erden, während du alles blendest, dem du entgegentrittst. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2024 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2024MageText": "Hibiskus Roben",
|
||||
"armorSpecialSpring2024MageNotes": "Diese hübschen Blüten werden dir helfen, stilvoll mit deinen Kräften zu posieren. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2024 Frühlingsausrüstung.",
|
||||
"headSpecialSpring2024HealerText": "Blaukehlchen Helm",
|
||||
"armorSpecialSpring2024HealerNotes": "Diese fabelhaften Federn werden helfen, deinen glücklichsten Träumen Flügel zu verleihen. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2024 Frühlingsausrüstung.",
|
||||
"armorSpecialSummer2024RogueText": "Nacktkiemerschnecken-Schwanz",
|
||||
"armorSpecialSummer2024RogueNotes": "Du magst vielleicht eine Seeschnecke ohne Schneckenhaus sein, aber du bist eine Seeschnecke mit See-Schwingen! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
|
||||
"armorSpecialSpring2024HealerText": "Blaukehlchen Anzug"
|
||||
}
|
||||
|
||||
@@ -238,5 +238,6 @@
|
||||
"viewAdminPanel": "Admin Panel anzeigen",
|
||||
"mutePlayer": "Stumm",
|
||||
"skipExternalLinkModal": "Halte STRG (Windows) oder Command (Mac) beim Anklicken eines Links, um dieses Modal zu überspringen.",
|
||||
"shadowMute": "Unsichtbare Stummschaltung"
|
||||
"shadowMute": "Unsichtbare Stummschaltung",
|
||||
"titleCustomizations": "Individualisierungen"
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"tavern": "Tavernen-Chat",
|
||||
"tavernChat": "Tavernen-Chat",
|
||||
"innCheckOutBanner": "Du bist derzeit im Gasthaus eingecheckt. Deine Tagesaufgaben können Dir nicht schaden und Du erzielst keinen Fortschritt bei Deinen Quests.",
|
||||
"innCheckOutBannerShort": "Du bist im Gasthaus eingecheckt.",
|
||||
"innCheckOutBanner": "Du hast derzeit Schaden pausiert. Deine Tagesaufgaben können Dir nicht schaden und Du erzielst keinen Fortschritt bei Deinen Quests.",
|
||||
"innCheckOutBannerShort": "Du hast Schaden derzeit pausiert.",
|
||||
"resumeDamage": "Schaden fortsetzen",
|
||||
"helpfulLinks": "Weiterführende Links",
|
||||
"communityGuidelinesLink": "Community-Richtlinien",
|
||||
@@ -20,7 +20,7 @@
|
||||
"dataTool": "Werkzeug zur Datenanzeige",
|
||||
"resources": "Ressourcen",
|
||||
"communityGuidelines": "Community-Richtlinien",
|
||||
"bannedWordUsed": "Hoppla! Es sieht so aus, als würde dieser Beitrag ein Schimpfwort enthalten, oder sich auf Suchtstoffe oder nicht-jugendfreie Themen beziehen (<%= swearWordsUsed %>). Habitica achtet darauf, unsere Chats frei von diesen Dingen zu halten. Du kannst Deine Nachricht gerne überarbeiten und sie wieder posten! Die betroffenen Wörter musst Du allerdings löschen, nicht einfach zensieren.",
|
||||
"bannedWordUsed": "Hoppla! Es sieht so aus, als würde dieser Beitrag ein Schimpfwort enthalten, oder sich auf Suchtstoffe oder nicht-jugendfreie Themen beziehen (<%= swearWordsUsed %>). Habitica achtet darauf, unsere Chats frei von diesen Dingen zu halten. Du kannst Deine Nachricht gerne überarbeiten und sie wieder posten! Die betroffenen Wörter musst Du allerdings löschen, nicht einfach nur zensieren.",
|
||||
"bannedSlurUsed": "Dein Beitrag enthielt unangebrachte Inhalte, daher wurden Dir Deine Chat-Privilegien entzogen.",
|
||||
"party": "Party",
|
||||
"usernameCopied": "Benutzername in die Zwischenablage kopiert.",
|
||||
@@ -30,8 +30,8 @@
|
||||
"invite": "Einladen",
|
||||
"leave": "Verlassen",
|
||||
"invitedToParty": "Du wurdest in die Party <span class=\"notification-bold\"><%- party %></span> eingeladen",
|
||||
"invitedToPrivateGuild": "Du wurdest eingeladen, der privaten Gilde <span class=\"notification-bold\"><%- guild %></span> beizutreten",
|
||||
"invitedToPublicGuild": "Du wurdest eingeladen, der Gilde <span class=\"notification-bold-blue\"><%- guild %></span> beizutreten",
|
||||
"invitedToPrivateGuild": "Du wurdest eingeladen, der privaten Gruppe<span class=\"notification-bold\"><%- guild %></span> beizutreten",
|
||||
"invitedToPublicGuild": "Du wurdest eingeladen, der Gruppe<span class=\"notification-bold-blue\"><%- guild %></span> beizutreten",
|
||||
"invitationAcceptedHeader": "Deine Einladung wurde angenommen",
|
||||
"invitationAcceptedBody": "<%= username %> hat Deine Einladung zu <%= groupName %> angenommen!",
|
||||
"systemMessage": "Systemmeldung",
|
||||
@@ -57,7 +57,7 @@
|
||||
"createGuild2": "Erstellen",
|
||||
"guild": "Gilde",
|
||||
"guilds": "Gilden",
|
||||
"sureKick": "Willst Du dieses Mitglied wirklich aus der Party/Gilde entfernen?",
|
||||
"sureKick": "Willst Du dieses Mitglied wirklich aus der Party oder Gruppe entfernen?",
|
||||
"optionalMessage": "Optionale Nachricht",
|
||||
"yesRemove": "Ja, entferne sie",
|
||||
"sortBackground": "Nach Hintergrund sortieren",
|
||||
@@ -85,9 +85,9 @@
|
||||
"PMDisabledOptPopoverText": "Private Nachrichten sind deaktiviert. Aktiviere diese Option, damit andere User Dich über Dein Profil erreichen können.",
|
||||
"PMDisabledCaptionTitle": "Private Nachrichten sind deaktiviert",
|
||||
"PMDisabledCaptionText": "Du kannst weiterhin Nachrichten versenden, aber Dir können keine zugeschickt werden.",
|
||||
"block": "Sperren",
|
||||
"unblock": "Entsperren",
|
||||
"blockWarning": "Sperre - Dies hat keine Auswirkung, wenn der Spieler jetzt Moderator ist oder in Zukunft Moderator wird.",
|
||||
"block": "Spieler sperren",
|
||||
"unblock": "Spieler entsperren",
|
||||
"blockWarning": "Dies hat keine Auswirkung, wenn der Spieler ein Administrator ist.",
|
||||
"inbox": "Postfach",
|
||||
"messageRequired": "Eine Nachricht wird benötigt.",
|
||||
"toUserIDRequired": "Eine Benutzer-ID wird benötigt",
|
||||
@@ -98,10 +98,10 @@
|
||||
"badAmountOfGemsToSend": "Die Menge muss zwischen 1 und Deiner aktuellen Edelsteinanzahl liegen.",
|
||||
"report": "Melden",
|
||||
"abuseFlagModalHeading": "Melde einen Verstoß",
|
||||
"abuseFlagModalBody": "Möchtest Du diesen Beitrag wirklich melden? Du solltest <strong>ausschließlich</strong> Beiträge melden, die unsere <%= firstLinkStart %>Community-Richtlinien<%= linkEnd %> und/oder unsere <%= secondLinkStart %>Nutzungsbedingungen<%= linkEnd %> verletzen. Das ungerechtfertigte Melden von Beiträgen stellt eine Verletzung der Community-Richtlinien dar und kann geahndet werden.",
|
||||
"abuseFlagModalBody": "Du solltest <strong>ausschließlich</strong> Beiträge melden, die unsere <%= firstLinkStart %>Community-Richtlinien<%= linkEnd %> und/oder unsere <%= secondLinkStart %>Nutzungsbedingungen<%= linkEnd %> verletzen. Das ungerechtfertigte Melden von Beiträgen stellt eine Verletzung der Community-Richtlinien dar.",
|
||||
"abuseReported": "Danke, dass Du diesen Verstoß gemeldet hast. Die Moderatoren wurden benachrichtigt.",
|
||||
"whyReportingPost": "Wieso meldest Du diesen Post?",
|
||||
"whyReportingPostPlaceholder": "Bitte hilf unseren Moderatoren und gib einen Grund an, warum Du diesen Beitrag als Verstoß gemeldet hast, z.B. Spam, Fluchen, Religiöse Schwüre, Intoleranz, Beleidigungen, Nicht jugendfreie Themen, Gewalt.",
|
||||
"whyReportingPostPlaceholder": "Grund für die Beschwerde",
|
||||
"optional": "Optional",
|
||||
"needsTextPlaceholder": "Gib Deine Nachricht hier ein.",
|
||||
"copyMessageAsToDo": "Nachricht als To-Do übernehmen",
|
||||
@@ -126,7 +126,7 @@
|
||||
"sendGiftMessagePlaceholder": "Füge eine Geschenknachricht hinzu",
|
||||
"sendGiftSubscription": "<%= months %> Monat(e): $<%= price %> USD",
|
||||
"gemGiftsAreOptional": "Bitte nimm zur Kenntnis, dass Habitica niemals von Dir verlangen wird, anderen Spielern Edelsteine zu schenken. Bei anderen Spielern um Edelsteine zu betteln ist ein <strong>Verstoss gegen die Community-Richtlinien</strong>, und jedes Vorkommnis sollte bei <%= hrefTechAssistanceEmail %> gemeldet werden.",
|
||||
"battleWithFriends": "Besiege mit Freunden Monster",
|
||||
"battleWithFriends": "Spiele Habitica zusammen mit anderen",
|
||||
"startAParty": "Erstelle eine Party",
|
||||
"partyUpName": "Party!",
|
||||
"partyOnName": "Riesenparty!",
|
||||
@@ -221,42 +221,42 @@
|
||||
"badAmountOfGemsToPurchase": "Die Anzahl muss mindestens 1 sein.",
|
||||
"groupPolicyCannotGetGems": "Die Regeln einer Gruppe in der Du Mitglied bist verhindern, dass die Gruppenmitglieder Edelsteine erhalten.",
|
||||
"viewParty": "Party ansehen",
|
||||
"newGuildPlaceholder": "Gib den Namen Deiner Gilde ein.",
|
||||
"guildBank": "Gildenbankkonto",
|
||||
"chatPlaceholder": "Füge die Botschaft an Gildenmitglieder hier ein",
|
||||
"newGuildPlaceholder": "Gib den Namen deiner Gruppe ein.",
|
||||
"guildBank": "Bankkonto",
|
||||
"chatPlaceholder": "Füge die Botschaft an Gruppenmitglieder hier ein",
|
||||
"partyChatPlaceholder": "Füge die Botschaft an Partymitglieder hier ein",
|
||||
"fetchRecentMessages": "Neue Nachrichten abrufen",
|
||||
"like": "Like",
|
||||
"liked": "Liked",
|
||||
"inviteToGuild": "In Gilde einladen",
|
||||
"inviteToGuild": "In Gruppe einladen",
|
||||
"inviteToParty": "In die Party einladen",
|
||||
"inviteEmailUsername": "Via E-Mail oder Benutzernamen einladen",
|
||||
"inviteEmailUsernameInfo": "Einladung von Benutzern über eine gültige E-Mailadresse oder Benutzernamen. Wenn eine E-Mail noch nicht registriert ist, werden wir sie einladen, beizutreten.",
|
||||
"emailOrUsernameInvite": "E-Mailadresse oder Benutzername",
|
||||
"messageGuildLeader": "Gildenleiter benachrichtigen",
|
||||
"messageGuildLeader": "Gruppenleiter benachrichtigen",
|
||||
"donateGems": "Edelsteine spenden",
|
||||
"updateGuild": "Gilde aktualisieren",
|
||||
"updateGuild": "Gruppe aktualisieren",
|
||||
"viewMembers": "Mitglieder ansehen",
|
||||
"memberCount": "Anzahl Mitglieder",
|
||||
"recentActivity": "Kürzliche Aktivitäten",
|
||||
"myGuilds": "Meine Gilden",
|
||||
"guildsDiscovery": "Gilden entdecken",
|
||||
"role": "Rolle",
|
||||
"guildLeader": "Gildenleiter",
|
||||
"guildLeader": "Gruppenleiter",
|
||||
"member": "Mitglied",
|
||||
"guildSize": "Gildengröße",
|
||||
"guildSize": "Gruppengröße",
|
||||
"goldTier": "Gold",
|
||||
"silverTier": "Silber",
|
||||
"bronzeTier": "Bronze",
|
||||
"privacySettings": "Datenschutzeinstellungen",
|
||||
"onlyLeaderCreatesChallenges": "Nur der Leiter kann Herausforderungen erstellen",
|
||||
"onlyLeaderCreatesChallengesDetail": "Wenn diese Option ausgewählt ist, können gewöhnliche Gruppenmitglieder keine Herausforderungen für die Gruppe erstellen.",
|
||||
"privateGuild": "Private Gilde",
|
||||
"privateGuild": "Private Gruppe",
|
||||
"charactersRemaining": "<%= characters %> Zeichen übrig",
|
||||
"guildSummary": "Zusammenfassung",
|
||||
"guildSummaryPlaceholder": "Schreibe eine Kurzbeschreibung um Deine Gilde anderen Habiticanern bekannt zu machen. Was ist der Hauptzweck der Gilde und warum sollten Leute ihr beitreten? Verwende hilfreiche Schlüsselwörter in der Beschreibung, um die Suche für andere Habiticaner zu erleichtern!",
|
||||
"guildSummaryPlaceholder": "Schreibe eine Kurzbeschreibung über deine Gruppe.. Was ist der Hauptzweck der Gruppe und was werden die Gruppenmitglieder tun?",
|
||||
"groupDescription": "Beschreibung",
|
||||
"guildDescriptionPlaceholder": "Nutze diesen Abschnitt um alles, was Mitglieder der Gilde über Deine Gilde wissen sollten, ausführlicher darzustellen. Nützliche Tipps, hilfreiche Links und ermutigende Worte gehören hier hin!",
|
||||
"guildDescriptionPlaceholder": "Nutze diesen Abschnitt um alles, was Mitglieder über Deine Gruppe wissen sollten, ausführlicher darzustellen. Nützliche Tipps, hilfreiche Links und ermutigende Worte gehören hier hin!",
|
||||
"markdownFormattingHelp": "[Markdown Formatierungshilfe](https://habitica.fandom.com/wiki/Markdown_Cheat_Sheet)",
|
||||
"partyDescriptionPlaceholder": "Das ist unsere Partybeschreibung. Sie beschreibt, was wir in unserer Party so tun. Wenn Du mehr darüber wissen willst, was wir in unserer Party so machen, lies die Beschreibung. Party on!",
|
||||
"guildGemCostInfo": "Eine Edelstein-Gebühr fördert die Qualität der Gilden und wird der Gildenbank gutgeschrieben.",
|
||||
@@ -265,7 +265,7 @@
|
||||
"noGuildsParagraph2": "Klicke auf den \"Gilden entdecken\"-Reiter, um basierend auf Deinen Interessen empfohlene Gilden zu sehen, stöbere durch Habiticas öffentliche Gilden, oder erstelle Deine eigene Gilde.",
|
||||
"noGuildsMatchFilters": "Wir haben keine passenden Gilden gefunden.",
|
||||
"privateDescription": "Private Gilden werden nicht in Habiticas Gildenübersicht angezeigt. Neue Mitglieder können nur durch eine Einladung hinzugefügt werden.",
|
||||
"removeInvite": "Einladung entfernen",
|
||||
"removeInvite": "Einladung löschen",
|
||||
"removeMember": "Mitglied entfernen",
|
||||
"sendMessage": "Nachricht senden",
|
||||
"promoteToLeader": "Gruppenleitung übertragen",
|
||||
@@ -353,7 +353,7 @@
|
||||
"PMCanNotReply": "Du kannst auf diese Nachricht nicht antworten",
|
||||
"PMUnblockUserToSendMessages": "Entblocke diese Person, um wieder Nachrichten versenden und empfangen zu können.",
|
||||
"PMUserDoesNotReceiveMessages": "Diese Person empfängt keine privaten Nachrichten mehr",
|
||||
"newPartyPlaceholder": "Gib den Namen Deiner Party ein.",
|
||||
"newPartyPlaceholder": "Gib den Namen deiner Party ein.",
|
||||
"chooseTeamMember": "Wähle ein Teammitglied",
|
||||
"unassigned": "Nicht zugewiesen",
|
||||
"claimRewards": "Belohnung einfordern",
|
||||
@@ -362,7 +362,7 @@
|
||||
"managerNotes": "Manager-Notizen",
|
||||
"thisTaskApproved": "Dieser Aufgabe wurde zugestimmt",
|
||||
"onlyPrivateGuildsCanUpgrade": "Nur bei privaten Gilden kann ein Upgrade zu einem Gruppenplan durchgeführt werden.",
|
||||
"bannedWordsAllowedDetail": "Durch Auswahl dieser Option, wird das Verwenden verbotener Wörter in dieser Gilde zugelassen.",
|
||||
"bannedWordsAllowedDetail": "Durch Auswahl dieser Option, wird das Verwenden verbotener Wörter in dieser Gruppe zugelassen.",
|
||||
"bannedWordsAllowed": "Verbotene Wörter zulassen",
|
||||
"languageSettings": "Spracheinstellungen",
|
||||
"cannotRemoveQuestOwner": "Du kannst die Person, welche die aktive Quest besitzt, nicht entfernen. Breche erst die Quest ab.",
|
||||
@@ -372,11 +372,11 @@
|
||||
"blockYourself": "Du kannst Dich nicht selbst blockieren",
|
||||
"invitedToThisQuest": "Du wurdest zu dieser Quest eingeladen!",
|
||||
"messagePartyLeader": "Partyleitung benachrichtigen",
|
||||
"joinGuild": "Gilde beitreten",
|
||||
"joinGuild": "Gruppe beitreten",
|
||||
"joinParty": "Party beitreten",
|
||||
"editGuild": "Gilde bearbeiten",
|
||||
"editGuild": "Gruppe bearbeiten",
|
||||
"editParty": "Party bearbeiten",
|
||||
"leaveGuild": "Gilde verlassen",
|
||||
"leaveGuild": "Gruppe verlassen",
|
||||
"viewDetails": "Details ansehen",
|
||||
"upgradeToGroup": "Auf Gruppenplan upgraden",
|
||||
"sendGiftTotal": "Insgesamt:",
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
"winter2019PyrotechnicSet": "Pyrotechniker (Magier)",
|
||||
"winter2019WinterStarSet": "Winterstern (Heiler)",
|
||||
"winter2019PoinsettiaSet": "Weihnachtsstern (Schurke)",
|
||||
"winterPromoGiftHeader": "VERSCHENK EIN ABO, BEKOMME EINS UMSONST!",
|
||||
"winterPromoGiftHeader": "VERSCHENK EIN ABO, BEKOMME EINS UMSONST!",
|
||||
"winterPromoGiftDetails1": "Nur bis zum 6. Januar: wenn Du jemandem ein Abonnement schenkst, erhältst Du das gleiche Abonnement gratis für Dich!",
|
||||
"winterPromoGiftDetails2": "Bitte bedenke, dass das geschenkte Abonnement, falls Du oder Deine beschenkte Person bereits über ein sich wiederholendes Abonnement verfügen, erst dann startet, wenn das alte Abonnement gekündigt wird oder ausläuft. Herzlichen Dank für Deine Unterstützung! <3",
|
||||
"discountBundle": "Paket",
|
||||
@@ -144,22 +144,22 @@
|
||||
"summer2019WaterLilyMageSet": "Seerose (Magier)",
|
||||
"summer2019ConchHealerSet": "Trompetenschnecke (Heiler)",
|
||||
"summer2019HammerheadRogueSet": "Hammerkopf (Schurke)",
|
||||
"june2018": "Juni 2018",
|
||||
"june2018": "Juni 2018",
|
||||
"fall2019LichSet": "Lich (Heiler)",
|
||||
"september2018": "September 2018",
|
||||
"september2017": "September 2017",
|
||||
"fall2019RavenSet": "Rabe (Krieger)",
|
||||
"fall2019CyclopsSet": "Zyklop (Magier)",
|
||||
"fall2019OperaticSpecterSet": "Opernhaftes Gespenst (Schurke)",
|
||||
"winter2020LanternSet": "Laterne (Schurke)",
|
||||
"winter2020LanternSet": "Laterne (Schurke)",
|
||||
"winter2020WinterSpiceSet": "Wintergewürz (Heiler)",
|
||||
"winter2020CarolOfTheMageSet": "Weihnachtslied des Magiers (Magier)",
|
||||
"winter2020EvergreenSet": "Immergrün (Krieger)",
|
||||
"spring2020BeetleWarriorSet": "Nashornkäfer (Krieger)",
|
||||
"spring2020LapisLazuliRogueSet": "Lapislazuli (Schurke)",
|
||||
"spring2020BeetleWarriorSet": "Nashornkäfer (Krieger)",
|
||||
"spring2020LapisLazuliRogueSet": "Lapislazuli (Schurke)",
|
||||
"spring2020IrisHealerSet": "Iris (Heiler)",
|
||||
"spring2020PuddleMageSet": "Pfütze (Magier)",
|
||||
"summer2020CrocodileRogueSet": "Krokodil (Schurke)",
|
||||
"summer2020CrocodileRogueSet": "Krokodil (Schurke)",
|
||||
"summer2020SeaGlassHealerSet": "Meerglas (Heiler)",
|
||||
"summer2020OarfishMageSet": "Riemenfisch (Magier)",
|
||||
"summer2020RainbowTroutWarriorSet": "Regenbogenforelle (Krieger)",
|
||||
@@ -167,8 +167,8 @@
|
||||
"fall2020ThirdEyeMageSet": "Drittes Auge (Magier)",
|
||||
"fall2020DeathsHeadMothHealerSet": "Totenkopfschwärmer (Heiler)",
|
||||
"fall2020WraithWarriorSet": "Gespenst (Krieger)",
|
||||
"royalPurpleJackolantern": "Purpurne Kürbislaterne",
|
||||
"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 Habiticaner 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.",
|
||||
"royalPurpleJackolantern": "Purpurne Kürbislaterne",
|
||||
"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 Habiticaner 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 Benutzernamen 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",
|
||||
@@ -196,15 +196,15 @@
|
||||
"winter2022StockingWarriorSet": "Strumpf (Krieger)",
|
||||
"winter2022IceCrystalHealerSet": "Eiskristall (Heiler)",
|
||||
"winter2022PomegranateMageSet": "Granatapfel (Magier)",
|
||||
"spring2022MagpieRogueSet": "Elster (Schurke)",
|
||||
"spring2022MagpieRogueSet": "Elster (Schurke)",
|
||||
"spring2022RainstormWarriorSet": "Gewitterregen (Krieger)",
|
||||
"spring2022ForsythiaMageSet": "Forsythie (Magier)",
|
||||
"spring2022PeridotHealerSet": "Abendsmaragd (Heiler)",
|
||||
"summer2022WaterspoutWarriorSet": "Wasserspeier (Krieger)",
|
||||
"summer2022WaterspoutWarriorSet": "Wasserspeier (Krieger)",
|
||||
"summer2022AngelfishHealerSet": "Kaiserfisch (Heiler)",
|
||||
"summer2022CrabRogueSet": "Krabbe (Schurke)",
|
||||
"summer2022CrabRogueSet": "Krabbe (Schurke)",
|
||||
"summer2022MantaRayMageSet": "Mantarochen (Magier)",
|
||||
"fall2022KappaRogueSet": "Kappa (Schurke)",
|
||||
"fall2022KappaRogueSet": "Kappa (Schurke)",
|
||||
"fall2022OrcWarriorSet": "Ork (Krieger)",
|
||||
"fall2022HarpyMageSet": "Harpyie (Magier)",
|
||||
"fall2022WatcherHealerSet": "Beobachter (Heiler)",
|
||||
@@ -213,7 +213,7 @@
|
||||
"winter2023WalrusWarriorSet": "Walross (Krieger)",
|
||||
"winter2023FairyLightsMageSet": "Feenlichter (Magier)",
|
||||
"winter2023CardinalHealerSet": "Kardinal (Heiler)",
|
||||
"anniversaryLimitedDates": "30. Januar bis 8. Februar",
|
||||
"anniversaryLimitedDates": "30. Januar bis 8. Februar",
|
||||
"limitedEvent": "Limitiertes Event",
|
||||
"winter2023RibbonRogueSet": "Schleife (Schurke)",
|
||||
"spring2024MeltingSnowRogueSet": "Schmelzendes Schnee Set (Schurke)",
|
||||
@@ -261,5 +261,9 @@
|
||||
"fourForFreeText": "Um die Party am Laufen zu halten, verschenken wir Party Gewänder, 20 Edelsteine, und eine limitierte Geburtstags-Hintergrund Ausgabe und ein Gegenstände Set, das ein Cape, ein Schulterstück und eine Augenmaske enthält.",
|
||||
"partyRobes": "Party Gewänder",
|
||||
"twentyGems": "20 Edelsteine",
|
||||
"dayOne": "Tag 1"
|
||||
"dayOne": "Tag 1",
|
||||
"summer2024WhaleSharkWarriorSet": "Walhai Set (Krieger)",
|
||||
"summer2024SeaAnemoneMageSet": "Seeanemonen Set (Magier)",
|
||||
"summer2024SeaSnailHealerSet": "Meeresschnecken Set (Heiler)",
|
||||
"summer2024NudibranchRogueSet": "Nacktkiemerschnecken Set (Schurke)"
|
||||
}
|
||||
|
||||
@@ -135,5 +135,7 @@
|
||||
"helpSupportHabitica": "Hilf Habitica zu unterstützen",
|
||||
"groupsPaymentSubBilling": "Dein nächstes Rechnungsdatum ist <strong><%= renewalDate %></strong>.",
|
||||
"groupsPaymentAutoRenew": "Dieses Abonnement läuft automatisch weiter, bis es gekündigt wird. Du kannst es im Gruppen-Abrechnungs-Tab kündigen.",
|
||||
"sellItems": "Items verkaufen"
|
||||
"sellItems": "Items verkaufen",
|
||||
"customizationsShopText": "Willst du deinen Style ändern? Hier bist du richtig! Wir haben die frischesten Looks, passend zur Saison, auf Lager.",
|
||||
"notAvailable": "Dieser Gegenstand ist nicht verfügbar."
|
||||
}
|
||||
|
||||
@@ -115,5 +115,6 @@
|
||||
"notEnoughFood": "Du hast nicht genug Futter",
|
||||
"invalidAmount": "Ungültige Menge Futter, positiver Integer benötigt",
|
||||
"jubilantGryphatrice": "Jubelnder Greifatrice",
|
||||
"veteranDragon": "Veterandrache"
|
||||
"veteranDragon": "Veterandrache",
|
||||
"veteranCactus": "Veterankaktus"
|
||||
}
|
||||
|
||||
@@ -772,5 +772,11 @@
|
||||
"questFungiDropFungiPotion": "Pilz Schlüpfelixier",
|
||||
"questFungiUnlockText": "Schaltet den Kauf von Pilz Schlüpfelixieren auf dem Marktplatz frei.",
|
||||
"questFungiNotes": "Es war ein verregneter Frühling in Habitica und der Boden um die Ställe ist schwammig und feucht. Du bemerkst, dass einige Pilze entlang den hölzernen Stallwänden und Zäunen aufgetaucht sind. Nebel hängt in der Luft, der die Sonne nicht so richtig durchscheinen lässt, und es fühlt sich ein wenig entmutigend an.<br><br>Durch den Nebel siehst du die Umrisse des April-Scherzkekses, der nicht so hüpfig ist wie sonst.<br><br>\"Ich hatte gehofft, euch allen ein paar köstliche Magische Pilz Schlüpfelixiere zu bringen, so dass ihr eure Pilzfreunde für immer von meinem Ehrentag fernhalten könnt,\" sagt er mit einem bedenklich ernsten Gesichtsausdruck. \"Aber dieser kalte Nebel macht mir echt zu schaffen, er lässt mich zu müde und trübselig fühlen, um meine gewohnte Magie zu wirken.\"<br><br>\"Oh nein, tut mir leid, das zu hören,\" sagst du, und bemerkst deine eigene, zunehmend düstere Stimmung. \"Dieser Nebel macht den Tag wirklich bedrückend. Ich frage mich, woher er kommt...\"<br><br>Ein tiefes Grollen ertönt über die Felder, und du siehst einen Umriss aus dem Nebel erscheinen. Erschrocken siehst du eine riesengroß und unglücklich aussehende Pilzkreatur, von welcher der Nebel auszuströmen scheint.<br><br>\"Aha,\" sagt der Scherzkeks, \"ich denke, dieser pilzige Kerl könnte der Ursprung unserer Niedergeschlagenheit sein. Lasst uns schauen, ob wir ein bisschen Freude für unseren Freund hier und für uns selbst herbeirufen können.\"",
|
||||
"questFungiCompletion": "Du und der April-Scherzkeks schaut einander mit einem Ausdruck der Erleichterung an, als sich der Pilz in den Wald zurückzieht.<br><br>\"Ah,\" ruft der Scherzkeks aus, \"das war eine wahre myzelische Melancholie. Ich bin froh, daß wir seine Laune verbessern konnten, und unsere eigene auch! Ich spüre meine Energie zurückkehren. Komm mit mir, und wir bringen zusammen diese Pilz Elixiere auf die Beine.\""
|
||||
"questFungiCompletion": "Du und der April-Scherzkeks schaut einander mit einem Ausdruck der Erleichterung an, als sich der Pilz in den Wald zurückzieht.<br><br>\"Ah,\" ruft der Scherzkeks aus, \"das war eine wahre myzelische Melancholie. Ich bin froh, daß wir seine Laune verbessern konnten, und unsere eigene auch! Ich spüre meine Energie zurückkehren. Komm mit mir, und wir bringen zusammen diese Pilz Elixiere auf die Beine.\"",
|
||||
"QuestGiraffeUnlockText": "Schält Giraffe Ei zum Kauf im Marktplatz frei.",
|
||||
"questChameleonText": "Das chaotische Chamäleon",
|
||||
"questChameleonBoss": "Chaotisches Chamäleon",
|
||||
"questChameleonDropChameleonEgg": "Chamäleon (Ei)",
|
||||
"QuestChameleonUnlockText": "Schält Chamäleon Eier zum Kauf im Marktplatz frei",
|
||||
"questGiraffeDropGiraffeEgg": "Giraffe (Ei)"
|
||||
}
|
||||
|
||||
@@ -240,5 +240,6 @@
|
||||
"mysterySet202303": "Mähniges Hauptfigur Set",
|
||||
"mysterySet202403": "Glückliches Legenden Set",
|
||||
"mysterySet202405": "Vergoldetes Drachen Set",
|
||||
"mysterySet202406": "Phantom-Seeräuber Set"
|
||||
"mysterySet202406": "Phantom-Seeräuber Set",
|
||||
"mysterySet202407": "Liebenswertes Axolotl Set"
|
||||
}
|
||||
|
||||
@@ -987,6 +987,10 @@
|
||||
"backgroundRiverBottomText": "River Bottom",
|
||||
"backgroundRiverBottomNotes": "Explore a River Bottom.",
|
||||
|
||||
"backgrounds082024": "SET 123: Released August 2024",
|
||||
"backgroundSavannaText": "Hazy Grasslands",
|
||||
"backgroundSavannaNotes": "Hike through Hazy Grasslands.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -259,6 +259,10 @@
|
||||
"questEggChameleonMountText": "Chameleon",
|
||||
"questEggChameleonAdjective": "a chaotic",
|
||||
|
||||
"questEggCrabText": "Crab",
|
||||
"questEggCrabMountText": "Crab",
|
||||
"questEggCrabAdjective": "a fiddling",
|
||||
|
||||
"eggNotes": "Find a hatching potion to pour on this egg, and it will hatch into <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
|
||||
|
||||
"hatchingPotionBase": "Base",
|
||||
|
||||
@@ -3,25 +3,35 @@
|
||||
"2b43f6": "Blue",
|
||||
"6bd049": "Green",
|
||||
"800ed0": "Purple",
|
||||
"98461a": "Skin Tone 6",
|
||||
"915533": "Skin Tone 1",
|
||||
"98461a": "Skin Tone 6",
|
||||
"allCustomizationsOwned": "You own all of these items. You can try them on by <a href=''>customizing your avatar</a>.",
|
||||
"allEquipmentOwned": "You own all of these items. You can find them in your <a href='/inventory/equipment'>Equipment</a>. Be sure to check back later for next month's options!",
|
||||
"aurora": "Aurora",
|
||||
"bear": "Bear",
|
||||
"black": "Black",
|
||||
"blond": "Blond",
|
||||
"blue": "Blue",
|
||||
"blueEarrings": "Blue Earrings",
|
||||
"blueFlower": "Blue Flower",
|
||||
"blunt": "Blunt",
|
||||
"braid": "Braid",
|
||||
"broad": "Broad",
|
||||
"brown": "Brown",
|
||||
"c06534": "Skin Tone 5",
|
||||
"c3e1dc": "Cyan",
|
||||
"cactus": "Cactus",
|
||||
"candycane": "Candy Cane",
|
||||
"candycorn": "Candy Corn",
|
||||
"checkNextMonth": "Be sure to check back later for next month's options!",
|
||||
"checkNextSeason": "Be sure to check back later for next season's options!",
|
||||
"clownfish": "Clownfish",
|
||||
"convict": "Referee",
|
||||
"cross": "Cross",
|
||||
"curly": "Curly",
|
||||
"curlyLong": "Curly Long",
|
||||
"curlyShort": "Curly Short",
|
||||
"customizationsNPC": "Felicitus Fennec",
|
||||
"d7a9f7": "Lavender",
|
||||
"dapper": "Dapper",
|
||||
"ddc994": "Skin Tone 2",
|
||||
@@ -43,18 +53,31 @@
|
||||
"ghost": "Ghost",
|
||||
"ghostwhite": "Ghost White",
|
||||
"goatee": "Goatee",
|
||||
"goldEarringLeft": "Gold Earring Left",
|
||||
"goldEarringRight": "Gold Earring Right",
|
||||
"goldEarrings": "Gold Earrings",
|
||||
"green": "Green",
|
||||
"greenEarrings": "Green Earrings",
|
||||
"greenFlower": "Green Flower",
|
||||
"halloween": "Halloween",
|
||||
"handleless_black": "Black Handleless",
|
||||
"handleless_blue": "Blue Handleless",
|
||||
"handleless_green": "Green Handleless",
|
||||
"handleless_pink": "Pink Handleless",
|
||||
"handleless_red": "Red Handleless",
|
||||
"handleless_yellow": "Yellow Handleless",
|
||||
"highPonytailLeft": "High Ponytail Left",
|
||||
"highPonytailRight": "High Ponytail Right",
|
||||
"holly": "Holly",
|
||||
"hollygreen": "Holly Green",
|
||||
"hoopEarrings": "Hoop Earrings",
|
||||
"horizon": "Horizon",
|
||||
"largeMustache": "Large Mustache",
|
||||
"lava": "Lava",
|
||||
"leftBun": "Left Bun",
|
||||
"lion": "Lion",
|
||||
"longBeard": "Long Beard",
|
||||
"lookingForMore": "Looking for more?",
|
||||
"merblue": "Merblue",
|
||||
"mergold": "Mergold",
|
||||
"mergreen": "Mergreen",
|
||||
@@ -63,8 +86,10 @@
|
||||
"midnight": "Midnight",
|
||||
"mohawk": "Mohawk",
|
||||
"monster": "Monster",
|
||||
"noItemsOwned": "You don't own any of these items",
|
||||
"ocean": "Ocean",
|
||||
"ogre": "Ogre",
|
||||
"orangeFlower": "Orange Flower",
|
||||
"orchid": "Orchid",
|
||||
"panda": "Panda",
|
||||
"pastelBlue": "Pastel Blue",
|
||||
@@ -81,6 +106,9 @@
|
||||
"pgreen": "Special Pastel Green",
|
||||
"pgreen2": "Pastel Green",
|
||||
"pig": "Pig",
|
||||
"pink": "Pink",
|
||||
"pinkEarrings": "Pink Earrings",
|
||||
"pinkFlower": "Pink Flower",
|
||||
"polar": "Polar",
|
||||
"ponytail": "Ponytail",
|
||||
"porange": "Special Pastel Orange",
|
||||
@@ -92,11 +120,14 @@
|
||||
"pumpkin": "Pumpkin",
|
||||
"pumpkin2": "Jack O' Lantern",
|
||||
"purple": "Purple",
|
||||
"purpleEarrings": "Purple Earrings",
|
||||
"purpleFlower": "Purple Flower",
|
||||
"pyellow": "Special Pastel Yellow",
|
||||
"pyellow2": "Pastel Yellow",
|
||||
"rainbow": "Rainbow",
|
||||
"red": "Red",
|
||||
"redblue": "Red and Blue",
|
||||
"redEarrings": "Red Earrings",
|
||||
"reptile": "Reptile",
|
||||
"rightBun": "Right Bun",
|
||||
"sandnsea": "Sand 'n' Sea",
|
||||
@@ -105,8 +136,10 @@
|
||||
"shadow2": "Shade",
|
||||
"shark": "Shark",
|
||||
"shortBeard": "Short Beard",
|
||||
"sideswept": "Sideswept",
|
||||
"skeleton": "Skeleton",
|
||||
"skeleton2": "Bones",
|
||||
"slim": "Slim",
|
||||
"smallMustache": "Small Mustache",
|
||||
"snowy": "Snowy",
|
||||
"straightLong": "Straight Long",
|
||||
@@ -121,21 +154,17 @@
|
||||
"tropicalwater": "Tropical Water",
|
||||
"TRUred": "Crimson",
|
||||
"updo": "Updo",
|
||||
"visitCustomizationsShop": "Head over to the <a href='/shops/customizations'>Customizations Shop</a> to browse the many ways you can customize your avatar!",
|
||||
"wavyLong": "Wavy Long",
|
||||
"wavyShort": "Wavy Short",
|
||||
"white": "White",
|
||||
"whiteEarrings": "White Earrings",
|
||||
"winternight": "Winter Night",
|
||||
"winterstar": "Winter Star",
|
||||
"wispy": "Wispy",
|
||||
"wolf": "Wolf",
|
||||
"yellow": "Yellow",
|
||||
"yellowFlower": "Yellow Flower",
|
||||
"zombie": "Zombie",
|
||||
"zombie2": "Undead",
|
||||
"allCustomizationsOwned": "You own all of these items. You can try them on by <a href=''>customizing your avatar</a>.",
|
||||
"checkNextMonth": "Be sure to check back later for next month's options!",
|
||||
"checkNextSeason": "Be sure to check back later for next season's options!",
|
||||
"noItemsOwned": "You don't own any of these items",
|
||||
"visitCustomizationsShop": "Head over to the <a href='/shops/customizations'>Customizations Shop</a> to browse the many ways you can customize your avatar!",
|
||||
"lookingForMore": "Looking for more?",
|
||||
"allEquipmentOwned": "You own all of these items. You can find them in your <a href='/inventory/equipment'>Equipment</a>. Be sure to check back later for next month's options!",
|
||||
"customizationsNPC": "Felicitus Fennec"
|
||||
"zombie2": "Undead"
|
||||
}
|
||||
@@ -562,6 +562,8 @@
|
||||
"weaponMystery202403Notes": "Carrying the biggest sword around is surely a way to create your own luck! Confers no benefit. March 2024 Subscriber Item.",
|
||||
"weaponMystery202404Text": "Mycelial Magus Staff",
|
||||
"weaponMystery202404Notes": "This staff will bestow upon you an ancient wisdom as ageless as the rocks and trees. Confers no benefit. April 2024 Subscriber Item.",
|
||||
"weaponMystery202408Text": "Arcane Aegis",
|
||||
"weaponMystery202408Notes": "A magic bubble shield that protects you from enemy spells or helps you float in the air or water. Confers no benefit. August 2024 Subscriber Item.",
|
||||
|
||||
"weaponMystery301404Text": "Steampunk Cane",
|
||||
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
|
||||
@@ -772,6 +774,8 @@
|
||||
"weaponArmoireShadyBeachUmbrellaNotes": "The shade of this rainbow-colored umbrella conceals you briefly from the day star and any unwanted bothers. Increases Perception by <%= per %>. Enchanted Armoire: Beachside Set (Item 3 of 4).",
|
||||
"weaponArmoireCorsairsBladeText": "Corsair’s Blade",
|
||||
"weaponArmoireCorsairsBladeNotes": "Whether you wield it to plunder or to protect, you can be glad you brought this fierce blade to sea with you. Just be sure to stow it safely when not in use. Increases Strength by <%= str %>. Enchanted Armoire: Corsair Set (Item 3 of 3)",
|
||||
"weaponArmoireDragonKnightsLanceText": "Dragon Knight Lance",
|
||||
"weaponArmoireDragonKnightsLanceNotes": "This red and silver lance has unseated many opponents from their mounts. Increases Constitution by <%= con %>. Enchanted Armoire: Dragon Knight Set (Item 3 of 3)",
|
||||
|
||||
"armor": "armor",
|
||||
"armorCapitalized": "Armor",
|
||||
@@ -1622,6 +1626,8 @@
|
||||
"armorArmoireBlueStripedSwimsuitNotes": "What could be more exciting than battling sea monsters on the beach? Increases Constitution by <%= con %>. Enchanted Armoire: Beachside Set (Item 2 of 4).",
|
||||
"armorArmoireCorsairsCoatAndCapeText": "Corsair’s Coat and Cape",
|
||||
"armorArmoireCorsairsCoatAndCapeNotes": "Whether you’re biding your time on the docks or watching for danger on the open seas, these will surely keep you feeling dry and looking dramatic. Just keep your balance on deck. Increases Constitution by <%= con %>. Enchanted Armoire: Corsair Set (Item 1 of 3)",
|
||||
"armorArmoireDragonKnightsArmorText": "Dragon Knight Armor",
|
||||
"armorArmoireDragonKnightsArmorNotes": "Channel the strength and power of a dragon with this armor made of silver and shed scales. Increases Strength by <%= str %>. Enchanted Armoire: Dragon Knight Set (Item 2 of 3)",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -2485,6 +2491,8 @@
|
||||
"headArmoirePottersBandanaNotes": "Look the part and keep your hair out of your face while you work. It’s a win-win! Increases Intelligence by <%= int %>. Enchanted Armoire: Potter Set (Item 2 of 4).",
|
||||
"headArmoireCorsairsBandanaText": "Corsair’s Bandana",
|
||||
"headArmoireCorsairsBandanaNotes": "Whether you’re keeping your head covered in case a seagull flies overhead or making sure your foes never see you sweat, this bandana is essential. Just add a decorative bead for every adventure you complete. Increases Intelligence by <%= int %>. Enchanted Armoire: Corsair Set (Item 2 of 3)",
|
||||
"headArmoireDragonKnightsHelmText": "Dragon Knight Helm",
|
||||
"headArmoireDragonKnightsHelmNotes": "With the fiery features on this helmet, dragons might mistake you for one of their own. Increases Intelligence by <%= int %>. Enchanted Armoire: Dragon Knight Set (Item 1 of 3)",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
@@ -2783,6 +2791,8 @@
|
||||
"shieldMystery202011Notes": "Harness the power of the autumn wind with this staff. Use for arcane magic or to make awesome leaf piles, the choice is yours! Confers no benefit. November 2020 Subscriber Item.",
|
||||
"shieldMystery202209Text": "Mound o' Magic Books",
|
||||
"shieldMystery202209Notes": "Building your sorcery knowledge takes a lot of reading, but you're sure to enjoy your education. Confers no benefit. September 2022 Subscriber Item.",
|
||||
"shieldMystery202408Text": "Arcane Sparkles",
|
||||
"shieldMystery202408Notes": "Magic lights will illuminate the inside of your bubble hideout, or anywhere else you need a little light! Confers no benefit. August 2024 Subscriber Item.",
|
||||
"shieldMystery301405Text": "Clock Shield",
|
||||
"shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.",
|
||||
"shieldMystery301704Text": "Fluttery Fan",
|
||||
|
||||
@@ -576,7 +576,7 @@
|
||||
"questMayhemMistiflying3DropWeapon": "Roguish Rainbow Message (Main-Hand Item)",
|
||||
|
||||
"featheredFriendsText": "Feathered Friends Quest Bundle",
|
||||
"featheredFriendsNotes": "Contains 'Help! Harpy!', 'The Night-Owl', and 'The Birds of Preycrastination'.",
|
||||
"featheredFriendsNotes": "Contains Quests to obtain Owl, Parrot, and Hawk Pet eggs: The Night-Owl, Help! Harpy!, and The Birds of Preycrastination.",
|
||||
|
||||
"questNudibranchText": "Infestation of the NowDo Nudibranchs",
|
||||
"questNudibranchNotes": "You finally get around to checking your To Do's on a lazy day in Habitica. Bright against your deepest red tasks are a gaggle of vibrant blue sea slugs. You are entranced! Their sapphire colors make your most intimidating tasks look as easy as your best Habits. In a feverish stupor you get to work, tackling one task after the other in a ceaseless frenzy...<br><br>The next thing you know, @LilithofAlfheim is pouring cold water over you. “The NowDo Nudibranchs have been stinging you all over! You need to take a break!”<br><br>Shocked, you see that your skin is as bright red as your To Do list was. \"Being productive is one thing,\" @beffymaroo says, \"but you've also got to take care of yourself. Hurry, let's get rid of them!\"",
|
||||
@@ -586,7 +586,7 @@
|
||||
"questNudibranchUnlockText": "Unlocks Nudibranch Eggs for purchase in the Market",
|
||||
|
||||
"splashyPalsText": "Splashy Pals Quest Bundle",
|
||||
"splashyPalsNotes": "Contains 'The Dilatory Derby', 'Guide the Turtle', and 'Wail of the Whale'.",
|
||||
"splashyPalsNotes": "Contains Quests to obtain Turtle, Whale, and Seahorse Pet eggs: Guide the Turtle, Wail of the Whale, and The Dilatory Derby.",
|
||||
|
||||
"questHippoText": "What a Hippo-Crite",
|
||||
"questHippoNotes": "You and @awesomekitty collapse into the shade of a palm tree, exhausted. The sun beats down over the Sloensteadi Savannah, scorching the ground below. It’s been a productive day so far, conquering your Dailies, and this oasis looks like a nice place to take a break and refresh. Stooping near the water to get a drink, you stumble back in shock as a massive hippopotamus rises. “Resting so soon? Don’t be so lazy, get back to work.” You try and protest that you’ve been working hard and need a break, but the hippo isn’t having any of it.<br><br>@khdarkwolf whispers to you, “Notice how it’s lounging around all day but has the nerve to call you lazy? It’s the Hippo-Crite!”<br><br>Your friend @jumorales nods. “Let’s show it what hard work looks like!”",
|
||||
@@ -596,10 +596,10 @@
|
||||
"questHippoUnlockText": "Unlocks Hippo Eggs for purchase in the Market",
|
||||
|
||||
"farmFriendsText": "Farm Friends Quest Bundle",
|
||||
"farmFriendsNotes": "Contains 'The Mootant Cow', 'Ride the Night-Mare', and 'The Thunder Ram'.",
|
||||
"farmFriendsNotes": "Contains Quests to obtain Horse, Sheep, and Cow Pet eggs: Ride the Night-Mare, The Thunder Ram, and The Mootant Cow.",
|
||||
|
||||
"witchyFamiliarsText": "Witchy Familiars Quest Bundle",
|
||||
"witchyFamiliarsNotes": "Contains 'The Rat King', 'The Icy Arachnid', and 'Swamp of the Clutter Frog'.",
|
||||
"witchyFamiliarsNotes": "Contains Quests to obtain Frog, Spider, and Rat Pet eggs: Swamp of the Clutter Frog, The Icy Arachnid, and The Rat King.",
|
||||
|
||||
"questGroupLostMasterclasser": "Mystery of the Masterclassers",
|
||||
"questUnlockLostMasterclasser": "To unlock this quest, complete the final quests of these quest chains: 'Dilatory Distress', 'Mayhem in Mistiflying', 'Stoïkalm Calamity', and 'Terror in the Taskwoods'.",
|
||||
@@ -650,7 +650,7 @@
|
||||
"questYarnUnlockText": "Unlocks Yarn Eggs for purchase in the Market",
|
||||
|
||||
"winterQuestsText": "Winter Quest Bundle",
|
||||
"winterQuestsNotes": "Contains 'Trapper Santa', 'Find the Cub', and 'The Fowl Frost'. Note that Trapper Santa and Find the Cub have stackable quest achievements but give a rare pet and mount that can only be obtained once each.",
|
||||
"winterQuestsNotes": "Contains Quests to obtain the Polar Bear Pet, the Polar Bear Mount, and Penguin Pet eggs: Find the Cub, Trapper Santa, and The Fowl Frost.",
|
||||
|
||||
"questPterodactylText": "The Pterror-dactyl",
|
||||
"questPterodactylNotes": "You're taking a stroll along the peaceful Stoïkalm Cliffs when an evil screech rends the air. You turn to find a hideous creature flying towards you and are overcome by a powerful terror. As you turn to flee, @Lilith of Alfheim grabs you. \"Don't panic! It's just a Pterror-dactyl.\"<br><br>@Procyon P nods. \"They nest nearby, but they're attracted to the scent of negative Habits and undone Dailies.\"<br><br>\"Don't worry,\" @Katy133 says. \"We just need to be extra productive to defeat it!\" You are filled with a renewed sense of purpose and turn to face your foe.",
|
||||
@@ -689,7 +689,7 @@
|
||||
"dysheartenerArtCredit": "Artwork by @AnnDeLune",
|
||||
|
||||
"hugabugText": "Hug a Bug Quest Bundle",
|
||||
"hugabugNotes": "Contains 'The CRITICAL BUG', 'The Snail of Drudgery Sludge', and 'Bye, Bye, Butterfry'.",
|
||||
"hugabugNotes": "Contains Quests to obtain Beetle, Caterpillar, and Snail Pet eggs: The CRITICAL BUG, Bye Bye Butterfry, and The Snail of Drudgery Sludge.",
|
||||
|
||||
"questSquirrelText": "The Sneaky Squirrel",
|
||||
"questSquirrelNotes": "You wake up and find you’ve overslept! Why didn’t your alarm go off? … How did an acorn get stuck in the ringer?<br><br>When you try to make breakfast, the toaster is stuffed with acorns. When you go to retrieve your mount, @Shtut is there, trying unsuccessfully to unlock their stable. They look into the keyhole. “Is that an acorn in there?”<br><br>@randomdaisy cries out, “Oh no! I knew my pet squirrels had gotten out, but I didn’t know they’d made such trouble! Can you help me round them up before they make any more of a mess?”<br><br>Following the trail of mischievously placed oak nuts, you track and catch the wayward sciurines, with @Cantras helping secure each one safely at home. But just when you think your task is almost complete, an acorn bounces off your helm! You look up to see a mighty beast of a squirrel, crouched in defense of a prodigious pile of seeds.<br><br>“Oh dear,” says @randomdaisy, softly. “She’s always been something of a resource guarder. We’ll have to proceed very carefully!” You circle up with your party, ready for trouble!",
|
||||
@@ -699,10 +699,10 @@
|
||||
"questSquirrelUnlockText": "Unlocks Squirrel Eggs for purchase in the Market",
|
||||
|
||||
"cuddleBuddiesText": "Cuddle Buddies Quest Bundle",
|
||||
"cuddleBuddiesNotes": "Contains 'The Killer Bunny', 'The Nefarious Ferret', and 'The Guinea Pig Gang'.",
|
||||
"cuddleBuddiesNotes": "Contains Quests to obtain Rabbit, Ferret, and Guinea Pig Pet eggs: The Killer Bunny, The Nefarious Ferret, and The Guinea Pig Gang.",
|
||||
|
||||
"aquaticAmigosText": "Aquatic Amigos Quest Bundle",
|
||||
"aquaticAmigosNotes": "Contains 'The Magical Axolotl', 'The Kraken of Inkomplete', and 'The Call of Octothulu'.",
|
||||
"aquaticAmigosNotes": "Contains Quests to obtain Cuttlefish, Octopus, and Axolotl Pet eggs: The Kraken of Inkomplete, The Call of Octothulu, and The Magical Axolotl.",
|
||||
|
||||
"questSeaSerpentText": "Danger in the Depths: Sea Serpent Strike!",
|
||||
"questSeaSerpentNotes": "Your streaks have you feeling lucky—it’s the perfect time for a trip to the seahorse racetrack. You board the submarine at Diligent Docks and settle in for the trip to Dilatory, but you’ve barely submerged when an impact rocks the sub, sending its occupants tumbling. “What’s going on?” @AriesFaries shouts.<br><br>You glance through a nearby porthole and are shocked by the wall of shimmering scales passing by it. “Sea serpent!” Captain @Witticaster calls through the intercom. “Brace yourselves, it’s coming ‘round again!” As you grip the arms of your seat, your unfinished tasks flash before your eyes. ‘Maybe if we work together and complete them,’ you think, ‘we can drive this monster away!’",
|
||||
@@ -719,7 +719,7 @@
|
||||
"questKangarooUnlockText": "Unlocks Kangaroo Eggs for purchase in the Market",
|
||||
|
||||
"forestFriendsText": "Forest Friends Quest Bundle",
|
||||
"forestFriendsNotes": "Contains 'The Spirit of Spring', 'The Hedgebeast', and 'The Tangle Tree'.",
|
||||
"forestFriendsNotes": "Contains Quests to obtain Treeling, Deer, and Hedgehog Pet eggs: The Tangle Tree, The Spirit of Spring, and The Hedgebeast.",
|
||||
|
||||
"questAlligatorText": "The Insta-Gator",
|
||||
"questAlligatorNotes": "“Crikey!” exclaims @gully. “An Insta-Gator in its natural habitat! Careful, it distracts its prey with things that seem urgent THIS INSTANT, and it feeds on the unchecked Dailies that result.” You fall silent to avoid attracting its attention, but to no avail. The Insta-Gator spots you and charges! Distracting voices rise up from Swamps of Stagnation, grabbing for your attention: “Read this post! See this photo! Pay attention to me THIS INSTANT!” You scramble to mount a counterattack, completing your Dailies and bolstering your good Habits to fight off the dreaded Insta-Gator.",
|
||||
@@ -729,10 +729,10 @@
|
||||
"questAlligatorUnlockText": "Unlocks Alligator Eggs for purchase in the Market",
|
||||
|
||||
"oddballsText": "Oddballs Quest Bundle",
|
||||
"oddballsNotes": "Contains 'The Jelly Regent', 'Escape the Cave Creature', and 'A Tangled Yarn'.",
|
||||
"oddballsNotes": "Contains Quests to obtain Slime, Yarn, and Rock Pet eggs: The Jelly Regent, A Tangled Yarn, and Escape the Cave Creature.",
|
||||
|
||||
"birdBuddiesText": "Bird Buddies Quest Bundle",
|
||||
"birdBuddiesNotes": "Contains 'The Fowl Frost', 'Rooster Rampage', and 'The Push-and-Pull Peacock'.",
|
||||
"birdBuddiesNotes": "Contains Quests to obtain Peacock, Penguin, and Rooster Pet eggs: The Push-and-Pull Peacock, The Fowl Frost, and Rooster Rampage.",
|
||||
|
||||
"questVelociraptorText": "The Veloci-Rapper",
|
||||
"questVelociraptorNotes": "You’re sharing honey cakes with @*~Seraphina~*, @Procyon P, and @Lilith of Alfheim by a lake in the Stoïkalm Steppes. Suddenly, a mournful voice interrupts your picnic.<br><br><em>My Habits took a hit, I missed my Dailies,<br>I’m losing it, sinking with doubt and maybes,<br>At the top of my game I used to be so fly,<br>But now I just let my Due Dates go by.</em><br><br>@*~Seraphina~* peers behind a stand of grass. “It’s the Veloci-Rapper. It seems... distraught?”<br><br>You pump a fist in determination. “There's only one thing to do. Rap battle time!”",
|
||||
@@ -742,7 +742,7 @@
|
||||
"questVelociraptorUnlockText": "Unlocks Velociraptor Eggs for purchase in the Market",
|
||||
|
||||
"mythicalMarvelsText": "Mythical Marvels Quest Bundle",
|
||||
"mythicalMarvelsNotes": "Contains 'Convincing the Unicorn Queen', 'The Fiery Gryphon', and 'Danger in the Depths: Sea Serpent Strike!'",
|
||||
"mythicalMarvelsNotes": "Contains Quests to obtain Unicorn, Gryphon, and Sea Serpent Pet eggs: Convincing the Unicorn Queen, The Fiery Gryphon, and Danger in the Depths: Sea Serpent Strike!",
|
||||
|
||||
"questBronzeText": "Brazen Beetle Battle",
|
||||
"questBronzeNotes": "On a refreshing break between tasks, you and some friends take a stroll through the forest trails of the Taskwoods. You come upon a large hollow log and a sparkle from inside catches your attention.<br><br>Why, it's a cache of Magic Hatching Potions! The shimmering bronze liquid swirls gently in the bottles, and @Hachiseiko reaches to pick one up to examine it.<br><br>“Halt!” hisses a voice from behind you. It's a gigantic beetle with a carapace of gleaming bronze, raising her clawed feet in a fighting stance. “Those are my potions, and if you wish to earn them, you must prove yourself in a gentlefolks' duel!”",
|
||||
@@ -777,10 +777,10 @@
|
||||
"questRobotUnlockText": "Unlocks purchasable Robot Eggs in the Market",
|
||||
|
||||
"rockingReptilesText": "Rocking Reptiles Quest Bundle",
|
||||
"rockingReptilesNotes": "Contains 'The Insta-Gator', 'The Serpent of Distraction', and 'The Veloci-Rapper'.",
|
||||
"rockingReptilesNotes": "Contains Quests to obtain Alligator, Velociraptor, and Snake Pet eggs: The Insta-Gator, The Veloci-Rapper, and The Serpent of Distraction.",
|
||||
|
||||
"delightfulDinosText": "Delightful Dinos Quest Bundle",
|
||||
"delightfulDinosNotes": "Contains 'The Pterror-dactyl', 'The Trampling Triceratops', and 'The Dinosaur Unearthed'.",
|
||||
"delightfulDinosNotes": "Contains Quests to obtain Triceratops, T-Rex, and Pterodactyl Pet eggs: The Trampling Triceratops, The Dinosaur Unearthed, and The Pterror-dactyl.",
|
||||
|
||||
"questAmberText": "The Amber Alliance",
|
||||
"questAmberNotes": "You’re sitting in the Tavern with @beffymaroo and @-Tyr- when @Vikte bursts through the door and excitedly tells you about the rumors of another type of Magic Hatching Potion hidden in the Taskwoods. Having completed your Dailies, the three of you immediately agree to help @Vikte on their search. After all, what’s the harm in a little adventure?<br><br>After walking through the Taskwoods for hours, you’re beginning to regret joining such a wild chase. You’re about to head home, when you hear a surprised yelp and turn to see a huge lizard with shiny amber scales coiled around a tree, clutching @Vikte in her claws. @beffymaroo reaches for her sword.<br><br>“Wait!” cries @-Tyr-. “It’s the Trerezin! She’s not dangerous, just dangerously clingy!”",
|
||||
@@ -809,7 +809,7 @@
|
||||
"questWaffleUnlockText": "Unlocks Confection Hatching Potions for purchase in the Market",
|
||||
|
||||
"jungleBuddiesText": "Jungle Buddies Quest Bundle",
|
||||
"jungleBuddiesNotes": "Contains 'Monstrous Mandrill and the Mischief Monkeys', 'The Somnolent Sloth', and 'The Tangle Tree'.",
|
||||
"jungleBuddiesNotes": "Contains Quests to obtain Monkey, Treeling, and Sloth Pet eggs: Monstrous Mandrill and the Mischief Monkeys, The Tangle Tree, and The Somnolent Sloth.",
|
||||
|
||||
"questFluoriteText": "A Bright Fluorite Fright",
|
||||
"questFluoriteNotes": "Unusual minerals are in high demand these days, so you and a few friends have trekked deep into the mines of the Meandering Mountains, in search of exciting ores. It’s a long and boring expedition, until @-Tyr- stumbles over a large rock, sitting right in the middle of the tunnel.<br><br>“This should help brighten things up,” says @nirbhao, before conjuring up an orb of light.<br><br>A warm brightness fills the tunnel, but something odd starts happening to that large rock. Feeding on the magical light, it begins to glow with fluorescent blues, greens and purples. Then it rears upright into a vaguely humanoid shape, complete with glowing red eyes fixed right on you! You jump into action with flashing spells and shining weapons.",
|
||||
@@ -835,7 +835,7 @@
|
||||
"questTurquoiseUnlockText": "Unlocks Turquoise Hatching Potions for purchase in the Market",
|
||||
|
||||
"sandySidekicksText": "Sandy Sidekicks Quest Bundle",
|
||||
"sandySidekicksNotes": "Contains 'The Indulgent Armadillo', 'The Serpent of Distraction', and 'The Icy Arachnid'.",
|
||||
"sandySidekicksNotes": "Contains Quests to obtain Spider, Armadillo, and Snake Pet eggs: The Icy Arachnid, The Indulgent Armadillo, and The Serpent of Distraction.",
|
||||
|
||||
"questBlackPearlText": "A Startling Starry Idea",
|
||||
"questBlackPearlNotes": "You’ve been feeling uninspired lately, so when @jjgame83 suggests a trip to Lively Lake, you jump at the chance for a change of scenery. As @QuartzFox lays out a picnic on the shore, you find something glinting in the shallows. A strange black pearl.<br><br>“I wish I had a new idea,” you sigh.<br><br>A chill washes over the shore. The lake turns to black ink. The stars rise as noon becomes midnight in a heartbeat.<br><br>“Those aren’t good signs,” says @PixelStormArt.<br><br>A towering mass of arms bursts from the lake in a spray of foam, and from its beak, it booms: “BEHOLD ASTEROIDEA, THE IDEA FROM BEYOND THE STARS!”<br><br>A tentacle slams down onto the picnic basket. Good idea or not, you leap into action.",
|
||||
@@ -887,21 +887,31 @@
|
||||
"questPinkMarbleRageDescription": "This bar fills when you don't complete your Dailies. When it is full, Cupido will take away some of your party's pending damage!",
|
||||
"questPinkMarbleRageEffect": "`Cupido uses Pink Punch!` That wasn't affectionate at all! Your partymates are taken aback. Pending damage reduced.",
|
||||
"questPinkMarbleDropPinkMarblePotion": "Pink Marble Hatching Potion",
|
||||
"QuestPinkMarbleUnlockText": "Unlocks Pink Marble Hatching Potions for purchase in the Market.",
|
||||
"questPinkMarbleUnlockText": "Unlocks Pink Marble Hatching Potions for purchase in the Market.",
|
||||
|
||||
"questGiraffeText": "The Gear-affe",
|
||||
"questGiraffeNotes": "You’re strolling across the tall grass of the Sloenstedi Savannah, enjoying a nice walk in nature as a break from your tasks. As you pass through the rolling landscape, you notice a collection of items in the distance. It’s a pile of musical instruments, art supplies, electronic equipment, and more! You venture near for a better look.<br><br>“Hey, what do you think you’re doing?” yells a voice from behind an acacia. A tall and imposing giraffe emerges, wearing a fancy pair of shades. a guitar, and a fancy camera around its long neck. “This is all my gear, be careful and don’t touch anything!”<br><br>You notice dust on many of the items. “Wow, you sure have a lot of hobbies!” you say. “Can you show me some art or play me a tune?”<br><br>The giraffe’s face falls as he looks at all his supplies. “I have so much of this stuff but don’t know where to begin! Why don't you give me some of your motivation so I can have the productive energy I need to finally get started!”",
|
||||
"questGiraffeCompletion": "After helping the Gear-Affe with some basic organization of his stash, you’re both feeling more energized and upbeat!<br><br>He grabs his guitar and a book of beginner exercises and strums a few notes. “It feels good to take a step in the right direction, even a small one. Thanks for helping me out! Take these, I hear you have a stash of pets and these fellas could be a nice addition!”",
|
||||
"questGiraffeBoss": "Gear-affe",
|
||||
"questGiraffeDropGiraffeEgg": "Giraffe (Egg)",
|
||||
"QuestGiraffeUnlockText": "Unlocks Giraffe Eggs for purchase in the Market.",
|
||||
"questGiraffeUnlockText": "Unlocks Giraffe Eggs for purchase in the Market.",
|
||||
|
||||
"questChameleonText": "The Chaotic Chameleon",
|
||||
"questChameleonNotes": "It’s a beautiful day in a warm, rainy corner of the Taskwoods. You’re on the hunt for new additions to your leaf collection when a branch in front of you changes color without warning! Then it moves!<br><br>Stumbling backwards, you realize this is not a branch at all, but a huge chameleon! Each part of his body keeps changing colors as his eyes dart in different directions.<br><br>“Are you all right?” you ask the chameleon.<br><br>“Ahhh, well,” he says, looking a little flustered. “I’ve been trying to blend in… but it’s so overwhelming… the colors keep coming and going! It’s hard to focus on just one....”<br><br>“Aha,” you say, “I think I can help. We’ll sharpen your focus with a little challenge! Get your colors ready!”<br><br>“You’re on!” replied the chameleon.",
|
||||
"questChameleonCompletion": "After a few lively turns the Chameleon went through every color of the rainbow, perfectly matching each color you requested.<br><br>“Wow,” he says, “working together and making it into a game really helped me concentrate! Please take these as a reward, you’re earned them! Teach these little guys how to change all the colors of the rainbow when they hatch.”",
|
||||
"questChameleonBoss": "Chaotic Chameleon",
|
||||
"questChameleonDropChameleonEgg": "Chameleon (Egg)",
|
||||
"QuestChameleonUnlockText": "Unlocks Chameleon Eggs for purchase in the Market",
|
||||
"questChameleonUnlockText": "Unlocks Chameleon Eggs for purchase in the Market",
|
||||
|
||||
"questCrabText": "The Fiddling Crab",
|
||||
"questCrabNotes": "It’s a warm sunny morning, and you’re enjoying a visit to the beach to catch up on some of the books on your summer reading list. You’re startled when you nearly step on a shiny crystal near a shallow hole in the sand.<br><br>“Ey, watch where you’re goin’! I’m makin’ a burrow here!” says a voice. A surprisingly large crab with a decorative shell runs out in front of your toes, snapping her claw as she speaks.<br><br>“Hm, is this a burrow?” you ask, looking at the shallow depression. There are shells and crystals arranged around it, but it’s not much in the way of a hiding place.<br><br>The crab stammers. \"Ey, this is a judgment free zone! I'm gettin' to it, I'm gettin' to it... I just got caught up on decorating. Sometimes a crab's gotta fiddle,\" she says, adjusting a shell.<br><br>\"Why don't you lend a claw and help if you've got some big ideas on what a burrow should look like?\"",
|
||||
"questCrabCompletion": "You and the crab figure out how to work together to get everything in just the right place, ending up with a fine sandy burrow. The crab happily nestles in.<br><br>\"Thank ya!\" she says, making herself comfy. \"Now this is a hole that's made just for me. I can finally enjoy all my perfectly placed decorations. Here, take these lil guys as a token of my appreciation. It's an offer you can't refuse!\"",
|
||||
"questCrabBoss": "Fiddling Crab",
|
||||
"questCrabRageTitle": "Distracting Fiddling",
|
||||
"questCrabRageDescription": "This bar fills when you don't complete your Dailies. When it's full, the Fiddling Crab will take away some of your party's MP!",
|
||||
"questCrabRageEffect": "The Fiddling Crab distracts you with decorating, slowing your work on digging and draining some of your magic. The party's MP is reduced!",
|
||||
"questCrabDropCrabEgg": "Crab (Egg)",
|
||||
"questCrabUnlockText": "Unlocks Crab Eggs for purchase in the Market.",
|
||||
|
||||
"questFungiText": "The Moody Mushroom",
|
||||
"questFungiNotes": "It’s been a rainy spring in Habitica and the ground around the stables is spongy and damp. You notice quite a few mushrooms have appeared along the wooden stable walls and fences. There’s a fog hanging about, not quite letting the sun peek through, and it’s a bit dispiriting.<br><br>Out of the mist you see the outline of the April Fool, not at all his usual bouncy self.<br><br>”I’d hoped to bring you all some delightful Fungi Magic Hatching Potions so that you can keep your mushroom friends from my special day forever,” he says, his expression alarmingly unsmiling. “But this cold fog is really getting to me, it’s making me feel too tired and dismal to work my usual magic.”<br><br>“Oh no, sorry to hear that,” you say, noticing your own increasingly somber mood. “This fog is really making the day gloomy. I wonder where it came from…”<br><br>A low rumble sounds across the fields, and you see an outline emerging from the mist. You’re alarmed to see a gigantic and unhappy looking mushroom creature, and the mist appears to be emanating from it.<br><br>“Aha,” says the Fool, “I think this fungal fellow may be the source of our blues. Let’s see if we can summon a little cheer for our friend here and ourselves.”",
|
||||
|
||||
@@ -164,6 +164,7 @@
|
||||
"mysterySet202405": "Gilded Dragon Set",
|
||||
"mysterySet202406": "Phantom Buccaneer Set",
|
||||
"mysterySet202407": "Amiable Axolotl Set",
|
||||
"mysterySet202408": "Arcane Aegis Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
|
||||
@@ -55,5 +55,9 @@
|
||||
"iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
|
||||
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
|
||||
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help.",
|
||||
"general": "General"
|
||||
"general": "General",
|
||||
"commonQuestions": "Common Questions",
|
||||
"faqQuestion25": "What are the different task types?",
|
||||
"webFaqAnswer25": "Habitica uses three different task types to accommodate your needs: Habits, Dailies, and To Do’s.\n\nHabits can be positive or negative and represent something you may want to track multiple times per day, or on an unset schedule. Positive Habits will provide you with rewards, like Gold and Experience (Exp), while Negative Habits will cause you to lose health points (HP).\n\nDailies are repeated tasks you want to complete on a more structured schedule. E.g. Once per day, three times a week, or four times a month. Missing Dailies causes you to lose HP, but the more difficult they are, the better the rewards!\n\nTo Do’s are one-off tasks that provide rewards after you complete them. To Do’s can have a due date, but you won’t lose HP if you miss it.\n\nPick the task type that best fits what you want to achieve!",
|
||||
"faqQuestion26": "What are some sample tasks?"
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
"showAllAchievements": "Mostrar todo <%= category %>",
|
||||
"onboardingCompleteDesc": "Has ganado <strong>5 logros</strong> y <strong class=\"gold-amount\">100 de oro</strong> por completar la lista.",
|
||||
"earnedAchievement": "¡Has conseguido un logro!",
|
||||
"viewAchievements": "Ver logros",
|
||||
"viewAchievements": "Ver Logros",
|
||||
"letsGetStarted": "¡Comencemos!",
|
||||
"onboardingProgress": "<%= percentage %> % de progreso",
|
||||
"gettingStartedDesc": "¡Completa estas tareas de incorporación y ganarás <strong>5 logros</strong> y <strong class=\"gold-amount\">100 de oro</strong> una vez hayas terminado!",
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
"backgroundStormyRooftopsNotes": "Deslízate a través del Tempestuoso Techo.",
|
||||
"backgroundWindyAutumnText": "Otoño Ventoso",
|
||||
"backgroundWindyAutumnNotes": "Caza las hojas durante el Otoño Ventoso.",
|
||||
"incentiveBackgrounds": "Conjunto de fondos lisos",
|
||||
"incentiveBackgrounds": "Fondos Estándar",
|
||||
"backgroundVioletText": "violeta",
|
||||
"backgroundVioletNotes": "Un vibrante fondo violeta.",
|
||||
"backgroundBlueText": "Azul",
|
||||
@@ -867,5 +867,15 @@
|
||||
"backgroundMaypoleText": "Palo de Mayo",
|
||||
"backgroundMaypoleNotes": "Baila alrededor de un divertido Palo de Mayo.",
|
||||
"backgroundPottersStudioText": "Taller de Alfarero",
|
||||
"backgroundPottersStudioNotes": "Crea arte en el Taller de Alfarero."
|
||||
"backgroundPottersStudioNotes": "Crea arte en el Taller de Alfarero.",
|
||||
"backgrounds062024": "CONJUNTO 121: Publicado en Junio 2024",
|
||||
"backgroundShellGateText": "Cancela de Concha",
|
||||
"backgrounds072024": "CONJUNTO 122: Publicado en Julio 2024",
|
||||
"backgroundShellGateNotes": "Pasa a través de la decoración coralina de la Cancela de Concha.",
|
||||
"monthlyBackgrounds": "Fondos Mensuales",
|
||||
"backgrounds082024": "CONJUNTO 123: Publicado en Agosto 2024",
|
||||
"backgroundSavannaNotes": "Camina a través de estos Pastizales con Bruma.",
|
||||
"backgroundSavannaText": "Pastizales con Bruma",
|
||||
"backgroundRiverBottomText": "Fondo del Río",
|
||||
"backgroundRiverBottomNotes": "Explora el fondo del río."
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"communityGuidelinesWarning": "Por favor, ten en cuenta que tu Nombre de Usuario, foto de perfil y biografía deben cumplir con las <a href='https://habitica.com/static/community-guidelines' target='_blank'>Normas de la Comunidad</a> (por ejemplo, no se permite lenguaje grosero, temas adultos, insultos, etc.) Si tienes preguntas acerca de qué es o no apropiado, no dudes en enviar un email a <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"profile": "Perfil",
|
||||
"avatar": "Personalizar personaje",
|
||||
"editAvatar": "Editar personaje",
|
||||
"editAvatar": "Personalizar tu Avatar",
|
||||
"noDescription": "Este habiticano no ha añadido una descripción.",
|
||||
"noPhoto": "Este habiticano no ha añadido una foto.",
|
||||
"other": "Otro",
|
||||
@@ -189,5 +189,10 @@
|
||||
"notEnoughGold": "No hay suficiente Oro.",
|
||||
"chatCastSpellPartyTimes": "<%= username %> lanza <%= spell %> para el equipo <%= times %> veces.",
|
||||
"chatCastSpellUserTimes": "<%= username %> lanza <%= spell %> sobre <%= target %> <%= times %> veces.",
|
||||
"nextReward": "Próxima recompensa de Registro"
|
||||
"nextReward": "Próxima recompensa de Registro",
|
||||
"titleFacialHair": "Vello Facial",
|
||||
"titleHaircolor": "Colores de Pelo",
|
||||
"titleHairbase": "Estilos de Peinado",
|
||||
"customizations": "Personalizaciones",
|
||||
"skins": "Pieles"
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"hatchingPotionGlow": "que brilla en la oscuridad",
|
||||
"hatchingPotionFrost": "Escarcha",
|
||||
"hatchingPotionIcySnow": "Nieve Glacial",
|
||||
"hatchingPotionNotes": "Vierte esto en un huevo y eclosionará como una mascota <%= potText(locale) %>.",
|
||||
"hatchingPotionNotes": "Vierte esto en un huevo y eclosionará como una Mascota <%= potText(locale) %>.",
|
||||
"premiumPotionAddlNotes": "No puede usarse en huevos de Mascotas de Misiones. Disponible para su compra hasta <%= date(locale) %>.",
|
||||
"foodMeat": "Carne",
|
||||
"foodMeatThe": "La Carne",
|
||||
@@ -351,7 +351,7 @@
|
||||
"questEggRobotAdjective": "un futurista",
|
||||
"questEggRobotMountText": "Robot",
|
||||
"questEggRobotText": "Robot",
|
||||
"premiumPotionUnlimitedNotes": "No puede usarse en huevos de Mascotas de Misiones.",
|
||||
"premiumPotionUnlimitedNotes": "No puede usarse en huevos de Mascota de Misiones.",
|
||||
"hatchingPotionAmber": "Ámbar",
|
||||
"hatchingPotionAurora": "Aurora",
|
||||
"hatchingPotionBirchBark": "Corteza de abedul",
|
||||
@@ -376,5 +376,15 @@
|
||||
"hatchingPotionPinkMarble": "Mármol Rosa",
|
||||
"hatchingPotionTeaShop": "Tetería",
|
||||
"hatchingPotionRoseGold": "Oro Rosa",
|
||||
"hatchingPotionFungi": "Setas"
|
||||
"hatchingPotionFungi": "Setas",
|
||||
"questEggGiraffeMountText": "Jirafa",
|
||||
"questEggGiraffeAdjective": "una imponente",
|
||||
"questEggChameleonText": "Camaleón",
|
||||
"questEggChameleonMountText": "Camaleón",
|
||||
"questEggChameleonAdjective": "del Caos",
|
||||
"hatchingPotionKoi": "Koi",
|
||||
"questEggGiraffeText": "Jirafa",
|
||||
"questEggCrabText": "Cangrejo",
|
||||
"questEggCrabMountText": "Cangrejo",
|
||||
"questEggCrabAdjective": "Trivial"
|
||||
}
|
||||
|
||||
@@ -3138,5 +3138,56 @@
|
||||
"armorArmoireBlueStripedSwimsuitText": "Clásico Bañador de Rallas Azules",
|
||||
"headMystery202406Notes": "Las fantasmales plumas que adornan este sombrero brillan pálidamente, recuerdan las espectrales olas del mar de la desesperación. No otorga ningún beneficio. Artículo de Suscriptor Junio 2024.",
|
||||
"headMystery202406Text": "Sombrero de Bucanero Fantasmal",
|
||||
"shieldArmoireBuoyantBeachBallText": "Balón de Playa"
|
||||
"shieldArmoireBuoyantBeachBallText": "Balón de Playa",
|
||||
"weaponSpecialSummer2024RogueNotes": "¡Devuelve sus afilados aguijones en contra de ellos! Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"weaponSpecialSummer2024WarriorNotes": "Algunos de estos dientes de tiburón perdidos son transformados en una poderosa arma capaz de causar daño en cualquier dirección. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"armorSpecialSummer2024HealerNotes": "Ni caso a tus detractores. ¡Algo lento pero firme es la forma más válida de abordar las tareas! Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"headSpecialSummer2024RogueNotes": "Este yelmo apretado con esa especie de tentáculo tipo cuerno, por increíble que parezca, te ayuda a esconderte para que puedas golpear cuando y como tu decidas. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"headSpecialSummer2024MageNotes": "Este sombrero se mece suavemente en las corrientes del océano a la vez que te asiste para canalizar tu gran sabiduría. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"headArmoireCorsairsBandanaNotes": "Este pañuelo badana es esencial ya sea que desees mantener tu cabeza protegida de alguna gaviota que volando sobre ella suelte la carga o por que no quieras que la tripulación vea que estas sudando nerviosamente y decida amotinarse. Eso si, añade una cuenta decorativa cada vez que completes una de tus aventuras. Aumenta la Inteligencia en <%= int %>. Armario Encantado: Conjunto de Corsario (Artículo 2 de 3)",
|
||||
"shieldSpecialSummer2024WarriorNotes": "Jajaja, para todos aquellos que dicen que no eres capaz de alcanzar tus objetivos, mirad: ¡decídselo a mi mano, quiero decir, jeje, aleta! Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"gearItemsCompleted": "¡Ya tienes todo el equipamiento de <%= klass %>! Se publicará nuevo equipamiento en las Galas estaciónales.",
|
||||
"moreArmoireGearAvailable": "¡Hasta entonces, hay aún <%= armoireCount %> piezas de equipamiento que puedes encontrar en el Armario Encantado!",
|
||||
"moreArmoireGearComing": "¡También en el Armario Encantado tienes nuevos objetos cada mes!",
|
||||
"weaponSpecialSummer2024RogueText": "Tridente de Nudibranquio",
|
||||
"weaponSpecialSummer2024MageText": "Varita de Anémona de Mar",
|
||||
"weaponSpecialSummer2024MageNotes": "Estos tentáculos terroríficos poseen la habilidad de disipar, desviar y dirigir la magia indistintamente. Aumenta la inteligencia en <%= int %> y la percepción en <%= per %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"weaponSpecialSummer2024HealerNotes": "Jeje, te va a sorprender gratamente descubrir lo duro que es el caparazón que remata este bastón. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"weaponSpecialSummer2024HealerText": "Bastón Caracol Marino",
|
||||
"weaponSpecialSummer2024WarriorText": "Rebanadora Diente de Tiburón-Ballena",
|
||||
"weaponArmoireCorsairsBladeText": "Cuchilla de Corsario",
|
||||
"weaponArmoireCorsairsBladeNotes": "Ya sea que uses esta poderosa cuchilla para saquear o para proteger, puedes estar satisfecho de haberla traído desde tierra contigo. Eso si, a bordo de este galeón asegúrate de guardarla en un sitio seguro mientras no la uses. Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto de Corsario (Artículo 3 de 3)",
|
||||
"armorSpecialSummer2024RogueText": "Cola de Nudibranquio",
|
||||
"armorSpecialSummer2024RogueNotes": "Puede que seas un gusano marino sin caparazón, ¡pero eres un gusano con alas marinas! Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"armorSpecialSummer2024WarriorText": "Cola de Tiburón-Ballena",
|
||||
"armorSpecialSummer2024WarriorNotes": "Después de completar tu transformación en un auténtico Guerrero Tiburón-Ballena, ¡nada valientemente hacia la batalla contra tus tareas! Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"armorSpecialSummer2024MageText": "Cola de Anémona de Mar",
|
||||
"armorSpecialSummer2024MageNotes": "¡Dile a tu enemigo que vaya con cuidadito de enfadar a una anémona! (Ahora diles que repitan eso mismo cinco veces más rápido) Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"armorSpecialSummer2024HealerText": "Armadura de Caracol Marino",
|
||||
"armorMystery202407Text": "Vestido de Ajolote Afable",
|
||||
"armorMystery202407Notes": "¡Deslízate por lagos y canales con tu amplia cola rosa! No otorga ningún beneficio. Artículo de Suscriptor Julio 2024.",
|
||||
"armorArmoireCorsairsCoatAndCapeText": "Casaca y Capa de Corsario",
|
||||
"armorArmoireCorsairsCoatAndCapeNotes": "Ya sea que estes echando una ojeada por los muelles esperando tu momento o lanzándote de cabeza al peligro en mar abierto, estos ropajes te mantendrán seco y con un porte imponente. Ahora solo queda que mantengas el equilibrio cuando estes en cubierta para no resbalar y perder toda dignidad. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto de Corsario (Artículo 1 de 3)",
|
||||
"headSpecialSummer2024RogueText": "Yelmo de Nudibranquio",
|
||||
"headSpecialSummer2024WarriorText": "Casco Tiburón-Ballena",
|
||||
"headSpecialSummer2024WarriorNotes": "Divide esas difíciles tareas en dos con este útil timón. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"headSpecialSummer2024MageText": "Sombrero de Anémona Marina",
|
||||
"headSpecialSummer2024HealerText": "Caparazón de Caracol Marino",
|
||||
"headSpecialSummer2024HealerNotes": "La hermosa espiral de este caparazón te recuerda constantemente que no debes caer en la espiral y perder el control. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"headMystery202407Text": "Capucha de Ajolote Afable",
|
||||
"headMystery202407Notes": "¡Te confiere branquias mágicas para que puedas respirar bajo de agua! No otorga ningún beneficio. Artículo de Suscriptor Julio 2024.",
|
||||
"headArmoireCorsairsBandanaText": "Pañuelo Badana de Corsario",
|
||||
"shieldSpecialSummer2024WarriorText": "Aleta de Tiburón-Ballena",
|
||||
"shieldSpecialSummer2024HealerText": "Escudo de Caracol Marino",
|
||||
"shieldSpecialSummer2024HealerNotes": "Este escudo pulido es más duro aún que tu bastón de Caracol Marino así que tela. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Verano 2024.",
|
||||
"weaponMystery202408Text": "Égida Arcana",
|
||||
"weaponArmoireDragonKnightsLanceText": "Lanza de Caballero Dragón",
|
||||
"weaponArmoireDragonKnightsLanceNotes": "Esta lanza roja y plateada ha arrojado de sus monturas a innumerables oponentes. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto de Caballero Dragón (Artículo 3 de 3)",
|
||||
"armorArmoireDragonKnightsArmorText": "Armadura de placas Caballero de Dragón",
|
||||
"armorArmoireDragonKnightsArmorNotes": "Hecha con escamas de dragón unidas con presillas de mithril esta armadura te permite canalizar la fuerza y el poder de un dragón. Aumenta la Fuerza en <%= str %>. Armario Encantado: Conjunto de Caballero Dragón (Artículo 2 de 3)",
|
||||
"headArmoireDragonKnightsHelmText": "Yelmo Caballero Dragón",
|
||||
"headArmoireDragonKnightsHelmNotes": "Con las resplandecientes llamas que emanan del aura de poder que desprende este yelmo, cualquier dragón podría confundirte con uno de ellos. Aumenta la Inteligencia en <%= int %>. Armario Encantado: Conjunto de Caballero Dragón (Artículo 1 de 3)",
|
||||
"shieldMystery202408Text": "Destellos Arcanos",
|
||||
"shieldMystery202408Notes": "¡Está luz mágica te iluminará y guiará ya sea que te adentres en la oscuridad de Cirith Ungol o en el cubil de Ella-Laraña! No otorga ningún beneficio. Artículo de Suscriptor Agosto 2024.",
|
||||
"weaponMystery202408Notes": "Una esfera de poder que te protege de los hechizos dirigidos de tus enemigos o te ayuda a levitar en el aire o flotar en el agua. No otorga ningún beneficio. Artículo de Suscriptor Agosto 2024."
|
||||
}
|
||||
|
||||
@@ -223,5 +223,21 @@
|
||||
"questionDescriptionText": "Puedes enviar tus preguntas en tu idioma materno si no te sientes cómodo hablando en inglés.",
|
||||
"questionPlaceholder": "Haz tu pregunta aquí",
|
||||
"askQuestionHeaderDescribe": "¿Eres nuevo en Habitica y no sabes lo que haces?¿Eres veterano pero no consigues descubrir cómo se usa alguna de las funciones? Rellena este formulario y nuestro equipo se pondrá en contacto contigo.",
|
||||
"submitQuestion": "Enviar pregunta"
|
||||
"submitQuestion": "Enviar pregunta",
|
||||
"general": "General",
|
||||
"allNotifications": "Todas las Notificaciones",
|
||||
"blockPlayer": "Bloquear un Jugador",
|
||||
"unblockPlayer": "Desbloquear un Jugador",
|
||||
"adminTools": "Herramientas de Administrador",
|
||||
"mutePlayer": "Silenciar",
|
||||
"shadowMute": "Sombrear Silenciado",
|
||||
"banPlayer": "Restringir un Jugador",
|
||||
"unbanPlayer": "Permitir Jugador",
|
||||
"bannedPlayer": "Este jugador está restringido.",
|
||||
"whyReportingPlayerPlaceholder": "Motivos del informe",
|
||||
"titleCustomizations": "Personalizaciones",
|
||||
"whyReportingPlayer": "¿Por qué informas acerca de este jugador?",
|
||||
"reportPlayer": "Informar acerca de un Jugador",
|
||||
"viewAdminPanel": "Ver Comandos de Administrador",
|
||||
"playerReportModalBody": "Solo deberías informar de un jugador que de alguna forma quebrantara las <%= firstLinkStart %>Normas de la Comunidad<%= linkEnd %> y/o <%= secondLinkStart %>los Terminos de Servicio<%= linkEnd %>. Enviar un informe falso es una clara violación de la Normas de la Comunidad de Habitica."
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
"winter2019PyrotechnicSet": "Pirotécnico (Mago)",
|
||||
"winter2019WinterStarSet": "Estrella Invernal (Sanador)",
|
||||
"winter2019PoinsettiaSet": "Flor de Navidad (Pícaro)",
|
||||
"winterPromoGiftHeader": "¡REGALA UNA SUSCRIPCIÓN, RECIBE OTRA GRATIS!",
|
||||
"winterPromoGiftHeader": "¡REGALA UNA SUSCRIPCIÓN, RECIBE OTRA GRATIS!",
|
||||
"winterPromoGiftDetails1": "Solo hasta el 6 de enero, cuando regales una suscripción a alguien, ¡obtienes la misma suscripción gratis!",
|
||||
"winterPromoGiftDetails2": "Por favor, ten en cuenta que si tú o la persona que recibe el regalo ya tenéis una suscripción recurrente, la suscripción regalada solo empezará después de que esa suscripción sea cancelada o haya expirado. ¡Muchas gracias por tu apoyo! <3",
|
||||
"discountBundle": "Lote",
|
||||
@@ -143,7 +143,7 @@
|
||||
"september2018": "Septiembre del 2018",
|
||||
"september2017": "Septiembre del 2017",
|
||||
"june2018": "Junio 2018",
|
||||
"fall2019RavenSet": "Cuervo (Guerrero)",
|
||||
"fall2019RavenSet": "Cuervo (Guerrero)",
|
||||
"fall2019LichSet": "Liche (Sanador)",
|
||||
"fall2019CyclopsSet": "Cíclope (Mago)",
|
||||
"fall2019OperaticSpecterSet": "Espectro Operístico (Pícaro)",
|
||||
@@ -151,11 +151,11 @@
|
||||
"summer2019ConchHealerSet": "Caracola (Sanador)",
|
||||
"summer2019WaterLilyMageSet": "Nenúfar (Mago)",
|
||||
"summer2019SeaTurtleWarriorSet": "Tortuga Marina (Guerrero)",
|
||||
"winter2020LanternSet": "Linterna (Pícaro)",
|
||||
"winter2020LanternSet": "Linterna (Pícaro)",
|
||||
"winter2020WinterSpiceSet": "Especia de Invierno (Sanador)",
|
||||
"winter2020CarolOfTheMageSet": "Villancico del Mago",
|
||||
"winter2020EvergreenSet": "Siempre Joven (Guerrero)",
|
||||
"summer2020CrocodileRogueSet": "Cocodrilo (Pícaro)",
|
||||
"summer2020CrocodileRogueSet": "Cocodrilo (Pícaro)",
|
||||
"summer2020SeaGlassHealerSet": "Cristal Marino (Sanador)",
|
||||
"summer2020OarfishMageSet": "Regaleco (Mago)",
|
||||
"summer2020RainbowTroutWarriorSet": "Trucha Arcoiris (Guerrero)",
|
||||
@@ -163,12 +163,12 @@
|
||||
"spring2020IrisHealerSet": "Iris (Sanador)",
|
||||
"spring2020PuddleMageSet": "Charco (Mago)",
|
||||
"spring2020BeetleWarriorSet": "Escarabajo Rinoceronte (Guerrero)",
|
||||
"fall2020TwoHeadedRogueSet": "Bicéfalo (Pícaro)",
|
||||
"fall2020TwoHeadedRogueSet": "Bicéfalo (Pícaro)",
|
||||
"fall2020ThirdEyeMageSet": "Tercer ojo (Mago)",
|
||||
"fall2020DeathsHeadMothHealerSet": "Polilla cabeza de la muerte (Sanador)",
|
||||
"fall2020WraithWarriorSet": "Espectro (Guerrero)",
|
||||
"royalPurpleJackolantern": "Calabaza de Halloween púrpura real",
|
||||
"g1g1Limitations": "Este es un evento por tiempo limitado que comienza el <%= promoStartOrdinal %> de <%= promoStartMonth %> a las <%= promoStartTime %> y terminal el <%= promoEndOrdinal %> <%= promoEndMonth %> a las <%= promoEndTime %>. Esta promoción sólo es válida cuando se hace un regalo a otro Habiticano. Si tu o el receptor de tu regalo ya tenéis una suscripción, la suscripción regalada añadirá meses de crédito que sólo se usarán cuando la suscripción actual sea cancelada o expire.",
|
||||
"g1g1Limitations": "Este es un evento por tiempo limitado que comienza el <%= promoStartOrdinal %> de <%= promoStartMonth %> a las <%= promoStartTime %> y terminal el <%= promoEndOrdinal %> <%= promoEndMonth %> a las <%= promoEndTime %>. Esta promoción sólo es válida cuando se hace un regalo a otro Habiticano. Si tu o el receptor de tu regalo ya tenéis una suscripción, la suscripción regalada añadirá meses de crédito que sólo se usarán cuando la suscripción actual sea cancelada o expire.",
|
||||
"limitations": "Limitaciones",
|
||||
"g1g1HowItWorks": "Escribe el nombre de usuario de la cuenta a la que quieres hacerle el regalo. Desde ahí, selecciona la duración de la suscripción que quieres regalar y realiza el pago. Tu cuenta será automaticamente recompensada con el mismo nivel de suscripción que acabas de regalar.",
|
||||
"howItWorks": "Cómo funciona",
|
||||
@@ -192,7 +192,7 @@
|
||||
"fall2021FlameSummonerHealerSet": "Invocador de la llama (Sanador)",
|
||||
"fall2021HeadlessWarriorSet": "Acéfalo (Guerrero)",
|
||||
"fall2021OozeRogueSet": "Cieno (Pícaro)",
|
||||
"winter2022FireworksRogueSet": "Fuegos Artificiales (Pícaro)",
|
||||
"winter2022FireworksRogueSet": "Fuegos Artificiales (Pícaro)",
|
||||
"winter2022StockingWarriorSet": "Calcetín (Guerrero)",
|
||||
"winter2022PomegranateMageSet": "Granada (Mago)",
|
||||
"winter2022IceCrystalHealerSet": "Cristal de Hielo (Sanador)",
|
||||
@@ -200,11 +200,11 @@
|
||||
"spring2022RainstormWarriorSet": "Tempestad (Guerrero)",
|
||||
"spring2022ForsythiaMageSet": "Forsitia (Mago)",
|
||||
"spring2022PeridotHealerSet": "Peridoto (Sanador)",
|
||||
"summer2022CrabRogueSet": "Cangrejo (Pícaro)",
|
||||
"summer2022CrabRogueSet": "Cangrejo (Pícaro)",
|
||||
"summer2022MantaRayMageSet": "Manta Raya (Mago)",
|
||||
"summer2022WaterspoutWarriorSet": "Tromba marina (Guerrero)",
|
||||
"summer2022WaterspoutWarriorSet": "Tromba marina (Guerrero)",
|
||||
"summer2022AngelfishHealerSet": "Pez ángel (Sanador)",
|
||||
"fall2022HarpyMageSet": "Arpía (Mago)",
|
||||
"fall2022HarpyMageSet": "Arpía (Mago)",
|
||||
"fall2022OrcWarriorSet": "Orca (Guerrero)",
|
||||
"gemSaleLimitations": "Esta promoción solo aplica durante el tiempo limitado del evento. Este evento empieza el <%= eventStartOrdinal %> de <%= eventStartMonth %> a las 8:00 AM EDT (12:00 UTC) y acabará el <%= eventEndOrdinal %> de <%= eventEndMonth %> a las 8:00 PM EDT (00:00 UTC). Esta promoción solo está disponible cuando se compran Gemas para uno mismo.",
|
||||
"gemSaleHow": "Entre el <%= eventStartOrdinal %> y <%= eventEndOrdinal %> de <%= eventStartMonth %>, simplemente compra cualquier paquete de Gemas como normalmente, y se abonará en tu cuenta el número promocional de Gemas. ¡Más Gemas para gastar, compartir o guardar para futuras entregas!",
|
||||
@@ -221,7 +221,7 @@
|
||||
"limitedEdition": "Equipamiento de edición limitada",
|
||||
"anniversaryGryphatricePrice": "Consíguelo hoy por <strong>$9.99</strong> o <strong>60 gemas</strong>",
|
||||
"dayFive": "Día 5",
|
||||
"anniversaryLimitedDates": "Del 30 de enero al 8 de febrero",
|
||||
"anniversaryLimitedDates": "Del 30 de enero al 8 de febrero",
|
||||
"limitedEvent": "Evento limitado",
|
||||
"dayOne": "Día 1",
|
||||
"dayTen": "Día 10",
|
||||
@@ -261,5 +261,9 @@
|
||||
"spring2024HibiscusMageSet": "Conjunto Planta Hibisco (Mago)",
|
||||
"spring2024BluebirdHealerSet": "Conjunto Pájaro Azulillo (Sanador)",
|
||||
"spring2024MeltingSnowRogueSet": "Conjunto Derrite-Nieves (Pícaro)",
|
||||
"spring2024FluoriteWarriorSet": "Conjunto de Fluorita (Guerrero)"
|
||||
"spring2024FluoriteWarriorSet": "Conjunto de Fluorita (Guerrero)",
|
||||
"summer2024SeaAnemoneMageSet": "Conjunto de Anémona Marina (Mago)",
|
||||
"summer2024SeaSnailHealerSet": "Conjunto de Caracol Marino (Sanador)",
|
||||
"summer2024WhaleSharkWarriorSet": "Conjunto de Tiburón-Ballena (Guerrero)",
|
||||
"summer2024NudibranchRogueSet": "Conjunto de Nudibranquio (Pícaro)"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"checkinEarned": "¡Tu contador de Registros ha aumentado!",
|
||||
"unlockedCheckInReward": "¡Has desbloqueado un Premio por Registros!",
|
||||
"checkinProgressTitle": "Progreso hasta el próximo",
|
||||
"incentiveBackgroundsUnlockedWithCheckins": "Los fondos planos bloqueados se desbloquean con Registros Diarios.",
|
||||
"incentiveBackgroundsUnlockedWithCheckins": "Más fondos estándar se desbloquearán a medida que completes los Registros Diarios.",
|
||||
"oneOfAllPetEggs": "Un Huevo de Mascota estándar de cada tipo",
|
||||
"twoOfAllPetEggs": "Dos Huevos de Mascota estándar de cada tipo",
|
||||
"threeOfAllPetEggs": "Tres Huevos de Mascota estándar de cada tipo",
|
||||
|
||||
@@ -135,5 +135,7 @@
|
||||
"groupsPaymentSubBilling": "Tu próxima fecha de facturación es <strong><%= renewalDate %></strong>.",
|
||||
"groupsPaymentAutoRenew": "Esta suscripción se auto-renovará hasta que sea cancelada. Si quieres cancelarla, puedes hacerlo desde la pestaña de Cobro de grupos.",
|
||||
"helpSupportHabitica": "Ayuda a apoyar a Habitica",
|
||||
"sellItems": "Vender objetos"
|
||||
"sellItems": "Vender objetos",
|
||||
"notAvailable": "Este artículo no está disponible.",
|
||||
"customizationsShopText": "¿Necesitas un cambio de estilo? ¡Has llegado al lugar adecuado! Tenemos los complementos más actuales para que encajes en la temporada."
|
||||
}
|
||||
|
||||
@@ -115,5 +115,6 @@
|
||||
"tooMuchFood": "Estas tratando de dar demasiada comida a tu mascota, acción cancelada",
|
||||
"notEnoughFood": "No tienes suficiente comida",
|
||||
"veteranDragon": "Dragón Veterano",
|
||||
"jubilantGryphatrice": "Grifotriz Jubiloso"
|
||||
"jubilantGryphatrice": "Grifotriz Jubiloso",
|
||||
"veteranCactus": "Cactus Veterano"
|
||||
}
|
||||
|
||||
@@ -497,7 +497,7 @@
|
||||
"questMayhemMistiflying3DropShield": "Mensaje Arcoíris del Pícaro (Objeto de la Mano de Fuera)",
|
||||
"questMayhemMistiflying3DropWeapon": "Mensaje Arcoíris del Pícaro (Objeto de la Mano Principal)",
|
||||
"featheredFriendsText": "Lote de Misiones Amigos Plumosos",
|
||||
"featheredFriendsNotes": "Contiene '¡Ayuda! ¡Harpía!', 'El Búho de la Noche', y 'Los Pájaros de la Presastinación'.",
|
||||
"featheredFriendsNotes": "Contiene las Misiones de Mascota para obtener huevos de Búho, Loro y Halcón: ¡Ayuda! ¡Harpía!, El Búho de la Noche, y Los Pájaros de la Presastinación.",
|
||||
"questNudibranchText": "Infestación de las Nudibranquias HazloAhora",
|
||||
"questNudibranchNotes": "Finalmente te decides a comprobar tus Tareas Pendientes en un aburrido día en Habitica. Frente a tus tareas más enrojecidas, hay una manada de babosas marinas azules graznando. ¡No sales de tu asombro! El color zafiro de esas criaturas hace que tus tareas más intimidadoras parezcan algo tan fácil de lograr como el mejor de tus hábitos. Te pones a trabajar con un febril estupor, tachando una tarea tras otra con un incesante frenesí.<br><br>Lo siguiente que descubres es que @LilithofAlfheim te está tirando agua fría por encima. \"¡Las Nudibranquias HazloAhora te han estado picando por todo el cuerpo! ¡Necesitas tomarte un descanso!\"<br><br> Asombrado, te percatas de que tu piel es de un color tan rojo como lo era tu lista de Tareas Pendientes. \"Ser productivo es una cosa\" dice @beffymaroo, \"pero también debes cuidar de ti mismo. ¡Rápido, deshagámonos de ellas!\"",
|
||||
"questNudibranchCompletion": "Ves la última de las Nudibranquias HazloAhora deslizándose por una pila de tareas completadas mientras que @amadshade las limpia. Deja atrás una bolsa de tela, y la abres encontrando algo de oro, así como varios elipsoides que adivinas que son huevos.",
|
||||
@@ -505,7 +505,7 @@
|
||||
"questNudibranchDropNudibranchEgg": "Nudibranquia (Huevo)",
|
||||
"questNudibranchUnlockText": "Desbloquea la compra de huevos de nudibranquia en el Mercado",
|
||||
"splashyPalsText": "Lote de Misiones Compis Chapoteantes",
|
||||
"splashyPalsNotes": "Contiene 'El Derbi Dilatorio', 'Guía la Tortuga', y 'El Gemido de la Ballena'.",
|
||||
"splashyPalsNotes": "Contiene las Misiones de Mascota para obtener huevos de Tortuga, Ballena y Caballito de Mar: Guía a la Tortuga, El Gemido de la Ballena y El Derbi Dilatorio.",
|
||||
"questHippoText": "Qué Hipo-Crita",
|
||||
"questHippoNotes": "Tú y @awesomekitty se tumban bajo la sombra de una palmera, exhaustos. El sol arde sobre Sabana Calmoilento, quemando el suelo. Ha sido un día muy productivo hasta ahora conquistando tus tareas Diarias y este oasis parece un buen sitio para hacer una pausa y refrescarse. Al inclinarte para beber un poco de agua tropiezas hacia atrás y quedas en shock cuando un hipopótamo masivo aparece.\n—¿Descansando tan temprano? No seas perezoso, vuelve al trabajo. —Tú intentas protestar diciendo que has trabajado duro y necesitas una pausa, pero el hipo no está haciendo nada de eso. <br><br> @khdarkwolf te susurra:\n—Mira cómo anda descansando todo el día. ¿Y tiene el coraje de llamarte perezoso? ¡Es el Hipo-Crita! <br><br> \nTu amigo @jumorales asiente con la cabeza.\n—¡Vamos a mostrarle lo que es trabajar duro!\"",
|
||||
"questHippoCompletion": "El hipo se inclina para rendirse.\n—Te subestimé. Parece que no estabas siendo perezoso. Mis disculpas. La verdad sea dicha, quizá me proyecté un poco. Tal vez deba yo mismo dejar algo de trabajo hecho. Aquí, toma estos huevos como señal de gratitud.\nLos agarras y te instalas al borde del agua, listo para al fin relajarte.",
|
||||
@@ -513,9 +513,9 @@
|
||||
"questHippoDropHippoEgg": "Hipo (Huevo)",
|
||||
"questHippoUnlockText": "Desbloquea la compra de huevos de hipopótamo en el Mercado",
|
||||
"farmFriendsText": "Lote de Misiones de Amigos Granjeros",
|
||||
"farmFriendsNotes": "Contiene 'La Vaca Muutante', 'Cabalga el Potro de Pesadilla', y 'El Carnero Trueno'.",
|
||||
"farmFriendsNotes": "Contiene las Misiones para obtener huevos de Mascota de Caballo, Oveja y Vaca: 'Cabalga el Potro de Pesadilla', 'El Carnero Trueno' y 'La Vaca Muutante'.",
|
||||
"witchyFamiliarsText": "Lote de Misiones de Familiares Brujos",
|
||||
"witchyFamiliarsNotes": "Contiene 'El Rey Rata', 'El Arácnido Helado', y 'Pantano de la Rana Desastrosa'.",
|
||||
"witchyFamiliarsNotes": "Contiene la Misiones para obtener huevos de Mascota de Rana, Araña y Rata: 'Pantano de la Rana Desastrosa', 'El Arácnido Helado' y 'El Rey Rata'.",
|
||||
"questGroupLostMasterclasser": "Misterio de los Maestros de Clase",
|
||||
"questUnlockLostMasterclasser": "Para desbloquear esta misión, completa las misiones finales de estas cadenas de misiones: 'Angustia Dilatoria', 'Caos en Calavuelos', 'Calamidad en Estoïcalma', y 'Terror en Bosquetarea'.",
|
||||
"questLostMasterclasser1Text": "El Misterio de los Maestros de Clase, Parte 1: Lee Entre Líneas",
|
||||
@@ -559,7 +559,7 @@
|
||||
"questYarnDropYarnEgg": "Hilo (Huevo)",
|
||||
"questYarnUnlockText": "Desbloquea la compra de huevos de hilo en el Mercado",
|
||||
"winterQuestsText": "Lote de Misiones Invernales",
|
||||
"winterQuestsNotes": "Contiene \"Santa Trampero\", \"Encuentra el Cachorro\", y \"El Ave Helada\". Recuerda que \"Santa Trampero\" y \"Encuentra al Cachorro\" tienen logros de misión acumulables, pero da una montura rara que solo puede añadirse a tu establo una vez.",
|
||||
"winterQuestsNotes": "Contiene las Misiones para obtener la Mascota Oso Polar, la Montura Oso Polar y huevos de Mascota de Pingüino: \"Encuentra el Cachorro\", “Santa Trampero\" y \"El Ave Helada\".",
|
||||
"questPterodactylText": "El Terror-dáctilo",
|
||||
"questPterodactylNotes": "Das un paseo a lo largo de los pacíficos Acantilados de Stoïkalma cuando un chillido maléfico rasga el aire. Te das la vuelta para encontrar una horrible criatura que vuela hacia ti, a lo que te invade un poderoso terror. Cuando te das a la fuga, @Lilith de Alfheim te atrapa.\n\n—¡No entres en pánico! Es solo un Terror-dáctilo.<br><br>@Procyon P asiente.\n\n—Anidan cerca, pero se sienten atraídos por el olor de los Hábitos negativos y las Tareas Diarias sin acabar.<br><br>—No te preocupes—dice @Katy133—. ¡Solo necesitamos ser extra productivos para vencerlo!\n\nTe sientes lleno de un renovado sentido de propósito y te das la vuelta para enfrentar a tu enemigo.",
|
||||
"questPterodactylCompletion": "Con un último chillido, el Terror-dáctilo se desploma sobre el lado del acantilado. Corres hacia delante para ver cómo remonta el vuelo sobre las lejanas estepas.\n\n—Uf, me alegro de que haya terminado—dices.\n\n—Yo también—responde @GeraldThePixel—. ¡Pero mira! Nos ha dejado algunos huevos.\n\n@Edge te entrega tres huevos, y prometes criarlos en tranquilidad, rodeado de Hábitos positivos y Tareas Diarias azules.",
|
||||
@@ -594,7 +594,7 @@
|
||||
"questDysheartenerDropHippogriffMount": "Hipogrifo Esperanzado (Montura)",
|
||||
"dysheartenerArtCredit": "Material gráfico hecho por @AnnDeLune",
|
||||
"hugabugText": "Abraza un Lote de Misiones de Insectos",
|
||||
"hugabugNotes": "Contiene \"El Insecto Crítico\", \"El Caracol del Cieno de Rutinaria\" y \"Adiós, Mariposa. Disponible hasta el <%= date %>.”",
|
||||
"hugabugNotes": "Contiene las Misiones para obtener huevos de Mascota de Escarabajo, Oruga y Caracol: \"El INSECTO CRÍTICO\", \"Adiós, Mariposa” y \"El Caracol del Cieno de Rutinaria\".",
|
||||
"questSquirrelText": "La Ardilla Escurridiza",
|
||||
"questSquirrelNotes": "¡Te levantas y te das cuenta de que te has quedado dormido! ¿Por qué no ha sonado la alarma...? ¿Cómo es que hay una bellota en el timbre? <br><br>Cuando intentas hacer el desayuno, la tostadora está llena de bellotas. Cuando intentas coger tu montura, @Shtut está ahí, intentando abrir su establo sin resultado. Mira en el agujero de la llave.\n—¿Eso es una bellota?<br><br>\n@randomdaisy grita:\n—¡Oh, no! ¡Sabía que mis ardillas se habían escapado, pero nunca pensé que causarían tantos problemas! ¿Puedes ayudarme a reunirlas antes de que la líen todavía más?<br><br>\nSiguiendo la huella de bellotas colocadas con malicia, rastreas y encuentras a las caprichosas ardillas, con @Cantras ayudando a llevar a todas ellas a casa a salvo. Pero justo cuando piensas que tu tarea está a punto de completarse, ¡una bellota cae sobre tu cabeza! Miras hacia arriba y encuentras una ardilla bestial, apostada detrás de una prodigiosa pila de semillas. <br><br>\n—Ay, madre —murmura @randomdaisy—. Ella siempre ha sido algo así como una guardiana de recursos. ¡Tendremos que proceder con mucho cuidado!\n¡Te reúnes con tu equipo, preparado para afrontar el problema!",
|
||||
"questSquirrelCompletion": "Acercándote con suavidad, con ofertas de intercambio y algún hechizo tranquilizante, eres capaz de convencer a la ardilla para que se aparte de sus provisiones y vuelva a los establos, que @Shtut acaba de terminar de desbellotizar. Ha dejado algunas bellotas aparte en una mesa de trabajo.\n—¡Esto son huevos de ardilla! A lo mejor puedes criar algunas que no jueguen tanto con la comida.",
|
||||
@@ -602,9 +602,9 @@
|
||||
"questSquirrelDropSquirrelEgg": "Ardilla (huevo)",
|
||||
"questSquirrelUnlockText": "Desbloquea la compra de huevos de ardilla en el Mercado",
|
||||
"cuddleBuddiesText": "Lote de Misiones Compañeros Abrazados",
|
||||
"cuddleBuddiesNotes": "Contiene \"El Conejito Asesino\", \"El Hurón Malvado\", y \"La Pandilla de Cobayas\".",
|
||||
"cuddleBuddiesNotes": "Contiene las Misiones para obtener los huevos de Mascota de Conejo, Hurón y Cobaya: \"El Conejito Asesino\", \"El Hurón Malvado\", y \"La Pandilla de Cobayas\".",
|
||||
"aquaticAmigosText": "Lote de Misiones de Amigos Acuáticos",
|
||||
"aquaticAmigosNotes": "Contiene 'El ajolote mágico', 'El Kraken del Inkompleto' y 'La llamada de Octothulu'.",
|
||||
"aquaticAmigosNotes": "Contiene las Misiones para obtener los Huevos de Mascota de Calamar, Pulpo y Ajolote: 'La llamada de Octothulu', 'El Kraken del Inkompleto' y 'El ajolote mágico'.",
|
||||
"questSeaSerpentText": "Peligro en las profundidades: ¡Ataque de la serpiente marina!",
|
||||
"questSeaSerpentNotes": "Tus manchas te hacen sentir afortunado: es el momento perfecto para un viaje a la pista de carreras de caballitos de mar. Abordas el submarino en Muelles Diligentes y te acomodas para el viaje a Dilatoria, pero apenas te has sumergido cuando un impacto sacude el submarino, haciendo que sus ocupantes caigan.\n– ¿Qué está pasando? –grita @AriesFaries. <br><br>Miras a través de un ojo de buey cercano y te sorprende la pared de escamas brillantes que pasan por allí.\n–¡Serpiente de mar! –aclama el capitán @Witticaster a través del intercomunicador–. ¡Preparaos, viene otra vez!\nMientras agarras los brazos de tu asiento, tus tareas inconclusas parpadean ante tus ojos. \"Quizás si trabajamos juntos y los completamos\", piensas, \"¡podemos alejar a este monstruo!\"",
|
||||
"questSeaSerpentCompletion": "Maltrecha por tu compromiso, la serpiente marina huye, desapareciendo en las profundidades. Cuando llegas a Dilatoria, sueltas un suspiro de alivio antes de ver que @*~Seraphina~ se acerca con tres huevos translúcidos acunados en sus brazos.\n– Aquí, debes quedarte con esto –dice ella–. ¡Sabes cómo manejar una serpiente marina!\nAl aceptar los huevos, prometes nuevamente mantenerte firme al completar tus tareas para asegurarte de que no vuelva a ocurrir.",
|
||||
@@ -618,7 +618,7 @@
|
||||
"questKangarooDropKangarooEgg": "Canguro (Huevo)",
|
||||
"questKangarooUnlockText": "Desbloquea la compra de huevos de canguro en el Mercado",
|
||||
"forestFriendsText": "Lote de Misiones de Amigos del Bosque",
|
||||
"forestFriendsNotes": "Contiene \"El espíritu de la primavera\", \"El erizobestia\", y \"La enredadera\".",
|
||||
"forestFriendsNotes": "Contiene las Misiones para obtener los huevos de Mascota de Brote, Ciervo y Erizo: “La enredadera\", \"El espíritu de la primavera\" y \"El erizobestia\".",
|
||||
"questAlligatorText": "El Insta-Drilo",
|
||||
"questAlligatorNotes": "— ¡Caramba! —exclama @gully— ¡Un Insta-Drilo en su hábitat natural! Cuidado, distrae a sus presas con cosas que parecen urgentes EN ESTE INSTANTE, y se alimenta de las Tareas Diarias que como consecuencia de eso quedan sin marcar.\nGuardas silencio para evitar llamar su atención, pero es inútil. ¡El Insta-Drilo te ve y carga contra tí! Unas sugestivas voces surgen del Pantano del Estancamiento, atrapando tu atención:\n— ¡Lee este post! ¡Mira esta foto! ¡Préstame atención EN ESTE INSTANTE!\nTe esfuerzas para preparar un contra-ataque, completando tus Tareas Diarias y reafirmando tus buenos Hábitos para defenderte del temible Insta-Drilo.",
|
||||
"questAlligatorCompletion": "Con tu atención enfocada en lo que es más importante y no en las distracciones del Insta-Drilo, consigues que éste huya. ¡Victoria!\n— ¿Eso son huevos? — pregunta @mfonda.\n— Si los cuidamos correctamente, se convertirán en mascotas leales o en fieles monturas. — responde @UncommonCriminal, dándote tres de ellos para que los cuides.\nEsperemos que sea así, porque si no podríamos enfrentarnos otra vez al Insta-Drilo…",
|
||||
@@ -626,9 +626,9 @@
|
||||
"questAlligatorDropAlligatorEgg": "Caimán (Huevo)",
|
||||
"questAlligatorUnlockText": "Desbloquea la compra de huevos de caimán en el Mercado",
|
||||
"oddballsText": "Lote de Misiones Bichos Raros",
|
||||
"oddballsNotes": "Contiene \"La Jalea Regente\", \"Escapa de la Cueva Viviente\" y \"Un Hilo Enredado\".",
|
||||
"oddballsNotes": "Contiene las Misiones para obtener los huevos de Mascota de Limo, Hilo y Roca: \"La Jalea Regente\", \"Un Hilo Enredado\" y \"Escapa de la Cueva Viviente\".",
|
||||
"birdBuddiesText": "Lote de Misiones de Aves Amigables",
|
||||
"birdBuddiesNotes": "Contiene “El Ave Helada”, “Gallo Alborotador” y “El Pavo Real del Tira y Afloja”.",
|
||||
"birdBuddiesNotes": "Contiene las Misiones para obtener los huevos de Mascota de Pavo Real, Pingüino y Gallo: “El Pavo Real del Tira y Afloja”, “El Ave Helada” y “Gallo Alborotador”.",
|
||||
"questVelociraptorText": "El Veloci-Rapeador",
|
||||
"questVelociraptorNotes": "Estás compartiendo pastas de miel con @*~Seraphina~*, @Procyon P y @Lilith of Alfheim cerca de un lago en las Estepas de Estoïcalmaada. De repente, una voz que se lamenta interrumpe vuestro picnic.<br><br><em>Mis Hábitos recibieron un golpe, he perdido mis Tareas Diarias,<br>me estoy perdiendo, hundiéndome en las dudas y en los \"y si\",<br>Solía estar al día con todo,<br>Pero ahora simplemente dejo que las fechas límite pasen.</em><br><br>@*~Seraphina~* se asoma detrás de unos arbustos.\n—\"Es el Veloci-Rapeador. Parece… ¿angustiado?\" —<br><br>Cierras un puño, determinado.\n—\"Solo se puede hacer una cosa. ¡Hora de la batalla de rap!\"",
|
||||
"questVelociraptorCompletion": "Apareces de entre la hierba y te enfrentas al Veloci-Rapeador.<br><br><em>Tú eres rapeador, no un perdedor,<br>El que golpea con más fuerza los hábitos de mayor dureza!<br>Tacha tus tareas como una marea,<br>¡No llores la pérdida de un día!</em><br><br>Con renovada confianza, vuelve a improvisar rimas, dejando atrás los tres huevos en los que estaba sentado.",
|
||||
@@ -636,7 +636,7 @@
|
||||
"questVelociraptorDropVelociraptorEgg": "Velociraptor (Huevo)",
|
||||
"questVelociraptorUnlockText": "Desbloquea la compra de huevos de velociraptor en el Mercado",
|
||||
"mythicalMarvelsText": "Lote de Misiones de Maravillas Míticas",
|
||||
"mythicalMarvelsNotes": "Contiene 'Convenciendo a la Reina Unicornio', 'El Hipogrifo Fiero', y 'Peligro en las Profundidades: ¡Ataque de la Serpiente Marina!'",
|
||||
"mythicalMarvelsNotes": "Contiene las Misiones para obtener los huevos de Mascota de Unicornio, Grifo y Serpiente Marina: 'Convenciendo a la Reina Unicornio', 'El Hipogrifo Fiero', y 'Peligro en las Profundidades: ¡Ataque de la Serpiente Marina!'",
|
||||
"questBronzeText": "Batalla del Escarabajo de Latón",
|
||||
"questBronzeNotes": "En un refrescante descanso entre tareas, tú y algunos amigos tomáis un paseo por los senderos del Bosquetarea. Os topáis con un gran tronco hueco y un brillo en su interior capta vuestra atención.<br><br>¡Es un alijo de Pociones de Eclosión Mágicas! El resplandeciente líquido color bronce se arremolina suavemente en botellas, y @Hachiseiko se estira para tomar una y examinarla.<br><br>\"¡Alto! sisea una voz por detrás de vosotros. Es un escarabajo gigante con un caparazón de reluciente bronce, levantando sus patas en una posición de lucha. \"Esas son mis pociones, y si deseáis conseguirlas, debéis provaros en un duelo de caballeros!\"",
|
||||
"questBronzeCompletion": "\"¡Bien hecho, guerrero!\" dice el escarabajo mientras se posa en el suelo. ¿Está sonriendo? Es difícil decirlo con esas mandíbulas. \"¡Ciertamente te has ganado estas pociones!\"<br><br>\"¡Oh vaya, nunca hemos conseguido una recompensa como esta por haber ganado una batalla!\" Dice @UncommonCriminal, girando una reluciente botella en su mano. \"¡Vamos a eclosionar nuestras nuevas mascotas!\"",
|
||||
@@ -653,7 +653,7 @@
|
||||
"questSilverCollectSilverIngots": "Lingotes de Plata",
|
||||
"questSilverDropSilverPotion": "Poción de eclosión de Plata",
|
||||
"questSilverUnlockText": "Desbloquea la compra de pociones de eclosión de Plata en el Mercado",
|
||||
"rockingReptilesNotes": "Contiene \"El insta-gator\", \"La serpiente de la distracción\" y \"El veloci-raptor\".",
|
||||
"rockingReptilesNotes": "Contiene las Misiones para obtener los huevos de Mascota de Caimán, Velociraptor y Serpiente: \"El insta-gator\", \"El veloci-raptor\" y \"La serpiente de la distracción\".",
|
||||
"rockingReptilesText": "Lote de Misiones de Reptiles Oscilantes",
|
||||
"questRobotUnlockText": "Desbloquea la compra de huevos de robot en el Mercado",
|
||||
"questRobotDropRobotEgg": "Robot (Huevo)",
|
||||
@@ -667,7 +667,7 @@
|
||||
"questSilverNotes": "El reciente descubrimiento de las pociones de eclosión de bronce se comenta por toda Habitica. ¿Podría haber pociones de metales aún más brillantes? Te diriges a la biblioteca pública central de Villahábito, acompañado de @QuartzFox y @starsystemic, y reúnes grandes cantidades de libros sobre alquimia para estudiar. <br><br> Después de horas de trabajo agotador, @QuartzFox deja escapar un grito de triunfo bastante poco apropiado para la biblioteca. \"¡Ajá! ¡Lo he encontrado! ”Te apresuras a ver. \"Se puede hacer una poción de incubación de plata con runas del signo del zodiaco Cáncer, disueltas en plata pura derretida sobre una llama infundida con el poder de las runas de la Luna\". <br><br> \"Necesitaremos muchos de esos ingredientes\", murmura @starsystemic. \"Por si algún intento sale mal\". <br><br> \"Solo hay un lugar para encontrar cantidades tan grandes de materiales de fabricación de todo tipo\", dice @Edge, de pie a la sombra de las estanterías con los brazos cruzados. ¿Habrá estado allí todo el tiempo? “Las mazmorras del trabajo pesado. Vámonos.\"",
|
||||
"questDolphinCompletion": "Tu batalla de voluntades con el delfín te ha dejado cansado pero victorioso. Con su determinación y aliento, @mewrose, @khdarkwolf y @confusedcicada se levantan y se sacuden la insidiosa telepatía del delfín. Los cuatro os refugiáis con una sensación de logro en vuestras consistentes tareas diarias, hábitos fuertes y tareas completadas hasta que cierra sus ojos brillantes, en un reconocimiento silencioso de vuestros éxitos. Con eso, vuelve a caer en la bahía. Al intercambiar saludos y felicitaciones, notas que tres huevos se asoman en la tierra. <br><br> “Hm, me pregunto qué podemos hacer con ellos”, reflexiona @khdarkwolf.",
|
||||
"questDolphinNotes": "Caminas por las orillas de la Bahía Inkompleta, reflexionando sobre el desalentador trabajo que tienes por delante. Un chapoteo en el agua llama tu atención. Un magnífico delfín se arquea sobre las olas. La luz del sol brilla sobre sus aletas y su cola. Pero, espera... Eso no es la luz del sol, y el delfín no vuelve a sumergirse en el mar. Fija su mirada en @khdarkwolf. <br><br> \"Nunca terminaré todas estas tareas diarias\", dijo @khdarkwolf. <br><br> \"No soy lo suficientemente bueno como para alcanzar mis metas\", dijo @confusedcicada cuando el delfín les dirigió su mirada. <br><br> \"¿Por qué me molesté en intentarlo?\", preguntó @mewrose, marchitándose bajo la mirada de la bestia. <br><br> Sus ojos se encuentran con los tuyos y sientes cómo tu mente comienza a hundirse bajo la creciente ola de dudas. Pero te plantas; ¡alguien tiene que derrotar a esta criatura, y serás tú!",
|
||||
"delightfulDinosNotes": "Contiene \"El Terror-dáctilo\", \"El Aplastante Triceratops\" y \"El Dinosaurio Desenterrado\".",
|
||||
"delightfulDinosNotes": "Contiene las Misiones para obtener los huevos de Mascota de Triceratops, Tiranosaurio y Pterodáctilo: \"El Aplastante Triceratops\" y \"El Dinosaurio Desenterrado\" y \"El Terror-dáctilo\".",
|
||||
"delightfulDinosText": "Lote de Misiones de Dinos Encantadores",
|
||||
"questAmberText": "La Alianza Ámbar",
|
||||
"questAmberCompletion": "“¿Trerezina?” apeló @-Tyr- con calma . “¿Podrías soltar a @Vikte? No creo que lo esté pasando demasiado bien ahí arriba.”<br><br>La piel ámbar de Trerezina se sonrojó, soltando gentilmente a @Vikte sobre el suelo. “¡Mis disculpas!¡Hacía tanto que no tenía invitados que he olvidado mis modales!”. Se deslizó hacia a ti para saludarte adecuadamente antes de desaparecer en su casa del árbol, ¡volviendo cargada de pociones de eclosión ámbar como regalo de agradecimiento!<br><br>“¡Pociones mágicas!” exclamó @Vikte.<br><br>“¿Oh, estas viejas cosas?” La lengua de Trerezina siseó mientras pensaba. “¿Qué os parece esto? Os daré este montón de pociones si prometéis visitarme de vez en cuando...”<br><br>Y así, abandonamos el Bosquetarea, emocionados por contar a todo el mundo lo de las nuevas pociones, ¡y lo de tu nueva amiga!",
|
||||
@@ -689,7 +689,7 @@
|
||||
"questRubyCollectAquariusRunes": "Runas del Zodíaco Acuario",
|
||||
"questRubyCompletion": "Con los necesarios artículos guardados a buen recaudo, los tres os apresuráis de vuelta a la Ciudad Habito y os reunís en el laboratorio de @beffymaroo. “¡Excelente trabajo!” dice @beffymaroo. “¡Habéis reunido los ingredientes para la poción!”<br><br>@beffymaroo combina cuidadosamente las runas y los rubíes para crear una poción roja y brillante y vierte parte de ella sobre dos huevos de mascota. ¡Mientras observas los resultados, te percatas de que las dos mascotas parecen no estar interesadas la una en la otra en absoluto!<br><br>“¿No ha funcionado?”pregunta @gully. Pero antes de que nadie pueda contestar, súbitamente te das cuenta de que no es la poción lo que origina la amistas y el amor, sino que es la experiencia de trabajar juntos con un mismo objetivo. Vuelves de la misión habiendo hecho nuevos amigos... ¡y con unas vistosas mascotas nuevas!",
|
||||
"questFluoriteText": "Un Brillante Pánico Fluorescente",
|
||||
"jungleBuddiesNotes": "Contiene 'Mandril Monstruosos y los Monos Malignos', 'El Perezoso Somnoliento' y 'El Arbol Enmarañado'.",
|
||||
"jungleBuddiesNotes": "Contiene las Misiones para obtener los huevos de Mascota de Mono, Brote y Perezoso: 'Mandril Monstruoso y los Monos Malignos', 'El Arbol Enmarañado' y 'El Perezoso Somnoliento'.",
|
||||
"jungleBuddiesText": "Paquete de misiones Colegas de la Jungla",
|
||||
"questWaffleUnlockText": "Desbloquea la compra de la poción de eclosión de confitería en el Mercado",
|
||||
"questWaffleDropDessertPotion": "Poción de eclosión de confitería",
|
||||
@@ -723,7 +723,7 @@
|
||||
"questFluoriteCompletion": "A medida que avanza el combate, la criatura cristalina parece más y más distraida por el espectáculo de luces que estais creando. \"Que brillante...\" murmura. <br><br>\"¡Por supuesto!\" exclama @nirbhao. \"Debe de ser un elemental de fluorita, lo unico que quieren es luz que los haga brillar. Ayudémosle a resplandecer. \" <br><br> El elemental suelta una risilla feliz y brilla más intensamente a medida que encendéis antorchas y motas de magia. Está tan contento de volver a brillar que os conduce a un deposito de cristales de fluorita. <br><br> \"Este es el ingrediente perfecto para una nueva Poción de eclosión.\" dice @nirbhao. \"Una que hará que nuestras mascotas sean tan brillantes como nuestro fluorescente amigo.\"",
|
||||
"questWindupNotes": "Villahábito rara vez está en calma, pero aún así, no estabas preparado para la cacofonía de crujidos, chillidos y gritos que se salían de el Buen Guardatiempo, el mejor emporio de relojería de Habitica. Suspiras, solo querías que te arreglaran el reloj. El propietario, conocido sólo como “Grande y Poderoso”, irrumpe por la puerta, ¡perseguido por un ruidoso coloso de cobre! <br><br> “¡GA-! ¡GA-! GA!\" resuena mientras enormes brazos arramblan arriba y abajo. Sus engranajes retumban y rechinan con violencia. <br><br> “¡Mi robot Clankton se ha vuelto loco! ¡Está intentando matarme! \" gritó el que supuestamente era \"grande y poderoso\". <br><br> Incluso con un reloj roto puedes saber cuándo es momento de pelear. Saltas hacia adelante y te preparas para defender al asustado relojero. ¡@Vikte y @a_diamond también se unen para ayudar! <br><br> “¡GA-! ¡GA-! GA!\" resuena Clankton con cada golpe. \"¡Miau!\" <br><br> Espera, ¿qué ha sido ese maullido mecánico que se ha escuchado en medio del monótono \"GA-GA-GA\"?",
|
||||
"questSolarSystemBoss": "Diversinoides",
|
||||
"sandySidekicksNotes": "Contiene \"El Armadillo Indulgente\", \"La Serpiente de la Distracción\" y \"El Arácnido Helado\".",
|
||||
"sandySidekicksNotes": "Contiene las Misiones para obtener los huevos de Mascota de Araña, Armadillo y Serpiente: \"El Arácnido Helado\", \"El Armadillo Indulgente\" y \"La Serpiente de la Distracción\".",
|
||||
"questWindupCompletion": "Mientras esquivas los ataques, notas algo extraño: una cola de latón a rayas que sobresale del chasis del robot. Introduces una mano entre sus rechinantes engranajes y sacas... un tembloroso cachorro de tigre que parece ser de cuerda. Se acurruca contra tu camisa. <br><br> El robot mecánico deja de agitarse inmediatamente y sonríe, mientras sus engranajes vuelven encajarse en su sitio. “¡GA-GA-GATITO! ¡gatito se metió en mí! \"<br><br>\" ¡Genial! \" dice el Poderoso sonrojándose. \"He estado trabajando duro en estas pociones para mascotas a cuerda. Supongo que perdí de pista a una de mis nuevas creaciones. Últimamente he estado fallando mucho mi tarea diaria de 'Ordenar el taller' ... \"<br><br> Sigues dentro del taller al relojero y a Clankton. Piezas, herramientas y pociones cubren todo cuanto ves. \"Poderoso\" coge tu reloj, pero deja en tus manos algunas pociones. <br><br> \"Cógelas, ¡seguro que estarán más seguras contigo! \"",
|
||||
"questTurquoiseNotes": "@gawrone entra corriendo a tu habitación sosteniendo su diploma de habiticano en una mano y un tomo encuadernado en cuero extraordinariamente grande y polvoriento en la otra. <br><br> \"¡Jamás adivinarías lo que he descubierto!\" te dicen con exaltación. “La razón por la que los Campos Florecientes son tan fértiles es que una vez estuvieron cubiertos por un vasto océano. Se rumorea que un pueblo antiguo habitó sus profundidades en ciudades encantadas. He utilizado viejos mapas para encontrar su ubicación más probable. ¡Coge tu pala!”<br><br> Os reunís la noche siguiente, @QuartzFox y @starsystemic se unen a la fiesta y comenzáis a cavar. En lo profundo del suelo, encuentras una runa, ¡y una gema turquesa cerca de ella! <br><br> \"¡Sigue cavando!\" te anima @gawrone. \"¡Si encontramos suficientes, podremos destilar una de sus antiguas pociones y descubrir su historia al mismo tiempo!\"",
|
||||
"questTurquoiseCompletion": "Acalorado y sudoroso, tu grupo se detiene por fin a descansar junto a la montaña de tierra extraída y mirar el montón de runas y gemas que habéis encontrado. <br><br> \"Increíble\", murmura @QuartzFox. “Esto reescribirá los libros de historia”. <br><br> “Dejadme llevar estos materiales a la universidad de Habitica para que los analicen”, dice @gawrone. “¡Debería haber suficientes para su estudio y para que podamos hacer algunas pociones turquesas!¿Quién sabe qué más podemos llegar a encontrar enterrado aquí abajo? \"<br><br> @starsystemic interviene:\" ¡Es increíble lo mucho que se puede lograr con un poco de esfuerzo!\"",
|
||||
@@ -772,5 +772,28 @@
|
||||
"questFungiRageTitle": "Bruma de la Seta Cabreada",
|
||||
"questFungiRageDescription": "Esta barra de estado se va rellenando cuando no completas tus Tareas Diarias. Cuando se complete, la Seta Cabreada recuperará parte del daño pendiente que le haya causado vuestro Equipo",
|
||||
"questFungiRageEffect": "La bruma emana del cuerpo de la Seta Cabreada y os rodea por todos lados, vuestro estado de ánimo empeora y vuestra magia se vuelve menos fluida. ¡Los MP causados por el Equipo se ven reducidos!",
|
||||
"questFungiDropFungiPotion": "Poción de Eclosión de Seta Mágica"
|
||||
"questFungiDropFungiPotion": "Poción de Eclosión de Seta Mágica",
|
||||
"questGiraffeDropGiraffeEgg": "Jirafa (Huevo)",
|
||||
"questChameleonText": "El Camaleón del Caos",
|
||||
"questChameleonBoss": "Camaleón del Caos",
|
||||
"questChameleonDropChameleonEgg": "Camaleón (Huevo)",
|
||||
"QuestChameleonUnlockText": "Desbloquea los Huevos de Camaleón para poder comprarlos en el Mercado",
|
||||
"questChameleonCompletion": "Después de una cuántas sacudidas el camaleón empieza a cambiar a cada uno de los colores del arcoíris nebuloso, adquiriendo cada color con cada una de tus chanzas.<br><br> “¡Uau,” exclama, “este tête à tête que estamos sosteniendo y haberlo convertido en una especie de juego me está ayudando a concentrar mis poderes! Por favor toma este don recién salido de la disformidad, ¡te has hecho merecedor! Enseña a estos chiquitines como cambiar a los colores del arcoíris nebuloso cuando eclosionen.”",
|
||||
"questGiraffeText": "La Equip-jirafa",
|
||||
"questGiraffeBoss": "Equip-jirafa",
|
||||
"QuestGiraffeUnlockText": "Desbloquea los Huevos de Jirafa para poder comprarlos en el Mercado.",
|
||||
"questGiraffeNotes": "Estás paseando por la hierba alta de Sloenstedi Savannah, disfrutando de una bonita caminata en la naturaleza como merecido descanso de tus tareas. Cuando pasas cerca de unas dunas, observas una colección de objetos en la distancia. ¡Vaya es una montón de instrumentos musicales, pertrechos artísticos, equipos electrónicos y otras cosas! Decides acercarte para verlo todo de más cerca. <br><br>“¡Eh, joven! ¿Qué crees que estás haciendo?” grita una malhumorada voz desde detrás de una acacia. Una altísima y imponente jirafa asoma llevando puestas unas molonas gafas de sol, una Fender Telecaster y una estilizada cámara de fotos alrededor del cuello. “Esto es todo mi equipamiento, ¡ve con cuidado de no tocar nada sucio aventurero!”<br><br>Notas que hay una abundante capa de polvo encima de muchos de los objetos. “¡Oh, creo q tienes demasiados hobbies!” le dices con una sonrisa nerviosa. “Jeje, ¿podrías enseñarme algo de arte o tocarme un riff de metal con la guitarra?”<br><br>La cara de la Jirafa se retuerce en una extraña mueca al mirar hacia sus posesiones. “¡Cierto, tengo muchas cosas que hacer pero no se por donde empezar! Ya se, tomare prestada tu motivación, el hechizo de drenaje solo te dolerá un poquito, y así tendré suficiente energía productiva para finalmente empezar con algo!”",
|
||||
"questGiraffeCompletion": "Después de ayudar a entrar en razón con tu arma a la Equip-jirafa y de paso enseñarle algo de organización de sus reservas, ¡los dos os sentís revitalizados y mas optimistas!<br><br>Él agarra su Telecaster y un libro de partituras para principiantes y empieza a rasgar las primeras notas del “Smoke on the Water”. “Después de tu lección veo lo acertado de dar pasos en la dirección correcta, incluso alguno más corto. ¡Gracias por ayudarme a entrar en razón! Toma esto en honor a tu victoria, he oído que tienes una buena colección de mascotas y estos colegas pueden llegar a ser una buena adquisición!”",
|
||||
"questChameleonNotes": "Es un hermoso día en un cálido y húmedo rincón de Bosquetarea. Has salido de caza a por nuevas adquisiciones para tu colección de hojas cuando de repente ¡cuál brujería arcana una rama cambia de color ante tus ojos! ¡Y empieza a moverse!<br><br>Tropezando con tus propios pies tratando de ponerlos en polvorosa te das cuenta que lo que estás viendo no es una rama ¡si no un enorme camaleón del Caos recién salido de la disformidad! Cada parte de su cuerpo cambia de color y sus ojos apuntan hacia diferentes lados de forma enloquecida.<br><br> “¿Estas bien?” consigues balbucear.<br><br> “Ahhh, ser bien,” dice, transmitiendo cierto nerviosismo. “Estar tratando de mezclarme... pero ser tan abrumador... ¡los colores estar yendo y viniendo! Es difícil concentrarse en uno solo....”<br><br> “Ejem,” articulas con dificultad, “Creo que puedo ayudarte. ¡Afinaré tu concentración con mis armas lanzándote un pequeño desafío! ¡Prepara tus colores!”<br><br> “¡Tu mover ficha!” responde el camaleón.",
|
||||
"questCrabNotes": "Es una calurosa mañana, estás disfrutando tu acostumbrada visita a una playa cercana donde seguir poniéndote al día con tu lista de libros para leer en este verano. Mientras buscas un buen lugar donde colocar tu toalla vas a dar un paso y ¡sorpresa! Casi pisas un trozo de cristal brillante cerca de un agujero poco profundo.<br><br> “¡Eh, vigila donde pisas! Algunas estamos intentando crearnos una cómoda madriguera aquí abajo” dice una aguda vocecilla. Una sorprendente y inusitadamente gran Cangrejo con un caparazón bellamente decorado sale de entre la arena corriendo por delante de tus pies a la vez que chasquea su pinza.<br><br> “Umm, ¿me estás intentando decir que a eso le llamas una cómoda madriguera?” le preguntas mirando hacia el poco profundo agujero. Hay conchas y pequeños cristalitos decorando los alrededores, pero como escondite deja mucho que desear.<br><br>La cangrejo tartamudea levemente. “¡Eh, nadie te ha pedido tu opinión! Además, aún no he terminado, voy en camino... solo que había empezado por la decoración. De vez en cuando una cangrejo tiene que empezar por lo más trivial” dice reajustándose el caparazón.<br><br> “¿Por qué no me echas una pinza y me ayudas si tienes tan claro cómo debe ser una cómoda madriguera?”",
|
||||
"questGiraffeUnlockText": "Desbloquea Huevos de Jirafa para su compra en el Mercado.",
|
||||
"questCrabText": "El Cangrejo Trivial y sus Tribulaciones",
|
||||
"questCrabBoss": "El Cangrejo Trivial y sus Tribulaciones",
|
||||
"questCrabRageTitle": "Distracción Trivial",
|
||||
"questChameleonUnlockText": "Desbloquea Huevos de Camaleón para su compra en el Mercado",
|
||||
"questCrabRageEffect": "La Cangrejo Trivial te distrae excesivamente con la decoración, ralentizando vuestro trabajo de excavación y drenando algo de vuestra magia. ¡Se han reducido vuestros Puntos de Poder!",
|
||||
"questCrabDropCrabEgg": "Cangrejo (Huevo)",
|
||||
"questCrabUnlockText": "Desbloquea los Huevos de Cangrejo para poder comprarlos en el Mercado.",
|
||||
"questCrabCompletion": "Tu y la cangrejo acabáis entendiendo cómo trabajar juntos para que todo acabe en el lugar exacto y así completar la hermosa madriguera. La cangrejo está muy feliz y se acomoda en su interior.<br><br> “¡Muchísimash graciash!” te dice. “Ahora tengo un agujero que se ajusta perfectamente a mis gustos. Puedo disfrutar de toda esta bonita decoración. Aquí tienes estos shiquitines como muestra de mi gratitud. ¡Es un regalo q no puedes rechazar!”",
|
||||
"questCrabRageDescription": "Estaba barra se va llenando a medida que no completes tus Tareas Diarias. ¡Cuando esté completa, la Cangrejo Trivial os quitará algunos Puntos de Poder a todos los integrantes del equipo!"
|
||||
}
|
||||
|
||||