mirror of
https://github.com/HabitRPG/habitica.git
synced 2026-05-12 11:39:44 -05:00
Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d5c4e1666e | |||
| 79071e3445 | |||
| 2ea707c27c | |||
| f7b727dc95 | |||
| a78aea5456 | |||
| 6e8e7318f3 | |||
| 1c3d4a6fd5 | |||
| c9b3c48379 | |||
| 9ed2359c77 | |||
| 0dc21fa868 | |||
| e2c6fb1ea2 | |||
| b87527bcea | |||
| 0adfc9f756 | |||
| 9a2b49b4bf | |||
| 750a02053c | |||
| 2748455f16 | |||
| ef3767f80b | |||
| 8070486def | |||
| cc0e807609 | |||
| bbc5a54a3e | |||
| 8e717de039 | |||
| ce18e614be | |||
| 58c27c2610 | |||
| 220dd51f85 | |||
| 3b1407f529 | |||
| be7b3076eb | |||
| 2b4ffdf27f | |||
| e0dc608fd8 | |||
| 0b4059aab0 | |||
| 3aa7b8b447 | |||
| 94b9bb1036 | |||
| a2f169ab76 | |||
| 6d345740ff | |||
| 294cc63fef | |||
| 9a879d566e | |||
| 8ecb0f45b5 | |||
| b04df06a37 | |||
| 706cffa71d | |||
| 00b8f4fef5 | |||
| 5ea675b8a5 | |||
| 78f0c71387 | |||
| e674ef4035 | |||
| 1655e2e03a | |||
| 0d444a9d6a | |||
| de331f5e76 | |||
| c48043ec90 | |||
| ac4d148170 | |||
| ca49e995be | |||
| d47a867149 | |||
| 76ab93f501 | |||
| 5d4600f5c7 | |||
| 13c4a726c7 | |||
| 43122805fb | |||
| 1262d8f36e | |||
| 2b1635ff62 | |||
| e1664d2f87 | |||
| 6975b6061b | |||
| 9680c94087 | |||
| 76de241675 | |||
| 3ba6b4a209 | |||
| b101d43e62 | |||
| c0e8d80966 | |||
| afacd497d7 | |||
| dc744de4a9 | |||
| f44bebb573 | |||
| 8ccf701aec |
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"ACCOUNT_MIN_CHAT_AGE": "0",
|
||||
"ADMIN_EMAIL": "you@example.com",
|
||||
"AMAZON_PAYMENTS_CLIENT_ID": "CLIENT_ID",
|
||||
"AMAZON_PAYMENTS_MODE": "sandbox",
|
||||
|
||||
+1
-1
Submodule habitica-images updated: 896d1aedad...6e9d17b8a4
Generated
+1059
-1109
File diff suppressed because it is too large
Load Diff
+8
-8
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.235.1",
|
||||
"version": "4.238.1",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.18.5",
|
||||
"@babel/preset-env": "^7.18.2",
|
||||
"@babel/register": "^7.17.7",
|
||||
"@babel/core": "^7.18.6",
|
||||
"@babel/preset-env": "^7.18.6",
|
||||
"@babel/register": "^7.18.6",
|
||||
"@google-cloud/trace-agent": "^5.1.6",
|
||||
"@parse/node-apn": "^5.1.3",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
"accepts": "^1.3.8",
|
||||
"amazon-payments": "^0.2.9",
|
||||
"amplitude": "^6.0.0",
|
||||
"apidoc": "^0.51.1",
|
||||
"apidoc": "^0.52.0",
|
||||
"apple-auth": "^1.0.7",
|
||||
"bcrypt": "^5.0.1",
|
||||
"body-parser": "^1.20.0",
|
||||
@@ -39,7 +39,7 @@
|
||||
"gulp.spritesmith": "^6.13.0",
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"helmet": "^4.6.0",
|
||||
"image-size": "^1.0.1",
|
||||
"image-size": "^1.0.2",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^4.0.2",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
@@ -47,7 +47,7 @@
|
||||
"lodash": "^4.17.21",
|
||||
"merge-stream": "^2.0.0",
|
||||
"method-override": "^3.0.0",
|
||||
"moment": "^2.29.3",
|
||||
"moment": "^2.29.4",
|
||||
"moment-recur": "^1.0.7",
|
||||
"mongoose": "^5.13.7",
|
||||
"morgan": "^1.10.0",
|
||||
@@ -74,7 +74,7 @@
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"winston": "^3.7.2",
|
||||
"winston": "^3.8.1",
|
||||
"winston-loggly-bulk": "^3.2.1",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { MAX_SUMMARY_SIZE_FOR_CHALLENGES } from '../../../../../website/common/script/constants';
|
||||
|
||||
describe('POST /challenges', () => {
|
||||
it('returns error when group is empty', async () => {
|
||||
@@ -60,6 +61,22 @@ describe('POST /challenges', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('return error when creating a challenge with summary with greater than MAX_SUMMARY_SIZE_FOR_CHALLENGES characters', async () => {
|
||||
const user = await generateUser();
|
||||
const summary = 'A'.repeat(MAX_SUMMARY_SIZE_FOR_CHALLENGES + 1);
|
||||
const group = createAndPopulateGroup({
|
||||
members: 1,
|
||||
});
|
||||
await expect(user.post('/challenges', {
|
||||
group: group._id,
|
||||
summary,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('invalidReqParams'),
|
||||
});
|
||||
});
|
||||
|
||||
context('Creating a challenge for a valid group', () => {
|
||||
let groupLeader;
|
||||
let group;
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { MAX_SUMMARY_SIZE_FOR_CHALLENGES } from '../../../../../website/common/script/constants';
|
||||
|
||||
describe('PUT /challenges/:challengeId', () => {
|
||||
let privateGuild; let user; let nonMember; let challenge; let
|
||||
@@ -91,4 +92,15 @@ describe('PUT /challenges/:challengeId', () => {
|
||||
expect(res.name).to.equal('New Challenge Name');
|
||||
expect(res.description).to.equal('New challenge description.');
|
||||
});
|
||||
|
||||
it('return error when challenge summary is greater than MAX_SUMMARY_SIZE_FOR_CHALLENGES characters', async () => {
|
||||
const summary = 'A'.repeat(MAX_SUMMARY_SIZE_FOR_CHALLENGES + 1);
|
||||
await expect(user.put(`/challenges/${challenge._id}`, {
|
||||
summary,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('invalidReqParams'),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -15,6 +15,10 @@ describe('DELETE /groups/:groupId/chat/:chatId', () => {
|
||||
type: 'guild',
|
||||
privacy: 'public',
|
||||
},
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
balance: 10,
|
||||
},
|
||||
});
|
||||
|
||||
groupWithChat = group;
|
||||
|
||||
@@ -117,7 +117,9 @@ describe('POST /chat/:chatId/flag', () => {
|
||||
});
|
||||
|
||||
it('Flags a chat when the author\'s account was deleted', async () => {
|
||||
const deletedUser = await generateUser();
|
||||
const deletedUser = await generateUser({
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
const { message } = await deletedUser.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE });
|
||||
await deletedUser.del('/user', {
|
||||
password: 'password',
|
||||
|
||||
@@ -18,11 +18,16 @@ describe('POST /chat/:chatId/like', () => {
|
||||
privacy: 'public',
|
||||
},
|
||||
members: 1,
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
balance: 10,
|
||||
},
|
||||
});
|
||||
|
||||
user = groupLeader;
|
||||
groupWithChat = group;
|
||||
anotherUser = members[0]; // eslint-disable-line prefer-destructuring
|
||||
await anotherUser.update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
});
|
||||
|
||||
it('Returns an error when chat message is not found', async () => {
|
||||
|
||||
@@ -38,10 +38,15 @@ describe('POST /chat', () => {
|
||||
members: 2,
|
||||
});
|
||||
user = groupLeader;
|
||||
await user.update({ 'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL }); // prevent tests accidentally throwing messageGroupChatSpam
|
||||
await user.update({
|
||||
'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
}); // prevent tests accidentally throwing messageGroupChatSpam
|
||||
groupWithChat = group;
|
||||
member = members[0]; // eslint-disable-line prefer-destructuring
|
||||
additionalMember = members[1]; // eslint-disable-line prefer-destructuring
|
||||
await member.update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
await additionalMember.update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
});
|
||||
|
||||
it('Returns an error when no message is provided', async () => {
|
||||
@@ -104,7 +109,10 @@ describe('POST /chat', () => {
|
||||
});
|
||||
|
||||
const privateGuildMemberWithChatsRevoked = members[0];
|
||||
await privateGuildMemberWithChatsRevoked.update({ 'flags.chatRevoked': true });
|
||||
await privateGuildMemberWithChatsRevoked.update({
|
||||
'flags.chatRevoked': true,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
|
||||
const message = await privateGuildMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage });
|
||||
|
||||
@@ -122,7 +130,10 @@ describe('POST /chat', () => {
|
||||
});
|
||||
|
||||
const privatePartyMemberWithChatsRevoked = members[0];
|
||||
await privatePartyMemberWithChatsRevoked.update({ 'flags.chatRevoked': true });
|
||||
await privatePartyMemberWithChatsRevoked.update({
|
||||
'flags.chatRevoked': true,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
|
||||
const message = await privatePartyMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage });
|
||||
|
||||
@@ -183,7 +194,10 @@ describe('POST /chat', () => {
|
||||
});
|
||||
|
||||
const userWithChatShadowMuted = members[0];
|
||||
await userWithChatShadowMuted.update({ 'flags.chatShadowMuted': true });
|
||||
await userWithChatShadowMuted.update({
|
||||
'flags.chatShadowMuted': true,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
|
||||
const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage });
|
||||
|
||||
@@ -202,7 +216,10 @@ describe('POST /chat', () => {
|
||||
});
|
||||
|
||||
const userWithChatShadowMuted = members[0];
|
||||
await userWithChatShadowMuted.update({ 'flags.chatShadowMuted': true });
|
||||
await userWithChatShadowMuted.update({
|
||||
'flags.chatShadowMuted': true,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
|
||||
const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage });
|
||||
|
||||
@@ -312,6 +329,7 @@ describe('POST /chat', () => {
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
|
||||
const message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage });
|
||||
|
||||
@@ -330,6 +348,7 @@ describe('POST /chat', () => {
|
||||
|
||||
// Update the bannedWordsAllowed property for the group
|
||||
group.update({ bannedWordsAllowed: true });
|
||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
|
||||
const message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage });
|
||||
|
||||
@@ -345,6 +364,7 @@ describe('POST /chat', () => {
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
|
||||
const message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage });
|
||||
|
||||
@@ -411,6 +431,7 @@ describe('POST /chat', () => {
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
|
||||
const message = await members[0].post(`/groups/${group._id}/chat`, { message: testSlurMessage });
|
||||
|
||||
@@ -430,6 +451,16 @@ describe('POST /chat', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('errors when user account is too young', async () => {
|
||||
const brandNewUser = await generateUser();
|
||||
await expect(brandNewUser.post('/groups/habitrpg/chat', { message: 'hi im new' }))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('chatTemporarilyUnavailable'),
|
||||
});
|
||||
});
|
||||
|
||||
it('creates a chat', async () => {
|
||||
const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
||||
const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`);
|
||||
@@ -492,6 +523,7 @@ describe('POST /chat', () => {
|
||||
'items.currentMount': mount,
|
||||
'items.currentPet': pet,
|
||||
'preferences.style': style,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
await userWithStyle.sync();
|
||||
|
||||
@@ -517,6 +549,7 @@ describe('POST /chat', () => {
|
||||
};
|
||||
const backer = await generateUser({
|
||||
backer: backerInfo,
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
});
|
||||
|
||||
const message = await backer.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
||||
@@ -587,6 +620,9 @@ describe('POST /chat', () => {
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
},
|
||||
});
|
||||
|
||||
const message = await groupLeader.post(`/groups/${group._id}/chat`, { message: testMessage });
|
||||
|
||||
@@ -15,6 +15,10 @@ describe('POST /groups/:id/chat/seen', () => {
|
||||
privacy: 'public',
|
||||
},
|
||||
members: 1,
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
balance: 10,
|
||||
},
|
||||
});
|
||||
|
||||
guild = group;
|
||||
@@ -51,6 +55,9 @@ describe('POST /groups/:id/chat/seen', () => {
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
},
|
||||
});
|
||||
|
||||
party = group;
|
||||
|
||||
@@ -18,6 +18,10 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
|
||||
type: 'guild',
|
||||
privacy: 'public',
|
||||
},
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
balance: 10,
|
||||
},
|
||||
});
|
||||
|
||||
groupWithChat = group;
|
||||
@@ -65,6 +69,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
|
||||
members: 1,
|
||||
});
|
||||
|
||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
let privateMessage = await members[0].post(`/groups/${group._id}/chat`, { message: 'Some message' });
|
||||
privateMessage = privateMessage.message;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { model as Group } from '../../../../../website/server/models/group';
|
||||
import { MAX_SUMMARY_SIZE_FOR_GUILDS } from '../../../../../website/common/script/constants';
|
||||
|
||||
describe('POST /group', () => {
|
||||
let user;
|
||||
@@ -71,6 +72,20 @@ describe('POST /group', () => {
|
||||
|
||||
expect(updatedGroup.summary).to.eql(summary);
|
||||
});
|
||||
|
||||
it('returns error when summary is longer than MAX_SUMMARY_SIZE_FOR_GUILDS characters', async () => {
|
||||
const name = 'Test Group';
|
||||
const summary = 'A'.repeat(MAX_SUMMARY_SIZE_FOR_GUILDS + 1);
|
||||
await expect(user.post('/groups', {
|
||||
name,
|
||||
type: 'guild',
|
||||
summary,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('invalidReqParams'),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('Guilds', () => {
|
||||
|
||||
@@ -37,6 +37,7 @@ describe('POST /groups/:groupId/leave', () => {
|
||||
leader = groupLeader;
|
||||
member = members[0]; // eslint-disable-line prefer-destructuring
|
||||
memberCount = group.memberCount;
|
||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||
});
|
||||
|
||||
it('prevents non members from leaving', async () => {
|
||||
@@ -152,6 +153,10 @@ describe('POST /groups/:groupId/leave', () => {
|
||||
type: 'guild',
|
||||
},
|
||||
invites: 1,
|
||||
leaderDetails: {
|
||||
'auth.timestamps.created': new Date('2022-01-01'),
|
||||
balance: 10,
|
||||
},
|
||||
});
|
||||
|
||||
privateGuild = group;
|
||||
|
||||
@@ -153,6 +153,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => {
|
||||
},
|
||||
invites: 1,
|
||||
members: 2,
|
||||
leaderDetails: { 'auth.timestamps.created': new Date('2022-01-01') },
|
||||
});
|
||||
|
||||
party = group;
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
generateUser,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import { MAX_SUMMARY_SIZE_FOR_GUILDS } from '../../../../../website/common/script/constants';
|
||||
|
||||
describe('PUT /group', () => {
|
||||
let leader; let nonLeader; let groupToUpdate; let
|
||||
@@ -130,4 +131,15 @@ describe('PUT /group', () => {
|
||||
|
||||
expect(response.bannedWordsAllowed).to.eql(undefined);
|
||||
});
|
||||
|
||||
it('returns error when summary is longer than MAX_SUMMARY_SIZE_FOR_GUILDS characters', async () => {
|
||||
const summary = 'A'.repeat(MAX_SUMMARY_SIZE_FOR_GUILDS + 1);
|
||||
await expect(leader.put(`/groups/${groupToUpdate._id}`, {
|
||||
summary,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('invalidReqParams'),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -25,6 +25,7 @@ describe('Prevent multiple notifications', () => {
|
||||
|
||||
for (let i = 0; i < 4; i += 1) {
|
||||
for (let memberIndex = 0; memberIndex < partyMembers.length; memberIndex += 1) {
|
||||
await partyMembers[memberIndex].update({ 'auth.timestamps.created': new Date('2022-01-01') }); // eslint-disable-line no-await-in-loop
|
||||
multipleChatMessages.push(
|
||||
partyMembers[memberIndex].post(`/groups/${party._id}/chat`, { message: `Message ${i}_${memberIndex}` }),
|
||||
);
|
||||
|
||||
@@ -39,25 +39,38 @@ describe('POST /user/buy-quest/:key', () => {
|
||||
}));
|
||||
});
|
||||
|
||||
it('returns an error if quest prerequisites are not met', async () => {
|
||||
const key = 'dilatoryDistress2';
|
||||
it('returns an error if not all quest prerequisites are met', async () => {
|
||||
const prerequisites = ['dilatoryDistress1', 'dilatoryDistress2'];
|
||||
const key = 'dilatoryDistress3';
|
||||
|
||||
const achievementName1 = `achievements.quests.${prerequisites[0]}`;
|
||||
|
||||
await user.update({
|
||||
[achievementName1]: true,
|
||||
'stats.gp': 9999,
|
||||
});
|
||||
|
||||
await expect(user.post(`/user/buy-quest/${key}`))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('mustComplete', { quest: 'dilatoryDistress1' }),
|
||||
message: t('mustComplete', { quest: prerequisites[1] }),
|
||||
});
|
||||
});
|
||||
|
||||
it('allows purchase of a quest if prerequisites are met', async () => {
|
||||
const prerequisite = 'dilatoryDistress1';
|
||||
const key = 'dilatoryDistress2';
|
||||
const prerequisites = ['dilatoryDistress1', 'dilatoryDistress2'];
|
||||
const key = 'dilatoryDistress3';
|
||||
const item = content.quests[key];
|
||||
|
||||
const achievementName = `achievements.quests.${prerequisite}`;
|
||||
const achievementName1 = `achievements.quests.${prerequisites[0]}`;
|
||||
const achievementName2 = `achievements.quests.${prerequisites[1]}`;
|
||||
|
||||
await user.update({ [achievementName]: true, 'stats.gp': 9999 });
|
||||
await user.update({
|
||||
[achievementName1]: true,
|
||||
[achievementName2]: true,
|
||||
'stats.gp': 9999,
|
||||
});
|
||||
const res = await user.post(`/user/buy-quest/${key}`);
|
||||
await user.sync();
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ describe('shared.ops.buyQuestGems', () => {
|
||||
pinnedGearUtils.removeItemByPath.restore();
|
||||
});
|
||||
|
||||
context('successful purchase', () => {
|
||||
context('single purchase', () => {
|
||||
const userGemAmount = 10;
|
||||
|
||||
before(() => {
|
||||
@@ -44,7 +44,7 @@ describe('shared.ops.buyQuestGems', () => {
|
||||
user.pinnedItems.push({ type: 'quests', key: 'gryphon' });
|
||||
});
|
||||
|
||||
it('purchases quests', async () => {
|
||||
it('successfully purchases quest', async () => {
|
||||
const key = 'gryphon';
|
||||
|
||||
await buyQuest(user, { params: { key } });
|
||||
@@ -58,6 +58,28 @@ describe('shared.ops.buyQuestGems', () => {
|
||||
|
||||
await buyQuest(user, { params: { key } });
|
||||
|
||||
expect(user.items.quests[key]).to.equal(1);
|
||||
expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true);
|
||||
});
|
||||
it('errors if the user has not completed prerequisite quests', async () => {
|
||||
const key = 'atom3';
|
||||
user.achievements.quests.atom1 = 1;
|
||||
|
||||
try {
|
||||
await buyQuest(user, { params: { key } });
|
||||
} catch (err) {
|
||||
expect(err).to.be.an.instanceof(NotAuthorized);
|
||||
expect(err.message).to.equal(i18n.t('mustComplete', { quest: 'atom2' }));
|
||||
expect(user.items.quests[key]).to.eql(undefined);
|
||||
}
|
||||
});
|
||||
it('successfully purchases quest if user has completed all prerequisite quests', async () => {
|
||||
const key = 'atom3';
|
||||
user.achievements.quests.atom1 = 1;
|
||||
user.achievements.quests.atom2 = 1;
|
||||
|
||||
await buyQuest(user, { params: { key } });
|
||||
|
||||
expect(user.items.quests[key]).to.equal(1);
|
||||
expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true);
|
||||
});
|
||||
|
||||
@@ -162,7 +162,9 @@ describe('shared.ops.buyQuest', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('does not buy a quest without completing previous quests', async () => {
|
||||
it('returns error if user has not completed all prerequisite quests', async () => {
|
||||
user.stats.gp = 9999;
|
||||
user.achievements.quests.dilatoryDistress1 = 1;
|
||||
try {
|
||||
await buyQuest(user, {
|
||||
params: {
|
||||
@@ -175,4 +177,22 @@ describe('shared.ops.buyQuest', () => {
|
||||
expect(user.items.quests).to.eql({});
|
||||
}
|
||||
});
|
||||
|
||||
it('successfully purchases quest if user has completed all prerequisite quests', async () => {
|
||||
user.stats.gp = 500;
|
||||
user.achievements.quests.dilatoryDistress1 = 1;
|
||||
user.achievements.quests.dilatoryDistress2 = 1;
|
||||
|
||||
await buyQuest(user, {
|
||||
params: {
|
||||
key: 'dilatoryDistress3',
|
||||
},
|
||||
}, analytics);
|
||||
|
||||
expect(user.items.quests).to.eql({
|
||||
dilatoryDistress3: 1,
|
||||
});
|
||||
expect(user.stats.gp).to.equal(100);
|
||||
expect(analytics.track).to.be.calledOnce;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -11,6 +11,7 @@ if (process.env.LOAD_SERVER === '0') { // when the server is in a different proc
|
||||
setupNconf('./config.json.example');
|
||||
nconf.set('NODE_DB_URI', nconf.get('TEST_DB_URI'));
|
||||
nconf.set('NODE_ENV', 'test');
|
||||
nconf.set('ACCOUNT_MIN_CHAT_AGE', '2');
|
||||
nconf.set('IS_TEST', true);
|
||||
// We require src/server and not src/index because
|
||||
// 1. nconf is already setup
|
||||
|
||||
Generated
+60
-60
@@ -22,9 +22,9 @@
|
||||
}
|
||||
},
|
||||
"@amplitude/analytics-connector": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.3.tgz",
|
||||
"integrity": "sha512-Ghu1UJn55Rn9eglF+ED7yOGXaeX3KY2qkQi9W9yqC02ItPvKfrybeVndweI1XtsiW0LvRpdA3uQEjuZEGunyLw==",
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.4.tgz",
|
||||
"integrity": "sha512-6JcE1nxrprJt6pHqqDQb7FXRqJmFHG7KJPe0jNZaAvfll4mWKVqZu8W9IV3XiN1P+xgHIV1NN+i3PLOAZWEhXg==",
|
||||
"requires": {
|
||||
"@amplitude/ua-parser-js": "0.7.31"
|
||||
}
|
||||
@@ -1799,39 +1799,39 @@
|
||||
}
|
||||
},
|
||||
"@babel/plugin-proposal-optional-chaining": {
|
||||
"version": "7.17.12",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz",
|
||||
"integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==",
|
||||
"version": "7.18.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz",
|
||||
"integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==",
|
||||
"requires": {
|
||||
"@babel/helper-plugin-utils": "^7.17.12",
|
||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
|
||||
"@babel/helper-plugin-utils": "^7.18.6",
|
||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
|
||||
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": {
|
||||
"version": "7.17.12",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
|
||||
"integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA=="
|
||||
"version": "7.18.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
|
||||
"integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg=="
|
||||
},
|
||||
"@babel/helper-skip-transparent-expression-wrappers": {
|
||||
"version": "7.16.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
|
||||
"integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
|
||||
"version": "7.18.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz",
|
||||
"integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==",
|
||||
"requires": {
|
||||
"@babel/types": "^7.16.0"
|
||||
"@babel/types": "^7.18.6"
|
||||
}
|
||||
},
|
||||
"@babel/helper-validator-identifier": {
|
||||
"version": "7.16.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
|
||||
"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
|
||||
"version": "7.18.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
|
||||
"integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g=="
|
||||
},
|
||||
"@babel/types": {
|
||||
"version": "7.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz",
|
||||
"integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==",
|
||||
"version": "7.18.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz",
|
||||
"integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==",
|
||||
"requires": {
|
||||
"@babel/helper-validator-identifier": "^7.16.7",
|
||||
"@babel/helper-validator-identifier": "^7.18.6",
|
||||
"to-fast-properties": "^2.0.0"
|
||||
}
|
||||
}
|
||||
@@ -12131,11 +12131,11 @@
|
||||
}
|
||||
},
|
||||
"@vue/cli-plugin-eslint": {
|
||||
"version": "4.5.17",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.17.tgz",
|
||||
"integrity": "sha512-bVNDP+SuWcuJrBMc+JLaKvlxx25XKIlZBa+zzFnxhHZlwPZ7CeBD3e2wnsygJyPoKgDZcZwDgmEz1BZzMEjsNw==",
|
||||
"version": "4.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.19.tgz",
|
||||
"integrity": "sha512-53sa4Pu9j5KajesFlj494CcO8vVo3e3nnZ1CCKjGGnrF90id1rUeepcFfz5XjwfEtbJZp2x/NoX/EZE6zCzSFQ==",
|
||||
"requires": {
|
||||
"@vue/cli-shared-utils": "^4.5.17",
|
||||
"@vue/cli-shared-utils": "^4.5.19",
|
||||
"eslint-loader": "^2.2.1",
|
||||
"globby": "^9.2.0",
|
||||
"inquirer": "^7.1.0",
|
||||
@@ -12144,9 +12144,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@vue/cli-shared-utils": {
|
||||
"version": "4.5.17",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.17.tgz",
|
||||
"integrity": "sha512-VoFNdxvTW4vZu3ne+j1Mf7mU99J2SAoRVn9XPrsouTUUJablglM8DASk7Ixhsh6ymyL/W9EADQFR6Pgj8Ujjuw==",
|
||||
"version": "4.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.19.tgz",
|
||||
"integrity": "sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==",
|
||||
"requires": {
|
||||
"@achrinza/node-ipc": "9.2.2",
|
||||
"@hapi/joi": "^15.0.1",
|
||||
@@ -13086,11 +13086,11 @@
|
||||
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
|
||||
},
|
||||
"amplitude-js": {
|
||||
"version": "8.18.4",
|
||||
"resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.18.4.tgz",
|
||||
"integrity": "sha512-Nk4ymaw9iGf1Be/fGuuH7H/QnUJceD2RYGdode8ZAApw6jHlm9QZCoYoVRrNPdgfb3yJz3P84EPh/4xM+/98/w==",
|
||||
"version": "8.18.5",
|
||||
"resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.18.5.tgz",
|
||||
"integrity": "sha512-s43q4qKd7kvhYESQhYvyKDKUM1PpyAyoOFFlyMuFfQHRxyeDmZRhcfzrKnOhbrLhFxSWtPc0VEeh9tajJRNe5Q==",
|
||||
"requires": {
|
||||
"@amplitude/analytics-connector": "1.4.3",
|
||||
"@amplitude/analytics-connector": "1.4.4",
|
||||
"@amplitude/ua-parser-js": "0.7.31",
|
||||
"@amplitude/utils": "^1.0.5",
|
||||
"@babel/runtime": "^7.3.4",
|
||||
@@ -13697,9 +13697,12 @@
|
||||
"integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
|
||||
},
|
||||
"async": {
|
||||
"version": "3.2.3",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
|
||||
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
|
||||
"version": "2.6.4",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
|
||||
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
|
||||
"requires": {
|
||||
"lodash": "^4.17.14"
|
||||
}
|
||||
},
|
||||
"async-each": {
|
||||
"version": "1.0.3",
|
||||
@@ -15836,9 +15839,9 @@
|
||||
}
|
||||
},
|
||||
"core-js": {
|
||||
"version": "3.22.8",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz",
|
||||
"integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA=="
|
||||
"version": "3.23.5",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.5.tgz",
|
||||
"integrity": "sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg=="
|
||||
},
|
||||
"core-js-compat": {
|
||||
"version": "3.11.0",
|
||||
@@ -20975,7 +20978,7 @@
|
||||
"find-cache-dir": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
|
||||
"integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
|
||||
"integrity": "sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==",
|
||||
"requires": {
|
||||
"commondir": "^1.0.1",
|
||||
"mkdirp": "^0.5.1",
|
||||
@@ -20985,7 +20988,7 @@
|
||||
"find-up": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
|
||||
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
|
||||
"integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
|
||||
"requires": {
|
||||
"path-exists": "^2.0.0",
|
||||
"pinkie-promise": "^2.0.0"
|
||||
@@ -20994,7 +20997,7 @@
|
||||
"path-exists": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
|
||||
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
|
||||
"integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
|
||||
"requires": {
|
||||
"pinkie-promise": "^2.0.0"
|
||||
}
|
||||
@@ -21002,7 +21005,7 @@
|
||||
"pkg-dir": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
|
||||
"integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
|
||||
"integrity": "sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==",
|
||||
"requires": {
|
||||
"find-up": "^1.0.0"
|
||||
}
|
||||
@@ -21926,9 +21929,9 @@
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.29.3",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
|
||||
"integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
|
||||
},
|
||||
"move-concurrently": {
|
||||
"version": "1.0.1",
|
||||
@@ -22035,6 +22038,11 @@
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"async": {
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
|
||||
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
|
||||
},
|
||||
"cliui": {
|
||||
"version": "7.0.4",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
|
||||
@@ -23119,14 +23127,6 @@
|
||||
"mkdirp": "^0.5.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"async": {
|
||||
"version": "2.6.3",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
|
||||
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
|
||||
"requires": {
|
||||
"lodash": "^4.17.14"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "3.2.7",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
|
||||
@@ -26883,7 +26883,7 @@
|
||||
"strip-indent": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
|
||||
"integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g="
|
||||
"integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA=="
|
||||
},
|
||||
"strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
@@ -29477,7 +29477,7 @@
|
||||
"cross-spawn": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
|
||||
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
|
||||
"integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
|
||||
"requires": {
|
||||
"lru-cache": "^4.0.1",
|
||||
"shebang-command": "^1.2.0",
|
||||
@@ -29487,7 +29487,7 @@
|
||||
"execa": {
|
||||
"version": "0.8.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
|
||||
"integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
|
||||
"integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==",
|
||||
"requires": {
|
||||
"cross-spawn": "^5.0.1",
|
||||
"get-stream": "^3.0.0",
|
||||
@@ -29501,7 +29501,7 @@
|
||||
"get-stream": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
|
||||
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
|
||||
"integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ=="
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "4.1.5",
|
||||
@@ -29515,12 +29515,12 @@
|
||||
"normalize-path": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
|
||||
"integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k="
|
||||
"integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA=="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
|
||||
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
|
||||
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -20,19 +20,19 @@
|
||||
"@storybook/addons": "6.5.9",
|
||||
"@storybook/vue": "6.3.13",
|
||||
"@vue/cli-plugin-babel": "^4.5.15",
|
||||
"@vue/cli-plugin-eslint": "^4.5.17",
|
||||
"@vue/cli-plugin-eslint": "^4.5.19",
|
||||
"@vue/cli-plugin-router": "^4.5.15",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.5.15",
|
||||
"@vue/cli-service": "^4.5.15",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^8.18.4",
|
||||
"amplitude-js": "^8.18.5",
|
||||
"axios": "^0.25.0",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"bootstrap-vue": "^2.22.0",
|
||||
"chai": "^4.3.6",
|
||||
"core-js": "^3.22.8",
|
||||
"core-js": "^3.23.5",
|
||||
"dompurify": "^2.3.8",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
@@ -44,7 +44,7 @@
|
||||
"intro.js": "^5.1.0",
|
||||
"jquery": "^3.6.0",
|
||||
"lodash": "^4.17.21",
|
||||
"moment": "^2.29.3",
|
||||
"moment": "^2.29.4",
|
||||
"nconf": "^0.12.0",
|
||||
"sass": "^1.34.0",
|
||||
"sass-loader": "^8.0.2",
|
||||
@@ -65,6 +65,6 @@
|
||||
"webpack": "^4.46.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.17.12"
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.18.6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -414,7 +414,15 @@ export default {
|
||||
this.$store.state.isUserLoaded = true;
|
||||
Analytics.setUser();
|
||||
Analytics.updateUser();
|
||||
return axios.get('/api/v4/i18n/browser-script', { language: this.user.preferences.language });
|
||||
return axios.get('/api/v4/i18n/browser-script',
|
||||
{
|
||||
language: this.user.preferences.language,
|
||||
headers: {
|
||||
'Cache-Control': 'no-cache',
|
||||
Pragma: 'no-cache',
|
||||
Expires: '0',
|
||||
},
|
||||
});
|
||||
}).then(() => {
|
||||
const i18nData = window && window['habitica-i18n'];
|
||||
this.$loadLocale(i18nData);
|
||||
|
||||
@@ -463,6 +463,11 @@
|
||||
width: 48px;
|
||||
height: 52px;
|
||||
}
|
||||
.achievement-woodlandWizard2x {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-woodlandWizard2x.png');
|
||||
width: 60px;
|
||||
height: 64px;
|
||||
}
|
||||
.achievement-zodiac2x {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-zodiac2x.png');
|
||||
width: 60px;
|
||||
@@ -625,6 +630,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_bioluminescent_waves {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_bioluminescent_waves.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_birch_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_birch_forest.png');
|
||||
width: 141px;
|
||||
@@ -685,6 +695,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_by_a_campfire {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_by_a_campfire.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_camping_out {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_camping_out.png');
|
||||
width: 141px;
|
||||
@@ -1349,6 +1364,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_messy_room {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_messy_room.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_meteor_shower {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_meteor_shower.png');
|
||||
width: 141px;
|
||||
@@ -1504,6 +1524,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainbow_eucalyptus {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_rainbow_eucalyptus.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_rainbow_meadow {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_rainbow_meadow.png');
|
||||
width: 141px;
|
||||
@@ -1884,11 +1909,21 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_underwater_cave {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_cave.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_underwater_ruins {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_ruins.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_underwater_statues {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_statues.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_underwater_vents {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_vents.png');
|
||||
width: 141px;
|
||||
@@ -2151,6 +2186,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_bioluminescent_waves {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_bioluminescent_waves.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_birch_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_birch_forest.png');
|
||||
width: 68px;
|
||||
@@ -2211,6 +2251,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_by_a_campfire {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_by_a_campfire.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_camping_out {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_camping_out.png');
|
||||
width: 68px;
|
||||
@@ -2880,6 +2925,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_messy_room {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_messy_room.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_meteor_shower {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_meteor_shower.png');
|
||||
width: 68px;
|
||||
@@ -3035,6 +3085,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_rainbow_eucalyptus {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_rainbow_eucalyptus.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_rainbow_meadow {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_rainbow_meadow.png');
|
||||
width: 68px;
|
||||
@@ -3420,11 +3475,21 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_underwater_cave {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_cave.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_underwater_ruins {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_ruins.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_underwater_statues {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_statues.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_underwater_vents {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_vents.png');
|
||||
width: 68px;
|
||||
@@ -18145,6 +18210,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_fancyPirateSuit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_fancyPirateSuit.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_farrierOutfit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_farrierOutfit.png');
|
||||
width: 90px;
|
||||
@@ -18590,6 +18660,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_armoire_fancyPirateHat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_fancyPirateHat.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_armoire_fiddlersCap {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_fiddlersCap.png');
|
||||
width: 114px;
|
||||
@@ -18930,6 +19005,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_dustpan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_dustpan.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_fancyBlownGlassVase {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_fancyBlownGlassVase.png');
|
||||
width: 114px;
|
||||
@@ -19175,6 +19255,11 @@
|
||||
width: 114px;
|
||||
height: 87px;
|
||||
}
|
||||
.shield_armoire_treasureMap {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_treasureMap.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_trustyUmbrella {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_trustyUmbrella.png');
|
||||
width: 114px;
|
||||
@@ -19325,6 +19410,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_fancyPirateSuit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_fancyPirateSuit.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_farrierOutfit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_farrierOutfit.png');
|
||||
width: 68px;
|
||||
@@ -19785,6 +19875,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_armoire_fancyPirateHat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_fancyPirateHat.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_armoire_fiddlersCap {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_fiddlersCap.png');
|
||||
width: 68px;
|
||||
@@ -20125,6 +20220,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_dustpan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_dustpan.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_fancyBlownGlassVase {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_fancyBlownGlassVase.png');
|
||||
width: 68px;
|
||||
@@ -20370,6 +20470,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_treasureMap {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_treasureMap.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_trustyUmbrella {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_trustyUmbrella.png');
|
||||
width: 68px;
|
||||
@@ -20505,6 +20610,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_featherDuster {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_featherDuster.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_festivalFirecracker {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_festivalFirecracker.png');
|
||||
width: 68px;
|
||||
@@ -20745,6 +20855,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_pushBroom {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_pushBroom.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_rancherLasso {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_rancherLasso.png');
|
||||
width: 68px;
|
||||
@@ -20960,6 +21075,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_fancyPirateSuit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_fancyPirateSuit.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_farrierOutfit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_farrierOutfit.png');
|
||||
width: 90px;
|
||||
@@ -21365,6 +21485,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_featherDuster {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_featherDuster.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_festivalFirecracker {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_festivalFirecracker.png');
|
||||
width: 90px;
|
||||
@@ -21605,6 +21730,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_pushBroom {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pushBroom.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_rancherLasso {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_rancherLasso.png');
|
||||
width: 90px;
|
||||
@@ -26860,6 +26990,31 @@
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.eyewear_mystery_202208 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202208.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_mystery_202208 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202208.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shop_eyewear_mystery_202208 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_mystery_202208.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_mystery_202208 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202208.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202208 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202208.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.broad_armor_mystery_301404 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
|
||||
width: 90px;
|
||||
|
||||
@@ -82,7 +82,7 @@ input, textarea, input.form-control, textarea.form-control {
|
||||
}
|
||||
}
|
||||
|
||||
/** Colored Input-Groups, ignoring checklist */
|
||||
// Colored Input-Groups, ignoring checklist
|
||||
.input-group:not(.checklist-group) {
|
||||
border-radius: 2px;
|
||||
border: solid 1px $gray-400;
|
||||
@@ -100,7 +100,7 @@ input, textarea, input.form-control, textarea.form-control {
|
||||
}
|
||||
}
|
||||
|
||||
/** Generic Input Group Styles */
|
||||
// Generic Input Group Styles
|
||||
.input-group {
|
||||
height: 2rem;
|
||||
|
||||
@@ -179,10 +179,11 @@ input, textarea, input.form-control, textarea.form-control {
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
// Checkboxes and radios
|
||||
// used in checkboxes and radios
|
||||
$bg-focused-active-control: #4f2993;
|
||||
$bg-disabled-control: #34303a;
|
||||
|
||||
// custom control
|
||||
.custom-control {
|
||||
margin-bottom: .5rem;
|
||||
|
||||
@@ -205,6 +206,7 @@ $bg-disabled-control: #34303a;
|
||||
}
|
||||
}
|
||||
|
||||
// checkboxes
|
||||
.custom-checkbox {
|
||||
.custom-control-label::before {
|
||||
border-radius: 2px;
|
||||
@@ -280,11 +282,26 @@ $bg-disabled-control: #34303a;
|
||||
padding-left: 36px;
|
||||
}
|
||||
|
||||
// radio buttons
|
||||
$bg-color: $purple-400;
|
||||
|
||||
// svg for the purple dot
|
||||
@mixin custom-radio-checked-icon ($bg-color) {
|
||||
background-image: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$bg-color}'/%3E%3C/svg%3E"), "#", "%23");
|
||||
}
|
||||
|
||||
.custom-radio .custom-control-input {
|
||||
opacity: 0;
|
||||
margin: 15px 25px 34px 25px;
|
||||
|
||||
// outside circle
|
||||
&:checked~.custom-control-label::before {
|
||||
background-color: $gray-700;
|
||||
background-size: 12px 12px;
|
||||
border-color: $purple-400;
|
||||
}
|
||||
|
||||
// checked indicator
|
||||
&:checked~.custom-control-label::after {
|
||||
@include custom-radio-checked-icon($purple-400);
|
||||
width: 18px;
|
||||
@@ -292,51 +309,84 @@ $bg-disabled-control: #34303a;
|
||||
background-size: 12px 12px;
|
||||
}
|
||||
|
||||
&:checked~.custom-control-label::before {
|
||||
background-color: $gray-700;
|
||||
background-size: 12px 12px;
|
||||
border-color: $purple-400;
|
||||
}
|
||||
|
||||
&:active~.custom-control-label::before {
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
&:focus:not(:checked):not(:disabled)~.custom-control-label::before, &:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-focused-active-control, 0.1);
|
||||
// focus / not checked / not disabled
|
||||
&:focus:not(:checked):not(:disabled)~.custom-control-label::before,
|
||||
&:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
border: 2px solid $gray-300;
|
||||
box-shadow: 0 0 0 2px rgba(146, 92, 243, 0.5);
|
||||
}
|
||||
|
||||
&:focus:checked:not(:disabled)~.custom-control-label::before, &:active:checked:not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-focused-active-control, 0.1);
|
||||
border-color: $purple-400;
|
||||
background-color: rgba($bg-focused-active-control, 0.1);
|
||||
// focus / checked / not disabled
|
||||
&:focus:checked:not(:disabled)~.custom-control-label::before,
|
||||
&:active:checked:not(:disabled)~.custom-control-label::before {
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 0 0 2px rgba(146, 92, 243, 0.5);
|
||||
}
|
||||
|
||||
&:disabled:checked~.custom-control-label::before {
|
||||
border-color: $gray-400;
|
||||
background-color: transparent;
|
||||
// hover / not checked / not disabled
|
||||
&:hover:not(:checked):not(:disabled)~.custom-control-label::before,
|
||||
&:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
background: 50%/50% 50% no-repeat;
|
||||
@include custom-radio-checked-icon($purple-400);
|
||||
background-size: 12px 12px;
|
||||
border: solid 2px $purple-400;
|
||||
}
|
||||
|
||||
&:disabled:checked~.custom-control-label::after {
|
||||
// hover / checked / not disabled
|
||||
&:hover:checked:not(:disabled)~.custom-control-label::before,
|
||||
&:active::checked:not(:disabled)~.custom-control-label::before {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
background: 50%/50% 50% no-repeat;
|
||||
@include custom-radio-checked-icon($gray-400);
|
||||
background-size: 12px 12px;
|
||||
border: solid 2px $purple-300;
|
||||
}
|
||||
|
||||
// disabled / checked / before
|
||||
&:disabled:checked~.custom-control-label::before {
|
||||
background: 50%/50% 50% no-repeat;
|
||||
@include custom-radio-checked-icon($gray-300);
|
||||
border: 2px solid $gray-200;
|
||||
background-color: transparent;
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
// disabled / checked / after
|
||||
&:disabled:checked~.custom-control-label::after {
|
||||
background: 50%/50% 50% no-repeat;
|
||||
@include custom-radio-checked-icon($gray-300);
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
background-size: 12px 12px;
|
||||
}
|
||||
|
||||
// disabled / not checked / before
|
||||
&:disabled:not(:checked)~.custom-control-label::before {
|
||||
border-color: $gray-300;
|
||||
background-color: transparent;
|
||||
background-color: $gray-600;
|
||||
border: 2px solid $gray-200;
|
||||
}
|
||||
|
||||
&:focus:disabled~.custom-control-label::before, &:active:disabled~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-disabled-control, 0.1);
|
||||
border-color: $gray-300;
|
||||
// focus and disabled / not checked / before
|
||||
&:focus:disabled~.custom-control-label::before,
|
||||
&:active:disabled~.custom-control-label::before {
|
||||
background-color: rgba($bg-disabled-control, 0.1);
|
||||
box-shadow: 0 0 0 6px rgba($bg-disabled-control, 0.1);
|
||||
border: 2px solid $gray-200;
|
||||
}
|
||||
|
||||
&:focus:disabled:checked~.custom-control-label::before, &:active:disabled:checked~.custom-control-label::before {
|
||||
border-color: $gray-400;
|
||||
// focus and disabled / checked / before
|
||||
&:focus:disabled:checked~.custom-control-label::before,
|
||||
&:active:disabled:checked~.custom-control-label::before {
|
||||
background: 50%/50% 50% no-repeat;
|
||||
@include custom-radio-checked-icon($gray-300);
|
||||
border: 2px solid $gray-200;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<svg width="176" height="67" viewBox="0 0 176 67" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#77F4C7" d="M35.667 11.667 40 9.5l-4.333-2.167L33.5 3l-2.167 4.333L27 9.5l4.333 2.167L33.5 16z"/>
|
||||
<path fill="#BDA8FF" d="M24.667 38.667 30 36l-5.333-2.667L22 28l-2.667 5.333L14 36l5.333 2.667L22 44z"/>
|
||||
<path fill="#8EEDF6" d="M35.667 63.667 39 62l-3.333-1.667L34 57l-1.667 3.333L29 62l3.333 1.667L34 67z"/>
|
||||
<path fill="#FFBE5D" d="M6.667 49.667 10 48l-3.333-1.667L5 43l-1.667 3.333L0 48l3.333 1.667L5 53z"/>
|
||||
<path fill="#FFB6B8" d="M5.667 20.667 8 19.5l-2.333-1.167L4.5 16l-1.167 2.333L1 19.5l2.333 1.167L4.5 23z"/>
|
||||
<g>
|
||||
<path fill="#77F4C7" d="M140.333 11.667 136 9.5l4.333-2.167L142.5 3l2.167 4.333L149 9.5l-4.333 2.167L142.5 16z"/>
|
||||
<path fill="#BDA8FF" d="M151.333 38.667 146 36l5.333-2.667L154 28l2.667 5.333L162 36l-5.333 2.667L154 44z"/>
|
||||
<path fill="#8EEDF6" d="M140.333 63.667 137 62l3.333-1.667L142 57l1.667 3.333L147 62l-3.333 1.667L142 67z"/>
|
||||
<path fill="#FFBE5D" d="M169.333 49.667 166 48l3.333-1.667L171 43l1.667 3.333L176 48l-3.333 1.667L171 53z"/>
|
||||
<path fill="#FFB6B8" d="M170.333 20.667 168 19.5l2.333-1.167L171.5 16l1.167 2.333L175 19.5l-2.333 1.167L171.5 23z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M81.117 13.904c-2.139-4.838-6.274-9.113-11.25-9.324-4.976-.211-7.828 3.779-6.367 7.309 1.461 3.53 4.94 4.177 16.227 7.202 3.204.858 3.528-.35 1.39-5.187z" stroke="#22AEB7" stroke-width="4"/>
|
||||
<path d="M93.833 13.904c2.138-4.838 6.273-9.113 11.25-9.324 4.975-.211 7.828 3.779 6.367 7.309-1.462 3.53-4.94 4.177-16.227 7.202-3.205.858-3.528-.35-1.39-5.187z" stroke="#38C9C6" stroke-width="4"/>
|
||||
<path d="M87.128 11c-9.738 0-3.907 11.145 0 11.145 3.908 0 9.74-11.145 0-11.145z" fill="#46DDDA"/>
|
||||
<path fill="#6133B4" d="M62 33h52v34H62zM56 21h64v12H56z"/>
|
||||
<path fill-opacity=".5" fill="#FFF" style="mix-blend-mode:soft-light" d="M32 30h26v34H32z" transform="translate(56 3)"/>
|
||||
<path fill="#8EEDF6" d="M88 33h6v34h-6z"/>
|
||||
<path fill="#3BCAD7" d="M82 33h6v34h-6zM76 21h12v12H76z"/>
|
||||
<path fill="#8EEDF6" d="M88 21h12v12H88z"/>
|
||||
<path fill-opacity=".2" fill="#000" style="mix-blend-mode:multiply" d="M6 30h26v6H6zM20 18h12v6H20zM0 24h20v6H0zM44 24h20v6H44zM32 18h12v6H32zM6 58h26v6H6zM32 30h26v6H32zM32 58h26v6H32z" transform="translate(56 3)"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -1,5 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
|
||||
<g fill="none" fill-rule="evenodd" stroke="#A5A1AC" stroke-width="2">
|
||||
<path d="M1 11L11 1M11 11L1 1"/>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Icon/Close</title>
|
||||
<g id="Modals" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Shop-Modals" transform="translate(-183.000000, -655.000000)" fill="#878190" fill-rule="nonzero">
|
||||
<g id="Icon/Close" transform="translate(183.000000, 655.000000)">
|
||||
<polygon id="Mask" points="12.1973467 2 14 3.80265326 9.80187117 8 14 12.1973467 12.1973467 14 8 9.80187117 3.80265326 14 2 12.1973467 6.19812883 8 2 3.80265326 3.80265326 2 8 6.19812883"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 747 B |
@@ -122,6 +122,11 @@
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.custom-control-input {
|
||||
z-index: -1;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.box:hover {
|
||||
cursor: pointer;
|
||||
opacity: 0.7;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<creator-intro />
|
||||
<profileModal />
|
||||
<report-flag-modal />
|
||||
<send-gems-modal />
|
||||
<send-gift-modal />
|
||||
<select-user-modal />
|
||||
<b-navbar
|
||||
id="habitica-menu"
|
||||
@@ -747,7 +747,7 @@ import creatorIntro from '../creatorIntro';
|
||||
import notificationMenu from './notificationsDropdown';
|
||||
import profileModal from '../userMenu/profileModal';
|
||||
import reportFlagModal from '../chat/reportFlagModal';
|
||||
import sendGemsModal from '@/components/payments/sendGemsModal';
|
||||
import sendGiftModal from '@/components/payments/sendGiftModal';
|
||||
import selectUserModal from '@/components/payments/selectUserModal';
|
||||
import sync from '@/mixins/sync';
|
||||
import userDropdown from './userDropdown';
|
||||
@@ -759,7 +759,7 @@ export default {
|
||||
notificationMenu,
|
||||
profileModal,
|
||||
reportFlagModal,
|
||||
sendGemsModal,
|
||||
sendGiftModal,
|
||||
selectUserModal,
|
||||
userDropdown,
|
||||
},
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
:class="{ condensed, expanded, 'd-flex': isHeader, row: !isHeader, }"
|
||||
@click="showMemberModal(member)"
|
||||
>
|
||||
<div :class="{ 'col-4': !isHeader }">
|
||||
<div class="avatar-container" :class="{ 'col-4': !isHeader }">
|
||||
<avatar
|
||||
:member="member"
|
||||
:hide-class-badge="classBadgePosition !== 'under-avatar'"
|
||||
@@ -92,6 +92,10 @@
|
||||
.member-details {
|
||||
white-space: nowrap;
|
||||
transition: all 0.15s ease-out;
|
||||
|
||||
.avatar-container {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.member-stats {
|
||||
|
||||
@@ -198,7 +198,7 @@ export default {
|
||||
appState.newGroup = false;
|
||||
appState.group = pick(this.amazonPayments.group, ['_id', 'memberCount', 'name']);
|
||||
}
|
||||
} else if (paymentType.indexOf('gift-') === 0) {
|
||||
} else if (paymentType && paymentType.indexOf('gift-') === 0) {
|
||||
appState.gift = this.amazonPayments.gift;
|
||||
appState.giftReceiver = this.amazonPayments.giftReceiver;
|
||||
} else if (paymentType === 'gems') {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<template>
|
||||
<div class="payments-column mx-auto mt-auto">
|
||||
<h4>{{ $t('choosePaymentMethod') }}</h4>
|
||||
<button
|
||||
v-if="stripeAvailable"
|
||||
class="btn btn-primary payment-button payment-item with-icon"
|
||||
@@ -80,6 +81,13 @@
|
||||
cursor: default !important;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 0.875rem;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
|
||||
@@ -14,15 +14,44 @@
|
||||
</div>
|
||||
<h2
|
||||
v-else
|
||||
class="ml-2"
|
||||
class="d-flex flex-column mx-auto align-items-center"
|
||||
>
|
||||
{{ $t('sendGift') }}
|
||||
{{ $t('sendAGift') }}
|
||||
</h2>
|
||||
<div
|
||||
v-if="currentEvent && currentEvent.promo === 'g1g1'"
|
||||
class="g1g1-margin d-flex flex-column align-items-center"
|
||||
>
|
||||
<div
|
||||
class="svg-big-gift"
|
||||
v-once
|
||||
v-html="icons.bigGift"
|
||||
></div>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="d-flex flex-column align-items-center">
|
||||
<div
|
||||
class="svg-big-gift"
|
||||
v-once
|
||||
v-html="icons.bigGift"
|
||||
></div>
|
||||
</div>
|
||||
<div class="d-flex flex-column align-items-center">
|
||||
<div
|
||||
class="modal-close"
|
||||
v-if="currentEvent && currentEvent.promo === 'g1g1'"
|
||||
class="g1g1-modal-close"
|
||||
@click="close()"
|
||||
>
|
||||
<div
|
||||
class="g1g1-svg-icon"
|
||||
v-html="icons.close"
|
||||
></div>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="modal-close"
|
||||
@click="close()">
|
||||
<div
|
||||
class="svg-icon"
|
||||
v-html="icons.close"
|
||||
@@ -42,6 +71,7 @@
|
||||
v-model="userSearchTerm"
|
||||
class="form-control"
|
||||
type="text"
|
||||
ref="textBox"
|
||||
:placeholder="$t('usernameOrUserId')"
|
||||
:class="{
|
||||
'input-valid': foundUser._id,
|
||||
@@ -70,15 +100,20 @@
|
||||
<div
|
||||
v-else
|
||||
>
|
||||
{{ $t('selectGift') }}
|
||||
{{ $t('next') }}
|
||||
</div>
|
||||
</button>
|
||||
<a
|
||||
class="cancel-link mx-auto mt-3"
|
||||
@click="close()"
|
||||
<div
|
||||
v-if="currentEvent && currentEvent.promo ==='g1g1'"
|
||||
class="g1g1-cancel d-flex justify-content-center"
|
||||
v-html="$t('cancel')"
|
||||
@click="close()"
|
||||
>
|
||||
{{ $t('cancel') }}
|
||||
</a>
|
||||
{{ $t('cancel') }}
|
||||
</div>
|
||||
<div
|
||||
v-else>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -110,13 +145,16 @@
|
||||
@import '~@/assets/scss/mixins.scss';
|
||||
|
||||
#select-user-modal {
|
||||
.modal-content {
|
||||
width:448px;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
margin-top: 0rem;
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
width: 29.5rem;
|
||||
margin-top: 25vh;
|
||||
width: 448px;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
@@ -126,7 +164,16 @@
|
||||
margin: 0rem 0.25rem 0.25rem 0.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
body.modal-open .modal {
|
||||
display: flex !important;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body.modal-open .modal .modal-dialog {
|
||||
margin: auto;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@@ -146,12 +193,12 @@
|
||||
|
||||
.g1g1 {
|
||||
background-image: url('~@/assets/images/g1g1-send.png');
|
||||
background-size: 472px 152px;
|
||||
width: 470px;
|
||||
background-size: 446px 152px;
|
||||
width: 446px;
|
||||
height: 152px;
|
||||
margin: -1rem 0rem 0rem -1rem;
|
||||
border-radius: 0.3rem 0.3rem 0rem 0rem;
|
||||
padding: 1.5rem;
|
||||
margin: -16px 0px 0px -16px;
|
||||
border-radius: 4.8px 4.8px 0px 0px;
|
||||
padding: 24px;
|
||||
color: $white;
|
||||
|
||||
h1 {
|
||||
@@ -169,6 +216,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
.g1g1-margin {
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.g1g1-cancel {
|
||||
margin-top: 16px;
|
||||
color: $blue-10;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.g1g1-fine-print {
|
||||
color: $gray-100;
|
||||
background-color: $gray-700;
|
||||
@@ -176,6 +233,29 @@
|
||||
line-height: 1.33;
|
||||
}
|
||||
|
||||
.g1g1-modal-close {
|
||||
position: absolute;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
padding: 4px;
|
||||
right: 16px;
|
||||
top: 16px;
|
||||
cursor: pointer;
|
||||
|
||||
.g1g1-svg-icon {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
|
||||
& ::v-deep svg path {
|
||||
fill: #FFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.g1g1-modal-dialog {
|
||||
margin-top: 10vh;
|
||||
}
|
||||
|
||||
.input-error {
|
||||
color: $red-50;
|
||||
font-size: 90%;
|
||||
@@ -192,6 +272,18 @@
|
||||
border-color: $purple-500;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.75rem;
|
||||
color: $purple-300;
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
.svg-big-gift {
|
||||
width: 176px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
width: 18px;
|
||||
@@ -206,14 +298,17 @@
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// import { nextTick } from 'vue'; // may not need this? I don't know!
|
||||
import debounce from 'lodash/debounce';
|
||||
import find from 'lodash/find';
|
||||
import isUUID from 'validator/lib/isUUID';
|
||||
import { mapState } from '@/libs/store';
|
||||
import closeIcon from '@/assets/svg/close.svg';
|
||||
import bigGiftIcon from '@/assets/svg/big-gift.svg';
|
||||
|
||||
export default {
|
||||
data () {
|
||||
@@ -223,6 +318,7 @@ export default {
|
||||
foundUser: {},
|
||||
icons: Object.freeze({
|
||||
close: closeIcon,
|
||||
bigGift: bigGiftIcon,
|
||||
}),
|
||||
};
|
||||
},
|
||||
@@ -281,7 +377,7 @@ export default {
|
||||
this.foundUser = result;
|
||||
}, 500),
|
||||
selectUser () {
|
||||
this.$root.$emit('habitica::send-gems', this.foundUser);
|
||||
this.$root.$emit('habitica::send-gift', this.foundUser);
|
||||
this.close();
|
||||
},
|
||||
onHide () {
|
||||
|
||||
@@ -0,0 +1,659 @@
|
||||
<template>
|
||||
<b-modal
|
||||
id="send-gift"
|
||||
:hide-footer="true"
|
||||
:hide-header="true"
|
||||
size="md"
|
||||
@hide="onHide()"
|
||||
>
|
||||
<div>
|
||||
<!-- header -->
|
||||
<div
|
||||
class="modal-close"
|
||||
@click="close()"
|
||||
>
|
||||
<div
|
||||
class="icon-close"
|
||||
v-html="icons.closeIcon"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="d-flex flex-column mx-auto align-items-center">
|
||||
{{ $t('sendAGift') }}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<!-- user avatar -->
|
||||
<div
|
||||
v-if="userReceivingGift"
|
||||
class="modal-body"
|
||||
>
|
||||
<avatar
|
||||
:member="userReceivingGift"
|
||||
:hideClassBadge="true"
|
||||
class="d-flex flex-column mx-auto align-items-center"
|
||||
/>
|
||||
<div class="avatar-spacer"></div>
|
||||
<div class="d-flex flex-column mx-auto align-items-center display-name">
|
||||
<!-- user display name and username -->
|
||||
<user-link
|
||||
:user-id="displayName"
|
||||
:name="displayName"
|
||||
:backer="userBacker"
|
||||
:contributor="userContributor"
|
||||
:class="display-name"
|
||||
/>
|
||||
</div>
|
||||
<div class="d-flex flex-column mx-auto align-items-center user-name">
|
||||
@{{ userName }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- menu area -->
|
||||
<div class="row">
|
||||
<div class="col-md-8 offset-md-2 text-center nav">
|
||||
<div
|
||||
class="nav-link"
|
||||
:class="{active: selectedPage === 'subscription'}"
|
||||
@click="selectPage('subscription')"
|
||||
>
|
||||
{{ $t('subscription') }}
|
||||
</div>
|
||||
<div
|
||||
class="nav-link"
|
||||
:class="{active: selectedPage !== 'subscription'}"
|
||||
@click="selectPage('buyGems')"
|
||||
>
|
||||
{{ $t('gems') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- subscriber block -->
|
||||
<subscription-options
|
||||
v-show="selectedPage === 'subscription'"
|
||||
class="subscribe-option"
|
||||
:userReceivingGift="userReceivingGift"
|
||||
/>
|
||||
|
||||
<!-- gem block -->
|
||||
<div
|
||||
v-show="selectedPage === 'buyGems'"
|
||||
>
|
||||
<div class="gem-group">
|
||||
<!-- buy gems with money -->
|
||||
<label v-once>
|
||||
{{ $t('howManyGemsPurchase') }}
|
||||
</label>
|
||||
<div class="d-flex flex-row align-items-center justify-content-center">
|
||||
<div
|
||||
class="gray-circle"
|
||||
@click="gift.gems.amount <= 0
|
||||
? gift.gems.amount = 0
|
||||
: gift.gems.amount--"
|
||||
>
|
||||
<div
|
||||
class="icon-negative"
|
||||
v-html="icons.negativeIcon"
|
||||
></div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend input-group-icon align-items-center">
|
||||
<div
|
||||
class="icon-gem"
|
||||
v-html="icons.gemIcon"
|
||||
></div>
|
||||
</div>
|
||||
<input
|
||||
id="gemsForm"
|
||||
v-model.number="gift.gems.amount"
|
||||
class="form-control"
|
||||
max="9999"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="gray-circle"
|
||||
@click="gift.gems.amount++"
|
||||
>
|
||||
<div
|
||||
class="icon-positive"
|
||||
v-html="icons.positiveIcon"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- the word "total" -->
|
||||
<div class="buy-gem-total">
|
||||
{{ $t('sendGiftTotal') }}
|
||||
</div>
|
||||
|
||||
<!-- the actual dollar amount -->
|
||||
<div class="buy-gem-amount">
|
||||
<span>
|
||||
{{ formatter.format(totalGems) }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- change to sending own gems page -->
|
||||
<div
|
||||
:class="{active: selectedPage === 'ownGems'}"
|
||||
class="gem-state-change"
|
||||
@click="selectPage('ownGems')"
|
||||
>
|
||||
{{ $t('wantToSendOwnGems') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- paying for gems -->
|
||||
<payments-buttons
|
||||
class="payment-buttons"
|
||||
:stripe-fn="() => redirectToStripe({gift, uuid: userReceivingGift._id, receiverName})"
|
||||
:paypal-fn="() => openPaypalGift({
|
||||
gift: gift, giftedTo: userReceivingGift._id, receiverName,
|
||||
})"
|
||||
:amazon-data="{type: 'single', gift, giftedTo: userReceivingGift._id, receiverName}"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- send gems from balance -->
|
||||
<div
|
||||
v-show="selectedPage === 'ownGems'"
|
||||
>
|
||||
<div class="gem-group">
|
||||
<label v-once>
|
||||
{{ $t('howManyGemsSend') }}
|
||||
</label>
|
||||
<div class="d-flex align-items-center justify-content-center">
|
||||
<div
|
||||
class="gray-circle"
|
||||
@click="gift.gems.amount <= 0
|
||||
? gift.gems.amount = 0
|
||||
: gift.gems.amount--"
|
||||
>
|
||||
<div
|
||||
class="icon-negative"
|
||||
v-html="icons.negativeIcon"
|
||||
></div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend input-group-icon align-items-center">
|
||||
<div
|
||||
class="icon-gem"
|
||||
v-html="icons.gemIcon"
|
||||
></div>
|
||||
</div>
|
||||
<input
|
||||
id="gemsForm"
|
||||
v-model="gift.gems.amount"
|
||||
class="form-control"
|
||||
:max="maxGems"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="gray-circle"
|
||||
@click="gift.gems.amount < maxGems
|
||||
? gift.gems.amount++
|
||||
: gift.gems.amount = maxGems"
|
||||
>
|
||||
<div
|
||||
class="icon-positive"
|
||||
v-html="icons.positiveIcon"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="align-items-middle">
|
||||
<div class="d-flex justify-content-center align-items-middle">
|
||||
<span class="balance-text">
|
||||
{{ $t('yourBalance') }}
|
||||
</span>
|
||||
<span
|
||||
class="icon-gem balance-gem-margin"
|
||||
style="display: inline-block;"
|
||||
v-html="icons.gemIcon"
|
||||
></span>
|
||||
<span
|
||||
class="balance-gems"
|
||||
>
|
||||
{{ maxGems }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-column justify-content-center align-items-middle mt-3">
|
||||
<button
|
||||
v-if="fromBal"
|
||||
class="btn btn-primary mx-auto mt-2"
|
||||
type="submit"
|
||||
:disabled="sendingInProgress"
|
||||
@click="sendGift()"
|
||||
>
|
||||
{{ $t("send") }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- change to buying gems page -->
|
||||
<div
|
||||
:class="{active: selectedPage === 'buyGems'}"
|
||||
class="gem-state-change"
|
||||
@click="selectPage('buyGems')"
|
||||
>
|
||||
{{ $t('needToPurchaseGems') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/mixins.scss';
|
||||
#send-gift {
|
||||
.modal-dialog {
|
||||
max-width: 448px;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
width: 448px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 14px 28px 0 rgba(26, 24, 29, 0.24), 0 10px 10px 0 rgba(26, 24, 29, 0.28);
|
||||
}
|
||||
.modal-body{
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 16px;
|
||||
cursor: pointer;
|
||||
|
||||
.icon-close {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
vertical-align: middle;
|
||||
|
||||
& ::v-deep svg path {
|
||||
fill: #878190;
|
||||
}
|
||||
& :hover {
|
||||
fill: #686274;
|
||||
}
|
||||
}
|
||||
}
|
||||
#subscription-form .subscribe-option {
|
||||
background: #F9F9F9;
|
||||
}
|
||||
|
||||
#subscription-form .selected {
|
||||
background: rgba(213, 200, 255, 0.32);
|
||||
// using rgba for transparency
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style scoped lang="scss">
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
h2 {
|
||||
color: $purple-300;
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.avatar-spacer {
|
||||
height: 9px;
|
||||
}
|
||||
|
||||
.display-name {
|
||||
font-size: 0.875rem;
|
||||
font-weight: bold;
|
||||
line-height: 1.71;
|
||||
margin: 0px 6px 0 20px;
|
||||
}
|
||||
|
||||
.display-name a:hover{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.user-name {
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.33;
|
||||
text-align: center;
|
||||
color: $gray-100;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
.row {
|
||||
background-color: $gray-700;
|
||||
margin: 0 0 0 0;
|
||||
min-height: 32px;
|
||||
}
|
||||
|
||||
.nav {
|
||||
font-weight: bold;
|
||||
font-size: 0.75rem;
|
||||
min-height: 32px;
|
||||
padding: 16px 0 0 0;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
color: $gray-100;
|
||||
display: inline-block;
|
||||
padding: 0px 8px 6px 8px;
|
||||
|
||||
&.active {
|
||||
color: $purple-300;
|
||||
border-bottom: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: $purple-300;
|
||||
border-bottom: 2px solid $purple-400;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.gem-group {
|
||||
padding: 0 0 24px 0;
|
||||
background-color: $gray-700;
|
||||
margin: 0 0 0 0;
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px
|
||||
}
|
||||
|
||||
label {
|
||||
color: $gray-50;
|
||||
font-size: 0.875rem;
|
||||
font-weight: bold;
|
||||
line-height: 1.71;
|
||||
margin: 12px 0 16px 0;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
width: 94px;
|
||||
height: 32px;
|
||||
margin: 0px 16px 0px 16px;
|
||||
padding: 0;
|
||||
border-radius: 2px;
|
||||
border: solid 1px $gray-400;
|
||||
background-color: $white;
|
||||
}
|
||||
|
||||
.gray-circle {
|
||||
border-radius: 100%;
|
||||
border: solid 2px $gray-300;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
border-color: $purple-400;
|
||||
}
|
||||
}
|
||||
|
||||
.gray-circle:hover{
|
||||
.icon-positive, .icon-negative {
|
||||
& ::v-deep svg path {
|
||||
fill: $purple-400;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.icon-gem {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.icon-positive, .icon-negative {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
margin: 4px auto;
|
||||
|
||||
& ::v-deep svg path {
|
||||
fill: $gray-300;
|
||||
}
|
||||
}
|
||||
|
||||
.buy-gem-total {
|
||||
font-size: 0.875rem;
|
||||
font-weight: bold;
|
||||
line-height: 1.71;
|
||||
padding-top: 24px;
|
||||
text-align: center;
|
||||
height: 28px;
|
||||
}
|
||||
|
||||
.buy-gem-amount {
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
line-height: 1.4;
|
||||
margin: 16px 0 24px 0;
|
||||
text-align: center;
|
||||
height: 28px;
|
||||
color: $green-10;
|
||||
}
|
||||
|
||||
.balance-text {
|
||||
font-size: 0.75rem;
|
||||
font-weight: bold;
|
||||
color: $gray-100;
|
||||
line-height: 1.33;
|
||||
margin: 12px 0px 0px 70px;
|
||||
}
|
||||
|
||||
.balance-gem-margin {
|
||||
margin: 8px 4px 0px 8px;
|
||||
}
|
||||
|
||||
.balance-gems {
|
||||
font-size: 0.75rem;
|
||||
color: $gray-100;
|
||||
line-height: 1.33;
|
||||
margin: 12px 71px 0px 4px;
|
||||
}
|
||||
|
||||
.gem-state-change {
|
||||
color: $blue-10;
|
||||
font-size: 0.875rem;
|
||||
min-height: 24px;
|
||||
margin: 16px 0 0;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.subscribe-option {
|
||||
border-bottom-left-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
padding-bottom: 24px;
|
||||
}
|
||||
|
||||
.payment-buttons {
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
|
||||
// libs imports
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
// mixins imports
|
||||
import paymentsMixin from '../../mixins/payments';
|
||||
|
||||
// component imports
|
||||
import avatar from '../avatar';
|
||||
import userLink from '../userLink';
|
||||
import subscriptionOptions from '../settings/subscriptionOptions.vue';
|
||||
import paymentsButtons from '@/components/payments/buttons/list';
|
||||
|
||||
// svg imports
|
||||
import closeIcon from '@/assets/svg/close.svg';
|
||||
import gemIcon from '@/assets/svg/gem.svg';
|
||||
import positiveIcon from '@/assets/svg/positive.svg';
|
||||
import negativeIcon from '@/assets/svg/negative.svg';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
avatar,
|
||||
subscriptionOptions,
|
||||
paymentsButtons,
|
||||
userLink,
|
||||
},
|
||||
mixins: [
|
||||
paymentsMixin,
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
subscription: {
|
||||
key: '',
|
||||
},
|
||||
icons: Object.freeze({
|
||||
closeIcon,
|
||||
gemIcon,
|
||||
positiveIcon,
|
||||
negativeIcon,
|
||||
}),
|
||||
userReceivingGift: {
|
||||
profile: '',
|
||||
},
|
||||
name: '',
|
||||
display: '',
|
||||
selectedPage: 'subscription',
|
||||
gift: {
|
||||
type: 'gems',
|
||||
gems: {
|
||||
amount: 0,
|
||||
fromBalance: true,
|
||||
},
|
||||
},
|
||||
sendingInProgress: false,
|
||||
amazonPayments: {},
|
||||
gemCost: 1,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
userLoggedIn: 'user.data',
|
||||
}),
|
||||
userName () {
|
||||
const userName = this.userReceivingGift.auth
|
||||
&& this.userReceivingGift.auth.local
|
||||
&& this.userReceivingGift.auth.local.username;
|
||||
return userName;
|
||||
},
|
||||
displayName () {
|
||||
const displayName = this.userReceivingGift.profile.name;
|
||||
return displayName;
|
||||
},
|
||||
userBacker () {
|
||||
const userBacker = this.userReceivingGift.backer;
|
||||
return userBacker;
|
||||
},
|
||||
userContributor () {
|
||||
const userContributor = this.userReceivingGift.contributor;
|
||||
return userContributor;
|
||||
},
|
||||
tierIcon () {
|
||||
if (this.isNPC) {
|
||||
return this.icons.tierNPC;
|
||||
}
|
||||
return this.icons[`tier${this.level}`];
|
||||
},
|
||||
fromBal () {
|
||||
return this.gift.type === 'gems' && this.gift.gems.fromBalance;
|
||||
},
|
||||
maxGems () {
|
||||
const maxGems = this.fromBal ? this.userLoggedIn.balance * 4 : 9999;
|
||||
return maxGems;
|
||||
},
|
||||
formatter () {
|
||||
const formatter = new Intl.NumberFormat('en-US', {
|
||||
style: 'currency',
|
||||
currency: 'USD',
|
||||
minimumFractionDigits: 2,
|
||||
});
|
||||
return formatter;
|
||||
},
|
||||
totalGems () {
|
||||
const totalGems = this.gift.gems.amount * 0.25;
|
||||
return totalGems;
|
||||
},
|
||||
receiverName () {
|
||||
if (
|
||||
this.userReceivingGift.auth
|
||||
&& this.userReceivingGift.auth.local
|
||||
&& this.userReceivingGift.auth.local.username
|
||||
) {
|
||||
return this.userReceivingGift.auth.local.username;
|
||||
}
|
||||
return this.userReceivingGift.profile.name;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
startingPage () {
|
||||
this.selectedPage = this.startingPage;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.$root.$on('habitica::send-gift', data => {
|
||||
this.userReceivingGift = data;
|
||||
if (this.$store.state.giftModalOptions.startingPage) {
|
||||
this.selectedPage = this.$store.state.giftModalOptions.startingPage;
|
||||
this.$store.state.giftModalOptions.startingPage = '';
|
||||
this.selectPage(this.selectedPage);
|
||||
} else {
|
||||
this.selectPage(this.startingPage);
|
||||
}
|
||||
this.setGemDefaults();
|
||||
this.$root.$emit('bv::show::modal', 'send-gift');
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
close () {
|
||||
this.$root.$emit('bv::hide::modal', 'send-gift');
|
||||
},
|
||||
setGemDefaults () {
|
||||
if (this.selectedPage === 'buyGems') {
|
||||
this.gift.gems.amount = 20;
|
||||
} else if (this.selectedPage === 'ownGems') {
|
||||
this.gift.gems.amount = 1;
|
||||
} else {
|
||||
this.gift.gems.amount = 0;
|
||||
}
|
||||
},
|
||||
selectPage (page) {
|
||||
if (page === this.selectedPage) return;
|
||||
if (page === 'buyGems') this.selectedPage = 'buyGems';
|
||||
if (page === 'buyGems' && this.selectedPage === 'ownGems') return;
|
||||
this.selectedPage = page || 'subscription';
|
||||
this.setGemDefaults();
|
||||
},
|
||||
async sendGift () {
|
||||
this.sendingInProgress = true;
|
||||
await this.$store.dispatch('members:transferGems', {
|
||||
toUserId: this.userReceivingGift._id,
|
||||
gemAmount: this.gift.gems.amount,
|
||||
});
|
||||
this.close();
|
||||
setTimeout(() => { // wait for the send gem modal to be closed
|
||||
this.$root.$emit('habitica:payment-success', {
|
||||
paymentMethod: 'balance',
|
||||
paymentCompleted: true,
|
||||
paymentType: 'gift-gems-balance',
|
||||
gift: {
|
||||
gems: {
|
||||
amount: this.gift.gems.amount,
|
||||
},
|
||||
},
|
||||
giftReceiver: this.receiverName,
|
||||
});
|
||||
}, 500);
|
||||
},
|
||||
onHide () {
|
||||
this.sendingInProgress = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -739,6 +739,14 @@ export default {
|
||||
} else if (attribute === 'email') {
|
||||
this.user.auth.local.email = updates.newEmail;
|
||||
window.alert(this.$t('emailSuccess')); // eslint-disable-line no-alert
|
||||
} else if (attribute === 'password') {
|
||||
this.passwordUpdates = {};
|
||||
this.$store.dispatch('snackbars:add', {
|
||||
title: 'Habitica',
|
||||
text: this.$t('passwordSuccess'),
|
||||
type: 'success',
|
||||
timeout: true,
|
||||
});
|
||||
}
|
||||
},
|
||||
async changeDisplayName (newName) {
|
||||
|
||||
@@ -450,10 +450,6 @@
|
||||
background-color: $white;
|
||||
}
|
||||
|
||||
.subscribe-option {
|
||||
border-bottom: 1px solid $gray-600;
|
||||
}
|
||||
|
||||
.svg-amazon-pay {
|
||||
width: 208px;
|
||||
}
|
||||
|
||||
@@ -10,10 +10,17 @@
|
||||
:value="block.key"
|
||||
class="subscribe-option pt-2 pl-5 pb-3 mb-0"
|
||||
:class="{selected: subscription.key === block.key}"
|
||||
@click.native="subscription.key = block.key"
|
||||
@click.native="updateSubscriptionData(block.key)"
|
||||
>
|
||||
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
|
||||
<div
|
||||
v-if="userReceivingGift && userReceivingGift._id"
|
||||
class="subscription-text ml-2 mb-1"
|
||||
v-html="$t('giftSubscriptionRateText', {price: block.price, months: block.months})"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="subscription-text ml-2 mb-1"
|
||||
v-html="$t('subscriptionRateText', {price: block.price, months: block.months})"
|
||||
>
|
||||
@@ -25,7 +32,18 @@
|
||||
</div>
|
||||
</b-form-radio>
|
||||
</b-form-group>
|
||||
<!-- payment buttons first is for gift subs and the second is for renewing subs -->
|
||||
<payments-buttons
|
||||
v-if="userReceivingGift && userReceivingGift._id"
|
||||
:disabled="!subscription.key"
|
||||
:stripe-fn="() => redirectToStripe({gift, uuid: userReceivingGift._id, receiverName})"
|
||||
:paypal-fn="() => openPaypalGift({
|
||||
gift: gift, giftedTo: userReceivingGift._id, receiverName,
|
||||
})"
|
||||
:amazon-data="{type: 'single', gift, giftedTo: userReceivingGift._id, receiverName}"
|
||||
/>
|
||||
<payments-buttons
|
||||
v-else
|
||||
:disabled="!subscription.key"
|
||||
:stripe-fn="() => redirectToStripe({
|
||||
subscription: subscription.key,
|
||||
@@ -43,6 +61,7 @@
|
||||
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
#subscription-form {
|
||||
.custom-control .custom-control-label::before,
|
||||
.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
|
||||
@@ -101,11 +120,22 @@ export default {
|
||||
mixins: [
|
||||
paymentsMixin,
|
||||
],
|
||||
props: {
|
||||
userReceivingGift: {
|
||||
type: Object,
|
||||
default () {},
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
subscription: {
|
||||
key: null,
|
||||
key: 'basic_earned',
|
||||
},
|
||||
gift: {
|
||||
type: 'subscription',
|
||||
subscription: { key: 'basic_earned' },
|
||||
},
|
||||
receiverName: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -114,7 +144,6 @@ export default {
|
||||
},
|
||||
subscriptionBlocksOrdered () {
|
||||
const subscriptions = filter(subscriptionBlocks, o => o.discount !== true);
|
||||
|
||||
return sortBy(subscriptions, [o => o.months]);
|
||||
},
|
||||
},
|
||||
@@ -131,6 +160,10 @@ export default {
|
||||
return '<span class="subscription-bubble px-2 py-1">Gem cap at 25</span>';
|
||||
}
|
||||
},
|
||||
updateSubscriptionData (key) {
|
||||
this.subscription.key = key;
|
||||
if (this.userReceivingGift._id) this.gift.subscription.key = key;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -209,6 +209,7 @@
|
||||
<li>Fox_town</li>
|
||||
<li>MaybeSteveRogers</li>
|
||||
<li>shanaqui</li>
|
||||
<li>deilann (not yet pictured)</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -218,7 +219,7 @@
|
||||
{{ $t('commGuidePara014') }}<br>
|
||||
<em>
|
||||
Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8,
|
||||
deilann, Breadstrings, Megan, Blade, and Daniel the Bard
|
||||
Breadstrings, Megan, Blade, and Daniel the Bard
|
||||
</em>
|
||||
</p>
|
||||
<h2 id="final">
|
||||
|
||||
@@ -662,6 +662,11 @@
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.custom-control-input {
|
||||
z-index: -1;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
.form-group {
|
||||
margin-bottom: 1rem;
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6 offset-md-3 text-center nav">
|
||||
<div class="text-center nav">
|
||||
<div
|
||||
class="nav-item"
|
||||
:class="{active: selectedPage === 'profile'}"
|
||||
@@ -470,6 +470,7 @@
|
||||
.gift-icon svg {
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@@ -538,6 +539,7 @@
|
||||
}
|
||||
|
||||
.nav {
|
||||
width: 100%;
|
||||
font-weight: bold;
|
||||
min-height: 40px;
|
||||
justify-content: center;
|
||||
@@ -710,6 +712,27 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 990px) {
|
||||
.profile-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
.profile-actions :not(:last-child) {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.profile-actions {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 550px) {
|
||||
.member-details {
|
||||
flex-direction: column;
|
||||
}
|
||||
.member-details .avatar {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
@@ -969,7 +992,8 @@ export default {
|
||||
axios.post(`/api/v4/user/block/${this.user._id}`);
|
||||
},
|
||||
openSendGemsModal () {
|
||||
this.$root.$emit('habitica::send-gems', this.user);
|
||||
this.$store.state.giftModalOptions.startingPage = 'buyGems';
|
||||
this.$root.$emit('habitica::send-gift', this.user);
|
||||
},
|
||||
adminTurnOnShadowMuting () {
|
||||
if (!this.hero.flags) {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
class="standard-page"
|
||||
>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="stats-section-equipment col-12 col-md-6">
|
||||
<h2 class="text-center">
|
||||
{{ $t('equipment') }}
|
||||
</h2>
|
||||
@@ -12,7 +12,7 @@
|
||||
<div
|
||||
v-for="(label, key) in equipTypes"
|
||||
:key="key"
|
||||
class="col-12 col-md-4 item-wrapper"
|
||||
class="item-wrapper"
|
||||
>
|
||||
<div
|
||||
v-if="label !== 'skip'"
|
||||
@@ -48,7 +48,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="stats-section-costume col-12 col-md-6">
|
||||
<h2 class="text-center">
|
||||
{{ $t('costume') }}
|
||||
</h2>
|
||||
@@ -57,7 +57,7 @@
|
||||
<div
|
||||
v-for="(label, key) in equipTypes"
|
||||
:key="key"
|
||||
class="col-12 col-md-4 item-wrapper"
|
||||
class="item-wrapper"
|
||||
>
|
||||
<!-- Append a "C" to the key name since HTML IDs have to be unique.-->
|
||||
<div
|
||||
@@ -111,7 +111,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row pet-mount-row">
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="stats-section-pets col-12 col-md-6">
|
||||
<h2
|
||||
v-once
|
||||
class="text-center"
|
||||
@@ -119,8 +119,7 @@
|
||||
{{ $t('pets') }}
|
||||
</h2>
|
||||
<div class="well pet-mount-well">
|
||||
<div class="row col-12">
|
||||
<div class="col-12 col-md-4">
|
||||
<div class="pet-mount-well-image">
|
||||
<div
|
||||
class="box"
|
||||
:class="{white: user.items.currentPet}"
|
||||
@@ -131,7 +130,7 @@
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-8">
|
||||
<div class="pet-mount-well-text">
|
||||
<div>{{ formatAnimal(user.items.currentPet, 'pet') }}</div>
|
||||
<div>
|
||||
<strong>{{ $t('petsFound') }}:</strong>
|
||||
@@ -142,10 +141,9 @@
|
||||
{{ beastMasterProgress(user.items.pets) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="stats-section-mounts col-12 col-md-6">
|
||||
<h2
|
||||
v-once
|
||||
class="text-center"
|
||||
@@ -153,28 +151,26 @@
|
||||
{{ $t('mounts') }}
|
||||
</h2>
|
||||
<div class="well pet-mount-well">
|
||||
<div class="row col-12">
|
||||
<div class="col-12 col-md-4">
|
||||
<div class="pet-mount-well-image">
|
||||
<div
|
||||
class="box"
|
||||
:class="{white: user.items.currentMount}"
|
||||
>
|
||||
<div
|
||||
class="box"
|
||||
:class="{white: user.items.currentMount}"
|
||||
>
|
||||
<div
|
||||
class="mount"
|
||||
:class="`Mount_Icon_${user.items.currentMount}`"
|
||||
></div>
|
||||
</div>
|
||||
class="mount"
|
||||
:class="`Mount_Icon_${user.items.currentMount}`"
|
||||
></div>
|
||||
</div>
|
||||
<div class="col-12 col-md-8">
|
||||
<div>{{ formatAnimal(user.items.currentMount, 'mount') }}</div>
|
||||
<div>
|
||||
<strong>{{ $t('mountsTamed') }}:</strong>
|
||||
<span>{{ totalCount(user.items.mounts) }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<strong>{{ $t('mountMasterProgress') }}:</strong>
|
||||
<span>{{ mountMasterProgress(user.items.mounts) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pet-mount-well-text">
|
||||
<div>{{ formatAnimal(user.items.currentMount, 'mount') }}</div>
|
||||
<div>
|
||||
<strong>{{ $t('mountsTamed') }}:</strong>
|
||||
<span>{{ totalCount(user.items.mounts) }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<strong>{{ $t('mountMasterProgress') }}:</strong>
|
||||
<span>{{ mountMasterProgress(user.items.mounts) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -309,15 +305,13 @@
|
||||
v-if="showStatsSave"
|
||||
class="row save-row"
|
||||
>
|
||||
<div class="col-12 col-md-6 offset-md-3 text-center">
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
:disabled="loading"
|
||||
@click="saveAttributes()"
|
||||
>
|
||||
{{ loading ? $t('loading') : $t('save') }}
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
:disabled="loading"
|
||||
@click="saveAttributes()"
|
||||
>
|
||||
{{ loading ? $t('loading') : $t('save') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -650,10 +644,17 @@ export default {
|
||||
border-radius: 2px;
|
||||
padding: 0.4em;
|
||||
padding-top: 1em;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.well.pet-mount-well {
|
||||
padding-left: 15px;
|
||||
padding-bottom: 1em;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: flex-start;
|
||||
|
||||
strong {
|
||||
margin-right: .2em;
|
||||
@@ -690,12 +691,13 @@ export default {
|
||||
}
|
||||
|
||||
.save-row {
|
||||
margin-top: 1em;
|
||||
margin: 2em 0 1em 0;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.gear.box {
|
||||
vertical-align: top;
|
||||
margin: 0 auto;
|
||||
// margin: 0 auto;
|
||||
}
|
||||
|
||||
.gear-label {
|
||||
@@ -721,4 +723,34 @@ export default {
|
||||
// breaks the long words without a space
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
@media (max-width: 850px) {
|
||||
#stats .col-md-6 {
|
||||
flex: none;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
@media(max-width: 990px) {
|
||||
.modal-body #stats .col-md-6 {
|
||||
flex: none;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
[class^="stats-section-"] {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
#allocation {
|
||||
.box {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.col-9 {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.col-9 div:first-child {
|
||||
font-size: 13px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -39,6 +39,11 @@ export default [
|
||||
type: 'Moderator',
|
||||
uuid: '28771972-ca6d-4c03-8261-e1734aa7d21d',
|
||||
},
|
||||
{
|
||||
name: 'deilann',
|
||||
type: 'Moderator',
|
||||
uuid: 'e7b5d1e2-3b6e-4192-b867-8bafdb03eeec',
|
||||
},
|
||||
{
|
||||
name: 'Dewines',
|
||||
type: 'Moderator',
|
||||
|
||||
@@ -124,6 +124,9 @@ export default function () {
|
||||
profileOptions: {
|
||||
startingPage: '',
|
||||
},
|
||||
giftModalOptions: {
|
||||
startingPage: '',
|
||||
},
|
||||
rageModalOptions: {
|
||||
npc: '',
|
||||
},
|
||||
|
||||
@@ -119,5 +119,21 @@
|
||||
"achievementDomesticatedText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة المستأنسة: النمس ، وخنزير غينيا ، والديك ، والخنزير الطائر ، والجرذ ، والأرنب ، والحصان ، والبقر!",
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو",
|
||||
"achievementBirdsOfAFeatherModalText": "تقوم بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!"
|
||||
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!",
|
||||
"achievementGroupsBeta2022ModalText": "لقد ساعدت أنت ومجموعاتك Habitica من خلال الاختبار وتقديم التعليقات!",
|
||||
"achievementGroupsBeta2022": "اختبار تجريبي تفاعلي",
|
||||
"achievementGroupsBeta2022Text": "قدمت أنت ومجموعتك تعليقات لا تقدر بثمن لمساعدة Habitica في الاختبار.",
|
||||
"achievementReptacularRumble": "الدمدمة الزاحفة",
|
||||
"achievementReptacularRumbleModalText": "لقد جمعت كل الزواحف الأليفة!",
|
||||
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح ، الزاحف المجنح ، الأفعى ، ترايسيراتوبس ، السلحفاة ، التيرانوصور ريكس ، وفيلوسيرابتور!",
|
||||
"achievementBirdsOfAFeather": "متشابهون",
|
||||
"achievementZodiacZookeeper": "حارس حديقة الحيوانات الفلكية",
|
||||
"achievementShadyCustomerText": "لقد جمع كل حيوانات الظل الأليفة.",
|
||||
"achievementShadyCustomerModalText": "لقد قمت بتجميع كل حيوانات الظل الأليفة!",
|
||||
"achievementZodiacZookeeperModalText": "لقد قمت بتجميع كل الحيوانات الفلكية الأليفة!",
|
||||
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر ، البومة ، الببغاء ، الزاحف المجنح ، الجريفون ، فالكون ، الطاووس ، والديك!",
|
||||
"achievementShadeOfItAllModalText": "لقد قمت بترويض كل حيوانات الظل للركوب!",
|
||||
"achievementShadyCustomer": "زبون الظل",
|
||||
"achievementShadeOfItAll": "ظل كل شيء",
|
||||
"achievementShadeOfItAllText": "لقد ربي كل حيوانات الظل للترويض."
|
||||
}
|
||||
|
||||
@@ -409,5 +409,18 @@
|
||||
"backgroundArchaeologicalDigNotes": "Unearth secrets of the ancient past at an Archaeological Dig.",
|
||||
"backgroundScribesWorkshopText": "Scribe's Workshop",
|
||||
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop.",
|
||||
"backgrounds022019": "مجموعة 57: تم إصدارها في فبراير 2019"
|
||||
"backgrounds022019": "مجموعة 57: تم إصدارها في فبراير 2019",
|
||||
"backgroundBirthdayPartyText": "حفلة عيد ميلاد",
|
||||
"backgrounds012020": "مجموعة 68: تم طرحه في يناير 2020",
|
||||
"backgroundMedievalKitchenText": "مطبخ القرون الوسطى",
|
||||
"backgroundMedievalKitchenNotes": "اطبخ العاصفة في مطبخ القرون الوسطى.",
|
||||
"backgroundBirthdayPartyNotes": "احتفل بعيد ميلاد ال Habitican المفضل لديك.",
|
||||
"backgroundDuckPondText": "بركة بط",
|
||||
"backgroundOldFashionedBakeryText": "مخبز قديم الطراز",
|
||||
"backgroundValentinesDayFeastingHallText": "قاعة عيد الحب",
|
||||
"backgroundOldFashionedBakeryNotes": "استمتع بالنكهات اللذيذة خارج مخبز قديم الطراز.",
|
||||
"backgroundDuckPondNotes": "أطعم الطيور المائية في بركة البط.",
|
||||
"backgroundValentinesDayFeastingHallNotes": "اشعر بالحب في قاعة احتفالات عيد الحب.",
|
||||
"hideLockedBackgrounds": "إخفاء الخلفيات المقفلة",
|
||||
"backgrounds032019": "SET 58: تم إصداره في مارس 2019"
|
||||
}
|
||||
|
||||
@@ -103,5 +103,6 @@
|
||||
"selectParticipant": "اختر مشارك",
|
||||
"wonChallengeDesc": "<%= إسم التحدي %> إخترتك لتكون الفائز!تم تسجيل فوزك في \"إنجازاتك\".",
|
||||
"yourReward": "مكافئاتك",
|
||||
"filters": "التصفيات"
|
||||
"filters": "التصفيات",
|
||||
"removeTasks": "إزالة المهام"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"languageName": "العربية",
|
||||
"stringNotFound": "سلسلة المحارف '<%= string %>' لم توجد.",
|
||||
"habitica": "Habitica",
|
||||
"onward": "Onward!",
|
||||
"onward": "إلي الأمام!",
|
||||
"done": "Done",
|
||||
"gotIt": "Got it!",
|
||||
"titleTimeTravelers": "مسافرين عبر الزمن",
|
||||
@@ -25,7 +25,7 @@
|
||||
"user": "المستخدم",
|
||||
"market": "المتجر",
|
||||
"newSubscriberItem": "You have new <span class=\"notification-bold-blue\">Mystery Items</span>",
|
||||
"subscriberItemText": "كل شهر يحصل المشتركون على غرض غامض. عادةً يتم إصداره قبل نهاية الشهر بأسبوع. راجع صفحة الويكي \"الغرض الغامض\" للمزيد من المعلومات.",
|
||||
"subscriberItemText": "كل شهر يحصل المشتركون على غرض غامض. عادةً يصبح متاحا في بداية الشهر. راجع صفحة الويكي \"الغرض الغامض\" للمزيد من المعلومات.",
|
||||
"all": "الجميع",
|
||||
"none": "لا شيء",
|
||||
"more": "<%= count %> more",
|
||||
@@ -190,10 +190,28 @@
|
||||
"dismissAll": "Dismiss All",
|
||||
"messages": "Messages",
|
||||
"emptyMessagesLine1": "You don't have any messages",
|
||||
"emptyMessagesLine2": "Send a message to start a conversation!",
|
||||
"emptyMessagesLine2": "يمكنك إرسال رسالة جديدة إلى مستخدم من خلال زيارة ملفه الشخصي والنقر على زر \"رسالة\".",
|
||||
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> sent you a message",
|
||||
"letsgo": "لنذهب!",
|
||||
"selected": "Selected",
|
||||
"howManyToBuy": "How many would you like to buy?",
|
||||
"contactForm": "Contact the Moderation Team"
|
||||
"contactForm": "Contact the Moderation Team",
|
||||
"congratulations": "تهانينا!",
|
||||
"finish": "نهاية",
|
||||
"onboardingAchievs": "إنجازات الإعداد",
|
||||
"reportBugHeaderDescribe": "يُرجى وصف الخطأ الذي تواجهه وسيتواصل معك فريقنا.",
|
||||
"reportEmailText": "سيتم استخدام هذا فقط للاتصال بك بخصوص تقرير الخطأ.",
|
||||
"reportEmailPlaceholder": "عنوان بريدك الإلكتروني",
|
||||
"reportEmailError": "يرجى تقديم عنوان بريد إلكتروني صالح",
|
||||
"reportDescription": "الوصف",
|
||||
"reportDescriptionText": "قم بتضمين لقطات الشاشة أو أخطاء وحدة التحكم بجافا سكريبت إذا كان ذلك مفيدًا.",
|
||||
"reportDescriptionPlaceholder": "صف الخطأ بالتفصيل هنا",
|
||||
"submitBugReport": "إرسال تقرير الخطأ",
|
||||
"reportSent": "تم إرسال تقرير الخطأ!",
|
||||
"askQuestion": "طرح سؤال",
|
||||
"emptyReportBugMessage": "الإبلاغ عن رسالة خطأ مفقودة",
|
||||
"loadEarlierMessages": "تحميل الرسائل السابقة",
|
||||
"demo": "تجريبي",
|
||||
"options": "الإعدادات",
|
||||
"reportSentDescription": "سنعود إليك بمجرد أن تتاح الفرصة لفريقنا للتحقيق في الأمر. شكرا على الإبلاغ عن المشكلة."
|
||||
}
|
||||
|
||||
@@ -4,5 +4,7 @@
|
||||
"eggsItemType": "بيض",
|
||||
"hatchingPotionsItemType": "جرعات الفقس",
|
||||
"specialItemType": "حاجات خاصة",
|
||||
"lockedItem": "حاجة مقفلة"
|
||||
"lockedItem": "حاجة مقفلة",
|
||||
"petAndMount": "حيوان أليف وحيوان للركوب",
|
||||
"allItems": "كل العناصر"
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"needTips": "تحتاج بعض النصائح حول كيفية البدء؟ هنا دليل مباشر!",
|
||||
"step1": "الخطوة ١: أدخل المهام",
|
||||
"webStep1Text": "Habitica لا شيء بدون أهداف حقيقية، لذا أدخل بعض المهام. يمكنك إضافة المزيد في وقت لاحق وأنت تفكر بهم! يمكن إضافة جميع المهام عن طريق النقر على الزر \"إنشاء\" باللون الأخضر.\n* ** إعداد [المهام](http://habitica.wikia.com/wiki/To-Dos): ** أدخل المهام التي تقوم بها مرة واحدة أو نادراً ما في عمود المهام، كل مهمة على حدة. يمكنك أيضاً الضغط على المهام لتحريرها وإضافة قوائم المراجعة وتواريخ الاستحقاق والمزيد!\n* ** إعداد [اليوميات](http://habitica.wikia.com/wiki/Dailies): ** أدخل الأنشطة التي تحتاج فعلها يوميًا أو في يوم معين من الأسبوع أو الشهر أو السنة في عمود اليوميات. انقر على المهمة اليومية لتعديل موعد استحقاقها و/أو تحديد تاريخ البدء. يمكنك أيضًا جعلها مستحقة على أساس متكرر، على سبيل المثال، كل 3 أيام.\n* ** إعداد [العادات](http://habitica.wikia.com/wiki/Habits): ** أدخل العادات التي تريد إقامتها في عمود العادات. يمكنك تحرير العادة لتغييرها إلى عادة جيدة :heavy_plus_sign: أو عادة سيئة :heavy_minus_sign:\n* ** إعداد [المكافآت](http://habitica.wikia.com/wiki/Rewards): ** بالإضافة إلى المكافآت المقدمة في اللعبة، أضف الأنشطة أو الأشياء التي تريد استخدامها كدافع إلى عمود المكافآت. من المهم أن تمنح نفسك فترة راحة أو تسمح ببعض التساهل باعتدال!\n* إذا كنت بحاجة إلى إلهام للمهام التي يمكنك إضافتها، يمكنك الاطلاع على صفحات الويكي عن [نموذج عادات](http://habitica.wikia.com/wiki/Sample_Habits)، و[نموذج يوميات](http://habitica.wikia.com/wiki/Sample_Dailies)، و[نموذج مهام](http://habitica.wikia.com/wiki/Sample_To-Dos)، و[نموذج مكافآت](http://habitica.wikia.com/wiki/Sample_Custom_Rewards).",
|
||||
"webStep1Text": "Habitica لا شيء بدون أهداف حقيقية، لذا أدخل بعض المهام. يمكنك إضافة المزيد في وقت لاحق وأنت تفكر بهم! يمكن إضافة جميع المهام عن طريق النقر على الزر \"إنشاء\" باللون الأخضر.\n* ** إعداد [المهام](https://habitica.wikia.com/wiki/To-Dos): ** أدخل المهام التي تقوم بها مرة واحدة أو نادراً ما في عمود المهام، كل مهمة على حدة. يمكنك أيضاً الضغط على المهام لتحريرها وإضافة قوائم المراجعة وتواريخ الاستحقاق والمزيد!\n* ** إعداد [اليوميات](https://habitica.wikia.com/wiki/Dailies): ** أدخل الأنشطة التي تحتاج فعلها يوميًا أو في يوم معين من الأسبوع أو الشهر أو السنة في عمود اليوميات. انقر على المهمة اليومية لتعديل موعد استحقاقها و/أو تحديد تاريخ البدء. يمكنك أيضًا جعلها مستحقة على أساس متكرر، على سبيل المثال، كل 3 أيام.\n* ** إعداد [العادات](https://habitica.wikia.com/wiki/Habits): ** أدخل العادات التي تريد إقامتها في عمود العادات. يمكنك تحرير العادة لتغييرها إلى عادة جيدة :heavy_plus_sign: أو عادة سيئة :heavy_minus_sign:\n* ** إعداد [المكافآت](https://habitica.wikia.com/wiki/Rewards): ** بالإضافة إلى المكافآت المقدمة في اللعبة، أضف الأنشطة أو الأشياء التي تريد استخدامها كدافع إلى عمود المكافآت. من المهم أن تمنح نفسك فترة راحة أو تسمح ببعض التساهل باعتدال!\n* إذا كنت بحاجة إلى إلهام للمهام التي يمكنك إضافتها، يمكنك الاطلاع على صفحات الويكي عن [نموذج عادات](https://habitica.wikia.com/wiki/Sample_Habits)، و[نموذج يوميات](http://habitica.wikia.com/wiki/Sample_Dailies)، و[نsموذج مهام](https://habitica.wikia.com/wiki/Sample_To-Dos)، و[نموذج مكافآت](https://habitica.wikia.com/wiki/Sample_Custom_Rewards).",
|
||||
"step2": "الخطوة 2: اكسب نقاط عن طريق القيام بأشياء في الحياة الحقيقية",
|
||||
"webStep2Text": "مستوى",
|
||||
"webStep2Text": "الآن ، ابدأ في معالجة أهدافك من القائمة! عندما تكمل المهام وتحقق منها في Habitica ، ستحصل على [الخبرة] (https://habitica.fandom.com/wiki/Experience_Points) ، مما يساعدك على الارتقاء إلى المستوى الأعلى ، و [الذهب] (https: // Habitica. fandom.com/wiki/Gold_Points) ، والذي يسمح لك بشراء مكافأت. إذا وقعت في عادات سيئة أو فاتتك يومياتك ، فستفقد [الصحة] (https://habitica.fandom.com/wiki/Health_Points). بهذه الطريقة ، تعمل أشرطة Habiticaالخبرة والصحة كمؤشر ممتع لتقدمك نحو أهدافك. ستبدأ في رؤية حياتك الحقيقية تتحسن مع تقدم شخصيتك في اللعبة.",
|
||||
"step3": "الخطوة ٣: كيّف واستكشف Habitica",
|
||||
"webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your tasks with [tags](http://habitica.wikia.com/wiki/Tags) (edit a task to add them).\n * Customize your [avatar](http://habitica.wikia.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](http://habitica.wikia.com/wiki/Equipment) under Rewards or from the [Shops](<%= shopUrl %>), and change it under [Inventory > Equipment](<%= equipUrl %>).\n * Connect with other users via the [Tavern](http://habitica.wikia.com/wiki/Tavern).\n * Starting at Level 3, hatch [Pets](http://habitica.wikia.com/wiki/Pets) by collecting [eggs](http://habitica.wikia.com/wiki/Eggs) and [hatching potions](http://habitica.wikia.com/wiki/Hatching_Potions). [Feed](http://habitica.wikia.com/wiki/Food) them to create [Mounts](http://habitica.wikia.com/wiki/Mounts).\n * At level 10: Choose a particular [class](http://habitica.wikia.com/wiki/Class_System) and then use class-specific [skills](http://habitica.wikia.com/wiki/Skills) (levels 11 to 14).\n * Form a party with your friends (by clicking [Party](<%= partyUrl %>) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [quests](http://habitica.wikia.com/wiki/Quests) (you will be given a quest at level 15).",
|
||||
"webStep3Text": "بمجرد أن تتعرف على الأساسيات ، يمكنك الحصول على المزيد من Habitica بهذه الميزات الرائعة:\n * تنظيم المهام باستخدام [العلامات] (https://habitica.fandom.com/wiki/Tags) (قم بتحرير مهمة لإضافتها).\n * قم بتخصيص [الشخصية] الخاص بك (https://habitica.fandom.com/wiki/Avatar) بالنقر فوق رمز المستخدم في الزاوية العلوية اليمنى.\n * اشتر [المعدات] (https://habitica.fandom.com/wiki/Equipment) بموجب المكافآت أو من [المتاجر] (<٪ = shopUrl٪>) ، وقم بتغييرها ضمن [المخزون> المعدات] (<٪ = equipUrl٪>).\n * تواصل مع مستخدمين آخرين عبر [المطعم] (https://habitica.fandom.com/wiki/Tavern).\n * افقس[الحيوانات الأليفة] (https://habitica.fandom.com/wiki/ Pets) من خلال جمع [البيض] (https://habitica.fandom.com/wiki/Eggs) و [جرعات الفقس] (https: // Habitica.fandom.com/wiki/Hatching_Potions). [موجز] (https://habitica.fandom.com/wiki/Food) لإنشاء [حيوانات للركوب] (https://habitica.fandom.com/wiki/Mounts).\n * في المستوى 10: اختر [فئة] معينة (https://habitica.fandom.com/wiki/Class_System) ثم استخدم [مهارات] خاصة بالفصل (https://habitica.fandom.com/wiki/Skills) (المستويات من 11 إلى 14).\n * كوّن مجموعة مع أصدقائك (بالنقر فوق [حفلة] (<٪ = partyUrl٪>) في شريط التنقل) للبقاء مسؤولاً وكسب تمرير المهام.\n * اهزم الوحوش وجمع الأشياء في [المهام] (https://habitica.fandom.com/wiki/Quests) (ستحصل على مهمة في المستوى 15).",
|
||||
"overviewQuestions": "Have questions? Check out the [FAQ](<%= faqUrl %>)! If your question isn't mentioned there, you can ask for further help in the [Habitica Help guild](<%= helpGuildUrl %>).\n\nGood luck with your tasks!"
|
||||
}
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
"beastAchievement": "لقد ربحت \"وحش رئيسي \" إنجاز جمع كل الحيوانات الأليفة!",
|
||||
"beastMasterProgress": "تقدم الوحش الرئيسي",
|
||||
"premiumPotionNoDropExplanation": "لا يمكن استخدام جرعات التفقيس السحرية على البيض المستلم من المهام.الطريقة الوحيدة للحصول على جرعات التفقيس السحرية هي عن طريق شراؤهم بالأسفل.ليس من المقطورات العشوائية.",
|
||||
"dropsExplanationEggs": "أنفق الجواهر لتحصل على المزيد من البيض بسرهة,إذا كنت لاتريد أن تنتظر البيض الأساسي أسقطه, أو كررالتنقيب لإدخارالبيض المنقب <a href=\"http://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
|
||||
"dropsExplanation": "احصل على هذه العناصر بشكل أسرع مع الجواهر إذا كنت لا ترغب في انتظار إسقاطها عند إكمال مهمة. <a href=\"http://habitica.fandom.com/wiki/Drops\"> تعرف على المزيد حول نظام الإفلات. </a>",
|
||||
"dropsExplanationEggs": "أنفق الجواهر لتحصل على المزيد من البيض بسرهة,إذا كنت لاتريد أن تنتظر البيض الأساسي أسقطه, أو كررالتنقيب لإدخارالبيض المنقب <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
|
||||
"dropsExplanation": "احصل على هذه العناصر بشكل أسرع مع الجواهر إذا كنت لا ترغب في انتظار إسقاطها عند إكمال مهمة. <a href=\"https://habitica.fandom.com/wiki/Drops\"> تعرف على المزيد حول نظام الإفلات. </a>",
|
||||
"veteranTiger": "النمر المحارب",
|
||||
"veteranWolf": "الذئب المحارب",
|
||||
"etherealLion": "الأسد السماوي",
|
||||
@@ -77,5 +77,26 @@
|
||||
"keyToMountsDesc": "حرر جميع العينات القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر عمليات تثبيت المهام وعمليات التثبيت النادرة.)",
|
||||
"keyToBoth": "مفاتيح رئيسية لبيوت الكلاب",
|
||||
"releasePetsSuccess": "تم إطلاق حيوانك الأليف القياسي!",
|
||||
"mountName": "<%= mount(locale) %> <%= potion(locale) %>"
|
||||
"mountName": "<%= mount(locale) %> <%= potion(locale) %>",
|
||||
"filterByWacky": "أحمق",
|
||||
"sortByColor": "لون",
|
||||
"filterByMagicPotion": "مشروب سحري",
|
||||
"releaseBothSuccess": "لقد تم إطلاق كل حيواناتك الأليفة وحيوانات الركوب القياسية!",
|
||||
"welcomeStable": "مرحبا بكم في الاسطبل!",
|
||||
"mountsReleased": "تم إطلاق حيوانات الركوب القياسية",
|
||||
"hatch": "فقس!",
|
||||
"sortByHatchable": "قابل للفقس",
|
||||
"filterByStandard": "أساسي",
|
||||
"foodTitle": "طعام الحيوانات الاليفة",
|
||||
"welcomeStableText": "مرحبا بكم في الاسطبل! أنا مات ، صاحب الوحش. في كل مرة تكمل فيها مهمة ، سيكون لديك فرصة عشوائية لتلقي بيضة أو جرعة تفقيس لتفقيس الحيوانات الأليفة. عندما تفقس حيوانًا أليفًا ، سيظهر هنا! انقر فوق صورة حيوان أليف لإضافتها إلى صورتك الرمزية. أطعمهم بأطعمة الحيوانات الأليفة التي تجدها وستنمو لتصبح حيوانات ركوب صلبة.",
|
||||
"dragThisFood": "اسحب هذا <%= foodName %> إالي الحيوات وشاهده ينمو!",
|
||||
"filterByQuest": "مغامرة",
|
||||
"standard": "أساسي",
|
||||
"releaseMountsConfirm": "هل أنت متأكد أنك تريد إطلاق كل الحيوانات الأليفة القياسية؟",
|
||||
"releaseMountsSuccess": "لقد تم إطلاق كل حيوانات الركوب القياسية!",
|
||||
"petLikeToEat": "ماذا يحب حيواني الأليف أن يأكل؟",
|
||||
"keyToBothDesc": "حرر جميع الحيوانات الأليفة وحيوانات الركوب القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر Quest Pets / Mounts والحيوانات الأليفة النادرة /حيوانات الركوب.)",
|
||||
"releaseBothConfirm": "هل أنت متأكد من إطلاق حيواناتك الأليفة وحيوانات الركوب القياسية؟",
|
||||
"mountsAndPetsReleased": "الحيوانات الأليفة وحيوانات الركوب القياسية تم إطلاقها",
|
||||
"petLikeToEatText": "ستنمو الحيوانات الأليفة بغض النظر عما تطعمه ، لكنها ستنمو بشكل أسرع إذا أطعمتها طعام الحيوانات الأليفة الذي تفضله أكثر. جرب لمعرفة النمط ، أو شاهد الإجابات هنا: <br/> <a href=\"https://habitica.fandom.com/wiki/Food_Preferences\" target=\"_blank\"> https: //habitica.fandom. com / wiki / Food_Preferences </a>"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
"rebirthOrb": "Used an Orb of Rebirth to start over after attaining Level <%= level %>.",
|
||||
"rebirthOrb100": "Used an Orb of Rebirth to start over after attaining Level 100 or higher.",
|
||||
"rebirthOrbNoLevel": "Used an Orb of Rebirth to start over.",
|
||||
"rebirthPop": "Instantly restart your character as a Level 1 Warrior while retaining achievements, collectibles, and equipment. Your tasks and their history will remain but they will be reset to yellow. Your streaks will be removed except from challenge tasks. Your Gold, Experience, Mana, and the effects of all Skills will be removed. All of this will take effect immediately. For more information, see the wiki's <a href='http://habitica.wikia.com/wiki/Orb_of_Rebirth' target='_blank'>Orb of Rebirth</a> page.",
|
||||
"rebirthPop": "أعد شخصيتك على الفور كمحارب من المستوى 1 مع الاحتفاظ بالإنجازات والمقتنيات والمعدات. ستبقى مهامك ومحفوظاتهم ولكن ستتم إعادة تعيينهم إلى اللون الأصفر. ستتم إزالة عدد سلاسلك المستمرة باستثناء المهام التي تنتمي إلى التحديات وخطط المجموعة. ستتم إزالة الذهب ، والخبرة ، ومانا ، وتأثيرات جميع المهارات. كل هذا سيصبح ساري المفعول على الفور. لمزيد من المعلومات ، راجع صفحة ويكي <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'> Orb of Rebirth </a>.",
|
||||
"rebirthName": "Orb of Rebirth",
|
||||
"rebirthComplete": "You have been reborn!"
|
||||
"rebirthComplete": "You have been reborn!",
|
||||
"nextFreeRebirth": "<strong><%= الأيام%> days</strong> until <strong>FREE</strong>نجم إعادة الميلاد"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"spellWizardEarthText": "زلزال",
|
||||
"spellWizardEarthNotes": "Your mental power shakes the earth and buffs your Party's Intelligence! (Based on: Unbuffed INT)",
|
||||
"spellWizardFrostText": "صقيع مقشعر",
|
||||
"spellWizardFrostNotes": "With one cast, ice freezes all your streaks so they won't reset to zero tomorrow!",
|
||||
"spellWizardFrostNotes": "عن طريق إطلاق تعويذة واحدة، يقوم الجليد بتجميد كل سلاسل تقدمك حتى لا يتم إعادة تعيينها إلى الصفر غدًا!",
|
||||
"spellWizardFrostAlreadyCast": "You have already cast this today. Your streaks are frozen, and there's no need to cast this again.",
|
||||
"spellWarriorSmashText": "سحقة متوحشة",
|
||||
"spellWarriorSmashNotes": "You make a task more blue/less red and deal extra damage to Bosses! (Based on: STR)",
|
||||
@@ -24,7 +24,7 @@
|
||||
"spellRogueToolsOfTradeNotes": "Your tricky talents buff your whole Party's Perception! (Based on: Unbuffed PER)",
|
||||
"spellRogueStealthText": "تسلل",
|
||||
"spellRogueStealthNotes": "With each cast, a few of your undone Dailies won't cause damage tonight. Their streaks and colors won't change. (Based on: PER)",
|
||||
"spellRogueStealthDaliesAvoided": "<%= originalText %> Number of dailies avoided: <%= number %>.",
|
||||
"spellRogueStealthDaliesAvoided": "<%= originalText %> عدد المهام اليومية التي سيتم تجنبها: <%= number %>.",
|
||||
"spellRogueStealthMaxedOut": "You have already avoided all your dailies; there's no need to cast this again.",
|
||||
"spellHealerHealText": "الضوء المعالج",
|
||||
"spellHealerHealNotes": "Shining light restores your health! (Based on: CON and INT)",
|
||||
@@ -55,5 +55,6 @@
|
||||
"challengeTasksNoCast": "Casting a skill on challenge tasks is not allowed.",
|
||||
"groupTasksNoCast": "Casting a skill on group tasks is not allowed.",
|
||||
"spellNotOwned": "You don't own this skill.",
|
||||
"spellLevelTooHigh": "You must be level <%= level %> to use this skill."
|
||||
}
|
||||
"spellLevelTooHigh": "You must be level <%= level %> to use this skill.",
|
||||
"spellAlreadyCast": "لن يكون لاستخدام هذه المهارة أي تأثير إضافي."
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"clearCompleted": "إكتمل الحذف",
|
||||
"clearCompletedDescription": "يتم حذف المهام التي تم إكمالها بعد ٣٠ يومًا لغير المشتركين وبعد ٩٠ يومًا للمشتركين.",
|
||||
"clearCompletedConfirm": "هل أنت متأكد من أنك تريد حذف المهام التي أنجزتها؟",
|
||||
"clearCompletedDescription": "المهام المكتملة يتم حذفها بعد ٣٠ يومًا لغير المشتركين وبعد ٩٠ يومًا للمشتركين.",
|
||||
"clearCompletedConfirm": "هل أنت متأكد من حذف المهام التي أنجزتها؟",
|
||||
"addMultipleTip": "<strong>نصيحة: </strong> لإضافة عدة <%= taskType %>، افصل كل منها باستخدام فاصل أسطر (Shift + Enter) ثم اضغط على \"Enter\".",
|
||||
"addATask": "اضف <%= type %>",
|
||||
"editATask": "حرر <%= type %>",
|
||||
"editATask": "عدل<%= type %>",
|
||||
"createTask": "أنشئ <%= type %>",
|
||||
"addTaskToUser": "اضف مهمة",
|
||||
"scheduled": "مجدولة",
|
||||
@@ -27,7 +27,7 @@
|
||||
"notes": "الملاحظات",
|
||||
"advancedSettings": "إعدادات متقدمة",
|
||||
"difficulty": "الصعوبة",
|
||||
"difficultyHelp": "Difficulty describes how challenging a Habit, Daily, or To-Do is for you to complete. A higher difficulty results in greater rewards when a Task is completed, but also greater damage when a Daily is missed or a negative Habit is clicked.",
|
||||
"difficultyHelp": "تصف الصعوبة مدى صعوبة إكمال العادة أو المهام اليومية أو المهام التي يتعين عليك القيام بها. تؤدي الصعوبة الأعلى إلى الحصول على مكافآت أكبر عند اكتمال المهمة ، ولكن أيضًا الضرر الأكبر عند فقد مهام يومية أو النقر فوق العادة السلبية.",
|
||||
"trivial": "تافه",
|
||||
"easy": "سهل",
|
||||
"medium": "متوسط",
|
||||
@@ -48,7 +48,7 @@
|
||||
"resetStreak": "Reset Streak",
|
||||
"todo": "المهمة",
|
||||
"todos": "المهام",
|
||||
"todosDesc": "تُنجَز المهام مرة واحدة فقط. أضف قوائم إلى المهام الخصة بك لتزيد قيمتها.",
|
||||
"todosDesc": "تُنجَز المهام مرة واحدة فقط. أضف قوائم إلى المهام الخاصة بك لتزيد قيمتها.",
|
||||
"dueDate": "تاريخ الاستحقاق",
|
||||
"remaining": "متبقية",
|
||||
"complete": "منجزة",
|
||||
@@ -95,7 +95,7 @@
|
||||
"invalidTasksType": "يجب أن يكون نوع المهمة واحدًا من \"العادات\" أو \"اليوميات\" أو \"المهام\" أو \"المكافآت\".",
|
||||
"invalidTasksTypeExtra": "يجب أن يكون نوع المهمة واحدًا من \"العادات\" أو \"اليوميات\" أو \"المهام\" أو \"المكافآت\" أو \"المهام التي تم إكمالها\".",
|
||||
"cantDeleteChallengeTasks": "لا يمكن حذف المهمة التي تنتمي إلى التحدي.",
|
||||
"checklistOnlyDailyTodo": "Checklists are supported only on Dailies and To-Dos",
|
||||
"checklistOnlyDailyTodo": "القوائم مدعومة فقط في المهام اليومية والمهام",
|
||||
"checklistItemNotFound": "No checklist item was found with given id.",
|
||||
"itemIdRequired": "\"itemId\" must be a valid UUID.",
|
||||
"tagNotFound": "No tag item was found with given id.",
|
||||
@@ -129,5 +129,15 @@
|
||||
"sessionOutdated": "Your session is outdated. Please refresh or sync.",
|
||||
"errorTemporaryItem": "This item is temporary and cannot be pinned.",
|
||||
"deleteTaskType": "احذف هذا/هذه <%= type %>",
|
||||
"sureDeleteType": "هل انت متأكد انك تريد حذف هذا/هذه <%= type %> ؟"
|
||||
"sureDeleteType": "هل انت متأكد انك تريد حذف هذا/هذه <%= type %> ؟",
|
||||
"addATitle": "أضف عنوان",
|
||||
"enterTag": "أدخل علامة",
|
||||
"addNotes": "أضف ملاحظات",
|
||||
"counter": "عداد",
|
||||
"resetCounter": "إعداة ضبط العداد",
|
||||
"tomorrow": "غدا",
|
||||
"editTagsText": "تعديل العلامات",
|
||||
"adjustCounter": "تعديل العداد",
|
||||
"addTags": "أضف علامات...",
|
||||
"pressEnterToAddTag": "اضغط Enter لإضافة العلامة: '<%= tagName %>'"
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -707,5 +707,12 @@
|
||||
"backgroundMountainWaterfallText": "Wasserfall in den Bergen",
|
||||
"backgroundMountainWaterfallNotes": "Bewundere einen Wasserfall in den Bergen.",
|
||||
"backgroundSailboatAtSunsetText": "Segelboot bei Sonnenuntergang",
|
||||
"backgroundSailboatAtSunsetNotes": "Geniesse ein Segelboot im Sonnenuntergang."
|
||||
"backgroundSailboatAtSunsetNotes": "Geniesse ein Segelboot im Sonnenuntergang.",
|
||||
"backgroundBioluminescentWavesText": "Biolumineszierende Wellen",
|
||||
"backgroundBioluminescentWavesNotes": "Bewundere das Glimmen der Biolumineszierenden Wellen.",
|
||||
"backgroundUnderwaterCaveText": "Unterwasserhöhle",
|
||||
"backgroundUnderwaterCaveNotes": "Erkunde eine Unterwasserhöhle.",
|
||||
"backgroundUnderwaterStatuesText": "Statuen Unterwassergarten",
|
||||
"backgrounds072022": "Set 98: Veröffentlicht im July 2022",
|
||||
"backgroundUnderwaterStatuesNotes": "Versuche nicht zu blinzeln in einem Statuen Unterwassergarten."
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"commGuidePara024": "<strong>Sprecht nicht über etwas suchterregendes in der Taverne</strong>. Viele Menschen verwenden Habitica, um Ihre schlechten Gewohnheiten loszuwerden. Wenn sie andere Leute über suchterregende/illegale Substanzen reden hören, würde das dies deutlich erschweren! Respektiert eure Tavernenkameraden und berücksichtigt diesen Umstand. Dies gilt auch, aber nicht abschließend, für: Rauchen, Alkohol, Pornografie, Glückspiel und Drogen.",
|
||||
"commGuidePara027": "<strong>Wenn ein Moderator Dich anweist, ein Gespräch an anderer Stelle zu führen und wenn es keine relevante Gilde gibt, kann er Dir vorschlagen, die Hinterzimmer-Gilde zu benutzen</strong>. Die Hinterzimmer-Gilde ist ein freier öffentlicher Raum, um potenziell sensible Themen zu diskutieren. Sie sollte nur verwendet werden, wenn sie von einem Moderator geleitet wird. Sie wird vom Moderatorenteam sorgfältig überwacht. Sie ist kein Ort für allgemeine Diskussionen oder Gespräche, und Du wirst nur dann von einem Mod dorthin geleitet, wenn es angebracht ist.",
|
||||
"commGuideHeadingPublicGuilds": "Öffentliche Gilden",
|
||||
"commGuidePara029": "<strong>Öffentliche Gilden sind der Taverne ziemlich ähnlich, außer dass die Gespräche dort nicht so allgemein sind, sondern sich um ein bestimmtes Thema drehen.</strong> Der öffentliche Gildenchat sollte sich auf dieses Thema konzentrieren. Zum Beispiel könnte es sein, dass Mitglieder der Wordsmith-Gilde genervt sind, wenn sich das Gespräch plötzlich um Gärtnern statt um Schreiben dreht, und eine Drachenliebhaber-Gilde interessiert sich wahrscheinlich nicht dafür, antike Runen zu entziffern. Manche Gilden sind dabei lockerer als andere, aber <strong>versuche beim Thema zu bleiben!</strong>",
|
||||
"commGuidePara029": "<strong>Öffentliche Gilden sind der Taverne ziemlich ähnlich, außer dass die Gespräche dort nicht so allgemein sind, sondern sich um ein bestimmtes Thema drehen.</strong> Der öffentliche Gildenchat sollte sich auf dieses Thema konzentrieren. Zum Beispiel könnte es sein, dass Mitglieder der Wordsmith-Gilde genervt sind, wenn sich das Gespräch plötzlich um Gärtnern statt um Schreiben dreht, und eine Drachenliebhaber-Gilde interessiert sich wahrscheinlich nicht dafür, antike Runen zu entziffern. Manche Gilden sind dabei lockerer als andere, aber <strong>versuche beim Thema zu bleiben</strong>!",
|
||||
"commGuidePara031": "Einige öffentlichen Gilden werden sensible Themen wie Depressionen, Religion, Politik usw. enthalten. Dies ist in Ordnung, solange die Gespräche darin nicht gegen die Allgemeinen Geschäftsbedingungen oder die Regeln des öffentlichen Raums verstoßen und solange sie beim Thema bleiben.",
|
||||
"commGuidePara033": "<strong>Öffentliche Gilden dürfen KEINE Inhalte \"ab 18\" enthalten. Wenn geplant ist, regelmäßig über sensible Inhalte zu diskutieren, sollte dies in der Gildenbeschreibung angegeben werden</strong>. Auf diese Weise soll Habitica sicher und angenehm für alle sein.",
|
||||
"commGuidePara035": "<strong>Wenn die betreffende Gilde verschiedene Arten von heiklen Themen hat, ist es respektvoll gegenüber Deinen Habiticanern, eine Warnung vor Deinen Kommentar zu stellen (z.B. \"Warnung: erwähnt Selbstverletzung\")</strong>. Diese können als Triggerwarnungen und/oder Inhaltshinweise bezeichnet werden, und Gilden können zusätzlich zu den hier angegebenen Regeln eigene Regeln haben. Wenn möglich, verwende bitte <a href='https://habitica.fandom.com/wiki/Markdown_Cheat_Sheet' target='_blank'>Markdown</a> um die potenziell heiklen Inhalte unterhalb von Zeilenumbrüchen auszublenden, damit diejenigen, die sie nicht lesen möchten, darüber hinweg scrollen können, ohne den Inhalt zu sehen. Mitarbeiter und Moderatoren von Habitica können dieses Material nach eigenem Ermessen trotzdem entfernen.",
|
||||
@@ -61,7 +61,7 @@
|
||||
"commGuidePara056": "Leichte Regelverletzungen sollten zwar nicht passieren, haben aber nur leichte Konsequenzen. Wenn sie wiederholt auftreten, können sie mit der Zeit zu schwereren Konsequenzen führen.",
|
||||
"commGuidePara057": "In folgender Liste sind Beispiele für leichte Regelverletzungen. Die Liste ist nicht abschliessend.",
|
||||
"commGuideList07A": "Erstmalige Verletzung von Richtlinien für öffentliche Orte",
|
||||
"commGuideList07B": "Jegliche Aussagen oder Handlungen die ein \"Bitte nicht\" vom Moderations-Team auslösen. Wenn Du öffentlich gebeten wirst, eine Handlung zu unterlassen, kann das für sich genommen als Konsequenz gelten. Wenn Mods viele dieser Berichtigungen an dieselbe Person richten müssen, kann das als stärkere Regelverletzung zählen.",
|
||||
"commGuideList07B": "Jegliche Aussagen oder Handlungen die ein \"Bitte nicht\" vom Moderations-Team auslösen. Wenn Du öffentlich gebeten wirst, eine Handlung zu unterlassen, kann das für sich genommen als Konsequenz gelten. Wenn Mods viele dieser Berichtigungen an dieselbe Person richten müssen, kann das als stärkere Regelverletzung zählen",
|
||||
"commGuidePara057A": "Manche Beiträge werden eventuell versteckt, da sie persönliche Informationen enthalten oder einen falschen Eindruck erwecken. Normalerweise wird dies nicht als Verstoß gewertet, vor allem nicht beim ersten Mal!",
|
||||
"commGuideHeadingConsequences": "Konsequenzen",
|
||||
"commGuidePara058": "In Habitica hat – wie im echten Leben – jede Handlung eine Konsequenz: man wird fit weil man rennt, bekommt Löcher in den Zähnen weil man zu viel Zucker isst oder besteht eine Prüfung, weil man gelernt hat.",
|
||||
@@ -77,7 +77,7 @@
|
||||
"commGuideList09C": "Der Aufstieg in höhere Mitwirkendenstufen kann dauerhaft verwehrt (\"eingefroren\") werden",
|
||||
"commGuideHeadingModerateConsequences": "Beispiele für mittlere Konsequenzen",
|
||||
"commGuideList10A": "Beschränkte öffentliche und/oder private Chat-Berechtigungen",
|
||||
"commGuideList10A1": "Führen Deine Handlungen zur Aufhebung Deiner Chatrechte, wird Dich ein Moderator oder Mitarbeiter per PN und/oder in dem Forum, in dem Du stummgeschaltet wurdest, über die Dauer und Gründe für das Stummschalten und/oder die Handlung, die für die Wiederherstellung Deiner Chatrechte notwendig ist, informieren. Deine Chatrechte werden wiederhergestellt, wenn Du höflich mit den erforderlichen Handlungen übereinstimmst und zustimmst, Dich fortan an die Community-Richtlinien und Nutzungsbedingungen zu halten.",
|
||||
"commGuideList10A1": "Führen Deine Handlungen zur Aufhebung Deiner Chatrechte, wird Dich ein Moderator oder Mitarbeiter per PN und/oder in dem Forum, in dem Du stummgeschaltet wurdest, über die Dauer und Gründe für das Stummschalten und/oder die Handlung, die für die Wiederherstellung Deiner Chatrechte notwendig ist, informieren. Deine Chatrechte werden wiederhergestellt, wenn Du höflich mit den erforderlichen Handlungen übereinstimmst und zustimmst, Dich fortan an die Community-Richtlinien und Nutzungsbedingungen zu halten",
|
||||
"commGuideList10C": "Beschränkte Berechtigung, Gilden/Herausforderungen zu gründen",
|
||||
"commGuideList10D": "Der Aufstieg in höhere Mitwirkendenstufen kann temporär verwehrt (\"eingefroren\") werden",
|
||||
"commGuideList10E": "Herabstufung von Mitwirkenden",
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
"pkQuestion4": "Warum schadet das Auslassen von Aufgaben der Gesundheit Deines Avatars?",
|
||||
"pkAnswer4": "Wenn Du eines Deiner Tagesziele überspringst, verliert Dein Avatar am nächsten Tag an Gesundheit. Dies dient als wichtiger Motivationsfaktor, um Menschen zu ermutigen, ihre Ziele zu verwirklichen, denn die Menschen mögen es wirklich nicht, ihren kleinen Avatar zu verletzen! Außerdem ist die soziale Verantwortung für viele Menschen entscheidend: Wenn Du ein Monster mit Deinen Freunden bekämpfst, verletzen unerledigte Tagesaufgaben auch deren Avatare.",
|
||||
"pkQuestion5": "Was unterscheidet Habitica von anderen Programmen mit Gamifizierung?",
|
||||
"pkAnswer5": "Ein Weg, wie Habitica am erfolgreichsten mit der Gamifikation umgegangen ist, ist, dass wir viel Mühe darauf verwendet haben, über die Spielaspekte nachzudenken, um sicherzustellen, dass sie tatsächlich Spaß machen. Wir haben auch viele soziale Komponenten aufgenommen, weil wir der Meinung sind, dass einige der motivierendsten Spiele es ermöglichen, mit Freunden zu spielen, und weil Untersuchungen gezeigt haben, dass es einfacher ist, Gewohnheiten zu bilden, wenn man gegenüber anderen Menschen Rechenschaft ablegt.",
|
||||
"pkAnswer5": "Ein Weg, wie Habitica am erfolgreichsten mit der Gamifizierung umgegangen ist, ist, dass wir viel Mühe darauf verwendet haben, über die Spielaspekte nachzudenken, um sicherzustellen, dass sie tatsächlich Spaß machen. Wir haben auch viele soziale Komponenten eingebunden, weil wir der Meinung sind, dass einige der Spiele, die am meisten motivieren, es ermöglichen, mit Freunden zu spielen, und weil Untersuchungen gezeigt haben, dass es einfacher ist Gewohnheiten zu bilden, wenn man gegenüber anderen Menschen Rechenschaft ablegt.",
|
||||
"pkQuestion6": "Wer ist der typische Habitica-User?",
|
||||
"pkAnswer6": "Viele verschiedene Leute benutzen Habitica! Mehr als die Hälfte unserer Nutzer sind zwischen 18 und 34 Jahre alt, aber wir haben Großeltern, die die Seite mit ihren jungen Enkeln und jedem Alter dazwischen nutzen. Oftmals schließen sich Familien einer Party an und kämpfen gemeinsam gegen Monster.<br />Viele unserer Benutzer haben einen Hintergrund in Spielen, aber überraschenderweise, als wir vor einiger Zeit eine Umfrage durchführten, identifizierten sich 40% unserer Benutzer als Nicht-Gamer! So sieht es so aus, als ob unsere Methode für jeden effektiv sein kann, der an Produktivität und Wellness mehr Spaß haben möchte.",
|
||||
"pkAnswer6": "Viele verschiedene Leute benutzen Habitica! Mehr als die Hälfte dieser Leute sind zwischen 18 und 34 Jahre alt, aber wir haben auch Großeltern, welche die Seite mit ihren jungen Enkeln nutzen, und Menschen jeden Alters dazwischen. Oftmals kommen Familien in einer Party zusammen und kämpfen gemeinsam gegen Monster.<br /> Viele, die Habitica nutzen, haben einen Hintergrund in Spielen, aber als wir vor einiger Zeit eine Umfrage durchführten wurden wir überrascht: rund 40% von ihnen sahen sich als Nicht-Gamer! Es sieht ganz so aus, als ob unsere Methode für jede Person effektiv sein kann, die möchte, dass Produktivität und Wohlbefinden mehr Spaß machen.",
|
||||
"pkQuestion7": "Warum benutzt Habitica pixel art?",
|
||||
"pkAnswer7": "Habitica nutzt pixel art aus verschiedenen Gründen. Zusätzlich zum spaßigen Nostalgiefaktor ist pixel art sehr gut zugänglich für die freiwilligen Künstler, die gerne beitragen möchten. Es ist viel einfacher, unsere pixel art konstistent zu halten, selbst wenn viele verschiedene Künstler einen Beitrag leisten und es lässt uns schnell neuen Inhalt entwickeln!",
|
||||
"pkQuestion8": "Wie hat Habitica das reale Leben von Leuten beeinflusst?",
|
||||
|
||||
@@ -2303,21 +2303,21 @@
|
||||
"armorSpecialSpring2021WarriorText": "Sonnenrüstung",
|
||||
"weaponSpecialSpring2021WarriorText": "Hammer der Sonne",
|
||||
"eyewearArmoireClownsNoseText": "Clownsnase",
|
||||
"shieldArmoireBlueCottonCandyFoodNotes": "Eine süße Leckerei für die Naschkatzen unter deinen Haustieren. Aber wer wird sie am meisten mögen? Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Futterset (Gegenstand 9 von 10).",
|
||||
"shieldArmoireBlueCottonCandyFoodNotes": "Eine süße Leckerei für die Naschkatzen unter deinen Haustieren. Aber wer wird sie am meisten mögen? Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 9 von 10).",
|
||||
"shieldArmoireBlueCottonCandyFoodText": "Dekorative Blaue Zuckerwatte",
|
||||
"shieldArmoireChocolateFoodText": "Dekorative Schokolade",
|
||||
"shieldArmoireFishFoodText": "Dekorativer Fisch",
|
||||
"shieldArmoireHoneyFoodText": "Dekorativer Honig",
|
||||
"shieldArmoireMeatFoodText": "Dekoratives Fleisch",
|
||||
"shieldArmoireMilkFoodNotes": "Es gibt viele Berichte über die gesundheitlichen Vorteile von Milch, aber die Haustire, die sie bevorzugen, lieben schlicht ihren kremigen Geschmack. Erhöht Ausdauer und Stärke um jeweils <%= attrs %>. Verzauberter Schrank: Futterset (Gegenstand 10 von 10).",
|
||||
"shieldArmoireMilkFoodNotes": "Es gibt viele Berichte über die gesundheitlichen Vorteile von Milch, aber die Haustire, die sie bevorzugen, lieben schlicht ihren kremigen Geschmack. Erhöht Ausdauer und Stärke um jeweils <%= attrs %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 10 von 10)",
|
||||
"shieldArmoireMilkFoodText": "Dekorative Milch",
|
||||
"shieldArmoirePinkCottonCandyFoodNotes": "Eine süße Leckerei für die Naschkatzen unter deinen Haustieren. Aber wer wird sie am meisten mögen? Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Futterset (Gegenstand 4 von 10).",
|
||||
"shieldArmoirePinkCottonCandyFoodNotes": "Eine süße Leckerei für die Naschkatzen unter deinen Haustieren. Aber wer wird sie am meisten mögen? Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 4 von 10).",
|
||||
"shieldArmoirePinkCottonCandyFoodText": "Dekorative Rosa Zuckerwatte",
|
||||
"shieldArmoirePotatoFoodNotes": "Kartoffeln sind ein Hauptbestandteil vieler Gerichte, aber einige Haustire würden sich am liebsten nur von Kartoffeln ernähren... Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Futterset (Gegenstand 3 von 10).",
|
||||
"shieldArmoirePotatoFoodNotes": "Kartoffeln sind ein Hauptbestandteil vieler Gerichte, aber einige Haustire würden sich am liebsten nur von Kartoffeln ernähren... Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 3 von 10).",
|
||||
"shieldArmoirePotatoFoodText": "Dekorative Kartoffel",
|
||||
"shieldArmoireRottenMeatFoodNotes": "Halte die Nase zu! Du magst dich vor diesem verrotteten Fleisch ekeln, aber es ist perfekt für einige deiner Haustiere! Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Futterset (Gegenstand 2 von 10).",
|
||||
"shieldArmoireRottenMeatFoodNotes": "Halte die Nase zu! Du magst dich vor diesem verrotteten Fleisch ekeln, aber es ist perfekt für einige deiner Haustiere! Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 2 von 10).",
|
||||
"shieldArmoireRottenMeatFoodText": "Dekoratives Verrottetes Fleisch",
|
||||
"shieldArmoireStrawberryFoodNotes": "Eine köstliche, frische Erdbeere zum Verfüttern an deine Haustiere! Weißt du welche Haustiere Erdbeeren am liebsten mögen? Erhöht Stärke um <%= str %>. Verzauberter Schrank: Futterset (Gegenstand 1 von 10).",
|
||||
"shieldArmoireStrawberryFoodNotes": "Eine köstliche, frische Erdbeere zum Verfüttern an deine Haustiere! Weißt du welche Haustiere Erdbeeren am liebsten mögen? Erhöht Stärke um <%= str %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 1 von 10).",
|
||||
"shieldArmoireStrawberryFoodText": "Dekorative Erdbeere",
|
||||
"shieldSpecialSpring2021HealerText": "Salixschild",
|
||||
"shieldSpecialSpring2021WarriorText": "Sonnenschild",
|
||||
@@ -2346,10 +2346,10 @@
|
||||
"backMystery202105Text": "Drachenflügel des Nebels",
|
||||
"shieldArmoireMedievalLaundryNotes": "Es wird hart, all das sauber zu bekommen, aber du weißt bereits, dass du alles schaffen kannst. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Mittelalterliche Wäscher-Montur (Gegenstand 6 von 6).",
|
||||
"shieldArmoireMedievalLaundryText": "Schmutzige Wäsche",
|
||||
"shieldArmoireChocolateFoodNotes": "Jeder mag etwas Schokolade, aber manche deiner Haustiere mehr als andere... Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Haustierfutter-Reihe (Gegenstand 8 von 10).",
|
||||
"shieldArmoireFishFoodNotes": "Dieser Fisch wird Deinen Haustieren helfen, starke Knochen zu haben. Aber kannst du erraten, welche deiner Haustiere ihn am liebsten essen? Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Haustierfutter-Reihe (Gegenstand 7 von 10).",
|
||||
"shieldArmoireHoneyFoodNotes": "Pass auf klebrige Pfoten auf, wenn Du deine Haustiere mit diesem Honig gefüttert hast! Manche Haustiere können dieser natürlichen Süße nicht widerstehen, kannst Du erraten welche? Erhöht Intelligenz und Wahrnehmung jeweils um <%= attrs %>. Verzauberter Schrank: Haustierfutter-Reihe (Gegenstand 6 von 10).",
|
||||
"shieldArmoireMeatFoodNotes": "Manchmal ist ein wenig Protein das, was man brauchst, um groß und stark zu werden. Manche deiner Haustiere mögen es mehr als andere. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Haustierfutter-Reihe (Gegenstand 5 von 10).",
|
||||
"shieldArmoireChocolateFoodNotes": "Jeder mag etwas Schokolade, aber manche deiner Haustiere mehr als andere... Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 8 von 10).",
|
||||
"shieldArmoireFishFoodNotes": "Dieser Fisch wird Deinen Haustieren helfen, starke Knochen zu haben. Aber kannst du erraten, welche deiner Haustiere ihn am liebsten essen? Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 7 von 10).",
|
||||
"shieldArmoireHoneyFoodNotes": "Pass auf klebrige Pfoten auf, wenn Du deine Haustiere mit diesem Honig gefüttert hast! Manche Haustiere können dieser natürlichen Süße nicht widerstehen, kannst Du erraten welche? Erhöht Intelligenz und Wahrnehmung jeweils um <%= attrs %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 6 von 10).",
|
||||
"shieldArmoireMeatFoodNotes": "Manchmal ist ein wenig Protein das, was man brauchst, um groß und stark zu werden. Manche deiner Haustiere mögen es mehr als andere. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Haustierfutter Set (Gegenstand 5 von 10).",
|
||||
"shieldArmoireClownsBalloonsNotes": "Sei vorsichtig: diese Luftballons zu ersetzen wäre etwas teuer... Der Preis hat Auftrieb! Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Clowngarnitur (Gegenstand 4 von 5).",
|
||||
"shieldArmoireClownsBalloonsText": "Luftballons eines Clowns",
|
||||
"shieldSpecialSpring2021HealerNotes": "Ein blattgrünes Bündel, welches Zuflucht und Mitgefühl verkündet. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021 Frühlingsausrüstung.",
|
||||
@@ -2388,7 +2388,7 @@
|
||||
"headSpecialSummer2021RogueText": "Clownfisch Haube",
|
||||
"armorArmoireBathtubNotes": "Zeit für eine kleine Auszeit? Hier ist Ihre ganz persönliche Badewanne - und eine Garantie, dass das Wasser immer die richtige Temperatur hat! Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Bubble Bath Set (Artikel 2 von 4).",
|
||||
"armorArmoireBathtubText": "Badewanne",
|
||||
"armorSpecialSummer2021HealerNotes": "Ihre Feinde könnten vermuten, dass Sie ein Federgewicht sind, aber diese Rüstung wird Sie schützen, während Sie Ihrer Partei helfen. Erhöht Ausdauer um <%= con %>. Limiterte Ausgabe 2021, Sommerausrüstung.",
|
||||
"armorSpecialSummer2021HealerNotes": "Deine Feinde könnten vermuten, dass Du ein Federgewicht bist, aber diese Rüstung wird Dich schützen, während Du Deiner Party hilfst. Erhöht Ausdauer um <%= con %>. Limiterte Ausgabe 2021, Sommerausrüstung.",
|
||||
"armorSpecialSummer2021HealerText": "Papageiengefieder",
|
||||
"armorSpecialSummer2021MageNotes": "Immer enger werdende Wirbel aus Perlmutt sorgen für eine arkane Geometrie, die den Schutzzauber fokussiert. Erhöht Intelligenz um <%= int %>. Limiterte Ausgabe 2021, Sommerausrüstung.",
|
||||
"armorSpecialSummer2021MageText": "Spiralförmige Schale",
|
||||
@@ -2476,7 +2476,7 @@
|
||||
"armorSpecialFall2021MageNotes": "Kragen mit vielen spitzen Spitzen sind besonders Beliebt bei Basisbösewichten. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"armorSpecialFall2021HealerText": "Roben des Erweckens",
|
||||
"armorSpecialFall2021HealerNotes": "Hergestellt aus flammen-resistentem Material sind diese Roben besonders geeignet um heilende Flammen und reinige Feuer anzuwenden. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"armorArmoireBagpipersKiltNotes": "Ein robuster, langlebiger Kilt wird Dir gute Dienste erweisen. Erhöht Ausdauer um <%= con %>. Dudelsackpfeiferset (Gegenstand 2 von 3).",
|
||||
"armorArmoireBagpipersKiltNotes": "Ein robuster, langlebiger Kilt wird Dir gute Dienste erweisen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Dudelsackpfeiferset (Gegenstand 2 von 3).",
|
||||
"armorArmoireHeraldsTunicText": "Tunika des Herolds",
|
||||
"armorArmoireSoftBlackSuitText": "Weicher Schwarzer Anzug",
|
||||
"headSpecialFall2021RogueNotes": "Tja, Du steckst fest. Jetzt bist Du dazu verdonnert alte Verliese heimzusuchen und allerlei Unrat mit dir aufzusammeln. Ohweh! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
@@ -2489,7 +2489,7 @@
|
||||
"armorArmoireSoftBlackSuitNotes": "Schwarz ist eine mysteriöse Farbe. Mit Sicherheit inspiriert es zu den interessantesten Träumen. Erhöht Konstitution und Wahrnehmung um jeweils <%=attrs %>. Verzauberter Schrank: Schwarzes Wohlfühl-Set (Gegenstand 2 von 3).",
|
||||
"headSpecialFall2021HealerNotes": "Deine eigene Magie lässt deine Haare zu schockierenden, hellen Flammen werden, wenn du diese Maske aufsetzt. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"weaponArmoireSkullLanternText": "Totenkopflaterne",
|
||||
"weaponArmoireSkullLanternNotes": "Lasse ihr Leuchten deinen Weg durch die tiefste Finsternis erhellen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank:Unabhängiger Gegenstand.",
|
||||
"weaponArmoireSkullLanternNotes": "Lasse ihr Leuchten deinen Weg durch die tiefste Finsternis erhellen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Unabhängiger Gegenstand.",
|
||||
"offHandCapitalized": "Schildhand-Gegenstand",
|
||||
"armorMystery202112Text": "Antarktischer Nixenschwanz",
|
||||
"armorMystery202112Notes": "Gleite mit diesem schimmerden Schwanz durch eisige Gewässser ohne jegliche Kälte zu spühren. Gewährt keinen Attributbonus. Dezember 2021 Abonnentengegenstand.",
|
||||
@@ -2625,7 +2625,7 @@
|
||||
"weaponArmoireHuntingHornNotes": "Tuuut! Tuut! Tuut! Rufe deine Party für ein Abenteuer oder eine Quest zusammen, indem Du auf diesem Horn spielst. Erhöht Stärke um <%= str %> und Intelligenz um <%= int %>. Verzauberter Schrank: Musikinstrument Set 1 (Gegenstand 1 von 3)",
|
||||
"headArmoireStrawRainHatText": "Stroh-Regenhut",
|
||||
"shieldArmoireSnareDrumText": "Kleine Trommel",
|
||||
"shieldArmoireSnareDrumNotes": "Rat-a-tat-ta! Rufe Deine Party für eine Parade oder einen Marsch zusammen, indem Du auf dieser Trommel spielst. Erhöht Ausdauer um <%= con %> und Intelligenz um <%= int %>. Musikinstrument Set 1 (Gegenstand 3 von 3)",
|
||||
"shieldArmoireSnareDrumNotes": "Rat-a-tat-ta! Rufe Deine Party für eine Parade oder einen Marsch zusammen, indem Du auf dieser Trommel spielst. Erhöht Ausdauer um <%= con %> und Intelligenz um <%= int %>. Verzauberter Schrank: Musikinstrument Set 1 (Gegenstand 3 von 3)",
|
||||
"shieldArmoireSpanishGuitarNotes": "Kling! Kling! Klooong! Rufe Deine Party für ein Konzert oder eine Feierlichkeit zusammen, indem Du auf dieser Gitarre spielst. Erhöht Wahrnehmung um <%= per %> und Intelligenz um <%= int %>. Verzauberter Schrank: Musikinstrument Set 1 (Gegenstand 2 von 3)",
|
||||
"shieldArmoireSpanishGuitarText": "Spanische Gitarre",
|
||||
"armorArmoireStrawRaincoatNotes": "Dieser gewebte Strohumhang wird Dich während Deiner Quest trocken halten und Deine Rüstung vor dem Rosten bewahren. Wage Dich jedoch nicht zu nah an Kerzen heran. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Stroh Regenmantel Set (Gegenstand 1 von 2).",
|
||||
@@ -2634,13 +2634,55 @@
|
||||
"backMystery202206Notes": "Wunderliche Flügel aus Wasser und Wellen! Verleiht keinen Vorteil. Juni 2022 Abonnentengegenstand.",
|
||||
"headMystery202206Notes": "Die blaue Perle in diesem Diadem verleiht dir Wasserbändigungskräfte. Nutze sie weise! Verleiht keinen Vorteil. Juni 2022 Abonnentengegenstand.",
|
||||
"weaponArmoireBlueKiteText": "Blauer Drachen",
|
||||
"weaponArmoireBlueKiteNotes": "Hoch am Himmel fliegt der Drachen, welche Stunts kann er wohl machen? Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 1 von 5)",
|
||||
"weaponArmoireBlueKiteNotes": "Hoch am Himmel fliegt der Drachen, welche Stunts kann er wohl machen? Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Schrank: Drachen Set (Gegenstand 1 von 5)",
|
||||
"weaponArmoireGreenKiteText": "Grüner Drachen",
|
||||
"weaponArmoireGreenKiteNotes": "Einen schöneren Drachen findet man kaum, in grün und gelb, es ist ein Traum. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 2 von 5)",
|
||||
"weaponArmoireGreenKiteNotes": "Einen schöneren Drachen findet man kaum, in grün und gelb, es ist ein Traum. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Schrank: Drachen Set (Gegenstand 2 von 5)",
|
||||
"weaponArmoireOrangeKiteText": "Oranger Drachen",
|
||||
"weaponArmoireOrangeKiteNotes": "Mit Farben wie der Aufgang und Untergang der Sonne, hoch zu fliegen ist für diesen Drachen eine Wonne. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 3 von 5)",
|
||||
"weaponArmoireOrangeKiteNotes": "Mit Farben wie der Aufgang und Untergang der Sonne, hoch zu fliegen ist für diesen Drachen eine Wonne. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Schrank: Drachen Set (Gegenstand 3 von 5)",
|
||||
"weaponArmoirePinkKiteText": "Pinker Drachen",
|
||||
"weaponArmoirePinkKiteNotes": "Er steigt auf , schießt zu Boden, dreht sich flink, dein Drachen im leuchtenden Pink. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 4 von 5)",
|
||||
"weaponArmoirePinkKiteNotes": "Er steigt auf , schießt zu Boden, dreht sich flink, dein Drachen im leuchtenden Pink. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Schrank: Drachen Set (Gegenstand 4 von 5)",
|
||||
"weaponArmoireYellowKiteText": "Gelber Drachen",
|
||||
"weaponArmoireYellowKiteNotes": "Er saust am Himmel hin und her, das fällt dem heiteren Drachen nicht schwer. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 5 von 5)"
|
||||
"weaponArmoireYellowKiteNotes": "Er saust am Himmel hin und her, das fällt dem heiteren Drachen nicht schwer. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Schrank: Drachen Set (Gegenstand 5 von 5)",
|
||||
"weaponSpecialSummer2022RogueText": "Krabbenschere",
|
||||
"weaponSpecialSummer2022WarriorText": "Wirbelnder Zyklon",
|
||||
"weaponSpecialSummer2022MageText": "Mantarochenstab",
|
||||
"weaponSpecialSummer2022HealerText": "Nützliche Blasen",
|
||||
"weaponSpecialSummer2022HealerNotes": "Diese Blasen geben mit einem befriedigenden Aufplatzen heilende Magie ins Wasser ab. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"armorSpecialSummer2022RogueText": "Krabbenrüstung",
|
||||
"armorSpecialSummer2022RogueNotes": "Perfekt geeignet, um lässig den Strand entlangzukrabbeln. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"armorSpecialSummer2022WarriorText": "Wasserspeierrüstung",
|
||||
"armorSpecialSummer2022WarriorNotes": "Bereite Dich auf eine Wasserschlacht vor, während Du Dich mit dieser wirbelnden Säule aus Luft und Nebel umgibst. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"armorSpecialSummer2022MageNotes": "Während Du diese Rüstung trägst, wirst Du so mühelos durch Deine Aufgaben gleiten wie ein Mantarochen durch das Wasser. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"armorSpecialSummer2022MageText": "Mantarochenrüstung",
|
||||
"armorSpecialSummer2022HealerText": "Kaiserfischschwanz",
|
||||
"headSpecialSummer2022RogueText": "Krabbenhelm",
|
||||
"headSpecialSummer2022WarriorText": "Wasserspeierhelm",
|
||||
"headSpecialSummer2022WarriorNotes": "Kanalisiere die Kraft des Wassers im Zentrum dieses immensen Wirbels. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"headSpecialSummer2022MageText": "Mantarochenhelm",
|
||||
"headSpecialSummer2022MageNotes": "Schütze Deinen Kopf, während Du in Deine Aufgaben oder die tiefste See abtauchst. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"headSpecialSummer2022HealerText": "Kaiserfisch Ohrflossen",
|
||||
"shieldSpecialSummer2022HealerText": "Heilende Wellen",
|
||||
"shieldSpecialSummer2022WarriorText": "Frecher Hai",
|
||||
"shieldSpecialSummer2022WarriorNotes": "Sie schnappt! Sie beißt! Und sie hört niemals damit auf! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"shieldSpecialSummer2022HealerNotes": "Sende heilende Energie in sanften Wellen über das Riff. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"weaponSpecialSummer2022RogueNotes": "Wenn Du in der Klemme steckst, solltest Du Dich nicht scheuen, diese furchteinflößenden Scheren zu zeigen! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"weaponSpecialSummer2022MageNotes": "Reinige auf magische Weise die Gewässer vor Dir mit einem Wirbeln dieses Stabs. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"weaponSpecialSummer2022WarriorNotes": "Er dreht sich! Er leitet um! Und er bringt den Sturm! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"armorSpecialSummer2022HealerNotes": "Nutze Deine farbenprächtigen Flossen, um über das Riff zu sausen und jenen zu helfen, die der Heilung oder der Rast bedürfen. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"headSpecialSummer2022RogueNotes": "Keine Zeit hier herumzukrebsen, wir werfen uns in Schale und feiern die besten Krustentier Wortwitze des Sommers. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"headSpecialSummer2022HealerNotes": "Fische haben keine Ohren sagst Du? Warte bis sie das hören. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Sommerausrüstung.",
|
||||
"armorMystery202207Text": "Quasselnde Quallen Rüstung",
|
||||
"armorMystery202207Notes": "Mit dieser Rüstung siehst du wabbelig und wahnsinnig gut aus. Gewährt keinen Attributbonus. July 2022 Abonnentengegenstand.",
|
||||
"headMystery202207Text": "Quasselnder Quallen Helm",
|
||||
"armorArmoireFancyPirateSuitText": "Ausgefallene Piratenjacke",
|
||||
"headArmoireFancyPirateHatText": "Ausgefallener Piratenhut",
|
||||
"shieldArmoireTreasureMapText": "Schatzkarte",
|
||||
"armorArmoireFancyPirateSuitNotes": "Trage diese feine Jacke während du die Bibliothek deines Schiffes organisierst, oder besprich es als Crew. Erhöht Ausdauer und Intelligenz um jeweils <%= attrs %> . Verzauberter Schrank: Ausgefallenes Piratenset (Gegenstand 1 von 3).",
|
||||
"headArmoireFancyPirateHatNotes": "Nutze diesen Schutz vor der Sonne und vor den Seemöven die Dir über den Kopf segeln während Du an Deck Deines Schiffes Tee trinkst. Erhöht Wahrnehmung um <%= per %>. Ausgefallenes Piratenset (Gegenstand 2 von 3).",
|
||||
"headMystery202207Notes": "Brauchst Du Hilfe mit Deinen Aufgaben? Mehrere Dutzend biolumineszierende Tentakel stehen Dir tatkräftig zur Seite! Gewährt keinen Attributbonus. July 2022 Abonnentengegenstand.",
|
||||
"shieldArmoireTreasureMapNotes": "Das X markiert die Stelle! Du weißt nie was Du finden wirst wenn du dieser handlichen Karte zu sagenhaften Schätzen folgst: Gold, Juwelen, Relikte oder vielleicht eine versteinerte Orange? Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Ausgefallenes Piratenset (Gegenstand 3 von 3).",
|
||||
"shieldArmoireDustpanText": "Mistschaufel",
|
||||
"eyewearMystery202208Text": "Funkelnde Augen",
|
||||
"weaponArmoirePushBroomText": "Kehrbesen",
|
||||
"weaponArmoireFeatherDusterText": "Staubwedel"
|
||||
}
|
||||
|
||||
@@ -379,5 +379,6 @@
|
||||
"leaveGuild": "Gilde verlassen",
|
||||
"viewDetails": "Details ansehen",
|
||||
"upgradeToGroup": "Auf Gruppenplan upgraden",
|
||||
"sendGiftTotal": "Insgesamt:"
|
||||
"sendGiftTotal": "Insgesamt:",
|
||||
"chatTemporarilyUnavailable": "Chat aktuell nicht verfügbar. Bitte versuche es später erneut."
|
||||
}
|
||||
|
||||
@@ -131,13 +131,13 @@
|
||||
"winter2019WinterStarSet": "Winterstern (Heiler)",
|
||||
"winter2019PoinsettiaSet": "Weihnachtsstern (Schurke)",
|
||||
"eventAvailability": "Zum Kauf verfügbar bis zum <%= date(locale) %>.",
|
||||
"dateEndMarch": "30. April",
|
||||
"dateEndApril": "19. April",
|
||||
"dateEndMarch": "31. März",
|
||||
"dateEndApril": "30. April",
|
||||
"dateEndMay": "31. Mai",
|
||||
"dateEndJune": "14. Juni",
|
||||
"dateEndJune": "30. Juni",
|
||||
"dateEndJuly": "31. Juli",
|
||||
"dateEndAugust": "31. August",
|
||||
"dateEndSeptember": "21. September",
|
||||
"dateEndSeptember": "30. September",
|
||||
"dateEndOctober": "31. Oktober",
|
||||
"dateEndNovember": "30. November",
|
||||
"dateEndJanuary": "31. Januar",
|
||||
@@ -221,5 +221,13 @@
|
||||
"spring2022RainstormWarriorSet": "Gewitterregen (Krieger)",
|
||||
"spring2022ForsythiaMageSet": "Forsythie (Magier)",
|
||||
"spring2022PeridotHealerSet": "Abendsmaragd (Heiler)",
|
||||
"aprilYYYY": "April <%= year %>"
|
||||
"aprilYYYY": "April <%= year %>",
|
||||
"summer2022WaterspoutWarriorSet": "Wasserspeier (Krieger)",
|
||||
"summer2022AngelfishHealerSet": "Kaiserfisch (Heiler)",
|
||||
"dateEndDecember": "31. Dezember",
|
||||
"summer2022CrabRogueSet": "Krabbe (Schurke)",
|
||||
"summer2022MantaRayMageSet": "Mantarochen (Magier)",
|
||||
"julyYYYY": "Juli <%= year %>",
|
||||
"octoberYYYY": "Oktober <%= year %>",
|
||||
"februaryYYYY": "Februar <%= year %>"
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
"questSpiderUnlockText": "Schaltet den Kauf von Spinneneiern auf dem Marktplatz frei",
|
||||
"questGroupVice": "Laster, der Schatten-Wyrm",
|
||||
"questVice1Text": "Laster, Teil 1: Befreie Dich vom Einfluss des Drachen",
|
||||
"questVice1Notes": "<p>Man sagt, dass ein schreckliches Unheil in den Höhlen von Mt. Habitica lauert. Ein Monster, dessen bloße Anwesenheit den Willen der stärksten Helden des Landes so verdreht, dass sie von ihren schlechten Gewohnheiten und ihrer Faulheit überkommen werden. Diese Bestie ist ein gewaltiger, aus Schatten bestehender Drache: Laster, der heimtückische Schatten-Wyrm. Mutige Habiticaner, erhebt Euch und bezwingt diese verdorbene Bestie ein für alle Mal, aber nur, wenn ihr daran glaubt, gegen seine immense Kraft bestehen zu können. </p><h3>Laster Teil 1: </h3><p> Wie kannst Du erwarten gegen ein Biest zu kämpfen, wenn es Dich bereits unter Kontrolle hat? Falle Deiner Faulheit und Deinen Lastern nicht zum Opfer! Arbeite hart gegen den finsteren Einfluss des Drachens und vertreibe seine Macht über Dich!</p>",
|
||||
"questVice1Notes": "Man sagt, dass ein schreckliches Unheil in den Höhlen von Mt. Habitica lauert. Ein Monster, dessen bloße Anwesenheit den Willen der stärksten Helden des Landes so verdreht, dass sie von ihren schlechten Gewohnheiten und ihrer Faulheit überkommen werden. Diese Bestie ist ein gewaltiger, aus Schatten bestehender Drache: Laster, der heimtückische Schatten-Wyrm. Mutige Habiticaner, erhebt Euch und bezwingt diese verdorbene Bestie ein für alle Mal, aber nur, wenn ihr daran glaubt, gegen seine immense Kraft bestehen zu können.<br><br>Wie kannst Du erwarten gegen ein Biest zu kämpfen, wenn es Dich bereits unter Kontrolle hat? Falle Deiner Faulheit und Deinen Lastern nicht zum Opfer! Arbeite hart gegen den finsteren Einfluss des Drachens und vertreibe seine Macht über Dich!",
|
||||
"questVice1Boss": "Lasters Schatten",
|
||||
"questVice1Completion": "Mit dem abgeschüttelten Einfluss des Lasters spürt Ihr eine Kraft zurückkehren die Ihr lange vergeßen hattet. Gratulation! Jedoch erwartet Euch ein noch schrecklicherer Gegner...",
|
||||
"questVice1DropVice2Quest": "Laster Teil 2 (Schriftrolle)",
|
||||
@@ -167,7 +167,7 @@
|
||||
"questPenguinDropPenguinEgg": "Pinguin (Ei)",
|
||||
"questPenguinUnlockText": "Schaltet den Kauf von Pinguineiern auf dem Marktplatz frei",
|
||||
"questStressbeastText": "Das Schreckliche Stressbiest aus den Stoïstillen Steppen",
|
||||
"questStressbeastNotes": "Erfülle Tagesaufgaben und To-Dos um dem Weltbossmonster Schaden zuzufügen! Unerfüllte Tagesaufgaben füllen die Stressschlag-Leiste. Ist die Leiste voll, wird der Weltboss einen NPC angreifen. Ein Weltboss wird einzelnen Spielern oder Accounts auf keine Weise Schaden zufügen. Nur die nicht erfüllten Tagesaufgaben von aktiven Spielern, die sich nicht in der Taverne ausruhen zählen.<br><br>~*~<br><br>Das erste was wir vernehmen sind die Schritte, langsam und donnernd. Einer nach dem anderen öffnen die Habiticaner ihre Haustüren und blicken dem entgegen und die Worte bleiben uns im Halse stecken.<br><br>Wir alle kennen das Stressbiest, natürlich - winzige, fiese Kreaturen, die uns im ungünstigsten Augenblick angreifen. Aber das? Das hier ragt in den Himmel hinauf, höher als die Gebäude, mit Pranken, die ohne Probleme einen Drachen zerschmettern könnten. Frostsplitter regnen aus dem stinkenden Fell herab und sein Gebrüll entfesselt einen eisigen Sturm, der die Dächer von unseren Häusern hebt. Von so einem gewaltigen Monster sprechen nur unsere ältesten Legenden.<br><br>\"Gebt acht, Habiticaner!\", ruft SabreCat, \"Verbarrikadiert euch in euren Häusern - dies ist das schreckliche Stressbiest!\"<br><br>\"Dieses Ding muss Jahrhunderte von Stress in sich tragen!\", sagt Kiwibot, während er die Türen der Taverne verrammelt und die Fenster zuschlägt.<br><br>\"Die Stoïstillen Steppen\", meint Lemnos mit grimmigem Gesicht, \"Die ganze Zeit dachten wir sie wären ein friedlicher Ort, aber sie müssen ihren Stress irgendwo versteckt haben. Über Generationen hinweg ist das hier aus ihm geworden, und nun hat es sich befreit und griff sie an - und uns!\"<br><br>Es gibt nur eine Möglichkeit das Stressbiest zu vertreiben, schrecklich oder nicht, und die ist es, es mit erfüllten Tagesaufgaben und To-Dos anzugreifen! Wir müssen zusammenstehen um gegen diesen furchteinflößenden Feind zu bestehen - geht sicher, dass ihr eure Tagesaufgaben nicht unerfüllt lasst, das könnte das Stressbiest so sehr reizen, dass es vielleicht anfängt um sich zu schlagen ...",
|
||||
"questStressbeastNotes": "Erfülle Tagesaufgaben und To-Dos um dem Weltbossmonster Schaden zuzufügen! Unerfüllte Tagesaufgaben füllen die Stressschlag-Leiste. Ist die Leiste voll, wird der Weltboss einen NPC angreifen. Ein Weltboss wird einzelnen Spielern oder Accounts auf keine Weise Schaden zufügen. Nur die nicht erfüllten Tagesaufgaben von aktiven Spielern, die sich nicht im Gasthaus ausruhen, zählen.<br><br>~*~<br><br>Das erste was wir vernehmen sind die Schritte, langsam und donnernd. Einer nach dem anderen öffnen die Habiticaner ihre Haustüren und blicken dem entgegen und die Worte bleiben uns im Halse stecken.<br><br>Wir alle kennen das Stressbiest, natürlich - winzige, fiese Kreaturen, die uns im ungünstigsten Augenblick angreifen. Aber das? Das hier ragt in den Himmel hinauf, höher als die Gebäude, mit Pranken, die ohne Probleme einen Drachen zerschmettern könnten. Frostsplitter regnen aus dem stinkenden Fell herab und sein Gebrüll entfesselt einen eisigen Sturm, der die Dächer von unseren Häusern hebt. Von so einem gewaltigen Monster sprechen nur unsere ältesten Legenden.<br><br>\"Gebt acht, Habiticaner!\", ruft SabreCat, \"Verbarrikadiert euch in euren Häusern - dies ist das schreckliche Stressbiest!\"<br><br>\"Dieses Ding muss Jahrhunderte von Stress in sich tragen!\", sagt Kiwibot, während er die Türen der Taverne verrammelt und die Fenster zuschlägt.<br><br>\"Die Stoïstillen Steppen\", meint Lemnos mit grimmigem Gesicht, \"Die ganze Zeit dachten wir sie wären ein friedlicher Ort, aber sie müssen ihren Stress irgendwo versteckt haben. Über Generationen hinweg ist das hier aus ihm geworden, und nun hat es sich befreit und griff sie an - und uns!\"<br><br>Es gibt nur eine Möglichkeit das Stressbiest zu vertreiben, schrecklich oder nicht, und die ist es, es mit erfüllten Tagesaufgaben und To-Dos anzugreifen! Wir müssen zusammenstehen um gegen diesen furchteinflößenden Feind zu bestehen - geht sicher, dass ihr eure Tagesaufgaben nicht unerfüllt lasst, das könnte das Stressbiest so sehr reizen, dass es vielleicht anfängt um sich zu schlagen ...",
|
||||
"questStressbeastBoss": "Das schreckliche Stressbiest",
|
||||
"questStressbeastBossRageTitle": "Stressschlag",
|
||||
"questStressbeastBossRageDescription": "Wenn sich diese Leiste füllt, entfesselt das schreckliche Stressbiest seinen Stressschlag auf Habitica!",
|
||||
@@ -205,7 +205,7 @@
|
||||
"questBunnyDropBunnyEgg": "Kaninchen (Ei)",
|
||||
"questBunnyUnlockText": "Schaltet den Kauf von Kanincheneiern auf dem Marktplatz frei",
|
||||
"questSlimeText": "Der Glibberkönig",
|
||||
"questSlimeNotes": "Wie immer arbeitest Du gut gelaunt an Deinen Aufgaben, als Du plötzlich bemerkst, wie Du Dich immer langsamer bewegst. \"Als würde man durch einen Sumpf wandern\", grummelt @Leephon, \"Nein, das fühlt sich eher so an als ob man durch Glibber watet!\" @starsystemic meint: \"Der schleimige Glibberkönig hat dieses Zeug über ganz Habitica verteilt. Es verstopft die Arbeitsschritte. Alles wird verlangsamt.\" Du siehst Dich um und bemerkst, dass die Straßen sich langsam mit durchsichtigem Glibber in allen Farben füllen und die Habiticaner daran hindert ihre Aufgaben zu erledigen. Im Gegensatz zu den meisten anderen, die die Flucht ergreifen, nimmst Du einen Mop zur Hand und machst Dich bereit für die Schlacht!",
|
||||
"questSlimeNotes": "Wie immer arbeitest Du gut gelaunt an Deinen Aufgaben, als Du plötzlich bemerkst, wie Du Dich immer langsamer bewegst. \"Als würde man durch einen Sumpf wandern\", grummelt @Leephon, \"Nein, das fühlt sich eher so an als ob man durch Glibber watet!\" @starsystemic meint: \"Der schleimige Glibberkönig hat dieses Zeug über ganz Habitica verteilt. Es verstopft die Arbeitsschritte. Alles wird verlangsamt.\" Du siehst Dich um und bemerkst, dass die Straßen sich langsam mit durchsichtigem Glibber in allen Farben füllen und die Habiticaner werden daran gehindert ihre Aufgaben zu erledigen. Im Gegensatz zu den meisten anderen, die die Flucht ergreifen, nimmst Du einen Mop zur Hand und machst Dich bereit für die Schlacht!",
|
||||
"questSlimeBoss": "Glibberkönig",
|
||||
"questSlimeCompletion": "Mit einem letzten Mopstoß stößt Du den Glibberkönig in die Falle, einen riesigen Donut, den @Overomega, @LordDarkly und @Shaner, die gewitzten Anführer der Feingebäck-Gilde, herangebracht haben. Anerkennend klopfen Dir die Habiticaner auf den Rücken, als Du fühlst, wie Dir jemand etwas in die Tasche rutschen lässt. Es ist die Belohnung für Deinen süßen Erfolg: drei Marshmallow-Schleim-Eier.",
|
||||
"questSlimeDropSlimeEgg": "Marshmallow-Schleim (Ei)",
|
||||
@@ -432,7 +432,7 @@
|
||||
"questTriceratopsUnlockText": "Schaltet den Kauf von Triceratopseiern auf dem Marktplatz frei",
|
||||
"questGroupStoikalmCalamity": "Stoïstilles Unglück",
|
||||
"questStoikalmCalamity1Text": "Stoïstilles Unglück, Teil 1: Erdgegner",
|
||||
"questStoikalmCalamity1Notes": "Ein knappes Schreiben von @Kiwibot trifft ein; nicht nur ist die frostbedeckte Schriftrolle eiskalt, sondern sie lässt Dir auch kalte Schauer den Rücken runterlaufen. \"Bin in Stoïstillen Steppen – Monster platzen aus Boden – brauche Hilfe!\" Du versammelst Deine Gruppe und reitest gen Norden, doch gerade, als Ihr Euch den Berg hinabbewegt, explodiert der Schnee unter Euren Füßen und grausig grinsende Schädel umzingeln Euch! <br><br>Plötzlich fliegt ein Speer an Euch vorbei und gräbt sich in einen Schädel, der Dich, sich durch den Schnee buddelnd, unbemerkt angreifen wollte. Eine große Frau in fein geschmiedeter Rüstung galoppiert auf dem Rücken eines Mastodons in die Schlacht und zieht mit wehendem Zopf rabiat den Speer wieder aus dem zerquetschten Biest. Zeit, die Feinde mit der Hilfe von Lady Glaciate, der Anführerin der Mammutreiter, zu bekämpfen!",
|
||||
"questStoikalmCalamity1Notes": "Ein knappes Schreiben von @Kiwibot trifft ein; nicht nur ist die frostbedeckte Schriftrolle eiskalt, sondern sie lässt Dir auch kalte Schauer den Rücken runterlaufen. \"Bin in Stoïstillen Steppen – Monster platzen aus Boden – brauche Hilfe!\" Du versammelst Deine Party und reitest gen Norden, doch gerade, als Ihr Euch den Berg hinabbewegt, explodiert der Schnee unter Euren Füßen und grausig grinsende Schädel umzingeln Euch! <br><br>Plötzlich fliegt ein Speer an Euch vorbei und gräbt sich in einen Schädel, der Dich, sich durch den Schnee buddelnd, unbemerkt angreifen wollte. Eine große Frau in fein geschmiedeter Rüstung galoppiert auf dem Rücken eines Mastodons in die Schlacht und zieht mit wehendem Zopf rabiat den Speer wieder aus dem zerquetschten Biest. Zeit, die Feinde mit der Hilfe von Lady Glaciate, der Anführerin der Mammutreiter, zu bekämpfen!",
|
||||
"questStoikalmCalamity1Completion": "Als Du den letzten Schädeln den Gnadenstoß versetzt, lösen sie sich in einen Hauch Magie auf. \"Der verflixte Schwarm mag zwar verschwunden sein\", sagt Lady Glaciate, \"aber wir haben größere Probleme. Folge mir.\" Sie wirft Dir zum Schutz vor der eisigen Luft einen Mantel zu und Du reitest ihr nach.",
|
||||
"questStoikalmCalamity1Boss": "Erdschädelschwarm",
|
||||
"questStoikalmCalamity1RageTitle": "Schwarmnachwuchs",
|
||||
@@ -520,7 +520,7 @@
|
||||
"questUnlockLostMasterclasser": "Um diese Quest freizuschalten, musst Du die finalen Quests der Questreihen 'Dilatory in Gefahr', 'Chaos in Mistiflying', 'Stoïstilles Unglück' und 'Schrecken in den Aufgabenwäldern' abgeschlossen haben.",
|
||||
"questLostMasterclasser1Text": "Das Geheimnis der Klassenmeister, Teil 1: Lies zwischen den Zeilen",
|
||||
"questLostMasterclasser1Notes": "Du wurdest unerwartet von @beffymaroo und @Lemoness nach Habit Hall gerufen, wo Du erstaunt feststellst, dass im fahlen Licht der Dämmerung alle vier Klassenmeister von Habitica auf Dich warten. Sogar der Fröhliche Reaper sieht düster aus. <br><br>“Oho, Du bist hier”, sagt der April-Scherzkeks. “Nun, wir stören ungern Deine Nachtruhe ohne einen wirklich triftigen—” <br><br>“Hilf uns, den jüngsten Fall von Besessenheit aufzuklären”, unterbricht Lady Glaciate. “Alle Opfer beschuldigten jemanden namens Tzina.” <br><br>Der April-Scherzkeks ist sichtlich beleidigt von der Kurzfassung. “Was ist mit meiner Ansprache?” zischt er ihr zu. “Mit dem Nebel und den Gewitter-Effekten?” <br><br>“Wir sind in Eile”, murmelt sie zurück. “Und meine Mammuts sind immer noch klatschnass von Deinen pausenlosen Proben.” <br><br>“Ich fürchte, dass die verehrte Meisterin der Krieger Recht behält”, sagt König Manta. “Zeit ist von wesentlicher Bedeutung. Wirst Du uns helfen?” <br><br>Als Du nickst, winkt er mit seinen Händen, um ein Portal zu öffnen, das zu einem Unterwasser-Raum führt. “Schwimm mit mir hinab nach Dilatory, und wir durchkämmen meine Bibliothek nach jeglichen Belegen, die uns einen Hinweis geben könnten.” Als er Deine Verwirrung bemerkt, fügt er hinzu: “Keine Sorge, das Papier wurde bereits verzaubert, lange bevor Dilatory versank. Keines der Bücher ist auch nur im geringsten feucht!” Er zwinkert. “Im Gegensatz zu Lady Glaciate’s Mammuts.” <br><br>“Das habe ich gehört, Manta.” <br><br>Als Du hinter dem Meister der Magier in das Wasser tauchst, verschmelzen Deine Beine auf magische Weise zu einer Schwanzflosse. Und obwohl Dein Körper Auftrieb hat, sinkt Dein Herz beim Anblick tausender Bücherregale. Du fängst besser an zu lesen…",
|
||||
"questLostMasterclasser1Completion": "Obwohl Du stundenlang über den Büchern gebrütet hast, hast Du keine einzige nützliche Information gefunden. <br><br>“Es kann unmöglich sein, dass sich nicht einmal der kleinste Hinweis auf etwas Relevantes finden lässt”, sagt Oberbibliothekar @Tuqjoi, und der Assistent @stefalupagus nickt frustriert. <br><br>König Manta verengt die Augen zu Schlitzen. “Nicht unmöglich…”, sagt er. “<em>Beabsichtigt</em>.” Für einen Moment glüht das Wasser um seine Hände, und einige der Bücher erschauern. “Etwas verschleiert Informationen”, stellt er fest. “Nicht einfach ein statischer Zauber, sondern etwas mit einem eigenen Willen. Etwas… Lebendiges.” Er schwimmt vom Tisch hoch. “Der Fröhliche Reaper muss davon erfahren. Packen wir etwas Proviant für unterwegs ein.”",
|
||||
"questLostMasterclasser1Completion": "Obwohl Du stundenlang über den Büchern gebrütet hast, konntest Du keine einzige nützliche Information finden. <br><br>“Es kann unmöglich sein, dass sich nicht einmal der kleinste Hinweis auf etwas Relevantes finden lässt”, sagt Oberbibliothekar @Tuqjoi, und der Assistent @stefalupagus nickt frustriert. <br><br>König Manta verengt die Augen zu Schlitzen. “Nicht unmöglich…”, sagt er. “<em>Beabsichtigt</em>.” Für einen Moment glüht das Wasser um seine Hände, und einige der Bücher erschauern. “Etwas verschleiert Informationen”, stellt er fest. “Nicht einfach ein statischer Zauber, sondern etwas mit einem eigenen Willen. Etwas… Lebendiges.” Er schwimmt vom Tisch hoch. “Der Fröhliche Reaper muss davon erfahren. Packen wir etwas Proviant für unterwegs ein.”",
|
||||
"questLostMasterclasser1CollectAncientTomes": "Alte Bücher",
|
||||
"questLostMasterclasser1CollectForbiddenTomes": "Verbotene Bücher",
|
||||
"questLostMasterclasser1CollectHiddenTomes": "Versteckte Bücher",
|
||||
@@ -604,7 +604,7 @@
|
||||
"cuddleBuddiesText": "\"Kuschelkumpel\" Quest-Paket",
|
||||
"cuddleBuddiesNotes": "Beinhaltet 'Das Killerkaninchen', 'Das Ruchlose Frettchen' und 'Die Meerschweinchen Gang'. Verfügbar bis zum 31. März.",
|
||||
"aquaticAmigosText": "\"Feuchte Freunde\" Quest-Paket",
|
||||
"aquaticAmigosNotes": "Beinhaltet 'Der magische Axolotl', 'Der Kraken von Unfertik' und 'Der Ruf des Octothulu'. Verfügbar bis zum 31. August.",
|
||||
"aquaticAmigosNotes": "Beinhaltet 'Der magische Axolotl', 'Der Kraken von Unfertik' und 'Der Ruf des Octothulu'. Verfügbar bis zum 30. Juni.",
|
||||
"questSeaSerpentText": "Gefahr in der Tiefe: Seeschlangen-Angriff!",
|
||||
"questSeaSerpentNotes": "Du fühlst Deine Glückssträhne - es ist die perfekte Zeit für einen Ausflug zur Seepferdchen-Rennstrecke. Du steigst in das U-Boot bei Diligent Docks ein und machst Dich bereit für die Reise nach Dilatory, aber kaum bist Du untergetaucht, erschüttert ein Aufprall das U-Boot und lässt seine Insassen stolpern. “Was ist los?” schreit @AriesFaries.<br><br>Du schaust durch ein nahegelegenes Bullauge und bist schockiert von der Wand aus schimmernden Schuppen, die an ihm vorbeizieht. “Seeschlange!” ruft Captain @Witticaster über die Gegensprechanlage aus. “Haltet euch fest, sie kommt schon wieder!” Während Du Dich an die Armlehnen Deines Sitzes klammerst, ziehen Deine unerledigten Aufgaben vor Deinen Augen vorüber. “Vielleicht, wenn wir zusammen arbeiten und sie erledigen”, denkst Du, “können wir dieses Monster vertreiben!”",
|
||||
"questSeaSerpentCompletion": "Von Deiner Hingabe angeschlagen, flieht die Seeschlange und verschwindet in den Tiefen. Als Du in Dilatory ankommst, entfährt Dir ein Seufzer der Erleichterung, bevor Du bemerkst, dass @*~Seraphina~ sich mit drei durchsichtigen Eiern in ihren Armen nähert. “Hier, die hier sollst Du haben”, sagt sie. “Du weißt, wie man mit einer Seeschlange umgeht!” Als Du die Eier annimmst, gelobst Du von neuem, standhaft bei der Erfüllung Deiner Aufgaben zu bleiben, um sicherzustellen, dass es nicht zu einer Wiederholung kommt.",
|
||||
@@ -646,7 +646,7 @@
|
||||
"questSilverCollectSilverIngots": "Silberbarren",
|
||||
"questSilverDropSilverPotion": "Silbernes Schlüpfelixier",
|
||||
"questBronzeText": "Dreister Käfer-Kampf",
|
||||
"questBronzeNotes": "In einer erfrischenden Pause zwischen den Aufgaben machst Du mit einigen Freunden einen Spaziergang durch die Waldwege der Taskwoods. Du triffst auf einen großen hohlen Baumstamm und ein Funkeln von innen erregt deine Aufmerksamkeit.<br><br><br>Hoppla, das ist ein Vorrat an magischen Schlüpftränken! Die schimmernde bronzene Flüssigkeit wirbelt sanft in den Flaschen, und @Hachiseiko greift nach einer, um sie zu untersuchen.<br><br><br>“Halt!” zischt eine Stimme von hinten. Es ist ein gigantischer Käfer mit einem Panzer aus glänzender Bronze, der seine Krallenfüße in Kampfhaltung hebt. “Das sind meine Tränke, und wenn Du sie verdienen willst, musst Du Dich in einem Duell der Gentlemen beweisen!”",
|
||||
"questBronzeNotes": "In einer erfrischenden Pause zwischen den Aufgaben machst Du mit einigen Freunden einen Spaziergang durch die Waldwege der Taskwoods. Du triffst auf einen großen hohlen Baumstamm und ein Funkeln von innen erregt deine Aufmerksamkeit.<br><br><br>Hoppla, das ist ein Vorrat an magischen Schlüpfelixieren! Die schimmernde bronzene Flüssigkeit wirbelt sanft in den Flaschen, und @Hachiseiko greift nach einer, um sie zu untersuchen.<br><br><br>“Halt!” zischt eine Stimme von hinten. Es ist ein gigantischer Käfer mit einem Panzer aus glänzender Bronze, der seine Krallenfüße in Kampfhaltung hebt. “Das sind meine Tränke, und wenn Du sie verdienen willst, musst Du Dich in einem Duell der Gentlemen beweisen!”",
|
||||
"questBronzeCompletion": "“Gut getroffen, Krieger!” sagt der Käfer, als er sich zu Boden setzt. Lächelt er etwa? Es ist schwer zu sagen, bei diesen Unterkiefern. “Du hast Dir diese Tränke wirklich verdient!” <br<br<br>“Oh wow, wir haben noch nie eine solche Belohnung für den Sieg in einer Schlacht erhalten”, sagt @UncommonCriminal und dreht eine schimmernde Flasche in der Hand. “Lasst uns unsere neuen Haustiere schlüpfen lassen!”",
|
||||
"questBronzeBoss": "Bronzener Brummer",
|
||||
"questBronzeUnlockText": "Schaltet den Kauf von Bronzenen Schlüpfelixieren auf dem Marktplatz frei",
|
||||
|
||||
@@ -215,5 +215,8 @@
|
||||
"gemCap": "Edelsteinobergrenze",
|
||||
"nextHourglass": "Nächste Sanduhr",
|
||||
"adjustment": "Änderung",
|
||||
"dayStartAdjustment": "Änderung des Tageswechsel"
|
||||
"dayStartAdjustment": "Änderung des Tageswechsel",
|
||||
"passwordSuccess": "Passwort erfolgreich geändert",
|
||||
"giftSubscriptionRateText": "<strong>$<%= price %> $(USD)</strong> für <strong><%= months %> Monate</strong>",
|
||||
"transaction_admin_update_balance": "Admin gegeben"
|
||||
}
|
||||
|
||||
@@ -208,5 +208,8 @@
|
||||
"howManyGemsSend": "Wie viele Edelsteine möchtest Du verschicken?",
|
||||
"sendAGift": "Geschenk verschicken",
|
||||
"howManyGemsPurchase": "Wie viele Edelsteine möchtest Du kaufen?",
|
||||
"mysterySet202206": "Meereselfen-Set"
|
||||
"mysterySet202206": "Meereselfen-Set",
|
||||
"mysterySet202207": "Quasselndes Quallen Set",
|
||||
"wantToSendOwnGems": "Willst Du von deinen eigenen Edelsteinen senden?",
|
||||
"needToPurchaseGems": "Willst Du Edelsteine als Geschenk kaufen?"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"step1": "Βήμα 1: Εισάγετε Αποστολές",
|
||||
"webStep1Text": "Το Habitica δεν είναι τίποτα χωρίς στόχους στον πραγματικό κόσμο, οπότε θέσε μερικούς. Μπορείς να προσθέσεις περισσότερους αργότερα! Οι στόχοι μπορούν να προστεθούν πατώντας το πράσινο κουμπί \"Δημιουργία\".\n* **Ρύθμισε τις [Υποχρεώσεις σου](http://habitica.wikia.com/wiki/To-Dos):** Βάλε στόχους που θέλεις να υλοποιείς σπάνια ή μια μόνο φορά στη στήλη των Υποχρεώσεων, έναν κάθε φορά. Μπορείς να τροποποιήσεις τους στόχους κάνοντας κλικ πάνω τους και να προσθέσεις λίστες, ημερομηνίες και άλλα!\n* **Ρύθμισε τους [Καθημερινούς Στόχους](http://habitica.wikia.com/wiki/Dailies):** Πρόσθεσε δραστηριότητες που πρέπει να κάνεις καθημερινά, ή μια συγκεκριμένη μέρα της εβδομάδας, μήνα ή του χρόνου στη στήλη με τις Καθημερινές Υποχρεώσεις. Κάνε κλικ σε έναν στόχο για να τροποποιήσεις το πότε πρέπει να τον ολοκληρώσεις, ή να ορίσεις μια ημερομηνία εκκίνησης. Μπορείς επίσης να ορίσεις μια ημερομηνία ολοκλήρωσης σε επαναλαμβανόμενη βάση, για παράδειγμα, κάθε 3 μέρες.\n* **Ρύθμισε τις [Συνήθειες](http://habitica.wikia.com/wiki/Habits):** Πρόσθεσε Συνήθειες που θέλεις να υιοθετήσεις στη στήλη των Συνηθειών. Μπορείς να τροποποιήσεις μια Συνήθεια ώστε να την θέσεις ως καλή :heavy_plus_sign: η κακή συνήθεια :heavy_minus_sign:\n* **Ρύθμισε τις [Ανταμοιβές](http://habitica.wikia.com/wiki/Rewards):** Επιπλέον από τις Ανταμοιβές που υπάρχουν μέσα στην εφαρμογή, πρόσθεσε δραστηριότητες ή κεράσματα τα οποία θέλεις να χρησιμοποιήσεις ως κίνητρο στην στήλη των Ανταμοιβών. Είναι σημαντικό να κάνεις ένα διάλειμμα ή να επιτρέπεις στον εαυτό σου λίγη ικανοποίηση με μέτρο!\n* Αν χρειάζεσαι έμπνευση για να προσθέσεις στόχους, μπορείς να κοιτάξεις στις σελίδες του wiki για τις [Παραδείγματα για Συνήθειες](http://habitica.wikia.com/wiki/Sample_Habits), [Παραδείγματα Καθημερινών Στόχων](http://habitica.wikia.com/wiki/Sample_Dailies), [Παραδείγματα Υποχρεώσεων](http://habitica.wikia.com/wiki/Sample_To-Dos), and [Παραδείγματα Ανταμειβών](http://habitica.wikia.com/wiki/Sample_Custom_Rewards).",
|
||||
"step2": "Βήμα 2: Πάρτε Πόντους Κάνοντας Πράξεις στην Πραγματική Ζωή",
|
||||
"webStep2Text": "Now, start tackling your goals from the list! As you complete tasks and check them off in Habitica, you will gain [Experience](http://habitica.wikia.com/wiki/Experience_Points), which helps you level up, and [Gold](http://habitica.wikia.com/wiki/Gold_Points), which allows you to purchase Rewards. If you fall into bad habits or miss your Dailies, you will lose [Health](http://habitica.wikia.com/wiki/Health_Points). In that way, the Habitica Experience and Health bars serve as a fun indicator of your progress toward your goals. You'll start seeing your real life improve as your character advances in the game.",
|
||||
"webStep2Text": "Τώρα, ξεκίνα να κυνηγάς τους στόχους σου από τη λίστα! Όσο ολοκληρώνεις και τσεκάρεις στόχους στο Habitica, θα κερδίζεις [Πόντους Εμπειρίας](http://habitica.wikia.com/wiki/Experience_Points), πράγμα που θα σε βοηθήσει να ανεβαίνεις επίπεδα, και [Χρυσό](http://habitica.wikia.com/wiki/Gold_Points), που σου επιτρέπει να αγοράζεις Ανταμειβές. Αν επιστρέψεις σε κακές συνήθειες, ή αν αποτύχεις στους καθημερινούς στόχους σου, θα χάσεις [Ζωή](http://habitica.wikia.com/wiki/Health_Points). Με αυτόν τον τρόπο, η Εμπειρία Habitica και οι μπάρες Ζωής, λειτουργούν ως μια διασκεδαστική ένδειξη της προόδου σου προς τους στόχους σου. Θα αρχίσεις να βλέπεις την πραγματική σου ζωή να βελτιώνεται όσο ο χαρακτήρας σου προχωρά στο παιχνίδι.",
|
||||
"step3": "Βήμα 3: Προσαρμόστε και Εξερευνήστε το Habitica",
|
||||
"webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your tasks with [tags](http://habitica.wikia.com/wiki/Tags) (edit a task to add them).\n * Customize your [avatar](http://habitica.wikia.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](http://habitica.wikia.com/wiki/Equipment) under Rewards or from the [Shops](<%= shopUrl %>), and change it under [Inventory > Equipment](<%= equipUrl %>).\n * Connect with other users via the [Tavern](http://habitica.wikia.com/wiki/Tavern).\n * Starting at Level 3, hatch [Pets](http://habitica.wikia.com/wiki/Pets) by collecting [eggs](http://habitica.wikia.com/wiki/Eggs) and [hatching potions](http://habitica.wikia.com/wiki/Hatching_Potions). [Feed](http://habitica.wikia.com/wiki/Food) them to create [Mounts](http://habitica.wikia.com/wiki/Mounts).\n * At level 10: Choose a particular [class](http://habitica.wikia.com/wiki/Class_System) and then use class-specific [skills](http://habitica.wikia.com/wiki/Skills) (levels 11 to 14).\n * Form a party with your friends (by clicking [Party](<%= partyUrl %>) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [quests](http://habitica.wikia.com/wiki/Quests) (you will be given a quest at level 15).",
|
||||
"overviewQuestions": "Have questions? Check out the [FAQ](<%= faqUrl %>)! If your question isn't mentioned there, you can ask for further help in the [Habitica Help guild](<%= helpGuildUrl %>).\n\nGood luck with your tasks!"
|
||||
|
||||
@@ -133,7 +133,10 @@
|
||||
"achievementReptacularRumble": "Reptacular Rumble",
|
||||
"achievementReptacularRumbleText": "Has hatched all the standard colors of reptile pets: Alligator, Pterodactyl, Snake, Triceratops, Turtle, Tyrannosaurus Rex, and Velociraptor!",
|
||||
"achievementReptacularRumbleModalText": "You collected all the reptile pets!",
|
||||
"achievementGroupsBeta2022":"Interactive Beta Tester",
|
||||
"achievementGroupsBeta2022Text":"You and your group provided invaluable feedback to help Habitica test.",
|
||||
"achievementGroupsBeta2022ModalText":"You and your groups helped Habitica by testing and providing feedback!"
|
||||
"achievementGroupsBeta2022": "Interactive Beta Tester",
|
||||
"achievementGroupsBeta2022Text": "You and your group provided invaluable feedback to help Habitica test.",
|
||||
"achievementGroupsBeta2022ModalText":"You and your groups helped Habitica by testing and providing feedback!",
|
||||
"achievementWoodlandWizard": "Woodland Wizard",
|
||||
"achievementWoodlandWizardText": "Has hatched all standard colors of forest creatures: Badger, Bear, Deer, Fox, Frog, Hedgehog, Owl, Snail, Squirrel, and Treeling!",
|
||||
"achievementWoodlandWizardModalText": "You collected all the forest pets!"
|
||||
}
|
||||
|
||||
@@ -795,6 +795,22 @@
|
||||
"backgroundSailboatAtSunsetText": "Sailboat At Sunset",
|
||||
"backgroundSailboatAtSunsetNotes": "Enjoy the beauty of a sailboat at sunset.",
|
||||
|
||||
"backgrounds072022": "SET 98: Released July 2022",
|
||||
"backgroundBioluminescentWavesText": "Bioluminescent Waves",
|
||||
"backgroundBioluminescentWavesNotes": "Admire the glow of Bioluminescent Waves.",
|
||||
"backgroundUnderwaterCaveText": "Underwater Cave",
|
||||
"backgroundUnderwaterCaveNotes": "Explore an Underwater Cave.",
|
||||
"backgroundUnderwaterStatuesText": "Underwater Statue Garden",
|
||||
"backgroundUnderwaterStatuesNotes": "Try not to blink in an Underwater Statue Garden.",
|
||||
|
||||
"backgrounds082022": "SET 99: Released August 2022",
|
||||
"backgroundRainbowEucalyptusText": "Rainbow Eucalyptus",
|
||||
"backgroundRainbowEucalyptusNotes": "Admire a Rainbow Eucalyptus grove.",
|
||||
"backgroundMessyRoomText": "Messy Room",
|
||||
"backgroundMessyRoomNotes": "Tidy up a Messy Room.",
|
||||
"backgroundByACampfireText": "By A Campfire",
|
||||
"backgroundByACampfireNotes": "Bask in the glow By a Campfire.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -640,16 +640,20 @@
|
||||
"weaponArmoireGardenersWateringCanNotes": "You can’t get far without water! Have an infinite supply on hand with this magic, refilling watering can. Increases Intelligence by <%= int %>. Enchanted Armoire: Gardener Set (Item 4 of 4).",
|
||||
"weaponArmoireHuntingHornText": "Hunting Horn",
|
||||
"weaponArmoireHuntingHornNotes": "Twooooo! Twoo! Twoo! Gather your party for an adventure or quest by playing this horn. Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Musical Instrument Set 1 (Item 1 of 3)",
|
||||
"weaponArmoireBlueKiteText":"Blue Kite",
|
||||
"weaponArmoireBlueKiteNotes":"Sailing high up in the blue, what tricks can you make your kite do? Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 1 of 5)",
|
||||
"weaponArmoireGreenKiteText":"Green Kite",
|
||||
"weaponArmoireGreenKiteNotes":"A more stunning kite you’ve never seen, with its shades of yellow and green. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 2 of 5)",
|
||||
"weaponArmoireOrangeKiteText":"Orange Kite",
|
||||
"weaponArmoireOrangeKiteNotes":"With colors like sunrise and sunset, let’s see how high your kite can get! Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 3 of 5)",
|
||||
"weaponArmoirePinkKiteText":"Pink Kite",
|
||||
"weaponArmoirePinkKiteNotes":"Diving, twirling, soaring high, your kite stands out against the sky. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 4 of 5)",
|
||||
"weaponArmoireYellowKiteText":"Yellow Kite",
|
||||
"weaponArmoireYellowKiteNotes":"Swooping and swerving to and fro, watch your cheerful kite go. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 5 of 5)",
|
||||
"weaponArmoireBlueKiteText": "Blue Kite",
|
||||
"weaponArmoireBlueKiteNotes": "Sailing high up in the blue, what tricks can you make your kite do? Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 1 of 5)",
|
||||
"weaponArmoireGreenKiteText": "Green Kite",
|
||||
"weaponArmoireGreenKiteNotes": "A more stunning kite you’ve never seen, with its shades of yellow and green. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 2 of 5)",
|
||||
"weaponArmoireOrangeKiteText": "Orange Kite",
|
||||
"weaponArmoireOrangeKiteNotes": "With colors like sunrise and sunset, let’s see how high your kite can get! Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 3 of 5)",
|
||||
"weaponArmoirePinkKiteText": "Pink Kite",
|
||||
"weaponArmoirePinkKiteNotes": "Diving, twirling, soaring high, your kite stands out against the sky. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 4 of 5)",
|
||||
"weaponArmoireYellowKiteText": "Yellow Kite",
|
||||
"weaponArmoireYellowKiteNotes": "Swooping and swerving to and fro, watch your cheerful kite go. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 5 of 5)",
|
||||
"weaponArmoirePushBroomText": "Push Broom",
|
||||
"weaponArmoirePushBroomNotes": "Take this tidying tool on your adventures and always be able to sweep a sooty stoop or clear cobwebs from corners. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set (Item 1 of 3)",
|
||||
"weaponArmoireFeatherDusterText": "Feather Duster",
|
||||
"weaponArmoireFeatherDusterNotes": "Let these fancy feathers fly over all your old objects to make them shine like new. Just beware of the disturbed dust so you don’t sneeze! Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set (Item 2 of 3)",
|
||||
|
||||
"armor": "armor",
|
||||
"armorCapitalized": "Armor",
|
||||
@@ -1362,6 +1366,8 @@
|
||||
"armorArmoireGardenersOverallsNotes": "Don’t be afraid to work down in the dirt when you’re wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
|
||||
"armorArmoireStrawRaincoatText": "Straw Raincoat",
|
||||
"armorArmoireStrawRaincoatNotes": "This woven straw cape will keep you dry and your armor from rusting while on your quest. Just don’t venture too near a candle! Increases Constitution by <%= con %>. Enchanted Armoire: Straw Raincoat Set (Item 1 of 2).",
|
||||
"armorArmoireFancyPirateSuitText": "Fancy Pirate Jacket",
|
||||
"armorArmoireFancyPirateSuitNotes": "Wear this fine jacket well as you organize your ship’s library or talk it through as a crew. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Fancy Pirate Set (Item 1 of 3).",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -1922,6 +1928,9 @@
|
||||
"headMystery202206Notes": "The blue pearl in this circlet grants you waterbending powers. Use them wisely! Confers no benefit. June 2022 Subscriber Item.",
|
||||
"headMystery202207Text": "Jammin' Jelly Helm",
|
||||
"headMystery202207Notes": "Need a hand with your tasks? Will several dozen bioluminescent tentacles do? Confers no benefit. July 2022 Subscriber Item.",
|
||||
"headMystery202208Text": "Perky Ponytail",
|
||||
"headMystery202208Notes": "Enjoy showing off this voluminous hair - it can double as a whip in a pinch! Confers no benefit. August 2022 Subscriber Item.",
|
||||
|
||||
"headMystery301404Text": "Fancy Top Hat",
|
||||
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
|
||||
"headMystery301405Text": "Basic Top Hat",
|
||||
@@ -2095,6 +2104,8 @@
|
||||
"headArmoireGardenersSunHatNotes": "The bright light of the day star won’t shine in your eyes when you wear this wide-brimmed hat. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set (Item 2 of 4).",
|
||||
"headArmoireStrawRainHatText": "Straw Rain Hat",
|
||||
"headArmoireStrawRainHatNotes": "You’ll be able to spot every obstacle in your path when you wear this water-resistant, conical hat. Increases Perception by <%= per %>. Enchanted Armoire: Straw Raincoat Set (Item 2 of 2).",
|
||||
"headArmoireFancyPirateHatText": "Fancy Pirate Hat",
|
||||
"headArmoireFancyPirateHatNotes": "Be protected from the sun and any seagulls flying overhead as you drink tea on the deck of your ship. Increases Perception by <%= per %>. Enchanted Armoire: Fancy Pirate Set (Item 2 of 3).",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
@@ -2481,6 +2492,10 @@
|
||||
"shieldArmoireSpanishGuitarNotes": "Tink! Tink! Thrummm! Gather your party for a concert or celebration by playing this guitar. Increases Perception by <%= per %> and Intelligence by <%= int %>. Enchanted Armoire: Musical Instrument Set 1 (Item 2 of 3)",
|
||||
"shieldArmoireSnareDrumText": "Snare Drum",
|
||||
"shieldArmoireSnareDrumNotes": "Rat-a-tat-tat! Gather your party for a parade or march into battle by playing this drum. Increases Constitution by <%= con %> and Intelligence by <%= int %>. Enchanted Armoire: Musical Instrument Set 1 (Item 3 of 3)",
|
||||
"shieldArmoireTreasureMapText": "Treasure Map",
|
||||
"shieldArmoireTreasureMapNotes": "X marks the spot! You never know what you’ll find when you follow this handy map to fabled treasures: gold, jewels, relics, or perhaps a petrified orange? Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fancy Pirate Set (Item 3 of 3).",
|
||||
"shieldArmoireDustpanText": "Dustpan",
|
||||
"shieldArmoireDustpanNotes": "Have this handy handheld dustpan ready every time you clean. A vanishing spell cast on it means you never have to search for a trash can to empty it into. Increases Intelligence and Constitution by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set (Item 3 of 3).",
|
||||
|
||||
"back": "Back Accessory",
|
||||
"backBase0Text": "No Back Accessory",
|
||||
@@ -2833,6 +2848,8 @@
|
||||
"eyewearMystery202204ANotes": "What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
|
||||
"eyewearMystery202204BText": "Virtual Face",
|
||||
"eyewearMystery202204BNotes": "What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
|
||||
"eyewearMystery202208Text": "Sparkly Eyes",
|
||||
"eyewearMystery202208Notes": "Lull your enemies into a false sense of security with these terrifyingly cute peepers. Confers no benefit. August 2022 Subscriber Item.",
|
||||
"eyewearMystery301404Text": "Eyewear Goggles",
|
||||
"eyewearMystery301404Notes": "No eyewear could be fancier than a pair of goggles - except, perhaps, for a monocle. Confers no benefit. April 3015 Subscriber Item.",
|
||||
"eyewearMystery301405Text": "Monocle",
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
"sendGiftHeading": "Send Gift to <%= name %>",
|
||||
"sendGiftGemsBalance": "From <%= number %> Gems",
|
||||
"sendGiftCost": "Total: $<%= cost %> USD",
|
||||
"sendGiftTotal": "Total:",
|
||||
"sendGiftFromBalance": "From Balance",
|
||||
"sendGiftPurchase": "Purchase",
|
||||
"sendGiftMessagePlaceholder": "Personal message (optional)",
|
||||
@@ -363,5 +364,6 @@
|
||||
"managerNotes": "Manager's Notes",
|
||||
"assignedDateOnly": "Assigned on <strong><%= date %></strong>",
|
||||
"assignedDateAndUser": "Assigned by <strong>@<%- username %></strong> on <strong><%= date %></strong>",
|
||||
"claimRewards": "Claim Rewards"
|
||||
"claimRewards": "Claim Rewards",
|
||||
"chatTemporarilyUnavailable": "Chat is temporarily unavailable. Please try again later."
|
||||
}
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
"passwordChangeSuccess": "Your password was successfully changed to the one you just chose. You can now use it to access your account.",
|
||||
"displayNameSuccess": "Display name successfully changed",
|
||||
"emailSuccess": "Email successfully changed",
|
||||
"passwordSuccess": "Password successfully changed",
|
||||
"detachSocial": "De-register <%= network %>",
|
||||
"detachedSocial": "Successfully removed <%= network %> authentication from your account",
|
||||
"addedLocalAuth": "Successfully added local authentication",
|
||||
@@ -124,6 +125,7 @@
|
||||
"unsubscribeAllPush": "Check to Unsubscribe from all Push Notifications",
|
||||
"correctlyUnsubscribedEmailType": "Correctly unsubscribed from \"<%= emailType %>\" emails.",
|
||||
"subscriptionRateText": "Recurring <strong>$<%= price %> USD</strong> every <strong><%= months %> months</strong>",
|
||||
"giftSubscriptionRateText": "<strong>$<%= price %> USD</strong> for <strong><%= months %> months</strong>",
|
||||
"benefits": "Benefits",
|
||||
"coupon": "Coupon",
|
||||
"couponText": "We sometimes have events and give out promo codes for special gear. (eg, those who stop by our Wondercon booth)",
|
||||
@@ -203,11 +205,13 @@
|
||||
"transaction_gift_send": "Gifted to",
|
||||
"transaction_gift_receive": "Received from",
|
||||
"transaction_create_challenge": "Created challenge",
|
||||
"transaction_create_bank_challenge": "Created bank challenge",
|
||||
"transaction_create_guild": "Created guild",
|
||||
"transaction_change_class": "Changed class",
|
||||
"transaction_rebirth": "Used Orb of Rebirth",
|
||||
"transaction_release_pets": "Released pets",
|
||||
"transaction_release_mounts": "Released mounts",
|
||||
"transaction_reroll": "Used Fortify Potion",
|
||||
"transaction_subscription_perks": "From subscription perk"
|
||||
"transaction_subscription_perks": "From subscription perk",
|
||||
"transaction_admin_update_balance": "Admin given"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
"subscriptions": "Subscriptions",
|
||||
"viewSubscriptions": "View Subscriptions",
|
||||
"sendGems": "Send Gems",
|
||||
"howManyGemsPurchase": "How many Gems would you like to purchase?",
|
||||
"howManyGemsSend":"How many Gems would you like to send?",
|
||||
"needToPurchaseGems": "Need to purchase Gems as a gift?",
|
||||
"wantToSendOwnGems": "Want to send your own Gems?",
|
||||
"buyGemsGold": "Buy Gems with Gold",
|
||||
"mustSubscribeToPurchaseGems": "Must subscribe to purchase gems with GP",
|
||||
"reachedGoldToGemCapQuantity": "Your requested amount <%= quantity %> exceeds the amount you can buy for this month (<%= convCap %>). The full amount becomes available within the first three days of each month. Thanks for subscribing!",
|
||||
@@ -136,6 +140,7 @@
|
||||
"mysterySet202205": "Dusk-Winged Dragon Set",
|
||||
"mysterySet202206": "Sea Sprite Set",
|
||||
"mysterySet202207": "Jammin' Jelly Set",
|
||||
"mysterySet202208": "Perky Ponytail Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
@@ -198,5 +203,6 @@
|
||||
"needToUpdateCard": "Need to update your card?",
|
||||
"readyToResubscribe": "Are you ready to resubscribe?",
|
||||
"cancelYourSubscription": "Cancel your subscription?",
|
||||
"cancelSubAlternatives": "If you're having technical problems or Habitica doesn't seem to be working out for you, please consider <a href='mailto:admin@habitica.com'>contacting us</a>. We want to help you get the most from Habitica."
|
||||
"cancelSubAlternatives": "If you're having technical problems or Habitica doesn't seem to be working out for you, please consider <a href='mailto:admin@habitica.com'>contacting us</a>. We want to help you get the most from Habitica.",
|
||||
"sendAGift": "Send Gift"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user