mirror of
https://github.com/HabitRPG/habitica.git
synced 2026-05-20 03:14:01 -05:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b8a2f0b8ee | |||
| 75c9731ca4 | |||
| 31afc45744 | |||
| f6466b161b | |||
| a36114e904 | |||
| 529f856ab9 | |||
| 9077e66973 | |||
| a47a96b70d | |||
| 8a94e88786 | |||
| b3aa236d3d | |||
| 4dd58ad89e | |||
| 317f7ab598 | |||
| d6c47e7e81 | |||
| 1ed61a3d3d | |||
| 5c734cfa00 | |||
| 07f485a654 |
+1
-1
Submodule habitica-images updated: 86a457d894...d2919bc15f
@@ -0,0 +1,115 @@
|
||||
/* eslint-disable no-console */
|
||||
const MIGRATION_NAME = '20241119_gem_caps_hourglasses';
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count += 1;
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
const { consecutive, customerId, dateTerminated, planId } = user.purchased.plan;
|
||||
const isRecurring = customerId !== 'Gift' && !dateTerminated;
|
||||
const updateOp = {
|
||||
$set: {
|
||||
migration: MIGRATION_NAME,
|
||||
'purchased.plan.consecutive.gemCapExtra': Math.max(2 * Math.ceil((consecutive.gemCapExtra + 1) / 2, 26)),
|
||||
},
|
||||
$inc: {},
|
||||
};
|
||||
|
||||
let hourglassBonus = 0;
|
||||
|
||||
if (isRecurring) {
|
||||
await user.updateBalance(
|
||||
5,
|
||||
'admin_update_balance',
|
||||
'',
|
||||
'Subscription Reward Migration',
|
||||
);
|
||||
updateOp.$inc.balance = 5;
|
||||
switch (planId) {
|
||||
case 'basic':
|
||||
case 'basic_earned':
|
||||
case 'group_plan_auto':
|
||||
hourglassBonus = 2;
|
||||
break;
|
||||
case 'basic_3mo':
|
||||
case 'basic_6mo':
|
||||
case 'google_6mo':
|
||||
hourglassBonus = 4;
|
||||
break;
|
||||
case 'basic_12mo':
|
||||
hourglassBonus = 12;
|
||||
updateOp.$set['purchased.plan.hourglassPromoReceived'] = new Date();
|
||||
break;
|
||||
default:
|
||||
hourglassBonus = 0;
|
||||
}
|
||||
|
||||
if (hourglassBonus) {
|
||||
updateOp.$inc['purchased.plan.consecutive.trinkets'] = hourglassBonus;
|
||||
await user.updateHourglasses(
|
||||
hourglassBonus,
|
||||
'admin_update_balance',
|
||||
'',
|
||||
'Subscription Reward Migration',
|
||||
);
|
||||
}
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_subscriber_reward',
|
||||
title: 'Thanks for being a subscriber!',
|
||||
text: 'Enjoy these extra Mystic Hourglasses and Gems to celebrate our new benefits.',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return await User.updateOne(
|
||||
{ _id: user._id },
|
||||
updateOp,
|
||||
).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
let query = {
|
||||
migration: { $ne: MIGRATION_NAME },
|
||||
'purchased.plan.customerId': { $exists: true },
|
||||
$or: [
|
||||
{ 'purchased.plan.dateTerminated': { $exists: false } },
|
||||
{ 'purchased.plan.dateTerminated': null },
|
||||
{ 'purchased.plan.dateTerminated': { $gt: new Date() } },
|
||||
],
|
||||
};
|
||||
|
||||
const fields = {
|
||||
_id: 1,
|
||||
purchased: 1,
|
||||
};
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({_id: 1})
|
||||
.select(fields)
|
||||
.exec();
|
||||
|
||||
if (users.length === 0) {
|
||||
console.warn('All appropriate users found and modified.');
|
||||
console.warn(`\n${count} users processed\n`);
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1],
|
||||
};
|
||||
}
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
+9
-10
@@ -2,16 +2,15 @@
|
||||
* Award Habitoween ladder items to participants in this month's Habitoween festivities
|
||||
*/
|
||||
/* eslint-disable no-console */
|
||||
import { model as User } from '../../website/server/models/user';
|
||||
|
||||
const MIGRATION_NAME = '20241030_habitoween_ladder'; // Update when running in future years
|
||||
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count++;
|
||||
count += 1;
|
||||
|
||||
const set = { migration: MIGRATION_NAME };
|
||||
const inc = {
|
||||
@@ -26,7 +25,7 @@ async function updateUser (user) {
|
||||
'items.food.Candy_Desert': 1,
|
||||
'items.food.Candy_Red': 1,
|
||||
};
|
||||
let push = { notifications: { $each: [] }};
|
||||
const push = { notifications: { $each: [] } };
|
||||
|
||||
if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-RoyalPurple']) {
|
||||
push.notifications.$each.push({
|
||||
@@ -138,13 +137,13 @@ async function updateUser (user) {
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
return await User.updateOne({_id: user._id}, {$inc: inc, $push: push, $set: set}).exec();
|
||||
return User.updateOne({ _id: user._id }, { $inc: inc, $push: push, $set: set }).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
let query = {
|
||||
migration: {$ne: MIGRATION_NAME},
|
||||
'auth.timestamps.loggedin': {$gt: new Date('2024-10-01')},
|
||||
const query = {
|
||||
migration: { $ne: MIGRATION_NAME },
|
||||
'auth.timestamps.loggedin': { $gt: new Date('2024-10-01') },
|
||||
};
|
||||
|
||||
const fields = {
|
||||
@@ -156,7 +155,7 @@ export default async function processUsers () {
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({_id: 1})
|
||||
.sort({ _id: 1 })
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
@@ -173,4 +172,4 @@ export default async function processUsers () {
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
/* eslint-disable no-console */
|
||||
import { model as User } from '../../website/server/models/user';
|
||||
|
||||
const MIGRATION_NAME = '20241120_harvest_feast';
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count += 1;
|
||||
|
||||
const updateOp = {
|
||||
$set: { migration: MIGRATION_NAME },
|
||||
};
|
||||
|
||||
if (typeof user.items.gear.owned.head_special_turkeyHelmGilded !== 'undefined') {
|
||||
updateOp.$inc = {
|
||||
'items.food.Pie_Base': 1,
|
||||
'items.food.Pie_CottonCandyBlue': 1,
|
||||
'items.food.Pie_CottonCandyPink': 1,
|
||||
'items.food.Pie_Desert': 1,
|
||||
'items.food.Pie_Golden': 1,
|
||||
'items.food.Pie_Red': 1,
|
||||
'items.food.Pie_Shade': 1,
|
||||
'items.food.Pie_Skeleton': 1,
|
||||
'items.food.Pie_Zombie': 1,
|
||||
'items.food.Pie_White': 1,
|
||||
};
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_pie',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received an assortment of pie for your Pets!',
|
||||
destination: '/inventory/stable',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
} else if (typeof user.items.gear.owned.armor_special_turkeyArmorBase !== 'undefined') {
|
||||
updateOp.$set['items.gear.owned.head_special_turkeyHelmGilded'] = true;
|
||||
updateOp.$set['items.gear.owned.armor_special_turkeyArmorGilded'] = true;
|
||||
updateOp.$set['items.gear.owned.back_special_turkeyTailGilded'] = true;
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_gilded_set',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received the Gilded Turkey Armor, Helm, and Tail!',
|
||||
destination: '/inventory/equipment',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
} else if (user.items && user.items.mounts && user.items.mounts['Turkey-Gilded']) {
|
||||
updateOp.$set['items.gear.owned.head_special_turkeyHelmBase'] = true;
|
||||
updateOp.$set['items.gear.owned.armor_special_turkeyArmorBase'] = true;
|
||||
updateOp.$set['items.gear.owned.back_special_turkeyTailBase'] = true;
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_base_set',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received the Turkey Armor, Helm, and Tail!',
|
||||
destination: '/inventory/equipment',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
} else if (user.items && user.items.pets && user.items.pets['Turkey-Gilded']) {
|
||||
updateOp.$set['items.mounts.Turkey-Gilded'] = true;
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_gilded_mount',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received the Gilded Turkey Mount!',
|
||||
destination: '/inventory/stable',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
} else if (user.items && user.items.mounts && user.items.mounts['Turkey-Base']) {
|
||||
updateOp.$set['items.pets.Turkey-Gilded'] = 5;
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_gilded_pet',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received the Gilded Turkey Pet!',
|
||||
destination: '/inventory/stable',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
} else if (user.items && user.items.pets && user.items.pets['Turkey-Base']) {
|
||||
updateOp.$set['items.mounts.Turkey-Base'] = true;
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_base_mount',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received the Turkey Mount!',
|
||||
destination: '/inventory/stable',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
updateOp.$set['items.pets.Turkey-Base'] = 5;
|
||||
updateOp.$push = {
|
||||
notifications: {
|
||||
type: 'ITEM_RECEIVED',
|
||||
data: {
|
||||
icon: 'notif_harvestfeast_base_pet',
|
||||
title: 'Happy Harvest Feast!',
|
||||
text: 'Gobble gobble, you\'ve received the Turkey Pet!',
|
||||
destination: '/inventory/stable',
|
||||
},
|
||||
seen: false,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
return User.updateOne({ _id: user._id }, updateOp).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
const query = {
|
||||
migration: { $ne: MIGRATION_NAME },
|
||||
'auth.timestamps.loggedin': { $gt: new Date('2024-10-20') },
|
||||
};
|
||||
|
||||
const fields = {
|
||||
_id: 1,
|
||||
items: 1,
|
||||
};
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({ _id: 1 })
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (users.length === 0) {
|
||||
console.warn('All appropriate users found and modified.');
|
||||
console.warn(`\n${count} users processed\n`);
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1],
|
||||
};
|
||||
}
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
}
|
||||
Generated
+6
-6
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "5.30.0",
|
||||
"version": "5.31.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "habitica",
|
||||
"version": "5.30.0",
|
||||
"version": "5.31.1",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -92,7 +92,7 @@
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-moment": "^0.1.0",
|
||||
"chalk": "^5.3.0",
|
||||
"cross-spawn": "^7.0.3",
|
||||
"cross-spawn": "^7.0.5",
|
||||
"mocha": "^5.1.1",
|
||||
"monk": "^7.3.4",
|
||||
"nyc": "^15.1.0",
|
||||
@@ -7500,9 +7500,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
|
||||
"integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "5.30.0",
|
||||
"version": "5.31.1",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -120,7 +120,7 @@
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-moment": "^0.1.0",
|
||||
"chalk": "^5.3.0",
|
||||
"cross-spawn": "^7.0.3",
|
||||
"cross-spawn": "^7.0.5",
|
||||
"mocha": "^5.1.1",
|
||||
"monk": "^7.3.4",
|
||||
"nyc": "^15.1.0",
|
||||
|
||||
@@ -51,6 +51,7 @@ describe('Stripe - Checkout', () => {
|
||||
gift: undefined,
|
||||
sub: undefined,
|
||||
gemsBlock: gemsBlockKey,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
expect(gems.validateGiftMessage).to.not.be.called;
|
||||
@@ -101,6 +102,7 @@ describe('Stripe - Checkout', () => {
|
||||
gift: JSON.stringify(gift),
|
||||
sub: undefined,
|
||||
gemsBlock: undefined,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
expect(gems.validateGiftMessage).to.be.calledOnce;
|
||||
@@ -155,6 +157,7 @@ describe('Stripe - Checkout', () => {
|
||||
gift: JSON.stringify(gift),
|
||||
sub: undefined,
|
||||
gemsBlock: undefined,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
expect(oneTimePayments.getOneTimePaymentInfo).to.be.calledOnce;
|
||||
@@ -192,6 +195,7 @@ describe('Stripe - Checkout', () => {
|
||||
userId: user._id,
|
||||
gift: undefined,
|
||||
sub: JSON.stringify(sub),
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
expect(subscriptions.checkSubData).to.be.calledOnce;
|
||||
@@ -258,6 +262,7 @@ describe('Stripe - Checkout', () => {
|
||||
userId: user._id,
|
||||
gift: undefined,
|
||||
sub: JSON.stringify(sub),
|
||||
server_url: BASE_URL,
|
||||
groupId,
|
||||
};
|
||||
|
||||
@@ -328,8 +333,9 @@ describe('Stripe - Checkout', () => {
|
||||
user.purchased.plan.customerId = customerId;
|
||||
|
||||
const metadata = {
|
||||
userId: user._id,
|
||||
type: 'edit-card-user',
|
||||
userId: user._id,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
const res = await createEditCardCheckoutSession({ user }, stripe);
|
||||
@@ -418,6 +424,7 @@ describe('Stripe - Checkout', () => {
|
||||
const metadata = {
|
||||
userId: user._id,
|
||||
type: 'edit-card-group',
|
||||
server_url: BASE_URL,
|
||||
groupId,
|
||||
};
|
||||
|
||||
@@ -455,6 +462,7 @@ describe('Stripe - Checkout', () => {
|
||||
userId: anotherUser._id,
|
||||
type: 'edit-card-group',
|
||||
groupId,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
const res = await createEditCardCheckoutSession({ user: anotherUser, groupId }, stripe);
|
||||
|
||||
@@ -16,6 +16,7 @@ import * as subscriptions from '../../../../../../website/server/libs/payments/s
|
||||
const { i18n } = common;
|
||||
|
||||
describe('Stripe - Webhooks', () => {
|
||||
const BASE_URL = nconf.get('BASE_URL');
|
||||
const stripe = stripeModule('test');
|
||||
const endpointSecret = nconf.get('STRIPE_WEBHOOKS_ENDPOINT_SECRET');
|
||||
const headers = {};
|
||||
@@ -284,7 +285,9 @@ describe('Stripe - Webhooks', () => {
|
||||
const session = {};
|
||||
|
||||
beforeEach(() => {
|
||||
session.metadata = {};
|
||||
session.metadata = {
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
event = { type: eventType, data: { object: session } };
|
||||
constructEventStub = sandbox.stub(stripe.webhooks, 'constructEvent');
|
||||
constructEventStub.returns(event);
|
||||
|
||||
@@ -19,8 +19,8 @@ describe('releaseDates', () => {
|
||||
});
|
||||
describe('armoire', () => {
|
||||
it('should only contain valid armoire names', () => {
|
||||
const lastReleaseDate = maxBy(Object.values(ARMOIRE_RELEASE_DATES), value => new Date(`${value.year}-${value.month + 1}-20`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month + 1}-20`));
|
||||
const lastReleaseDate = maxBy(Object.values(ARMOIRE_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-22`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-22`));
|
||||
Object.keys(ARMOIRE_RELEASE_DATES).forEach(key => {
|
||||
expect(find(armoire.all, { set: key }), `${key} is not a valid armoire set`).to.exist;
|
||||
});
|
||||
@@ -40,8 +40,8 @@ describe('releaseDates', () => {
|
||||
|
||||
describe('eggs', () => {
|
||||
it('should only contain valid egg names', () => {
|
||||
const lastReleaseDate = maxBy(Object.values(EGGS_RELEASE_DATES), value => new Date(`${value.year}-${value.month + 1}-${value.day}`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month + 1}-${lastReleaseDate.day}`));
|
||||
const lastReleaseDate = maxBy(Object.values(EGGS_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-${value.day}`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-${lastReleaseDate.day + 1}`));
|
||||
Object.keys(EGGS_RELEASE_DATES).forEach(key => {
|
||||
expect(eggs.all[key], `${key} is not a valid egg name`).to.exist;
|
||||
});
|
||||
@@ -61,8 +61,8 @@ describe('releaseDates', () => {
|
||||
|
||||
describe('hatchingPotions', () => {
|
||||
it('should only contain valid potion names', () => {
|
||||
const lastReleaseDate = maxBy(Object.values(HATCHING_POTIONS_RELEASE_DATES), value => new Date(`${value.year}-${value.month + 1}-${value.day}`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month + 1}-${lastReleaseDate.day}`));
|
||||
const lastReleaseDate = maxBy(Object.values(HATCHING_POTIONS_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-${value.day}`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-${lastReleaseDate.day + 1}`));
|
||||
Object.keys(HATCHING_POTIONS_RELEASE_DATES).forEach(key => {
|
||||
expect(hatchingPotions.all[key], `${key} is not a valid potion name`).to.exist;
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// eslint-disable-next-line max-len
|
||||
import maxBy from 'lodash/maxBy';
|
||||
import moment from 'moment';
|
||||
import nconf from 'nconf';
|
||||
import {
|
||||
@@ -10,6 +11,7 @@ import QUEST_BUNDLES from '../../website/common/script/content/bundles';
|
||||
import potions from '../../website/common/script/content/hatching-potions';
|
||||
import SPELLS from '../../website/common/script/content/spells';
|
||||
import QUEST_SEASONAL from '../../website/common/script/content/quests/seasonal';
|
||||
import { HATCHING_POTIONS_RELEASE_DATES } from '../../website/common/script/content/constants/releaseDates';
|
||||
|
||||
function validateMatcher (matcher, checkedDate) {
|
||||
expect(matcher.end).to.be.a('date');
|
||||
@@ -222,6 +224,8 @@ describe('Content Schedule', () => {
|
||||
});
|
||||
|
||||
it('premium hatching potions', () => {
|
||||
const lastReleaseDate = maxBy(Object.values(HATCHING_POTIONS_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-${value.day}`));
|
||||
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-${lastReleaseDate.day + 1}`));
|
||||
const potionKeys = Object.keys(potions.premium);
|
||||
Object.keys(MONTHLY_SCHEDULE).forEach(key => {
|
||||
const monthlyPotions = MONTHLY_SCHEDULE[key][21].find(item => item.type === 'premiumHatchingPotions');
|
||||
|
||||
@@ -1085,6 +1085,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_first_snow_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_first_snow_forest.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_floating_islands {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_floating_islands.png');
|
||||
width: 141px;
|
||||
@@ -29624,6 +29629,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_festiveHelperOveralls {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_festiveHelperOveralls.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_fiddlersCoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_fiddlersCoat.png');
|
||||
width: 114px;
|
||||
@@ -30199,6 +30209,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_armoire_festiveHelperHat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_festiveHelperHat.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;
|
||||
@@ -31099,6 +31114,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_festiveHelperOveralls {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_festiveHelperOveralls.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_fiddlersCoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_fiddlersCoat.png');
|
||||
width: 114px;
|
||||
@@ -35339,6 +35359,21 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_202412 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202412.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_mystery_202412 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202412.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_mystery_202412 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202412.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_301404 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
|
||||
width: 90px;
|
||||
@@ -37904,6 +37939,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_winter2025Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_winter2025Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_winter2025Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_winter2025Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_yeti {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png');
|
||||
width: 90px;
|
||||
@@ -38179,6 +38234,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_winter2025Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_winter2025Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_winter2025Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_winter2025Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_yeti {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png');
|
||||
width: 90px;
|
||||
@@ -38344,6 +38419,21 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_winter2025Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2025Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_winter2025Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2025Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_winter2025Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2025Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_yeti {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png');
|
||||
width: 90px;
|
||||
@@ -38564,6 +38654,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_winter2025Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_winter2025Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_winter2025Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_winter2025Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_yeti {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png');
|
||||
width: 90px;
|
||||
@@ -38784,6 +38894,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_winter2025Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_winter2025Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_winter2025Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_winter2025Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_yeti {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png');
|
||||
width: 90px;
|
||||
@@ -39982,6 +40112,41 @@
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_base_mount {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_base_mount.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_base_pet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_base_pet.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_base_set {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_base_set.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_gilded_mount {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_gilded_mount.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_gilded_pet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_gilded_pet.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_gilded_set {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_gilded_set.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_harvestfeast_pie {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_pie.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_head_special_nye {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_head_special_nye.png');
|
||||
width: 28px;
|
||||
@@ -40127,6 +40292,11 @@
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.notif_subscriber_reward {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_subscriber_reward.png');
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
.npc_bailey {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/npc_bailey.png');
|
||||
width: 60px;
|
||||
@@ -41997,6 +42167,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_BearCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_BearCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -42437,6 +42612,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_Cactus-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_Cactus-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Glass.png');
|
||||
width: 105px;
|
||||
@@ -43122,6 +43302,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_Dragon-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_Dragon-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Glass.png');
|
||||
width: 105px;
|
||||
@@ -43557,6 +43742,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_FlyingPig-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_FlyingPig-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Glass.png');
|
||||
width: 105px;
|
||||
@@ -43842,6 +44032,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_Fox-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_Fox-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Glass.png');
|
||||
width: 105px;
|
||||
@@ -44567,6 +44762,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_LionCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_LionCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -45072,6 +45272,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_PandaCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_PandaCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -46362,6 +46567,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_TigerCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Body_TigerCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -46957,6 +47167,11 @@
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Body_Wolf-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Gingerbread.png');
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Body_Wolf-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Glass.png');
|
||||
width: 135px;
|
||||
@@ -47492,6 +47707,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_BearCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_BearCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -47932,6 +48152,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Cactus-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Cactus-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Glass.png');
|
||||
width: 105px;
|
||||
@@ -48617,6 +48842,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Dragon-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Dragon-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Glass.png');
|
||||
width: 105px;
|
||||
@@ -49052,6 +49282,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_FlyingPig-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_FlyingPig-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Glass.png');
|
||||
width: 105px;
|
||||
@@ -49337,6 +49572,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Fox-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_Fox-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Glass.png');
|
||||
width: 105px;
|
||||
@@ -50062,6 +50302,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_LionCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_LionCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -50567,6 +50812,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_PandaCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_PandaCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -51857,6 +52107,11 @@
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_TigerCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Gingerbread.png');
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.Mount_Head_TigerCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Glass.png');
|
||||
width: 105px;
|
||||
@@ -52452,6 +52707,11 @@
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Gingerbread.png');
|
||||
width: 135px;
|
||||
height: 135px;
|
||||
}
|
||||
.Mount_Head_Wolf-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Glass.png');
|
||||
width: 135px;
|
||||
@@ -53002,6 +53262,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-BearCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Glass.png');
|
||||
width: 81px;
|
||||
@@ -53467,6 +53732,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Cactus-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-Cactus-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Glass.png');
|
||||
width: 81px;
|
||||
@@ -54182,6 +54452,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Dragon-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-Dragon-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Glass.png');
|
||||
width: 81px;
|
||||
@@ -54652,6 +54927,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-FlyingPig-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-FlyingPig-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Glass.png');
|
||||
width: 81px;
|
||||
@@ -54962,6 +55242,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Fox-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-Fox-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Glass.png');
|
||||
width: 81px;
|
||||
@@ -55717,6 +56002,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-LionCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-LionCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Glass.png');
|
||||
width: 81px;
|
||||
@@ -56247,6 +56537,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-PandaCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-PandaCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Glass.png');
|
||||
width: 81px;
|
||||
@@ -57567,6 +57862,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-TigerCub-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-TigerCub-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Glass.png');
|
||||
width: 81px;
|
||||
@@ -58187,6 +58487,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Wolf-Gingerbread {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Gingerbread.png');
|
||||
width: 78px;
|
||||
height: 96px;
|
||||
}
|
||||
.Pet-Wolf-Glass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Glass.png');
|
||||
width: 81px;
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
line-height: 1.71;
|
||||
border: 1px solid transparent;
|
||||
padding: 4px 12px;
|
||||
line-height: 1.714;
|
||||
border: 2px solid transparent;
|
||||
padding: 2px 12px;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
|
||||
color: $white;
|
||||
@@ -19,7 +19,7 @@
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-color: $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:active, &.active:not(.btn-flat) {
|
||||
@@ -30,9 +30,9 @@
|
||||
cursor: default;
|
||||
color: $gray-50;
|
||||
opacity: 0.75;
|
||||
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
|
||||
box-shadow: none;
|
||||
background-color: $gray-700;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
|
||||
.svg {
|
||||
color: $gray-300;
|
||||
@@ -40,7 +40,7 @@
|
||||
}
|
||||
|
||||
&.with-icon {
|
||||
height: 2rem; // otherwise would something set the height to 33px
|
||||
height: 32px; // otherwise would something set the height to 33px
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
@@ -48,40 +48,47 @@
|
||||
}
|
||||
|
||||
.btn-front {
|
||||
border: none !important;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
padding: 7.5px 15.5px;
|
||||
padding: 2px 17px;
|
||||
|
||||
&:hover {
|
||||
border: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: $purple-200;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
line-height: 1.714;
|
||||
--icon-color: #{$purple-500};
|
||||
|
||||
&:focus {
|
||||
background: $purple-200;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
--icon-color: #{$white};
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled) {
|
||||
&:hover {
|
||||
background: #5d3b9c;
|
||||
border: 1px solid transparent;
|
||||
background: $purple-200;
|
||||
border: 2px solid transparent;
|
||||
|
||||
--icon-color: #{$white};
|
||||
}
|
||||
|
||||
&:active, &.active {
|
||||
background: $purple-200;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: none;
|
||||
|
||||
--icon-color: #{$white};
|
||||
}
|
||||
|
||||
&:active:focus, &.active:focus {
|
||||
box-shadow: none;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,39 +104,43 @@
|
||||
.show > .btn-secondary.dropdown-toggle:not(.btn-success)
|
||||
{
|
||||
background: $white;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
color: $gray-50;
|
||||
|
||||
--icon-color: #{$gray-200};
|
||||
|
||||
&:focus, &:active {
|
||||
color: $gray-50;
|
||||
background: $white;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
color: $gray-50;
|
||||
|
||||
--icon-color: #{$purple-300};
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled) {
|
||||
&:active, &.active {
|
||||
background: $white;
|
||||
border: 2px solid $purple-400;
|
||||
color: $purple-300;
|
||||
--icon-color: #{$purple-300};
|
||||
|
||||
&:focus {
|
||||
color: $purple-300;
|
||||
box-shadow: none;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:active {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
background: $white;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: $purple-300;
|
||||
|
||||
background: $white !important;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
|
||||
--icon-color: #{$purple-300};
|
||||
.svg {
|
||||
@@ -151,91 +162,116 @@
|
||||
|
||||
.btn-danger {
|
||||
background: $maroon-100;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
|
||||
|
||||
|
||||
&:hover:not(:disabled):not(.disabled) {
|
||||
background: #e14e4e;
|
||||
border: 1px solid transparent;
|
||||
background: $maroon-100;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: $maroon-100;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active:focus, &:not(:disabled):not(.disabled).active:focus {
|
||||
box-shadow: none;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active, &:not(:disabled):not(.disabled).active {
|
||||
background: $maroon-100;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-warning {
|
||||
background: $orange-10;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
|
||||
color: $white !important;
|
||||
|
||||
&:hover:not(:disabled):not(.disabled) {
|
||||
background: $orange-100;
|
||||
background: $orange-10;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: $orange-10;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active:focus, &:not(:disabled):not(.disabled).active:focus {
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: none;
|
||||
border-color: $purple-400;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active, &:not(:disabled):not(.disabled).active {
|
||||
background: $orange-10;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background: $green-50;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid transparent;
|
||||
|
||||
&:hover:not(:disabled):not(.disabled) {
|
||||
background: #32bd8a;
|
||||
border: 1px solid transparent;
|
||||
background: $green-50;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: $green-50;
|
||||
border-color: $purple-400;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active:focus, &:not(:disabled):not(.disabled).active:focus {
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: none;
|
||||
border-color: $purple-400;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active, &:not(:disabled):not(.disabled).active {
|
||||
background: $green-50;
|
||||
border: 1px solid transparent;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-info {
|
||||
background: $blue-50;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
|
||||
|
||||
&:disabled {
|
||||
background: $blue-50;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: $blue-100;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:hover:not(:disabled):not(.disabled) {
|
||||
background-color: $blue-100;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
&:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled) {
|
||||
background: $blue-50;
|
||||
background: $blue-100;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,7 +280,7 @@
|
||||
width: 100%;
|
||||
padding: 8px;
|
||||
font-size: 14px;
|
||||
line-height: 1.43;
|
||||
line-height: 1.714;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
background: $gray-500;
|
||||
@@ -268,6 +304,6 @@
|
||||
|
||||
.btn-small {
|
||||
font-size: 12px;
|
||||
line-height: 1.33;
|
||||
padding: 4px 8px;
|
||||
line-height: 2;
|
||||
padding: 2px 2px;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
.dropdown > .btn {
|
||||
padding: 0.219rem 0.75rem;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
line-height: 1.714;
|
||||
padding: 2px 12px;
|
||||
}
|
||||
|
||||
.dropdown-toggle:hover {
|
||||
@@ -33,10 +34,10 @@
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
padding: 0px;
|
||||
border: none;
|
||||
border: transparent;
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 3px 6px 0 rgba(26, 24, 29, 0.16), 0 3px 6px 0 rgba(26, 24, 29, 0.24);
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
padding: 0;
|
||||
|
||||
}
|
||||
|
||||
@@ -113,6 +114,10 @@
|
||||
}
|
||||
|
||||
.dropdown-icon-item {
|
||||
line-height: 1;
|
||||
padding-top: 2px !important;
|
||||
padding-bottom: 2px !important;
|
||||
|
||||
.svg-icon {
|
||||
margin: 0px 16px 0px 0px;
|
||||
vertical-align: middle;
|
||||
@@ -128,7 +133,6 @@
|
||||
|
||||
.dropdown-toggle {
|
||||
width: 100% !important;
|
||||
height: 32px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
||||
@@ -105,6 +105,11 @@
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
.btn-primary:active {
|
||||
border: 2px solid $purple-400 !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.class-badge {
|
||||
$badge-size: 32px;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
:class="{'open': expand}"
|
||||
@click="expand = !expand"
|
||||
>
|
||||
Priviliges, Gem Balance
|
||||
Privileges, Gem Balance
|
||||
</h3>
|
||||
</div>
|
||||
<div
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
</div>
|
||||
<div class="donate-button">
|
||||
<button
|
||||
class="button btn-contribute"
|
||||
class="btn button btn-secondary btn-contribute"
|
||||
@click="donate()"
|
||||
>
|
||||
<div class="text">
|
||||
@@ -309,7 +309,7 @@
|
||||
<div class="my-2">
|
||||
Time Traveling! It is {{ new Date().toLocaleDateString() }}
|
||||
<a
|
||||
class="btn btn-warning btn-small"
|
||||
class="btn btn-small"
|
||||
@click="resetTime()"
|
||||
>
|
||||
Reset
|
||||
@@ -341,7 +341,7 @@
|
||||
</button>
|
||||
<div
|
||||
v-if="debugMenuShown"
|
||||
class="debug-toggle debug-group"
|
||||
class="btn debug-toggle debug-group"
|
||||
>
|
||||
<div class="debug-pop">
|
||||
<a
|
||||
@@ -512,7 +512,14 @@ li {
|
||||
grid-area: debug-pop;
|
||||
}
|
||||
|
||||
.time-travel { grid-area: time-travel;}
|
||||
.time-travel {
|
||||
grid-area: time-travel;
|
||||
|
||||
a:hover {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
footer {
|
||||
background-color: $gray-500;
|
||||
@@ -584,42 +591,65 @@ h3 {
|
||||
}
|
||||
|
||||
.debug {
|
||||
margin-top: 16px;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 16px;
|
||||
padding: 2px 12px;
|
||||
|
||||
&:hover {
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.12), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
&:focus {
|
||||
border: 2px solid $purple-400 !important;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.12), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
:active {
|
||||
border: 2px solid $purple-600 !important;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.debug-group {
|
||||
border-radius: 4px;
|
||||
padding: 16px;
|
||||
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
|
||||
font-weight: 700;
|
||||
background-color: $gray-600;
|
||||
border: 2px solid transparent;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
|
||||
font-weight: 700;
|
||||
padding: 8px 16px;
|
||||
|
||||
.btn {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
|
||||
text-decoration: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-small {
|
||||
background-color: $maroon-100;
|
||||
border: 2px solid transparent;
|
||||
color: $white !important;
|
||||
line-height: 18px;
|
||||
&:hover {
|
||||
background-color: $maroon-100;
|
||||
text-decoration: none !important;
|
||||
border: 2px solid $maroon-100;
|
||||
}
|
||||
}
|
||||
.btn-secondary {
|
||||
padding: 2px 12px;
|
||||
}
|
||||
.btn-secondary a:hover {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.btn-contribute {
|
||||
background: $white;
|
||||
border-radius: 2px;
|
||||
width: 175px;
|
||||
height: 32px;
|
||||
color: $gray-50;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
&:hover {
|
||||
color:$purple-300;
|
||||
box-shadow: 0 3px 6px 0 rgba(26, 24, 29, 0.16), 0 3px 6px 0 rgba(26, 24, 29, 0.24);
|
||||
&:active:not(:disabled) {
|
||||
color:$purple-300;
|
||||
border: 1px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba(26, 24, 29, 0.16), 0 3px 6px 0 rgba(26, 24, 29, 0.24);
|
||||
}
|
||||
}
|
||||
border: 2px solid transparent;
|
||||
|
||||
a {
|
||||
display: flex;
|
||||
|
||||
@@ -25,9 +25,13 @@
|
||||
</b-modal>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
<style scoped lang="scss">
|
||||
.modal-body {
|
||||
padding-bottom: 2em;
|
||||
|
||||
.btn {
|
||||
margin: 0px 2px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -354,13 +354,15 @@
|
||||
></div>
|
||||
<span>{{ userHourglasses }}</span>
|
||||
</div>
|
||||
<div class="item-with-icon gem">
|
||||
<div
|
||||
class="item-with-icon gem"
|
||||
@click.prevent="showBuyGemsModal()"
|
||||
>
|
||||
<a
|
||||
v-b-tooltip.hover.bottom="$t('gems')"
|
||||
class="top-menu-icon svg-icon gem mr-2"
|
||||
:aria-label="$t('gems')"
|
||||
href="#buy-gems"
|
||||
@click.prevent="showBuyGemsModal()"
|
||||
v-html="icons.gem"
|
||||
></a>
|
||||
<span>{{ userGems }}</span>
|
||||
|
||||
@@ -429,6 +429,7 @@
|
||||
}
|
||||
|
||||
.btn-update-card {
|
||||
line-height: 1.714;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
padding: 4px 12px;
|
||||
@@ -647,6 +648,7 @@
|
||||
border-radius: 8px;
|
||||
box-shadow: 0px 1px 3px 0px rgba($black, 0.12), 0px 1px 2px 0px rgba($black, 0.24);
|
||||
width: 448px;
|
||||
background-color: $white;
|
||||
}
|
||||
|
||||
.svg-amazon-pay {
|
||||
|
||||
@@ -378,7 +378,7 @@
|
||||
height: 40px;
|
||||
border-radius: 2px;
|
||||
background-color: $white;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
box-shadow: 0 2px 2px 0 rgba($black, 0.16), 0 1px 4px 0 rgba($black, 0.12);
|
||||
margin-right: 24px;
|
||||
|
||||
input {
|
||||
@@ -462,17 +462,17 @@
|
||||
|
||||
&.gems {
|
||||
color: $green-10;
|
||||
background-color: rgba(36, 204, 143, 0.15);
|
||||
background-color: rgba($green-100, 0.15);
|
||||
}
|
||||
|
||||
&.gold {
|
||||
color: $yellow-5;
|
||||
background-color: rgba(255, 190, 93, 0.15);
|
||||
background-color: rgba($yellow-100, 0.15);
|
||||
}
|
||||
|
||||
&.hourglasses {
|
||||
color: $hourglass-color;
|
||||
background-color: rgba(41, 149, 205, 0.15);
|
||||
background-color: rgba($blue-10, 0.15);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -516,11 +516,16 @@
|
||||
|
||||
button.btn.btn-primary {
|
||||
margin-top: 16px;
|
||||
padding: 4px 16px;
|
||||
height: 32px;
|
||||
padding: 2px 12px;
|
||||
line-height: 1.714;
|
||||
|
||||
&:focus {
|
||||
border: 2px solid black;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:active {
|
||||
border: 2px solid $purple-400 !important;
|
||||
box-shadow:none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -297,11 +297,16 @@
|
||||
|
||||
button.btn.btn-primary {
|
||||
margin-top: 16px;
|
||||
padding: 4px 16px;
|
||||
height: 32px;
|
||||
padding: 2px 12px;
|
||||
line-height: 1.714;
|
||||
|
||||
&:focus {
|
||||
border: 2px solid black;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:active {
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.balance {
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
top: 25px;
|
||||
border-radius: 8px;
|
||||
background-color: $gray-600;
|
||||
box-shadow: 0 2px 16px 0 rgba(26, 24, 29, 0.32);
|
||||
box-shadow: 0 2px 16px 0 rgba($black, 0.32);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
@@ -208,12 +208,17 @@
|
||||
}
|
||||
|
||||
button.btn.btn-primary {
|
||||
margin-top: 14px;
|
||||
padding: 4px 16px;
|
||||
height: 32px;
|
||||
margin-top: 16px;
|
||||
padding: 2px 12px;
|
||||
line-height: 1.714;
|
||||
|
||||
&:focus {
|
||||
border: 2px solid black;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&:active {
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,7 +254,7 @@
|
||||
|
||||
&.gems {
|
||||
color: $green-10;
|
||||
background-color: rgba(36, 204, 143, 0.15);
|
||||
background-color: rgba($green-100, 0.15);
|
||||
line-height: 1.4;
|
||||
margin: 0 0 0 -4px;
|
||||
border-radius: 20px;
|
||||
@@ -257,7 +262,7 @@
|
||||
|
||||
&.gold {
|
||||
color: $yellow-5;
|
||||
background-color: rgba(255, 190, 93, 0.15);
|
||||
background-color: rgba($yellow-100, 0.15);
|
||||
line-height: 1.4;
|
||||
margin: 0 0 0 -4px;
|
||||
border-radius: 20px;
|
||||
@@ -265,7 +270,7 @@
|
||||
|
||||
&.hourglasses {
|
||||
color: $hourglass-color;
|
||||
background-color: rgba(41, 149, 205, 0.15);
|
||||
background-color: rgba($blue-10, 0.15);
|
||||
line-height: 1.4;
|
||||
margin: 0 0 0 -4px;
|
||||
border-radius: 20px;
|
||||
|
||||
@@ -163,14 +163,7 @@
|
||||
slot="itemBadge"
|
||||
slot-scope="ctx"
|
||||
>
|
||||
<span
|
||||
class="badge-top"
|
||||
@click.prevent.stop="togglePinned(ctx.item)"
|
||||
>
|
||||
<pin-badge
|
||||
:pinned="ctx.item.pinned"
|
||||
/>
|
||||
</span>
|
||||
<category-item :item="ctx.item" />
|
||||
</template>
|
||||
</shopItem>
|
||||
</div>
|
||||
@@ -178,6 +171,23 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<buy-quest-modal
|
||||
:item="selectedItemToBuy || {}"
|
||||
:price-type="selectedItemToBuy ? selectedItemToBuy.currency : ''"
|
||||
:with-pin="true"
|
||||
>
|
||||
<template
|
||||
slot="item"
|
||||
slot-scope="ctx"
|
||||
>
|
||||
<item
|
||||
class="flat"
|
||||
:item="ctx.item"
|
||||
:item-content-class="ctx.item.class"
|
||||
:show-popover="false"
|
||||
/>
|
||||
</template>
|
||||
</buy-quest-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -346,11 +356,17 @@ import svgWizard from '@/assets/svg/wizard.svg';
|
||||
import svgRogue from '@/assets/svg/rogue.svg';
|
||||
import svgHealer from '@/assets/svg/healer.svg';
|
||||
|
||||
import BuyQuestModal from '../quests/buyQuestModal.vue';
|
||||
import CategoryItem from '../market/categoryItem';
|
||||
import FilterGroup from '@/components/ui/filterGroup';
|
||||
import FilterSidebar from '@/components/ui/filterSidebar';
|
||||
import { worldStateMixin } from '@/mixins/worldState';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BuyQuestModal,
|
||||
CategoryItem,
|
||||
FilterGroup,
|
||||
FilterSidebar,
|
||||
Checkbox,
|
||||
PinBadge,
|
||||
@@ -386,6 +402,7 @@ export default {
|
||||
featuredGearBought: false,
|
||||
currentEvent: null,
|
||||
backgroundUpdate: new Date(),
|
||||
selectedItemToBuy: null,
|
||||
imageURLs: {
|
||||
background: '',
|
||||
npc: '',
|
||||
@@ -550,7 +567,12 @@ export default {
|
||||
return false;
|
||||
},
|
||||
itemSelected (item) {
|
||||
this.$root.$emit('buyModal::showItem', item);
|
||||
if (item.type === 'quests') {
|
||||
this.selectedItemToBuy = item;
|
||||
this.$root.$emit('bv::show::modal', 'buy-quest-modal');
|
||||
} else {
|
||||
this.$root.$emit('buyModal::showItem', item);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
position: fixed;
|
||||
right: 10px;
|
||||
width: 350px;
|
||||
z-index: 9999; // to keep it above modal overlays
|
||||
z-index: 999; // to keep it above modal overlays
|
||||
|
||||
top: var(--current-scrollY);
|
||||
|
||||
|
||||
@@ -152,8 +152,11 @@
|
||||
}
|
||||
|
||||
.btn-primary.pull-right {
|
||||
height: 2.5em;
|
||||
line-height: 2.25;
|
||||
margin: auto 0px auto auto;
|
||||
&:focus, :active {
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
}
|
||||
|
||||
nav.navbar {
|
||||
|
||||
@@ -552,8 +552,16 @@
|
||||
}
|
||||
|
||||
.sign-up {
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
|
||||
padding-top: 11px;
|
||||
padding-bottom: 11px;
|
||||
|
||||
&:focus, &:active {
|
||||
background-color: $blue-50;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
|
||||
}
|
||||
}
|
||||
|
||||
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
|
||||
@@ -650,9 +658,9 @@
|
||||
.btn-primary {
|
||||
width: 411px;
|
||||
height: 48px;
|
||||
border-radius: 2px;
|
||||
border-radius: 4px;
|
||||
background-color: $purple-400;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.24), 0 1px 4px 0 rgba(26, 24, 29, 0.16);
|
||||
box-shadow: 0 2px 2px 0 rgba($black, 0.24), 0 1px 4px 0 rgba($black, 0.16);
|
||||
margin-bottom: 5em;
|
||||
}
|
||||
|
||||
@@ -669,7 +677,7 @@
|
||||
|
||||
&:hover {
|
||||
background-color: $purple-50;
|
||||
box-shadow: 0 4px 4px 0 rgba(26, 24, 29, 0.16), 0 1px 8px 0 rgba(26, 24, 29, 0.12);
|
||||
box-shadow: 0 4px 4px 0 rgba($black, 0.16), 0 1px 8px 0 rgba($black, 0.12);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,368 +1,231 @@
|
||||
<template>
|
||||
<!-- eslint-disable max-len -->
|
||||
<div class="container-fluid">
|
||||
<h1>Privacy Notice</h1>
|
||||
<h1>HabitRPG Privacy Policy</h1>
|
||||
<p class="strong pagemeta">
|
||||
Last Updated September 19, 2022: Removed reference to Facebook login, which is no longer supported.
|
||||
Last Updated June 20, 2024.
|
||||
</p>
|
||||
<p>
|
||||
HabitRPG, Inc. (“HabitRPG,” “we,” “us,” or “our”) welcomes you. This privacy notice (the “Privacy
|
||||
Notice”) describes how we process the information we collect about or from you through our Website
|
||||
located at <a href="https://habitica.com/static/home">https://habitica.com/static/home</a> and/or our Apps
|
||||
(our “Digital Platforms”), from our users, subscribers, visitors and other users of our technology and
|
||||
platforms (together with our Digital Platforms, the “Habitica Service” or the “Service”), and when you
|
||||
otherwise interact with us. This Privacy Notice may be updated by us from time to time without notice to
|
||||
you. By accepting this Privacy Notice, accessing or using the Service, or otherwise manifesting your
|
||||
assent to this Privacy Notice, you agree to be bound by this Privacy Notice. If you do not agree to (or
|
||||
cannot comply with) all of the terms of this Privacy Notice, you may not access or use the Service.
|
||||
This Privacy Policy applies when you interact with us through Habitica.com and any other feature or service owned or controlled by HabitRPG, Inc. (“HabitRPG”, “we,” or “us”) that posts or includes a valid link to this Privacy Policy (collectively, the “Service(s)”). This Privacy Policy informs you of our practices regarding the collection, use, and disclosure of personal information we receive from users of our Services. By accessing or using the Services, you consent to our Privacy Policy and our collection, use, and sharing of your information as described in this policy, our <a href="https://habitica.com/static/terms">Terms of Use</a>, and any additional policies and terms you may agree to in connection with the Services.
|
||||
</p>
|
||||
<p>
|
||||
Capitalized terms not defined in this Privacy Notice shall have the meaning set forth in our Terms of
|
||||
Service.
|
||||
</p>
|
||||
<h2>THE INFORMATION WE COLLECT AND HOW WE USE IT</h2>
|
||||
<p>
|
||||
In the course of operating the Service, HabitRPG collects or receives the following types of information
|
||||
from visitors to the Website; users, subscribers or other users of its Platforms; and from third-party
|
||||
integration partners, which may include personal information.
|
||||
</p>
|
||||
<h3>Contact Information</h3>
|
||||
<p>
|
||||
We collect contact information through our Service; contact information typically includes your name,
|
||||
email address, and any other information you provide in messages to us. We use such contact information
|
||||
for purposes such as providing you with information about the Service, responding to your inquiries,
|
||||
sending you email alerts (including marketing emails), verifying your identity or providing you the
|
||||
Service.
|
||||
</p>
|
||||
<h3>Account Access Information</h3>
|
||||
<p>
|
||||
In connection with the creation of an account on our Platforms, we collect account credentials such as
|
||||
your email, username, and password. We use this account information to create your account, including to
|
||||
verify your identity. We also use this information to manage your account, including your transactions. If
|
||||
you choose to log into your account through Google or Apple, we capture and store the User ID and email
|
||||
address connected to the respective account, so we can verify your identity when you log in.
|
||||
</p>
|
||||
<h3>User Content</h3>
|
||||
<p>
|
||||
As explained in more detail in the Terms of Service, HabitRPG allows you to upload and receive content,
|
||||
including text, photos, images, task lists, graphics, artwork, links to outside content, and or other material.
|
||||
It is your decision what kind of personal information (if any) you submit. We do not use personal
|
||||
information posted in your content in any way except as needed to enforce the community guidelines and
|
||||
terms of service or to provide assistance and troubleshooting issues with service to the account.
|
||||
</p>
|
||||
<h3>Transaction Information</h3>
|
||||
<p>
|
||||
When you make, or attempt to make, a purchase, sale or other transaction as a user or subscriber through
|
||||
one of our Platforms, we may collect certain information from you, including your name, billing address,
|
||||
mailing address, email address, and phone number. We refer to this information as “Transaction
|
||||
Information.” We use the Transaction Information that we collect generally to facilitate transactions
|
||||
between users through our Platforms (including providing you with invoices and/or transaction
|
||||
confirmations). Additionally, we use this Transaction Information to: communicate with you; screen our
|
||||
transactions for potential risk or fraud; and when in line with the preferences you have shared with us,
|
||||
provide you with information or advertising relating to our products or Service. Our third-party payment
|
||||
processing providers may also collect from you, process and store your payment information including
|
||||
credit card information and/or bank account information in accordance with their respective privacy
|
||||
policies linked to below:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
For Stripe, visit: <a
|
||||
href="https://stripe.com/privacy"
|
||||
target="_blank"
|
||||
>https://stripe.com/privacy</a>
|
||||
</li>
|
||||
<li>
|
||||
For Amazon Pay, visit: <a
|
||||
href="https://pay.amazon.com/help/201751600"
|
||||
target="_blank"
|
||||
>https://pay.amazon.com/help/201751600</a>
|
||||
</li>
|
||||
<li>
|
||||
For PayPal, visit: <a
|
||||
href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full"
|
||||
target="_blank"
|
||||
>https://www.paypal.com/us/webapps/mpp/ua/privacy-full</a>
|
||||
</li>
|
||||
<li>
|
||||
For Apple Pay, visit: <a
|
||||
href="https://www.apple.com/legal/privacy/data/en/apple-pay/"
|
||||
target="_blank"
|
||||
>https://www.apple.com/legal/privacy/data/en/apple-pay/</a>
|
||||
</li>
|
||||
<li>
|
||||
For Google Pay, visit: <a
|
||||
href="https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid"
|
||||
target="_blank"
|
||||
>https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid</a>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
We reserve the right to change our payment vendors at any time, or to use additional payment vendors, at
|
||||
our discretion, and will update this Privacy Notice from time to time accordingly.
|
||||
</p>
|
||||
<h3>Server Log, Device and Other Technical Information</h3>
|
||||
<p>
|
||||
Our servers keep log files that record data each time a device accesses those servers. The log files may
|
||||
contain data about the nature of such access, including the device’s IP address, user agent string (e.g.,
|
||||
operating system and browser type/version), and the pages you have clicked on while on our Service, and
|
||||
details regarding your activity on the Service such as time spent on the Service and other performance and
|
||||
usage data. We may use these log files for purposes such as assisting in monitoring and troubleshooting
|
||||
errors and incidents, analyzing traffic, or optimizing the user experience.
|
||||
</p>
|
||||
<h3>Cookies and Similar Technologies</h3>
|
||||
<p>
|
||||
We may collect information using cookies, web beacons, tags, pixel and other similar technologies to
|
||||
record information about how you use the Website, and to facilitate log-in and payments. Cookies are
|
||||
small packets of data that a website stores on your computer’s or mobile device’s hard drive (or other
|
||||
storage medium) so that your computer will “remember” information about your use. We use both first
|
||||
and third party session cookies and persistent cookies. Below is a general primer on session and persistent
|
||||
cookies; information collected by cookies depends on its particular purpose. For more information, please
|
||||
see the information regarding analytics providers discussed further below.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Session Cookies</strong>: We use session cookies to make it easier for you to navigate our Service. A
|
||||
session ID cookie expires when you close the Service.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Persistent Cookies</strong>: A persistent cookie remains on your device for an extended period of time or
|
||||
until you delete it. Persistent cookies enable us to better understand how you interact with the Service and to
|
||||
provide visitors with a better and more personalized experience by retaining information about their identity and
|
||||
preferences, including but not limited to keeping them logged in even if the browser is closed.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
If you do not want us to place a cookie on your device, you may be able to turn that feature off on your
|
||||
device. You may refuse to accept cookies from the Service at any time by activating the setting on your
|
||||
browser which allows you to refuse cookies. Further information about the procedure to follow in order to
|
||||
disable cookies can be found on your Internet browser provider’s website via your help screen. You may
|
||||
wish to refer to <a
|
||||
href="https://www.allaboutcookies.org/manage-cookies/index.html"
|
||||
target="_blank"
|
||||
>
|
||||
https://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
|
||||
For more information about targeting and advertising cookies and how you can opt out, you can also visit
|
||||
<a
|
||||
href="https://optout.aboutads.info"
|
||||
target="_blank"
|
||||
>https://optout.aboutads.info</a>. Please be aware
|
||||
that if cookies are disabled, not all features of the Service may operate properly or as intended.
|
||||
</p>
|
||||
<h3>Third-Party Analytics Providers</h3>
|
||||
<p>
|
||||
We use one or more third–party analytics Service to evaluate your use of the Service, as the case may be,
|
||||
by compiling reports on activity (based on their collection of IP addresses, Internet service provider,
|
||||
browser type, operating system and language, referring and exit pages and URLs, data and time, amount
|
||||
of time spent on particular pages, what sections of the Service you visit, number of links clicked, search
|
||||
terms and other similar usage data) and analyzing performance metrics. These third parties use cookies
|
||||
and other technologies to help collect, analyze, and provide us reports or other data.
|
||||
</p>
|
||||
<p>
|
||||
By accessing and using the Service, you consent to the processing of data about you by these analytics
|
||||
providers in the manner and for the purposes set out in this Privacy Notice. For more information on these
|
||||
third parties, including how to opt out from certain data collection, please visit the sites below. Please be
|
||||
advised that if you opt out of any service, you may not be able to use the full functionality of the Service.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
For Google Analytics, visit: <a
|
||||
href="https://marketingplatform.google.com/about/analytics/"
|
||||
target="_blank"
|
||||
>https://marketingplatform.google.com/about/analytics/</a>
|
||||
</li>
|
||||
<li>
|
||||
For Amplitude, visit: <a
|
||||
href="https://amplitude.com/privacy"
|
||||
target="_blank"
|
||||
>https://amplitude.com/privacy</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Third-Party Advertisers/Remarketers</h3>
|
||||
<p>
|
||||
We may share or receive information about you with/from third parties, including, but not limited to,
|
||||
advertising and remarketing providers, or similar partners, for purposes of personalizing or otherwise
|
||||
understanding how you engage with ads or other content. These third parties may use cookies, pixel tags,
|
||||
or other technologies to collect information in furtherance of such purposes, including to tailor, target
|
||||
(i.e., behavioral, contextual, retargeting, and remarketing), analyze, report on, and/or manage advertising
|
||||
campaigns or other initiatives. For example, when a browser visits a site, pixel tags enable us and these
|
||||
third-parties to recognize certain cookies stored within the browser to learn which ads or other content
|
||||
bring a user to a given site. Information that we may receive from these third-parties, including through
|
||||
their service providers, may include advertising identifiers, IP addresses, reports, and campaign data.
|
||||
</p>
|
||||
<p>
|
||||
By accessing and using the Service, you consent to the processing of data about you by these
|
||||
advertisers/remarketing providers in the manner and for the purposes set out in this Privacy Notice.
|
||||
</p>
|
||||
<p>
|
||||
For more information on our advertising partner Google AdMob, please visit <a
|
||||
href="https://policies.google.com/privacy?hl=en"
|
||||
target="_blank"
|
||||
>https://policies.google.com/privacy?hl=en</a>.
|
||||
</p>
|
||||
<h3>Geolocation Information</h3>
|
||||
<p>
|
||||
We may, with your consent, automatically collect geolocation information from your device via your
|
||||
browser’s location Service. This consent may be provided by you on the device level (e.g., you have
|
||||
consented to location Service generally through your browser’s settings) or by accepting our request for
|
||||
geolocation access on the Service. Please consult your browser’s documentation regarding how to turn off
|
||||
location Service. If you disable location Service, you may not be able to use the full array of features and
|
||||
functionalities available through our Service.
|
||||
</p>
|
||||
<h3>Aggregate and De-identified Data</h3>
|
||||
<p>
|
||||
In an ongoing effort to better understand our users and the Service, we might analyze your information in
|
||||
aggregate and/or de-identified form to operate, maintain, manage, and improve the Service. We may
|
||||
share this aggregate or de-identified data with our affiliates, agents, and business partners. We may also
|
||||
disclose aggregated or de-identified user statistics to describe the Service to current and prospective
|
||||
business partners and to other third parties for other lawful purposes.
|
||||
</p>
|
||||
<h3>Onward Transfer to Third Parties</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Like many businesses, we hire other companies to perform certain business-related services. We
|
||||
may disclose personal information to certain types of third party companies but only to the extent
|
||||
needed to enable them to provide such service. The types of companies that may receive personal
|
||||
information and their functions are: hosting service, technical assistance, database
|
||||
management/back-up service, use analytics, marketing, and customer service.
|
||||
</li>
|
||||
<li>
|
||||
To provide our Service and administer promotional programs, we may share your personal
|
||||
information with our third-party promotional and marketing partners, including, without
|
||||
limitation, businesses participating in our various programs.
|
||||
</li>
|
||||
<li>
|
||||
We may also disclose personal information to our parent companies, subsidiaries, affiliates, joint
|
||||
ventures, or other companies under common control to support the marketing and sale of our
|
||||
products and Service.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Business Transfers</h3>
|
||||
<p>
|
||||
In the event of a merger, dissolution, reorganization or similar corporate event, or the sale of all or
|
||||
substantially all of our assets, we expect that the information that we have collected, including personal
|
||||
information, would be transferred to the surviving entity in a merger or the acquiring entity. All such
|
||||
transfers shall be subject to our commitments with respect to the privacy and confidentiality of such
|
||||
personal information as set forth in this Privacy Notice. This Notice shall be binding upon HabitRPG and
|
||||
its legal successors in interest.
|
||||
</p>
|
||||
<h3>Disclosure to Public Authorities</h3>
|
||||
<p>
|
||||
We are required to disclose personal information in response to lawful requests by public authorities,
|
||||
including for the purpose of meeting national security or law enforcement requirements. We may also
|
||||
disclose personal information to other third parties when compelled to do so by government authorities or
|
||||
required by law or regulation including, but not limited to, in response to court orders and subpoenas.
|
||||
</p>
|
||||
<h2>UPDATES AND OPT-OUTS</h2>
|
||||
<p>
|
||||
On the website:<br>You can update your user profile on the Website by clicking the avatar box in the
|
||||
upper left hand corner of the browser window, or by going to “Settings” and then selecting the “Profile”
|
||||
option in the menu.
|
||||
</p>
|
||||
<p>
|
||||
You can fully delete or reset your account via the “Settings” option on the Website.
|
||||
</p>
|
||||
<p>
|
||||
On the mobile apps for iOS Versions 3.4.3 and Android versions 3.4.1.1 and below:
|
||||
You can update your user profile on the mobile apps by tapping the Settings gear in the menu and then
|
||||
selecting the “Profile” option.
|
||||
</p>
|
||||
<p>
|
||||
You can fully delete or reset your account on the mobile apps by tapping the Settings gear in the menu
|
||||
and then selecting the “Authentication” option.
|
||||
</p>
|
||||
<p>
|
||||
If you would like us to fully delete your account and all data associated with it, please email us at
|
||||
admin@habitica and we will handle your request within 30 days.
|
||||
</p>
|
||||
<p>
|
||||
You may opt out at any time from the use of your personal information for direct marketing purposes by
|
||||
emailing the instructions to <a href="mailto:admin@habitica.com">admin@habitica.com</a> or by clicking
|
||||
on the “Unsubscribe” link located on the bottom of any HabitRPG marketing email and following the
|
||||
instructions found on the page to which the link takes you. Please allow us a reasonable time to process
|
||||
your request. You cannot opt out of receiving transactional e-mails related to the Service.
|
||||
</p>
|
||||
<h2>HOW WE PROTECT YOUR INFORMATION</h2>
|
||||
<p>
|
||||
HabitRPG takes very seriously the security and privacy of the personal information that it collects
|
||||
pursuant to this Privacy Notice. Accordingly, we implement reasonable security measures designed to
|
||||
protect your personal information from loss, misuse and unauthorized access, disclosure, alteration and
|
||||
destruction, taking into account the risks involved in processing and the nature of such data, and to
|
||||
comply with applicable laws and regulations. Please understand, however, that no security system is
|
||||
impenetrable. We cannot guarantee the security of our databases or the databases of the third parties with
|
||||
which we may share your information (as permitted herein), nor can we guarantee that the information
|
||||
you supply will not be intercepted while being transmitted over the Internet. In particular, e-mail sent to
|
||||
us may not be secure, and you should therefore take special care in deciding what information you send to
|
||||
us via e-mail.
|
||||
</p>
|
||||
<h2>CHILDREN</h2>
|
||||
<p>
|
||||
The Service are intended for users 13 years or older; you are not permitted to access or use the Service if
|
||||
you are younger than 13. We do not knowingly collect personal information from children under the age
|
||||
of 13 through the Service. If you are under 13, please do not give us any personal information. We
|
||||
encourage parents and legal guardians to monitor their children’s Internet usage and to help enforce our
|
||||
Privacy Notice by instructing their children to never provide personal information without their
|
||||
permission. If you have reason to believe that a child under the age of 13 has provided personal
|
||||
information to us, please contact us at admin@habitica.com, and we will endeavor to delete that
|
||||
information from our databases.
|
||||
</p>
|
||||
<h2>IMPORTANT NOTICE TO ALL NON-US RESIDENTS</h2>
|
||||
<p>
|
||||
Our servers are located in the US. Please be aware that your information may be transferred to, processed,
|
||||
maintained, and used on computers, servers, and systems located outside of your state, province, country,
|
||||
or other governmental jurisdiction where the privacy laws may not be as protective as those in your
|
||||
country of origin. If you are located outside the United States and choose to use the Service, you do so at
|
||||
your own risk.
|
||||
</p>
|
||||
<h2>CALIFORNIA PRIVACY RIGHTS</h2>
|
||||
<p>
|
||||
Pursuant to Section 1798.83 of the California Civil Code, residents of California have the right to obtain
|
||||
certain information about the types of personal information that companies with whom they have an
|
||||
established business relationship (and that are not otherwise exempt) have shared with third parties for
|
||||
direct marketing purposes during the preceding calendar year, including the names and addresses of those
|
||||
third parties, and examples of the types of Service or products marketed by those third parties. If you wish
|
||||
to submit a request pursuant to Section 1798.83, please contact HabitRPG via email at
|
||||
<a href="mailto:admin@habitica.com">admin@habitica.com</a>.
|
||||
</p>
|
||||
<h2>NEVADA PRIVACY RIGHTS</h2>
|
||||
<p>
|
||||
If you are a resident of Nevada, you have the right to opt-out of the sale of certain personal information to
|
||||
third parties. You can exercise this right by contacting us at admin@habitica.com with the subject line
|
||||
“Nevada Do Not Sell Request” and providing us with your name and the email address associated with
|
||||
your account.
|
||||
</p>
|
||||
<h2>DO NOT TRACK</h2>
|
||||
<p>
|
||||
HabitRPG does not respond to “Do Not Track” settings or other related mechanisms on our Website at
|
||||
this time.
|
||||
</p>
|
||||
<h2>LINKS TO EXTERNAL WEBSITES</h2>
|
||||
<p>
|
||||
The Service may contain links to third-party websites (“<span style="text-decoration: underline;">External
|
||||
Sites</span>”). HabitRPG has no control over the privacy practices or the content of any such External Sites.
|
||||
As such, we are not responsible for the content or the privacy policies of such External Sites. You should
|
||||
check the applicable privacy notice or privacy policy and terms of use when visiting any such External Sites.
|
||||
</p>
|
||||
<h2>CHANGES TO THIS PRIVACY NOTICE</h2>
|
||||
<p>
|
||||
This Privacy Notice is effective as of the last updated date stated at the top of this Privacy Notice. We
|
||||
may change this Privacy Notice from time to time with or without notice to you. By accessing the Service
|
||||
after we make any such changes to this Privacy Notice, you are deemed to have accepted such changes.
|
||||
Please be aware that, to the extent permitted by applicable law, our use of the information collected is
|
||||
governed by the Privacy Notice in effect at the time we collect the information. Please refer back to this
|
||||
Privacy Notice on a regular basis.
|
||||
</p>
|
||||
<h2>HOW TO CONTACT US</h2>
|
||||
<p>
|
||||
If you have questions about this Privacy Notice, please e-mail us at <a href="mailto:admin@habitica.com">
|
||||
admin@habitica.com</a> with “Privacy Notice” in the subject line.
|
||||
</p>
|
||||
<address>
|
||||
<strong>HabitRPG, Inc.</strong>
|
||||
<br>202 Bicknell Ave., Ground Floor
|
||||
<br>Santa Monica, CA 90405
|
||||
<br>Email:
|
||||
<a href="mailto:admin@habitica.com">admin@habitica.com</a>
|
||||
</address>
|
||||
<h2>Table of Contents</h2>
|
||||
<ol>
|
||||
<li><a href="#collection-of-information">Collection of Information</a></li>
|
||||
<ul>
|
||||
<li><a href="#information-you-provide-directly">Information You Provide Directly</a></li>
|
||||
<li><a href="#information-we-collect-automatically">Information We Collect Automatically</a></li>
|
||||
<li><a href=#location-data>Location Data</a></li>
|
||||
<li><a href="#information-from-third-parties">Information from Third Parties</a></li>
|
||||
</ul>
|
||||
<li><a href="#purpose-and-use-of-information-we-collect">Purpose and Use of Information We Collect</a></li>
|
||||
<li><a href="#sharing-of-information">Sharing of Information</a></li>
|
||||
<li><a href="#third-party-analytics-providers">Third-Party Analytics Providers</a></li>
|
||||
<li><a href="#security">Security</a></li>
|
||||
<li><a href="#data-retention">Data Retention</a></li>
|
||||
<li><a href="#general-audience-services">General Audience Services</a></li>
|
||||
<li><a href="#consent-to-international-transfer">Consent to International Transfer</a></li>
|
||||
<li><a href="#your-choices">Your Choices</a></li>
|
||||
<li><a href="#changes-to-this-privacy-policy">Changes to This Privacy Policy</a></li>
|
||||
<li><a href="#contact-us">Contact Us</a></li>
|
||||
<li><a href="#jurisdiction-specific-rights">Jurisdiction-Specific Rights</a></li>
|
||||
<ul>
|
||||
<li><a href="#us-specific-rights">US Specific Rights</a></li>
|
||||
<li><a href="#additional-notice-to-california-residents">Additional Notice to California Residents</a></li>
|
||||
<li><a href="#additional-notice-to-nevada-residents">Additional Notice to Nevada Residents</a></li>
|
||||
<li><a href="#notice-to-uk-eea-switzerland-residents">Notice to UK/EEA/Switzerland Residents</a></li>
|
||||
</ul>
|
||||
</ol>
|
||||
<h3 id="collection-of-information">1. Collection of Information</h3>
|
||||
<p>We and our third-party service providers and business partners may collect information from you directly and automatically when you visit the Services and from third parties. Some of this information may be considered “personal information” or “personal data” under various applicable laws. We consider information that identifies you as a specific, identified individual (such as your name, phone number, and e-mail address) to be personal information. We will also treat additional information, including IP addresses and cookie identifiers, as “personal information” or “personal data” where required by applicable law.</p>
|
||||
<p>We may take your personal information and de-identify or pseudonymize it to make it non-personally identifiable, either by combining it with information about other individuals and/or by hashing the information or otherwise removing characteristics that make the information personally identifiable directly to you. We maintain and use de-identified or pseudonymized data without attempting to re-identify it, except where permitted by applicable law, such as to determine whether our de-identification processes satisfy legal requirements. We will treat de-identified or pseudonymized information as non-personal to the fullest extent allowed by applicable law.</p>
|
||||
<h4 id="information-you-provide-directly">1.1 Information You Provide Directly</h4>
|
||||
<p>We may ask you to provide certain personal information when you interact with the Services. This information may include contact information (such as your name and email), account information (such as your email - and if you choose to log in through Google or Apple, the associated user ID and email address), transaction information (such as your billing address and mailing address), or user content you choose to upload (such as photos and task lists). Note that all payments are handled by our third-party payment providers who may collect relevant information in order to complete your transaction (such as your payment card, billing address, and phone number) and are subject to its privacy policy, as provided at the time of such collection.</p>
|
||||
<p>We may also ask you to provide the contact information of another individual, such as when you invite another user to the Services. When you provide us with an individual’s contact information in this context, we will only use this information for the specific reason for which it was provided.</p>
|
||||
<h4 id="information-we-collect-automatically">1.2 Information We Collect Automatically</h4>
|
||||
<p>We and third-party companies and business partners may use a variety of technologies that automatically or passively collect certain information whenever you visit our Services or otherwise interact with us or our content (<strong>“Usage Information”</strong>). Usage Information may include the hardware model, browser, and operating system you are using, the URL or advertisement that referred you to the Service you are visiting, all of the areas within the Services that you visit, your time zone, non-precise location information, and mobile network (if applicable), among other information. In addition, we automatically collect your IP address or other unique identifier (<strong>“Device Identifier”</strong>) for any computer, mobile phone or other device you use to access our Services. In some cases, we may directly collect location information through your device. You may be able to turn off the collection of location information through the settings on your device. Usage Information is generally non-identifying, but if HabitRPG associates it with you as a specific and identifiable person, HabitRPG treats it as personal information.</p>
|
||||
<ul>
|
||||
<li><em>Web Tags</em>: Small graphic images or other web programming code called web tags (also known as “pixel tags,” “1x1 GIFs,” or “clear GIFs”) may be included in our email messages sent by our third-party service providers on our behalf. Web beacons may be invisible to you, but any electronic image or other web programming code inserted into a web page or email can act as a web beacon. Web beacons or similar technologies may be used for several purposes, including, without limitation, to count visitors to the Service, to monitor how users navigate the Service, to count how many emails that were sent were opened, or to count how many particular links were actually viewed.</li>
|
||||
<li><em>Embedded Scripts</em>: An embedded script is a programming code that is designed to collect information about your interactions with the Services, such as the links you click on. The code is temporarily downloaded onto your device from our server or a third-party service.</li>
|
||||
<li><em>Session Events</em>: HabitRPG may engage third party service providers to analyze your session events with user interfaces, including what pages you visit on the Service, how long you visit those pages, the links you click, and your path through the Service for website analytics purposes, solely for our internal business purposes, and to improve our Services.</li>
|
||||
</ul>
|
||||
<h4 id="location-data">1.3 Location Data</h4>
|
||||
<p>We do not collect your precise location. However, please note that we may still be able to collect or infer your approximate location through other information we collect, such as IP address. In addition, some mobile service providers may also provide us or our third-party service providers with information regarding the non-precise physical location of the device used to access our Services.</p>
|
||||
<h4 id="information-from-third-parties">1.4 Information from Third Parties</h4>
|
||||
<p>We may receive information about you from third parties. You may have the opportunity to log in through or otherwise connect your Apple and Google accounts. Additionally, when you interact with us through social media, you will be choosing to share information about your interactions with HabitRPG with that social media service.</p>
|
||||
<p>The following chart sets out by category the personal data collected (<strong>“Category”</strong>), the purposes for which the information is collected (<strong>“A. Purposes”</strong>), the categories of third parties to whom the information may be disclosed for a business purpose (<strong>“B. Disclosed To”</strong>), and the categories of third parties to whom the information may be sold for monetary value or other valuable consideration or shared for cross-context behavioral advertising/targeted marketing (<strong>“C. Sold/Shared To”</strong>).</p>
|
||||
<p>CHART GOES HERE</p>
|
||||
<h3 id="purpose-and-use-of-information-we-collect">2. Purpose and Use of Information We Collect</h3>
|
||||
<p>We may use non-personal information for any purpose, including for research and marketing purposes. We also use information that we collect, including personal information and Usage Information, as disclosed in this Privacy Policy and as follows:</p>
|
||||
<ul>
|
||||
<li>to provide the Services to you and allow you to participate in the features we offer;</li>
|
||||
<li>to verify your identity and to otherwise manage your user account;</li>
|
||||
<li>to tailor and target content, recommendations, and offers we display to you on the Services to send you communications with information about our products, and Services;</li>
|
||||
<li>to fulfill your order, send you an order confirmation, process your payment, and communicate with you about your order;</li>
|
||||
<li>to respond to your inquiries, customer service questions, feedback, or requests;</li>
|
||||
<li>to provide you with technical support;</li>
|
||||
<li>to improve our Services and for legal, regulatory, and internal business purposes; and</li>
|
||||
<li>to fulfill any other purpose consistent with this Privacy Policy.</li>
|
||||
</ul>
|
||||
<p>We may also use your personal information for any other purpose as disclosed to you at the time of collection and with your consent. For example, if we choose to begin offering sweepstakes promotions, we will notify you of the use of your personal information for such sweepstakes prior to your engagement.</p>
|
||||
<h3 id="sharing-of-information">3. Sharing of Information</h3>
|
||||
<p>HabitRPG may share non-personal information, such as information about use of our Services, aggregated user statistics, or hashed and other de-identified or pseudonymized information with third parties, in our discretion. We do not share personal information with unaffiliated third parties for those third parties' own marketing purposes without your consent.</p>
|
||||
<p>In addition, we may share the information we have collected about you as disclosed at the time you provide your information or your consent, and as described elsewhere in this Privacy Policy, including:</p>
|
||||
<ul>
|
||||
<li><em>At Your Request/Publicly Posted Content.</em> We may share information when you direct us to do so, such as if you choose to submit content on the Service (for example, when you decide to share your habits with other users). We do not control the actions of third parties, and you post content and share your information at your own risk.</li>
|
||||
<li><em>Service Providers.</em> Our service providers may collect information on our behalf and at our direction, in order to provide Services on our behalf to help with our business activities. These companies are authorized to use your personal information only as necessary to provide these Services to us.<br><br>
|
||||
Our Service Providers include:<br><br>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Service Provider Name</th>
|
||||
<th>Product(s)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Google Cloud</td>
|
||||
<td>cloud computing; storage</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MongoDB</td>
|
||||
<td>database</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Heroku</td>
|
||||
<td>cloud-based testing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Amazon Web Services</td>
|
||||
<td>content storage</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Hetzner</td>
|
||||
<td>translations and push notifications</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Stripe</td>
|
||||
<td>payment processing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PayPal</td>
|
||||
<td>payment processing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Amazon Payments</td>
|
||||
<td>payment processing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Apple App Store</td>
|
||||
<td>app host</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Google Play Store</td>
|
||||
<td>app host</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mailchimp</td>
|
||||
<td>email marketing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gmail</td>
|
||||
<td>internal communications</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Redislabs</td>
|
||||
<td>rate limiting</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Loggly</td>
|
||||
<td>log management and analytics</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Slack</td>
|
||||
<td>internal communications</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Amplitude</td>
|
||||
<td>analytics</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
</li>
|
||||
<li><em>Sweepstakes, Contests and Promotions.</em> We may offer sweepstakes, contests, or other promotions (any of which, a <strong>“Promotion”</strong>) that may require registration. By participating in a Promotion, you are agreeing to the provisions, conditions, or official rules that govern the Promotion, which may contain specific requirements of you (including, except where prohibited by law, allowing the sponsor(s) of the Promotion to use your name, voice, likeness, or other indicia of persona in advertising or marketing materials). If you choose to enter a Promotion, personal information may be disclosed to co-promotion partners, third parties or the public in connection with the administration of such Promotion, including in connection with winner selection, prize fulfillment, as required by law, or as permitted by the Promotion’s terms or official rules.</li>
|
||||
<li><em>Business Transitions.</em> By providing your personal information you understand if there is a corporate transition such as a merger, acquisition, bankruptcy, or sale of all or a portion of our assets, or during the course of any due diligence process, your personal information may be disclosed without your further consent. Where required by law, we will make reasonable efforts to notify you before such transfer.</li>
|
||||
<li><em>Administrative and Legal Reasons.</em> We reserve the right to use or disclose any information as needed to satisfy or fulfill our obligations under any law, regulation or legal request; to protect the integrity of the HabitRPG; to fulfill your requests; to cooperate in a law enforcement investigation, an investigation on a public safety matter, or an investigation into claims of intellectual property infringement; to protect and defend the legal rights and/or property of HabitRPG and any of our affiliates, shareholders, or our Services, any of its users, or any other party; or, in an emergency, to protect the health and safety of users or the general public. </li>
|
||||
</ul>
|
||||
<h3 id="third-party-analytics-providers">4. Third Party Analytics Providers</h3>
|
||||
<p>We work with third-party service providers, such as analytics providers, to provide us with information regarding use of and traffic on our Services (including without limitation the pages viewed and the actions users take when visiting our Services). These third parties may set and access their own tracking technologies on your device (including cookies), and they may otherwise collect or have access to certain information about your use of the Services (such as Usage Information and Device Identifier). Some of these parties may collect personal information over time when you visit our Services or other online websites, and some may connect the information they collect through cookies and with other information about you.</p>
|
||||
<ul>
|
||||
<li>Google Analytics. We use Google Analytics, which uses cookies and similar technologies to collect and analyze data about the use of the Services and report on activities and trends. This service may also collect data about the use of other websites, apps, and online services. You can <a href="https://policies.google.com/technologies/partner-sites">learn about Google's practices</a>, and opt out of them by downloading the <a href="https://tools.google.com/dlpage/gaoptout">Google Analytics opt-out browser add-on.</a></li>
|
||||
</ul>
|
||||
<p>Options for Our Mobile App: Mobile devices may contain settings that allow you to disable certain tracking analytics. If this is available, you can opt-out through your mobile device settings.</p>
|
||||
<h3 id="security">5. Security</h3>
|
||||
<p>HabitRPG uses commercially reasonable steps designed to secure your personal information; however, no data transmission over the Internet, wireless transmission, or electronic storage of data can be guaranteed to be 100% secure. HabitRPG cannot ensure or warrant the security of any data we collect. You use the Services and provide us your data at your own risk.</p>
|
||||
<h3 id="data-retention">6. Data Retention</h3>
|
||||
<p>We will only retain your personal information for as long as your account is active or as necessary to provide you Services, comply with our legal obligations, resolve disputes, and enforce our agreements.</p>
|
||||
<h3 id="general-audience-services">7. General Audience Services</h3>
|
||||
<p>The Service are intended for users 13 years or older; you are not permitted to access or use the Service if you are younger than 13. We do not knowingly collect personal information from children under the age of 13 through the Service. We encourage parents and legal guardians to monitor their children’s Internet usage and to help enforce our Privacy Policy by instructing their children to never provide personal information without their permission. If you have reason to believe that a child under the age of 13 has provided personal information to us, please contact us at privacy@habitica.com, and we will delete that information from our databases.</p>
|
||||
<h3 id="consent-to-international-transfer">8. Consent to International Transfer</h3>
|
||||
<p>HabitRPG is based in the United States. Please be aware that information we collect will be transferred to and processed in the United States and other countries. HabitRPG makes no representation that this Privacy Policy or the practices described in it comply with the laws of any other jurisdiction. By using the Services, or providing us with any information, you fully understand and unambiguously consent to this transfer, processing, and storage of your information in the United States and other jurisdictions for which the privacy laws may not be as comprehensive as those in the country where you reside and/or are a citizen. As a result, this information may be subject to access requests from governments, courts, or law enforcement in the United States and other countries according to laws in those jurisdictions.</p>
|
||||
<h3 id="your-choices">9. Your Choices</h3>
|
||||
<p><em>Edit Your Information</em>: On the website, you can update the information in your user profile at any time by going to the user icon in the upper right, selecting the “Profile” option, then clicking “Edit Profile”. You can update your username and email address by going to the user icon in the upper right and selecting the “Settings” option. If you are using the mobile app, you can update your user profile, username, and email by tapping the Settings gear in the menu and then selecting the “My Account” option.</p>
|
||||
<p><em>Reset Your Account</em>: You can fully delete or reset your account by selecting the user icon in the upper right, selecting the “Settings”, and then looking under “General Settings”. You can fully delete or reset your account on the mobile apps by tapping the Settings gear in the menu and then selecting the “My Account” submenu. Please note that in order to fully delete all data associated with your account, you will need to email us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>. Note that we may be required to retain certain data about you to comply with applicable laws.</p>
|
||||
<p><em>Newsletter</em>: You may also sign-up to receive our email newsletter. If you would like to discontinue receiving this information, you may update your email preferences by using the “Unsubscribe” link found in emails we send to you, or by contacting us. Please note that we reserve the right to send you certain communications relating to your account or use of the Services, such as administrative and services announcements. These transactional account messages may be unaffected if you choose to opt out from marketing e-mails.</p>
|
||||
<p><em>Push Notifications</em>: With your consent, we may send promotional and non-promotional push notifications or alerts to your mobile device. You can elect to stop receiving those messages by changing the notification settings in the app or on your mobile device.</p>
|
||||
<p><em>Other Privacy Rights</em>: Certain jurisdictions provide additional rights. Please see the <a href="#jurisdiction-specific-rights">“Jurisdiction-Specific Rights”</a> section below for more information.</p>
|
||||
<h3 id="changes-to-this-privacy-policy">10. Changes to This Privacy Policy</h3>
|
||||
<p>To the extent permitted by applicable law, we reserve the right to change or modify this Privacy Policy at our discretion at any time. We will notify you of any material changes by posting the changed or modified Privacy Policy on our Services. We may also provide notice to you in other ways, such as through contact information you have provided. Any changes will be effective immediately upon the posting of the revised Privacy Policy unless otherwise specified. Your continued use of the Services after the effective date of the revised Privacy Policy (or such other act as specified in the revised Privacy Policy) will, to the fullest extent permitted by applicable law, constitute your consent to those changes. However, we will provide notice and obtain your consent (opt-in or opt-out) if required by law. We encourage you to regularly review this Privacy Policy for the latest information on our privacy practices.</p>
|
||||
<h3 id="contact-us">11. Contact Us</h3>
|
||||
<p>If you have any questions or concerns about this Privacy Policy, please contact us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a> with “Privacy Policy” in the subject line. You may also write to us at:</p>
|
||||
<address>
|
||||
HabitRPG, Inc.
|
||||
<br>202 Bicknell Ave., Ground Floor
|
||||
<br>Santa Monica, CA 90405
|
||||
</address>
|
||||
<h3 id="jurisdiction-specific-rights">12. Jurisdiction-Specific Rights</h3>
|
||||
<p>As set forth below, residents of certain jurisdictions may have additional rights and choices regarding their personal information. If you are a resident of Nevada, please see additional information <a href="#additional-notice-to-nevada-residents">here</a>. Residents of the US please see additional information <a href="#us-specific-rights">here</a>. Residents of the UK, Switzerland, and EEA, please see additional information <a href="#notice-to-uk-eea-switzerland-residents">here</a>.</p>
|
||||
<ul id="us-specific-rights">
|
||||
<li>
|
||||
<p><strong>US Specific Rights</strong>. Residents of U.S. states have the ability to exercise additional rights and choices regarding their personal data. We will take reasonable steps to accommodate your request but may need to verify your identity before doing so.<br><br>
|
||||
We set forth above the categories of personal data we process, the purpose for processing personal data, the categories of personal data shared, and the categories of third parties with whom personal data is shared. If you would like to exercise your applicable rights, please contact us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a> to submit a request.</p>
|
||||
</li>
|
||||
<ul>
|
||||
<li><strong>Access Your Personal Data/Data Portability — </strong>You have the right to confirm whether we are processing your personal data and request to access such data, obtain a copy of the personal data previously provided by you to us and, to the extent feasible, in a readily usable format to allow data portability.</li>
|
||||
<li><strong>Delete Your Personal Data — </strong>You have the Right to Delete your personal data.</li>
|
||||
<li><strong>Correct Your Personal Data — </strong>You have the Right to Correct the personal data we hold about you.</li>
|
||||
<li><strong>Opt-Out of Sales of Your Personal Data and Targeted Advertising — </strong>You have the right to opt out of the sale of your data. Note that HabitRPG does not sell personal data to third parties for monetary compensation, but may share personal data for other valuable consideration such as with our third party analytics providers. If you would like to opt out of the sale of your personal data, please adjust your settings in our Cookie Preference Center. <strong><em>[LINK NEEDED]</em></strong></li>
|
||||
<li><strong>Right to Appeal — </strong>If, for any reason, you would like to appeal our decision relating to your request, you have the right to submit an appeal if your state permits such right. Please include your full name, the basis for your appeal, and any additional information to consider.</li>
|
||||
<li><strong>Opt-Out of Profiling in furtherance of legal or similarly significant effects — </strong>HabitRPG does not process your personal data for the purposes of profiling in furtherance of decisions that produce legal or similarly significant effects.</li>
|
||||
</ul>
|
||||
</ul>
|
||||
<ul id="additional-notice-to-california-residents">
|
||||
<li><strong>Additional Notice to California Residents.</strong></li>
|
||||
<p>HabitRPG does not share personal information with third parties for their direct marketing purposes (as defined by California Civil Code Section 1798.83). If you are a California consumer and you have questions about our practices, please send your request by email to <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>. You must put the statement “Your California Privacy Rights” in the subject field of your email. We are not responsible for notices that are not labeled or sent properly, or do not have complete information.</p>
|
||||
</ul>
|
||||
<ul id="additional-notice-to-nevada-residents">
|
||||
<li><strong>Additional Notice to Nevada Residents.</strong></li>
|
||||
<p>HabitRPG does not currently sell your covered information as those terms are defined under applicable Nevada law. You may still submit an opt-out request and we will honor that request as required by Nevada law if HabitRPG were to engage in such a sale in the future. You may do so by emailing us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a> and putting “Your Nevada Privacy Rights” in the subject field of your request.</p>
|
||||
</ul>
|
||||
<ul id="notice-to-uk-eea-switzerland-residents">
|
||||
<li><strong>Notice to United Kingdom/European/Switzerland Residents.</strong></li>
|
||||
<p>If you are a resident of the United Kingdom (UK), European Economic Area (EEA), or of Switzerland, the following information applies.</p>
|
||||
<p><strong>Purposes of processing and legal basis for processing: </strong>As explained above, we process personal information in various ways depending upon your use of our Services. We process personal information on the following legal bases: (1) with your consent; (2) as necessary to perform our agreement to provide the Services; (3) compliance with our legal obligations; and (4) as necessary for our legitimate interests in providing the Service where those interests do not override your fundamental rights and freedoms related to data privacy such as for:</p>
|
||||
<ul>
|
||||
<li>preventing fraud;</li>
|
||||
<li>ensuring network and information security, including preventing unauthorized access to our computer and electronic communication systems and preventing malicious software distribution;</li>
|
||||
<li>supporting internal administration;</li>
|
||||
<li>improving and developing the Services; and</li>
|
||||
<li>conducting data analytics analyses to review and better understand consumer interaction.</li>
|
||||
</ul><br>
|
||||
<p><strong>Right to lodge a complaint: </strong>Users that reside in the UK, EEA, or Switzerland have the right to seek information and assistance or lodge a complaint about our data collection and processing actions with the supervisory authority where they reside. Contact details for data protection authorities are available here. UK: <a href="https://ico.org.uk/">https://ico.org.uk/</a>, EEA: <a href="ttps://edpb.europa.eu/about-edpb/board/members_en">https://edpb.europa.eu/about-edpb/board/members_en</a> Switzerland: <a href="https://www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html">//www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html</a>.</p>
|
||||
<p><strong>Transfers:</strong>Personal information we collect may be transferred to, and stored and processed in, the United States or any other country in which we or our affiliates or subcontractors maintain facilities. Transfers of personal data to a third country without an adequacy decision (as that term is understood pursuant to Article 45 of GDPR) are required to be subject to appropriate safeguards such as standard contractual clauses. In certain cases, we rely on your consent to facilitate transfer, processing, and storage of your data in the United States and other jurisdictions, where laws regarding processing of personal information may be less stringent than the laws in the EEA, UK, and Switzerland.</p>
|
||||
<p><strong>Withdraw consent: </strong>If we have collected personal information with your consent, you have the right to withdraw that consent at any time.</p>
|
||||
<p><strong>Access: </strong>You have the right to request access to personal information we collected about you and information about its sources, purposes, and sharing.</p>
|
||||
<p><strong>Correction: </strong>You have the right to request that we correct the personal information we hold about you if it is inaccurate or incomplete.</p>
|
||||
<p><strong>Erasure: </strong>You have the right to request that we erase data we have collected from you. Please note that we may have a reason to deny your deletion request or delete data in a more limited way than you anticipated, e.g., because of a legal obligation to retain it.</p>
|
||||
<p><strong>Portability:</strong>You have the right, in certain circumstances, to request that we provide your personal information to you in a format that can be transferred to another entity.</p>
|
||||
<p><strong>Restrict Processing: </strong>You have the right, in certain circumstances, to request that we limit our processing of your personal information if you are (1) contesting the accuracy of your personal information, (2) asserting that our processing is unlawful; (3) asserting that we no longer need to keep the information for reasons related to the establishment, exercise, or defense of legal claims, or you object to our processing. You have the right, in certain circumstances, to request that we limit our processing of your personal information if you are contesting the accuracy of your personal information; asserting that our processing is unlawful; asserting that we no longer need to keep the information for reasons related to the establishment, exercise, or defense of legal claims, or you object to our processing</p>
|
||||
<p><strong>Objection: </strong>You have the right to object to our processing if we are processing your personal information based on legitimate interests, using your personal information for direct marketing (including profiling), or processing your personal information for purposes of scientific or historical research and statistics.</p>
|
||||
<p><strong>Verification Procedures: </strong>We must verify your identity for everyone’s protection, so we may require you to provide us with verification information prior to accessing any records containing personal information about you. We do this by asking you to provide personal identifiers we can match against information we may have collected from you previously and confirm your request using the email stated in the request.</p>
|
||||
<p>We will use the information you provide for verification only for the purpose of verification. We may have a reason under the law why we do not have to respond to your request or respond to it in a more limited way than you anticipated. If we do, we will explain that to you in our response.</p>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- eslint-enable max-len -->
|
||||
</template>
|
||||
|
||||
@@ -88,7 +88,7 @@ $itemHeight: 2rem;
|
||||
|
||||
.inline-dropdown {
|
||||
&.select-multi .dropdown-toggle {
|
||||
height: auto;
|
||||
line-height: 1.571;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -651,9 +651,9 @@
|
||||
|
||||
input, textarea {
|
||||
transition-property: border-color, box-shadow, color, background;
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
background-color: rgba($white, 0.5);
|
||||
&:focus:not(:disabled), &:active:not(:disabled), &:hover:not(:disabled) {
|
||||
background-color: rgba(255, 255, 255, 0.75);
|
||||
background-color: rgba($white, 0.75);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -810,11 +810,7 @@
|
||||
margin-right: 16px;
|
||||
color: $blue-10;
|
||||
}
|
||||
|
||||
.btn-footer {
|
||||
height: 2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.weekday-check {
|
||||
margin-left: 0px;
|
||||
@@ -884,6 +880,24 @@
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.disabled {
|
||||
background-color: $white;
|
||||
border: 2px solid transparent;
|
||||
color: $gray-200;
|
||||
line-height: 1.714;
|
||||
box-shadow: 0px 1px 3px 0px rgba(26, 24, 29, 0.12), 0px 1px 2px 0px rgba(26, 24, 29, 0.24);
|
||||
|
||||
&:focus {
|
||||
background-color: $white;
|
||||
border: 2px solid $purple-400;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&:active {
|
||||
box-shadow: 0px 1px 3px 0px rgba(26, 24, 29, 0.12), 0px 1px 2px 0px rgba(26, 24, 29, 0.24);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
|
||||
@@ -61,6 +61,18 @@
|
||||
left: calc((100% + 236px - 978px) / 2);
|
||||
right: 0%;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 575px) {
|
||||
max-width: none;
|
||||
left: 3%;
|
||||
right: 3%;
|
||||
}
|
||||
|
||||
.message {
|
||||
@media screen and (max-width: 450px) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.drawer-toggle-icon {
|
||||
@@ -136,7 +148,7 @@
|
||||
color: $white !important;
|
||||
text-decoration: none !important;
|
||||
border-bottom: 2px solid transparent;
|
||||
padding: 0.5rem;
|
||||
padding: 8px;
|
||||
|
||||
&-active, &:hover {
|
||||
color: $white !important;
|
||||
@@ -157,17 +169,19 @@
|
||||
}
|
||||
|
||||
.drawer-slider {
|
||||
padding: 12px 0 0 8px;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
& .message {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: auto;
|
||||
|
||||
top: calc(50% - 30px);
|
||||
left: 24px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
position: absolute;
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
.header-tabs {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto 1fr;
|
||||
grid-template-columns: max-content;
|
||||
}
|
||||
|
||||
// MS Edge
|
||||
|
||||
@@ -34,12 +34,6 @@
|
||||
<template
|
||||
v-for="item in showItems"
|
||||
>
|
||||
<div
|
||||
v-if="shouldAddVerticalLine(item)"
|
||||
:key="item.key"
|
||||
class="vertical-divider"
|
||||
:style="dividerMargins"
|
||||
></div>
|
||||
<slot
|
||||
name="item"
|
||||
:item="item"
|
||||
@@ -56,6 +50,10 @@
|
||||
|
||||
$buttonAreaWidth: 60;
|
||||
|
||||
.items > div {
|
||||
margin: 0 12px
|
||||
}
|
||||
|
||||
.slider-root {
|
||||
position: relative;
|
||||
}
|
||||
@@ -95,9 +93,11 @@
|
||||
|
||||
&.left-button {
|
||||
left: 0;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
&.right-button {
|
||||
padding-left:20px;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
@@ -108,15 +108,6 @@
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding-top: 10px;
|
||||
margin-left: $buttonAreaWidth+ px;
|
||||
margin-right: $buttonAreaWidth+ px;
|
||||
}
|
||||
|
||||
.vertical-divider {
|
||||
height: 92px;
|
||||
width: 1px;
|
||||
background: #34313a;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -199,9 +190,6 @@ export default {
|
||||
itemsPerPage () {
|
||||
return Math.floor(this.currentWidth / (this.itemWidth + this.itemMargin));
|
||||
},
|
||||
shouldAddVerticalLine (item) {
|
||||
return this.items[this.itemsPerPage() - 1] === item && this.pointer !== 5;
|
||||
},
|
||||
scrollButtonsVisible () {
|
||||
return this.items.length > this.itemsPerPage();
|
||||
},
|
||||
|
||||
@@ -12,7 +12,9 @@
|
||||
@select="selectItem($event)"
|
||||
>
|
||||
<template #item="{ item }">
|
||||
<span :class="{'dropdown-icon-item': withIcon}">
|
||||
<span
|
||||
:class="{'dropdown-icon-item': withIcon}"
|
||||
>
|
||||
<slot
|
||||
name="item"
|
||||
:item="item"
|
||||
@@ -54,7 +56,3 @@ export default {
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
</style>
|
||||
|
||||
@@ -446,7 +446,6 @@
|
||||
padding: 1.5rem;
|
||||
|
||||
.guidelines {
|
||||
height: 32px;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
@@ -459,9 +458,10 @@
|
||||
}
|
||||
|
||||
button {
|
||||
height: 40px;
|
||||
border-radius: 2px;
|
||||
border-radius: 4px;
|
||||
line-height: 1.714;
|
||||
margin-left: 1.5rem;
|
||||
padding: 2px 12px;
|
||||
|
||||
&.disabled {
|
||||
cursor: default;
|
||||
@@ -540,7 +540,7 @@
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
|
||||
box-shadow: 0 3px 12px 0 rgba(26, 24, 29, 0.24);
|
||||
box-shadow: 0 3px 12px 0 rgba($black, 0.24);
|
||||
}
|
||||
|
||||
.center-avatar {
|
||||
|
||||
@@ -820,9 +820,9 @@
|
||||
"backgroundIceSculptureFestivalText": "Eisskulptur Festival",
|
||||
"backgroundIceSculptureFestivalNotes": "Besuche ein Eisskulptur Festival.",
|
||||
"backgroundWinterFullMoonNotes": "Bestaune den Wintervollmond.",
|
||||
"backgroundBarrelCellarText": "Faßkeller",
|
||||
"backgroundBarrelCellarText": "Fasskeller",
|
||||
"backgrounds112023": "SET 114: Veröffentlicht im November 2023",
|
||||
"backgroundBarrelCellarNotes": "Schau dich im Faßkeller nach Tafelfreuden um.",
|
||||
"backgroundBarrelCellarNotes": "Schau dich im Fasskeller nach Tafelfreuden um.",
|
||||
"backgroundSpectralCandleRoomText": "Raum der gespenstischen Kerzen",
|
||||
"backgroundSpectralCandleRoomNotes": "Sprich mit Geistern im Raum der gespenstischen Kerzen.",
|
||||
"backgroundMonstrousCaveText": "Monströse Höhle",
|
||||
|
||||
@@ -2936,5 +2936,38 @@
|
||||
"weaponArmoireSpookyCandyBucketText": "Grusliger Süßigkeiten Eimer",
|
||||
"armorMystery202407Notes": "Gleite durch Seen und Kanäle mit deinem hin und her fegenden rosa Schwanz! Gewährt keinen Attributbonus. Juli 2024 Abonnentengegenstand.",
|
||||
"armorArmoireJewelersApronText": "Juweliers-Schürze",
|
||||
"armorArmoireJewelersApronNotes": "Diese Hochleistungsschürze ist genau das Richtige zum Anziehen, wenn du dich kreativ fühlst. Das Beste daran sind die Dutzende kleiner Taschen, um alles, was du brauchst, darin zu verstauen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Juwelier Set (Gegenstand 1 von 4)."
|
||||
"armorArmoireJewelersApronNotes": "Diese Hochleistungsschürze ist genau das Richtige zum Anziehen, wenn du dich kreativ fühlst. Das Beste daran sind die Dutzende kleiner Taschen, um alles, was du brauchst, darin zu verstauen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Juwelier Set (Gegenstand 1 von 4).",
|
||||
"armorArmoireBlueStripedSwimsuitText": "Blau gestreifter Badeanzug",
|
||||
"armorArmoireSmileyShirtText": "Shirt mit Smiley-Gesicht",
|
||||
"armorArmoireSoftWhiteSuitText": "Weicher weißer Anzug",
|
||||
"armorArmoireSchoolUniformPantsText": "Schuluniform mit Hose",
|
||||
"armorArmoireSchoolUniformSkirtNotes": "Ob du nun eine Schule für magische Zauberer, Drachenreiter, Ballsportspieler, kreative Künstler oder Mitglieder einer Organisation, die zu geheim ist, um sie hier aufzuzählen, besuchst, du wirst mit dieser Uniform gut dazu passen. Erhöht Intelligenz um <%= int %>.Verzauberter Schrank: Schuluniform-Set (Gegenstand 1 von 4).",
|
||||
"armorArmoireHattersSuitNotes": "Dein Outfit ist nicht vollständig ohne deine grüne Glücks-Fliege. Trage dies zu deiner nächsten verrückten Teeparty. Oder angenehmen Teeparty. Oder begeisterten Teeparty. Oder... Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Hutmacher-Set (Gegenstand 2 von 4).",
|
||||
"armorArmoireBlueStripedSwimsuitNotes": "Was könnte spannender sein als Seemonster am Strand zu bekämpfen? Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Strand-Set (Gegenstand 2 von 4).",
|
||||
"armorArmoireSchoolUniformPantsNotes": "Ob du nun eine Schule für magische Zauberer, Drachenreiter, Ballsportspieler, kreative Künstler oder Mitglieder einer Organisation, die zu geheim ist, um sie hier aufzuzählen, besuchst, du wirst mit dieser Uniform gut dazu passen. Erhöht Intelligenz um <%= int %>.Verzauberter Schrank: Schuluniform-Set (Gegenstand 2 von 4).",
|
||||
"armorArmoireGreenFluffTrimmedCoatNotes": "Sagen erzählen, dass einmal in einer Generation ein Mantel daherkommt, der der wärmste und bequemste von allen ist. Sein Flausch ist außergewöhnlich und seine Knöpfe sind sogar von fäustlingsumhüllten Händen handhabbar. Das ist dieser Mantel hier. Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Fallenstellerhut-Set (Gegenstand 2 von 2).",
|
||||
"armorArmoireSoftWhiteSuitNotes": "Weiß ist eine friedvolle Farbe. Ob du nun ein strahlend weißes Bettlaken oder eine Decke aus frischgefallenem Schnee betrachtest, du wirst einen klaren und vorbereiteten Geist haben. Erhöht Ausdauer um <% con %> und Wahrnehmung um <%= per %>. Verzauberter Schrank: Weiße Lounge-Kleidung (Gegenstand 2 von 3).",
|
||||
"armorArmoireCorsairsCoatAndCapeText": "Mantel und Umhang des Korsaren",
|
||||
"armorArmoireSmileyShirtNotes": "Weil du glücklich bist! Zeig der Welt, dass du heute den ganzen Tag lächelst. Erhöht Intelligenz und Wahrnehmung um jeweils <%= attrs %>. Verzauberter Schrank: Optimisten-Set (Gegenstand 1 von 4).",
|
||||
"armorArmoireYellowStripedSwimsuitText": "Gelb gestreifter Badeanzug",
|
||||
"armorArmoireYellowStripedSwimsuitNotes": "Was könnte erfreulicher sein als Seemonster am Strand zu bekämpfen? Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Strand-Set (Gegenstand 1 von 4).",
|
||||
"armorArmoireGreenFluffTrimmedCoatText": "Mantel mit grünem Flauschband",
|
||||
"armorArmoireSchoolUniformSkirtText": "Schuluniform mit Rock",
|
||||
"armorArmoireHattersSuitText": "Anzug des Hutmachers",
|
||||
"armorArmoireKarateGiText": "Karate Gi",
|
||||
"armorArmoireKarateGiNotes": "Diese leichte Karate-Uniform ist perfekt für Training oder Wettbewerbe. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Karate-Set (Gegenstand 1 von 10).",
|
||||
"weaponArmoireStormKnightAxeText": "Axt des Sturmritters",
|
||||
"weaponArmoireStormKnightAxeNotes": "Sammle deine Wut und schlage wie ein Donnerschlag zu! Erhöht Stärke um <%= str %>. Verzauberter Schrank: Sturmritter-Set (Gegenstand 3 von 3)",
|
||||
"armorArmoireDiagonalRainbowShirtNotes": "Ein Klecks Farbe mit einem Schuss Stil. Sei fröhlich! Erhöht Ausdauer und Wahrnehmung um jeweils <%= attrs %> . Verzauberter Schrank: Regenbogen-Set (Gegenstand 2 von 2).",
|
||||
"armorArmoireAdmiralsUniformText": "Admirals-Uniform",
|
||||
"armorArmoireAdmiralsUniformNotes": "Wir salutieren dir! Diese Marineuniform signalisiert, dass du bereit bist, das Kommando sowohl von deinen Aufgaben als auch von einem Schiff zu übernehmen. Erhöht Ausdauer und Stärke um jeweils <%= attrs %> . Verzauberter Schrank: Admirals-Set (Gegenstand 2 von 2).",
|
||||
"armorArmoireShawlCollarCoatText": "Schalkragen-Mantel",
|
||||
"armorArmoireStripedRainbowShirtText": "Gestreiftes Regenbogen-Shirt",
|
||||
"armorArmoireStripedRainbowShirtNotes": "Die Farben des Regenbogens sahen noch nie zuvor so gut aus. Sei mutig! Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Regenbogen-Set (Gegenstand 1 von 2).",
|
||||
"armorArmoireDiagonalRainbowShirtText": "Diagonales Regenbogen-Shirt",
|
||||
"armorArmoireBasketballUniformText": "Basketball-Uniform",
|
||||
"armorArmoireBasketballUniformNotes": "Fragst du dich, was auf dem Rücken dieser Uniform aufgedruckt ist? Deine Glückszahl, natürlich! Erhöht Wahrnehmung um <%= per %>.Verzauberter Schrank: Altertümliches Basketballset (Gegenstand 1 von 2).",
|
||||
"armorArmoireShawlCollarCoatNotes": "Ein weiser Zauberer sagte einst, dass nichts besser ist als es sowohl gemütlich zu haben als auch produktiv zu sein! Trage diesen warmen und stylischen Mantel, wenn du die diesjährigen Herausforderungen meisterst. Erhöht Ausdauer um <%= con %>.",
|
||||
"armorArmoirePaintersApronText": "Schürze des Malers",
|
||||
"armorArmoirePaintersApronNotes": "Diese Schürze kann deine Kleidung vor Farbe und deine kreativen Projekte vor harschen Kritiken schützen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Maler-Set (Gegenstand 1 von 4)."
|
||||
}
|
||||
|
||||
@@ -404,7 +404,7 @@
|
||||
"questDustBunniesBoss": "Ungezähmte Staubmäuse",
|
||||
"questGroupMoon": "Mondschlacht",
|
||||
"questMoon1Text": "Mondkampf, Teil 1: Finde die geheimnisvollen Scherben",
|
||||
"questMoon1Notes": "Die Bevölkerung von Habitica wurde durch etwas seltsames von ihren Aufgaben abgelenkt: Gewundene Steinsplitter erscheinen überall im Land. Besorgt ruft Dich die Seherin, @Starsystemic, zu ihrem Turm. Sie sagt: \"Ich erkenne ein besorgniserregendes Omen in diesen Splittern, die sich über das Land vereiteln und die hartarbeitende Bevölkerung ablenken. Ich kann die Quelle zurückverfolgen, aber dazu muss ich diese Steinsplitter zuerst untersuchen. Kannst Du einige davon zu mir bringen?\"",
|
||||
"questMoon1Notes": "Die Bevölkerung von Habitica wurde durch etwas seltsames von ihren Aufgaben abgelenkt: Gewundene Steinsplitter erscheinen überall im Land. Besorgt ruft Dich die Seherin, @Starsystemic, zu ihrem Turm. Sie sagt: \"Ich erkenne ein besorgniserregendes Omen in diesen Splittern, die sich über das Land verteilen und die hartarbeitende Bevölkerung ablenken. Ich kann die Quelle zurückverfolgen, aber dazu muss ich diese Steinsplitter zuerst untersuchen. Kannst Du einige davon zu mir bringen?\"",
|
||||
"questMoon1Completion": "@Starsystemic verschwindet in ihren Turm, um die Splitter zu begutachten, die Du gesammelt hast. \"Das könnte komplizierter werden, als wir dachten,\" meint @Beffymaroo, ihre treue Gehilfin. \"Es wird etwas dauern, bis wir die Ursache herausgefunden haben. Schau täglich vorbei und, sobald wir mehr wissen, werden wir Dir die nächste Questschriftrolle zukommen lassen.\"",
|
||||
"questMoon1CollectShards": "Mondscherben",
|
||||
"questMoon1DropHeadgear": "Mondkriegerhelm (Kopfbedeckung)",
|
||||
@@ -497,7 +497,7 @@
|
||||
"questMayhemMistiflying3DropShield": "Verwegene Regenbogenbotschaft (Schildhand-Gegenstand)",
|
||||
"questMayhemMistiflying3DropWeapon": "Verwegene Regenbogenbotschaft (Haupthand-Gegenstand)",
|
||||
"featheredFriendsText": "\"Gefiederte Freunde\" Quest-Paket",
|
||||
"featheredFriendsNotes": "Beinhaltet \"Hilfe! Harpyien!\", \"Die Nachteule\" und \"Die Zeitraubvögel\".",
|
||||
"featheredFriendsNotes": "Beinhaltet Quests, um Eier für das Eulen-Haustier, Papageien-Haustier und Falken-Haustier und Die Zeitraubvögel zu erhalten.",
|
||||
"questNudibranchText": "Befall mit NurSofort-Nacktkiemern",
|
||||
"questNudibranchNotes": "An einem faulen Tag in Habitica kommst Du endlich dazu, Deine To-Dos anzugehen. An Deiner dunkelrötlichsten Aufgabe leuchtet eine Horde glänzend blauer Seeschnecken. Du bist entzückt! Ihre saphirblaue Farbe lässt Deine einschüchterndsten Aufgaben so leicht wie Deine besten Gewohnheiten aussehen. In fieberhaftem Wahn machst Du Dich an die Arbeit, packst in unaufhörlicher Raserei eine Aufgabe nach der anderen an...<br><br>Das nächste, an das Du Dich erinnerst, ist wie @LilithofAlfheim Dich mit kaltem Wasser übergießt. \"Die NurSofort-Nacktkiemer haben Dich total zerstochen! Du musst eine Pause machen!\" <br><br>Schockiert stellst Du fest, dass Deine Haut genauso rot leuchtet, wie einst Deine To-Do-Liste. \"Produktiv zu sein ist eine Sache\", sagt @beffymaroo, \"aber Du musst auch auf Dich selbst achten. Beeilung, lass sie uns loswerden!\"",
|
||||
"questNudibranchCompletion": "Du siehst, wie die letzte NurSofort-Nacktkiemerschnecke von einem Stapel erledigter Aufgaben rutscht, als @amadshade sie wegwäscht. Eine lässt einen Kleidersack zurück, und als Du ihn öffnest, findest Du etwas Gold ein paar kleine Ellipsoiden, von denen Du annimmst, dass es Eier sind.",
|
||||
@@ -505,7 +505,7 @@
|
||||
"questNudibranchDropNudibranchEgg": "Nacktkiemerschnecke (Ei)",
|
||||
"questNudibranchUnlockText": "Schaltet den Kauf von Nacktkiemerschneckeneiern auf dem Marktplatz frei",
|
||||
"splashyPalsText": "\"Spritzige Kumpel\" Quest-Paket",
|
||||
"splashyPalsNotes": "Beinhaltet 'Das Dilatory-Rennen', 'Führe die Schildkröte' und 'Jammern des Wals'.",
|
||||
"splashyPalsNotes": "Beinhaltet Quests, um Eier für das Schildkröten-Haustier, Wal-Haustier und Seepferdchen-Haustier zu erhalten: Führe die Schildkröte, Jammern des Wals und Das Dilatory-Rennen.",
|
||||
"questHippoText": "Was für ein heuchlerisches Hippo",
|
||||
"questHippoNotes": "Du und @awesomekitty kollabiert vor Erschöpfung in dem Schatten einer Palme. Die Sonne glüht über der Schleichendstetigen Savanne und verbrennt den Grund unter ihr. Bis jetzt ist dies ein produktiver Tag gewesen, an dem Du Deine Tagesaufgaben besiegt hast. Und nun sieht diese Oase wie schönes Plätzchen aus, an dem man eine erfrischende Pause machen kann. Du beugst dich in der Nähe des Wassers herunter um etwas zu trinken, doch Du stolperst sogleich geschockt zurück, als sich ein riesiges Nilpferd vor dir erhebt. \"Ruhst Du dich jetzt schon aus? Sei nicht so faul und geh zurück zu deiner Arbeit.\" Du versuchst ihm zu widersprechen und zu sagen, dass Du sehr hart gearbeitet hast und eine Pause brauchst, aber das Hippo wollte nichts davon wissen. <br><br> @khdarkwolf flüstert dir zu, \"Fällt dir auf wie es den ganzen Tag faulenzt, aber die Frechheit besitzt dich faul zu nennen? Dies ist das heuchlerische Hippo!\" <br><br> Dein Freund @jumorales nickt. \"Kommt, wir zeigen ihm wie es ist, hart zu arbeiten!\"",
|
||||
"questHippoCompletion": "Das Hippo verbeugt sich kapitulierend. “Ich habe Dich unterschätzt. Es sieht so aus, als ob Du gar nicht faul gewesen bist. Ich entschuldige mich. Um die Wahrheit zu sagen, ich habe vielleicht einiges auf Dich projiziert. Vielleicht sollte ich selbst auch einige meiner Aufgaben erledigen. Hier, nimm diese Eier als ein Zeichen meiner Dankbarkeit.” Nachdem Du sie genommen hast, lässt Du Dich beim Wasser nieder, um endlich zu entspannen.",
|
||||
@@ -513,9 +513,9 @@
|
||||
"questHippoDropHippoEgg": "Nilpferd (Ei)",
|
||||
"questHippoUnlockText": "Schaltet den Kauf von Nilpferdeiern auf dem Marktplatz frei",
|
||||
"farmFriendsText": "\"Farmfreunde\" Quest-Paket",
|
||||
"farmFriendsNotes": "Beinhaltet 'Die Muhtantische Kuh', 'Reite die Nacht-Mähre', und 'Der Donner-Bock'.",
|
||||
"farmFriendsNotes": "Beinhaltet Quests, um Eier für das Pferde-Haustier, Schaf-Haustier und Kuh-Haustier zu erhalten: Reite die Nacht-Mähre, Der Donner-Bock und Die Muhtantische Kuh.",
|
||||
"witchyFamiliarsText": "\"Hexenhafte Haustiere\" Quest-Paket",
|
||||
"witchyFamiliarsNotes": "Beinhaltet 'Der Rattenkönig', 'Die eisige Arachnoide', und 'Sumpf des Chaos-Froschs'.",
|
||||
"witchyFamiliarsNotes": "Beinhaltet Quests, um Eier für das Frosch-Haustier, Spinnen-Haustier und Ratten-Haustier zu erhalten: Sumpf des Chaos-Froschs, Die eisige Arachnoide und Der Rattenkönig.",
|
||||
"questGroupLostMasterclasser": "Geheimnis der Klassenmeister",
|
||||
"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",
|
||||
@@ -559,7 +559,7 @@
|
||||
"questYarnDropYarnEgg": "Wollknäuel (Ei)",
|
||||
"questYarnUnlockText": "Schaltet den Kauf von Wollknäueleiern auf dem Marktplatz frei",
|
||||
"winterQuestsText": "\"Winter\" Quest-Paket",
|
||||
"winterQuestsNotes": "Beinhaltet 'Wildernder Weihnachtswichtel', 'Finde das Jungtier' und 'Der Federvieh-Frost'. Beachte, dass Wildernder Weihnachtswichtel und Finde das Jungtier stapelbare Questerfolge haben, aber nur einmalig ein seltenes Haus- und Reittier verleihen.",
|
||||
"winterQuestsNotes": "Beinhaltet Quests, um Eier für das Eisbären-Haustier, das Eisbären-Reittier und das Pinguin-Haustier zu erhalten: Finde das Jungtier, Wildernder Weihnachtswichtel und Der Federvieh-Frost.",
|
||||
"questPterodactylText": "Der Pterror-Dactylus",
|
||||
"questPterodactylNotes": "Du machst einen Spaziergang entlang der friedlichen Stoïstillen Klippen, als ein böses Kreischen die Luft zerreißt. Du drehst Dich um, siehst eine schreckliche Kreatur auf Dich zufliegen und wirst von einem mächtigen Schrecken überwältigt. Als Du Dich zur Flucht wendest, packt Dich @Lilith of Alfheim. \"Keine Panik! Es ist nur ein Pterror-Dactylus.\"<br><br>@Procyon P nickt. \"Sie nisten in der Nähe, aber sie fühlen sich angezogen vom Geruch negativer Gewohnheiten und unerledigter Tagesaufgaben.\"<br><br>Keine Sorge\", sagt @Katy133. \"Wir müssen nur besonders produktiv sein, um ihn zu besiegen!\" Du bist erfüllt von einem erneuerten Sinn für Zielstrebigkeit und wendest Dich Deinem Feind zu.",
|
||||
"questPterodactylCompletion": "Mit einem letzten Kreischen stürzt der Pterror-Dactylus über die Klippe. Du rennst nach vorn, um zu sehen, wie er über die entfernten Steppen hinwegfliegt. \"Puh, ich bin froh, dass das vorbei ist\", sagst Du. \"Ich auch\", antwortet @GeraldThePixel. \"Aber seht doch! Er hat ein paar Eier für uns zurückgelassen.\" @Edge gibt Dir drei Eier, und Du gelobst, sie in friedlicher Ruhe aufzuziehen, umgeben von positiven Gewohnheiten und blauen Tagesaufgaben.",
|
||||
@@ -594,7 +594,7 @@
|
||||
"questDysheartenerDropHippogriffMount": "Hoffnungsfroher Hippogreif (Reittier)",
|
||||
"dysheartenerArtCredit": "Artwork von @AnnDeLune",
|
||||
"hugabugText": "\"Knuddel den Käfer\" Quest-Paket",
|
||||
"hugabugNotes": "Beinhaltet 'Der KRITISCHE BUG', 'Die Schnecke der Schlamm-Schinderei' und 'Flieg' weiter, Funkenfalter!'.",
|
||||
"hugabugNotes": "Beinhaltet Quests, um Eier für das Käfer-Haustier, das Raupen-Haustier und das Schnecken-Haustier zu erhalten: Der KRITISCHE BUG, Flieg' weiter, Funkenfalter! und Die Schnecke der Schlamm-Schinderei.",
|
||||
"questSquirrelText": "Das Raffinierte Eichhörnchen",
|
||||
"questSquirrelNotes": "Du wachst auf und bemerkst, dass Du verschlafen hast! Warum hat Dein Wecker nicht geklingelt? .... Wie ist eine Eichel in die Klingel geraten?<br><br>Als Du versuchst, Frühstück zu machen, ist der Toaster mit Eicheln gefüllt. Als Du Dein Reittier holen willst, ist @Shtut da und versucht erfolglos, den Stall aufzusperren. Du schaust in das Schlüsselloch. “Ist das eine Eichel da drin?”<br><br>@randomdaisy ruft: “Oh nein! Ich wusste, dass meine Haustier-Eichhörnchen ausgebüxt sind, aber ich wusste nicht, dass sie solche Schwierigkeiten gemacht haben! Kannst Du mir helfen, sie zusammenzutreiben, bevor sie noch mehr Chaos anrichten?”<br><br>Den Spuren der schelmisch platzierten Eichennüsse folgend, fängst Du die eigensinnigen Nager, wobei @Cantras hilft sie sicher zu Hause unterzubringen. Aber gerade als Du denkst, dass Deine Aufgabe fast erledigt ist, prallt eine Nuss von Deinem Helm ab! Du schaust auf, um ein mächtiges Exemplar eines Eichhörnchens zu sehen, das zur Verteidigung eines wunderbaren Haufens von Eicheln zusammengekauert dasitzt.<br><br>“Oh je”, sagt @randomdaisy leise. “Sie war schon immer eine Art Ressourcenschützerin. Wir müssen sehr vorsichtig vorgehen!” Ihr kreist das Tier langsam ein, bereit für Ärger!",
|
||||
"questSquirrelCompletion": "Mit einer sanften Herangehensweise, Tauschangeboten und ein paar beruhigenden Zaubersprüchen kannst Du das Eichhörnchen von seinem Schatz weglocken und zurück zu den Ställen bringen, die @Shtut gerade erst enteichelt hat. Ein paar der Eicheln siehst Du auf einem Arbeitstisch beiseite gelegt. “Das sind Eichhörncheneier! Vielleicht kannst Du welche aufziehen, die nicht so viel mit ihrem Essen spielen.”",
|
||||
@@ -602,9 +602,9 @@
|
||||
"questSquirrelDropSquirrelEgg": "Eichhörnchen (Ei)",
|
||||
"questSquirrelUnlockText": "Schaltet den Kauf von Eichhörncheneiern auf dem Marktplatz frei",
|
||||
"cuddleBuddiesText": "\"Kuschelkumpel\" Quest-Paket",
|
||||
"cuddleBuddiesNotes": "Beinhaltet 'Das Killerkaninchen', 'Das Ruchlose Frettchen' und 'Die Meerschweinchen Gang'.",
|
||||
"cuddleBuddiesNotes": "Beinhaltet Quests, um Eier für das Hasen-Haustier, das Frettchen-Haustier und das Meerschweinchen-Haustier zu erhalten: Das Killerkaninchen, Das Ruchlose Frettchen und Die Meerschweinchen Gang.",
|
||||
"aquaticAmigosText": "\"Feuchte Freunde\" Quest-Paket",
|
||||
"aquaticAmigosNotes": "Beinhaltet 'Der magische Axolotl', 'Der Kraken von Unfertik' und 'Der Ruf des Octothulu'.",
|
||||
"aquaticAmigosNotes": "Beinhaltet Quests, um Eier für das Tintenfisch-Haustier, das Oktopus-Haustier und das Axolotl-Haustier zu erhalten: Der Kraken von Unfertik, Der Ruf des Octothulu und Der magische Axolotl.",
|
||||
"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.",
|
||||
@@ -618,7 +618,7 @@
|
||||
"questKangarooDropKangarooEgg": "Känguru (Ei)",
|
||||
"questKangarooUnlockText": "Schaltet den Kauf von Känguru-Eiern auf dem Marktplatz frei",
|
||||
"forestFriendsText": "\"Waldfreunde\" Quest-Paket",
|
||||
"forestFriendsNotes": "Beinhaltet 'Die Seele des Frühlings', 'Das Igelmonster' und 'Das Baumgewirr'.",
|
||||
"forestFriendsNotes": "Beinhaltet Quests, um Eier für das Baumling-Haustier, das Reh-Haustier und das Igel-Haustier zu erhalten: Das Baumgewirr, Die Seele des Frühlings und Das Igelmonster.",
|
||||
"questAlligatorText": "Der Insta-Gator",
|
||||
"questAlligatorNotes": "“Verflixt!” ruft @gully aus. “Ein Insta-Gator in seinem natürlichen Lebensraum! Vorsichtig, er lenkt seine Beute mit Dingen ab, die dringend erscheinen, JETZT SOFORT, und er ernährt sich von den daraus resultierenden liegengebliebenen Tagesaufgaben.” Du verstummst um nicht aufzufallen, aber ohne Erfolg. Der Insta-Gator entdeckt Dich und stürmt los! Aus den Sümpfen der Stagnation erheben sich ablenkende Stimmen, die nach Deiner Aufmerksamkeit greifen: “Lies diesen Beitrag! Sieh Dir dieses Foto an! Achte auf mich, JETZT SOFORT!” Du reißt Dich zusammen um einen Gegenangriff zu starten, vervollständigst Deine Tagesausgaben und stärkst Deine guten Gewohnheiten, um den gefürchteten Insta-Gator zu bekämpfen.",
|
||||
"questAlligatorCompletion": "Du konzentrierst Dich auf das Wesentliche und nicht auf die Ablenkungen des Insta-Gators, und so flieht der Insta-Gator. Sieg! “Sind das Eier? Sie sehen für mich wie Alligatoreier aus”, fragt @mfonda. “Wenn wir uns richtig um sie kümmern, werden sie treue Haustiere oder Reittiere sein”, antwortet @UncommonCriminal und übergibt Dir drei, um sich um sie zu kümmern. Lasst es uns hoffen, sonst könnte der Insta-Gator zurückkehren…",
|
||||
@@ -626,9 +626,9 @@
|
||||
"questAlligatorDropAlligatorEgg": "Alligator (Ei)",
|
||||
"questAlligatorUnlockText": "Schaltet den Kauf von Alligatoreneiern auf dem Marktplatz frei",
|
||||
"oddballsText": "\"Sonderlinge\" Quest-Paket",
|
||||
"oddballsNotes": "Beinhaltet 'Der Glibberkönig', 'Entkomme dem Höhlenungetüm' und 'Ein verheddertes Knäuel'.",
|
||||
"oddballsNotes": "Beinhaltet Quests, um Eier für das Schleim-Haustier, das Garn-Haustier und das Felsen-Haustier zu erhalten: Der Glibberkönig, Ein verheddertes Knäuel und Entkomme dem Höhlenungetüm.",
|
||||
"birdBuddiesText": "\"Vogel-Freunde\" Quest-Paket",
|
||||
"birdBuddiesNotes": "Beinhaltet 'Der Federvieh-Frost', 'Der Hahnenkampf' und 'Der Für-und-Wider-Pfau'.",
|
||||
"birdBuddiesNotes": "Beinhaltet Quests, um Eier für das Pfauen-Haustier, das Pinguin-Haustier und das Hahn-Haustier zu erhalten: Der Für-und-Wider-Pfau, Der Federvieh-Frost und Der Hahnenkampf.",
|
||||
"questVelociraptorText": "Der Veloci-Rapper",
|
||||
"questVelociraptorNotes": "Du teilst Honigkuchen mit @*~Seraphina~*, @Procyon P, and @Lilith of Alfheim an einem See in den Stoïstille Steppen. Plötzlich unterbricht eine traurige Stimme Dein Picknick.<br><br><em>Meine Gewohnheiten vergessen, die Tagesaufgaben verpasst,<br>Ich hab nachgelassen, das ist mir verhasst,<br>Alles lief rund, ich fühlte mich gut,<br>Doch jetzt herrscht Fälligkeitstermine-Flut.</em><br><br>@*~Seraphina~* guckt hinter einen Grasbüschel. “Das ist Veloci-Rapper. Es scheint... verzweifelt?” <br><br>Du ballst entschlossen Deine Faust. “Da gibt es nur eine Lösung. Zeit für eine Rap Battle!”",
|
||||
"questVelociraptorCompletion": "Du springst durch das Gras und stellst Veloci-Rapper.<br><br><em>Hör mir zu, Rapper, gib nicht so schnell auf,<br>Schlechten Gewohnheiten raubst Du doch den Schnauf!<br>Hak' ab die To-Dos mit neuer Lust,<br>Jammer nicht lang über Deinen Patzer-Frust!</em><br><br>Voll neuem Selbstvertrauen hüpft es davon um ein ander mal zu freestylen und hinterlässt drei Eier, wo es gesessen hat.",
|
||||
@@ -636,7 +636,7 @@
|
||||
"questVelociraptorDropVelociraptorEgg": "Velociraptor (Ei)",
|
||||
"questVelociraptorUnlockText": "Schaltet den Kauf von Velociraptoreiern auf dem Marktplatz frei",
|
||||
"mythicalMarvelsText": "Mythische Wunder Quest-Paket",
|
||||
"mythicalMarvelsNotes": "Beinhaltet \"Überzeuge die Einhornkönigin\", \"Der Feuergreif\" und \"Gefahr in der Tiefe: Seeschlangen-Angriff!\".",
|
||||
"mythicalMarvelsNotes": "Beinhaltet Quests, um Eier für das Einhorn-Haustier, das Greifen-Haustier und das Seeschlangen-Haustier zu erhalten: Überzeuge die Einhornkönigin Der Feuergreif und Gefahr in der Tiefe: Seeschlangen-Angriff!",
|
||||
"questBronzeDropBronzePotion": "Bronzenes Schlüpfelixier",
|
||||
"questDolphinText": "Der Delfin des Zweifels",
|
||||
"questDolphinBoss": "Delfin des Zweifels",
|
||||
@@ -659,7 +659,7 @@
|
||||
"questSilverUnlockText": "Schaltet den Kauf von Silbernen Schlüpfelixieren auf dem Marktplatz frei",
|
||||
"questRobotCompletion": "Als @Rev und der Rechenschafts-Buddy die letzte Schraube einsetzen, erwacht die Zeitmaschine zum Leben. @FolleMente und @McCoyly springen an Bord. „Danke für die Hilfe! Wir sehen uns in der Zukunft! Übrigens, die hier sollen Dir bei Deiner nächsten Erfindung helfen!\" Damit verschwinden die Zeitreisenden, aber im Wrack des alten Produktivitätsstabilisators verbleiben drei Eier mit Uhrwerken. Vielleicht sind das die entscheidenden Komponenten für eine neue Produktionslinie von Rechenschafts-Buddys!",
|
||||
"questRobotNotes": "Im Max Kapazitäten-Labor verleiht @Rev der neuesten Erfindung, einem robotischen Rechenschafts-Buddy , den letzten Schliff, als plötzlich ein seltsames Metallfahrzeug in einer Rauchwolke erscheint, nur wenige Zentimeter vom Fluktuationsdetektor des Roboters entfernt! Die Insassen, zwei seltsame, in Silber gekleidete Gestalten, verlassen ihr Gefährt und nehmen ihre Weltraumhelme ab, wobei sie sich als @FolleMente und @McCoyly offenbaren. <br><br>„Ich postuliere, dass unsere Produktivitätsimplementierung eine Anomalie aufwies“, meint @FolleMente verlegen. <br><br>@ McCoyly verschränkt ihre Arme. „Das bedeutet, dass sie es versäumt haben, ihre Tagesaufgaben zu erledigen, was, wie ich postuliere, zur Zersetzung unseres Produktivitätsstabilisators geführt hat. Dabei handelt es sich um eine wesentliche Komponente für Zeitreisen, die zwingend Konsistenz benötigt, um richtig funktionieren zu können. Unsere Leistungen befeuern unsere Bewegung durch Zeit und Raum! Ich habe keine Zeit, um es genauer zu erklären, @Rev. Du wirst es in 37 Jahren entdecken oder vielleicht auch Deine Verbündeten, die Mysteriösen Zeitreisenden. Kannst Du uns vorerst dabei helfen, unsere Zeitmachine zu reparieren?\"",
|
||||
"rockingReptilesNotes": "Beinhaltet den \"Insta-Gator\", \"Die Schlange der Ablenkung\" und den \"Veloci-Rpper\".",
|
||||
"rockingReptilesNotes": "Beinhaltet Quests, um Eier für das Alligator-Haustier, das Velociraptor-Haustier und das Schlangen-Haustier zu erhalten: Der Insta-Gator, Der Veloci-Rapper und Die Schlange der Ablenkung.",
|
||||
"rockingReptilesText": "\"Rockendes Reptilien\"-Quest-Bundle",
|
||||
"questRobotUnlockText": "Schaltet den Kauf von Robotereiern auf dem Markplatz frei",
|
||||
"questRobotDropRobotEgg": "Roboter (Ei)",
|
||||
@@ -667,7 +667,7 @@
|
||||
"questRobotCollectGears": "Zahnräder",
|
||||
"questRobotCollectBolts": "Schrauben",
|
||||
"questRobotText": "Mysteriöse Mechanische Merkwürdigkeiten!",
|
||||
"delightfulDinosNotes": "Enthält den \"Pterror-dactyl\", \"Trampelnden Triceratops\" und \"Ausgegrabenen Dinosaurier\".",
|
||||
"delightfulDinosNotes": "Beinhaltet Quests, um Eier für das Triceratops-Haustier, das T-Rex-Haustier und das Pterodactyl-Haustier zu erhalten: Der Trampelnde Triceratops, Der Ausgegrabene Dinosaurier und Der Pterror-Dactyl.",
|
||||
"delightfulDinosText": "\"Dufte Dinos\" Quest-Paket",
|
||||
"questAmberCompletion": "\"Trerezin?\" sagt @-Tyr- mit ruhiger Stimme. \"Würdest Du @Vikte loslassen? Ich glaube nicht, dass es ihm so hoch oben wohl ist.\"<br><br>Trerezins Haut wird hochrot und sie setzt @Vikte sanft auf dem Boden ab. \"Bitte entschuldigt! Es ist schon so lange her, dass ich Gäste hatte. Dabei habe ich meine guten Manieren vergessen!\" Sie gleitet vorwärts um euch standesgemäss zu begrüssen, bevor sie in ihrem Baumhaus verschwindet. Gleich darauf kehrt Sie zurück mit einem Arm voll Bernsteinfarbener Schlüpfelixiere als Dankeschön!<br><br>\"Magische Tränke!\" haucht @Vikte.<br><br>\"Ach, diese alten Dinger?\" Trerezins Zunge zittert während sie nachdenkt. \"Wie wär's damit: Ich gebe euch den ganzen Stapel, wenn ihr versprecht, mich ab und zu besuchen zu kommen...\"<br><br>So lasst ihr die Aufgabenwälder hinter euch, um allen über die neuen Schlüpfelixieren zu berichten – und natürlich über eure neue Freundin!",
|
||||
"questAmberNotes": "Du sitzt mit @beffymaroo und @-Tyr- in der Taverne als @Vikte zur Tür hereinplatzt und aufgeregt von Gerüchten über eine neue Art von Magischem Schlüpfelixier erzählt, die in den Aufgabenwälder versteckt seien. Da Deine Tagesaufgaben bereits erledigt sind, beschliesst ihr drei ohne zu zögern, @Vikte bei der Suche zu helfen. Was kann ein kleines Abenteuer schon schaden?<br><br>Nach stundenlangem Marsch durch die Aufgabenwälder fängst Du an, den spontanen Aufbruch zur Jagd zu bereuen. Ihr seid gerade am umkehren als ihr einen überraschten Ausruf hört. Ihr dreht euch um und erblickt eine riesige Echse mit glänzenden, bernsteinfarbenen Schuppen, die sich um einen Baum windet, @Vikte in ihren Krallen haltend. @beffymaroo greift nach ihrem Schwert.<br><br>\"Wartet!\" ruft @-Tyr-. \"Das ist Trerezin! Sie ist nicht gefährlich, nur gefährlich anhänglich!\"",
|
||||
@@ -693,7 +693,7 @@
|
||||
"questWaffleText": "An die Waffe(l) gegen den Scherzkeks: Desaster-Frühstück!",
|
||||
"questWaffleRageEffect": "`Fürchterliche Waffel setzt AHORNSUMPF ein!` Schmieriger saftiger Sirup lässt Deine Schläge und Sprüche stocken! Anstehender Schaden wird reduziert.",
|
||||
"questWaffleCompletion": "Angeschlagen und reich bebuttert, aber trotzdem triumphierend, genießt Ihr den süßen Sieg über die fürchterliche Waffel, die in eine klebrig-schleimige Pfütze zusammensinkt.<br><br>\"Wow, dieses Monster habt Ihr gründlich eingeschmiert\", sagt Lady Glaciate beeindruckt.<br><br>\"Ein Zuckerschlecken!\" strahlt der April-Scherzkeks.<br><br>\"Trotzdem irgendwie schade,\" findet @beffymaroo. \"Die sah irgendwie lecker aus.\"<br><br>Der Scherzkeks zaubert einen Satz Schlüpfelixier-Flaschen aus seinem Cape, füllt sie mit der sirupartigen Masse der Waffel-Überreste und mischt eine Prise glitzernden Staub hinein. Farben wirbeln durch die Flüssigkeit – neue Schlüpfelixiere! Er wirft sie Euch in die Arme. \"Das ganze Abenteuer hat mir Appetit gemacht. Wer kommt mit zum Frühstück?\"",
|
||||
"jungleBuddiesNotes": "Beinhaltet 'Monströser Mandrill und die Albernen Affen', 'Das verschlafene Faultier' und 'Das Baumgewirr'.",
|
||||
"jungleBuddiesNotes": "Beinhaltet Quests, um Eier für das Affen-Haustier, das Baumling-Haustier und das Faultier-Haustier zu erhalten: Monströser Mandrill und die Albernen Affen, Das Baumgewirr und Das verschlafene Faultier.",
|
||||
"jungleBuddiesText": "\"Jungle Freunde\" Quest-Paket",
|
||||
"questFluoriteUnlockText": "Schaltet den Kauf von Fluorit-Schlüpfelixieren auf dem Marktplatz frei",
|
||||
"questFluoriteDropFluoritePotion": "Fluorit-Schlüpfelixier",
|
||||
@@ -715,7 +715,7 @@
|
||||
"questTurquoiseCollectSagittariusRunes": "Schütze-Runen",
|
||||
"questTurquoiseCompletion": "Heiß und verschwitzt hält Dein Team endlich inne und macht eine verdiente Pause neben dem umgegrabenen Dreck und einem Haufen Runen und Edelsteine, die ihr gefunden habt.<br><br>“Unglaublich”, murmelt @QuartzFox. “Das wird Geschichte schreiben.”<br><br>“Lasst mich diese Materialien zur Habitica-Universität nehmen um sie zu analysieren”, sagt @gawrone. “Da müsste es viel zu studieren geben und auch einige türkise Elixiere für uns alle abwerfen! Wer weiß was wir hier sonst noch alles begraben finden könnten?”<br><br>@starsystemic stimmt ein: “Einfach bewundernswert, was man mit harter Arbeit erreichen kann!”",
|
||||
"questTurquoiseNotes": "@gawrone rennt in Dein Zimmer mit ihrem Habiticaner-Diplom in der einen Hand und einem außerordentlich großen und staubigen, ledergebundenen Folianten in der anderen.<br><br>“Du wirst nie erraten, was ich entdeckt habe!”, sagen sie. “Die Blühenden Felder sind so fruchtbar weil sie früher mal von einem riesigen Ozean bedeckt waren. Man munkelt dass ein uraltes Volk den Boden diesen Ozeans in magischen Städten bewohnt hat. Ich habe mithilfe längst vergessen geglaubter Karten herausgefunden, wo das höchstwahrscheinlich war! Hol Deine Schaufel!”<br><br>Schon am nächsten Abend trefft ihr euch mit @QuartzFox und @starsystemic, um eine Party zu gründen und die Grabungen zu starten. Tief im Boden findet Ihr eine Rune neben einem Türkis!<br><br>“Grabt weiter!”, drängt @gawrone. “Wenn wir genug finden, können wir eines ihrer uralten Elixiere nachbrauen und somit Geschichte schreiben!”",
|
||||
"sandySidekicksNotes": "Beinhaltet 'Das gutmütige Gürteltier', 'Die Schlange der Ablenkung' und 'Die eisige Arachnoide'.",
|
||||
"sandySidekicksNotes": "Beinhaltet Quests, um Eier für das Spinnen-Haustier, das Gürteltier-Haustier und das Schlangen-Haustier zu erhalten: Die eisige Arachnoide, Das gutmütige Gürteltier und Die Schlange der Ablenkung.",
|
||||
"sandySidekicksText": "\"Sandige Seelenverwandte\" Quest-Paket",
|
||||
"questBlackPearlText": "Sternstunde - Ein Fall von Einfall",
|
||||
"questBlackPearlNotes": "In letzter Zeit hast Du einfach keinen Schwung. Du vermisst deine Kreativität. Als @jjgame83 also vorschlägt zusammen zum Lively Lake zu gehen, ergreifst du die Chance für einen Tapetenwechsel. Während @QuarzFox das Picknick am Seeufer vorbereitet, siehst du etwas im flachen Wasser glitzern. Eine seltsame, schwarze Perle. <br><br>\"Ich wünschte, mir würde was neues einfallen\", seufzt Du.<br><br>Eine kalte Brise, scheinbar aus dem Nirgendwo, scheint deine Worte am Ufer entlang zu tragen und das Wasser kräuselt sich leicht. Der See wird schwarz wie Tinte, Sterne leuchten am Firmament auf und innerhalb eines Herzschlages wird der Tag zu tiefster Nacht.<br><br>\"Das sind keine guten Vorboten\", sagt @PixelStormArt.<br><br>Die Luft.. schmeckt nach Salz? Plötzlich bricht eine gigantische Masse an Fangarmen in einem Sprühregen aus Meeresschaum aus dem See hervor. Du kannst gerade eine Art Schnabel in der Mitte ausmachen, als dieser sich öffnet und dröhnend erschallt: \"HÜTET EUCH VOR ASTEROIDEE, DER EINFALL VON JENSEITS DER STERNE!\"<br><br>Ein Tentakel donnert nieder auf den Korb mit dem Picknick. Gute Idee oder nicht, jetzt ist Handeln gefragt.",
|
||||
@@ -785,5 +785,7 @@
|
||||
"questGiraffeNotes": "Du schlenderst durch das hohe Gras der Sloenstedi Savanne und genießt einen netten Spaziergang in der Natur als Auszeit von deinen Aufgaben. Als du die hügelige Landschaft durchstreifst, fällt dir eine Ansammlung von Gegenständen in der Ferne auf. Es ist ein Stapel aus Musikinstrumenten, Kunstzubehör, elektronischer Ausrüstung und mehr! Du wagst dich näher für einen besseren Blick.<br><br>“Hey, was glaubst du, was du da machst?“ ruft eine Stimme hinter einer Akazie hervor. Eine große und imposante Giraffe, die eine modische Sonnenbrille, eine Gitarre und eine ausgefallene Kamera um ihren langen Hals trägt, taucht auf. „Das ist alles meine Ausrüstung, sei vorsichtig und berühre nichts!“<br><br>Du bemerkst Staub auf vielen der Gegenstände. „Wow, du hast echt eine Menge Hobbies!“ sagst du. „Kannst du mir einige Kunstwerke zeigen oder ein Lied auf der Gitarre spielen?“<br><br>Die Giraffe zieht die Mundwinkel herunter, als sie all ihr Zubehör anschaut. „Ich habe so viel von diesem Zeug, aber ich weiß nicht, wo ich anfangen soll! Warum gibst du mir nicht ein bisschen von deiner Motivation, um mir die produktive Energie zu verleihen, die ich brauche, um endlich starten zu können!“",
|
||||
"questChameleonNotes": "Es ist ein schöner Tag in einer warmen, regnerischen Ecke der Aufgabenwälder. Du bist auf der Jagd nach Neuzugängen für deine Blattsammlung, als ein Ast vor dir ohne Vorwarnung seine Farbe ändert! Und dann bewegt er sich!<br><br>Rückwärts stolpernd realisierst du, dass dies überhaupt kein Ast ist, sondern ein großes Chamäleon! Jeder Teil seines Körpers wechselt andauernd seine Farbe, während seine Augen in unterschiedliche Richtungen zucken.<br><br>“Geht es dir gut?“ fragst du das Chamäleon.<br><br>“Ahhh, na ja,“ sagt es und wirkt ein wenig durcheinander. „Ich habe versucht, mich anzupassen… aber es ist so überwältigend… die Farben kommen und gehen ständig! Es ist schwer, sich auf nur eine zu konzentrieren….“<br><br>“Aha,“ sagst du, „Ich glaube, ich kann helfen. Wir schärfen deine Konzentration mit einer kleinen Herausforderung! Halte deine Farben bereit!“<br><br>“Die Wette gilt!“ erwidert das Chamäleon.",
|
||||
"questGiraffeBoss": "Gear-affe",
|
||||
"questGiraffeCompletion": "Nachdem du der Gear-affe mit ein bisschen grundlegender Organisation ihres Stapels geholfen hast, fühlt ihr euch beide energiegeladener und motivierter!<br><br>Sie nimmt ihre Gitarre und ein Heft mit Anfängerübungen und spielt ein paar Noten. \"Es fühlt sich gut an, einen Schritt in die richtige Richtung zu machen, selbst wenn es nur ein kleiner ist. Vielen Dank, dass du mir geholfen hast! Nimm diese hier, ich habe gehört, du hast einige Haustiere und diese Kameraden könnten eine nette Ergänzung sein!\""
|
||||
"questGiraffeCompletion": "Nachdem du der Gear-affe mit ein bisschen grundlegender Organisation ihres Stapels geholfen hast, fühlt ihr euch beide energiegeladener und motivierter!<br><br>Sie nimmt ihre Gitarre und ein Heft mit Anfängerübungen und spielt ein paar Noten. \"Es fühlt sich gut an, einen Schritt in die richtige Richtung zu machen, selbst wenn es nur ein kleiner ist. Vielen Dank, dass du mir geholfen hast! Nimm diese hier, ich habe gehört, du hast einige Haustiere und diese Kameraden könnten eine nette Ergänzung sein!\"",
|
||||
"questCrabDropCrabEgg": "Kabbe (Ei)",
|
||||
"questCrabUnlockText": "Schaltet Krabbeneier zum Kauf auf dem Marktplatz frei."
|
||||
}
|
||||
|
||||
@@ -1003,6 +1003,10 @@
|
||||
"backgroundCastleHallWithHearthText": "Castle Hall with Hearth",
|
||||
"backgroundCastleHallWithHearthNotes": "Bask in the warmth of a Castle Hall with a Hearth.",
|
||||
|
||||
"backgrounds122024": "SET 127: Released December 2024",
|
||||
"backgroundFirstSnowForestText": "First Snow in the Forest",
|
||||
"backgroundFirstSnowForestNotes": "Step into the First Snow in the Forest.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -335,6 +335,7 @@
|
||||
"hatchingPotionRoseGold": "Rose Gold",
|
||||
"hatchingPotionFungi": "Fungi",
|
||||
"hatchingPotionKoi": "Koi",
|
||||
"hatchingPotionGingerbread": "Gingerbread",
|
||||
|
||||
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> Pet.",
|
||||
"premiumPotionUnlimitedNotes": "Not usable on Quest Pet eggs.",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
"webFaqAnswer40": "Gems are Habitica’s in-app paid currency used to purchase Equipment, Avatar Customizations, Backgrounds, and more! Gems can be purchased in bundles or with Gold if you’re a Habitica subscriber. You can also win Gems by being selected as the winner of a Challenge.",
|
||||
|
||||
"faqQuestion41": "What are Mystic Hourglasses, and how do I get them?",
|
||||
"webFaqAnswer41": "Mystic Hourglasses are Habitica’s exclusive Subscriber currency used in the Time Travelers Shop! Hourglasses are delivered on a set schedule based on your subscription plan.\n\nHourglass delivery schedule:\n * 1-Month subscribers get 1 Hourglass at the start of the month after the 3rd consecutive payment.\n * 3-Month subscribers get 1 Hourglass immediately after subscribing, then 1 more Hourglass at the start of the month after each renewal.\n * 6-Month subscribers get 2 Hourglasses immediately after subscribing, then 2 more Hourglasses at the start of the month after each renewal.\n * 12-Month subscribers get 4 Hourglasses immediately after subscribing, then 4 more Hourglasses at the start of the month after each renewal.",
|
||||
"webFaqAnswer41": "Mystic Hourglasses are Habitica’s exclusive Subscriber currency used in the Time Travelers Shop. Subscribers receive a Mystic Hourglass at the start of each month they have subscription benefits, along with a bunch of other perks. Be sure to check out our subscription options if you’re interested in the special Backgrounds, Pets, Quests, and Equipment offered in the Time Travelers Shop!",
|
||||
|
||||
"faqQuestion42": "What can I do to increase accountability?",
|
||||
"webFaqAnswer42": "One of the best ways to motivate yourself and hold yourself accountable for accomplishing your tasks is to join a Party! Partying with other Habitica players is a great way to take on Quests to receive Pets and Equipment, receive buffs from Party members’ Skills, and boost your motivation.\n\nAnother way to increase accountability is to join a Challenge. Challenges automatically add tasks related to a specific goal to your lists! They also add an element of competition against other Habitica players that may give you a motivation boost as you strive for the Gem prize. There are official Challenges created by the Habitica Team as well Challenges made by other players.",
|
||||
|
||||
@@ -533,6 +533,15 @@
|
||||
"weaponSpecialFall2024MageText": "Staff of the Underworld",
|
||||
"weaponSpecialFall2024MageNotes": "Task steps will instantly become simplified with one touch of this shining weapon. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Fall 2024 Gear.",
|
||||
|
||||
"weaponSpecialWinter2025WarriorText": "Moose Warrior Axe",
|
||||
"weaponSpecialWinter2025WarriorNotes": "A mighty axe for a mighty moose! You’ll be unstoppable! Increases Strength by <%= str %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"weaponSpecialWinter2025RogueText": "Snowflake Burst",
|
||||
"weaponSpecialWinter2025RogueNotes": "Thump and dazzle those difficult tasks into submission! You’ll be unstoppable! Increases Strength by <%= str %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"weaponSpecialWinter2025HealerText": "Star Wand",
|
||||
"weaponSpecialWinter2025HealerNotes": "What you need now are more lights and a glowing star to go on top! You'll be unstoppable! Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"weaponSpecialWinter2025MageText": "Northern Lights Display",
|
||||
"weaponSpecialWinter2025MageNotes": "This stunning, colorful show provides the perfect backdrop! You’ll be unstoppable! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
|
||||
"weaponMystery201411Text": "Pitchfork of Feasting",
|
||||
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
|
||||
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
|
||||
@@ -1304,6 +1313,16 @@
|
||||
"armorSpecialFall2024MageText": "Underworld Sorceror Armor",
|
||||
"armorSpecialFall2024MageNotes": "Be one with the underworld and embrace the power of mages who’ve come before you in this armor. Increases Intelligence by <%= int %>. Limited Edition Fall 2024 Gear.",
|
||||
|
||||
"armorSpecialWinter2025WarriorText": "Moose Warrior Armor",
|
||||
"armorSpecialWinter2025WarriorNotes": "Everyone’s going to step aside and make way for you when you wear this armor. Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"armorSpecialWinter2025RogueText": "Snow Costume",
|
||||
"armorSpecialWinter2025RogueNotes": "Although you look like you’re covered in cold snow, you are toasty, warm, jolly, and happy when you wear this costume. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"armorSpecialWinter2025HealerText": "Robe of String Lights",
|
||||
"armorSpecialWinter2025HealerNotes": "Twinkle your way through your tasks. Just be careful—if one bulb goes out, they all go out. Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"armorSpecialWinter2025MageText": "Aurora Cloak",
|
||||
"armorSpecialWinter2025MageNotes": "Wonder, whimsy, enchantment, and splendor will fill your days when you dance in this cloak. Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
|
||||
|
||||
"armorMystery201402Text": "Messenger Robes",
|
||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||
"armorMystery201403Text": "Forest Walker Armor",
|
||||
@@ -1432,6 +1451,8 @@
|
||||
"armorMystery202406Notes": "Haunt your enemies with style and flair! Confers no benefit. June 2024 Subscriber Item.",
|
||||
"armorMystery202407Text": "Amiable Axolotl Suit",
|
||||
"armorMystery202407Notes": "Glide through lakes and canals with your sweeping pink tail! Confers no benefit. July 2024 Subscriber Item.",
|
||||
"armorMystery202412Text": "Candy Cane Cottontail Coat",
|
||||
"armorMystery202412Notes": "A fun and fluffy look to keep you snug on a winter day. Confers no benefit. December 2024 Subscriber Item.",
|
||||
|
||||
"armorMystery301404Text": "Steampunk Suit",
|
||||
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
|
||||
@@ -1656,6 +1677,8 @@
|
||||
"armorArmoireFunnyFoolCostumeNotes": "Dum-de-dum! Surely you jest. This colorful outfit looks amazing on you! Increases Strength by <%= str %>. Enchanted Armoire: Funny Fool Set (Item 2 of 3)",
|
||||
"armorArmoireStormKnightArmorText": "Storm Knight Armor",
|
||||
"armorArmoireStormKnightArmorNotes": "In this armor, you are nearly invincible. Your enemies will never see the storm’s end. Increases Perception by <%= per %>. Enchanted Armoire: Storm Knight Set (Item 2 of 3)",
|
||||
"armorArmoireFestiveHelperOverallsText": "Festive Helper Overalls",
|
||||
"armorArmoireFestiveHelperOverallsNotes": "Durable and comfortable, these overalls are great for working, playing, and assisting others. Plus, it has pockets! Increases Constitution by <%= con %>. Enchanted Armoire: Festive Helper Set (Item 2 of 2)",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -2163,6 +2186,15 @@
|
||||
"headSpecialFall2024MageText": "Underworld Sorcerer Mask",
|
||||
"headSpecialFall2024MageNotes": "Whether you’re mysterious or whimsical, you won’t be missed when you wear this! Increases Perception by <%= per %>. Limited Edition Fall 2024 Gear.",
|
||||
|
||||
"headSpecialWinter2025WarriorText": "Moose Warrior Helmet",
|
||||
"headSpecialWinter2025WarriorNotes": "So, get this: now you look just like a moose. Wear those antlers with pride. Increases Strength by <%= str %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"headSpecialWinter2025RogueText": "Snow Mask",
|
||||
"headSpecialWinter2025RogueNotes": "There is definitely some magic in this hat, because it transforms you into a snow person. Just don’t let the bunny get too close to your carrot nose. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"headSpecialWinter2025HealerText": "Tangle of String Lights",
|
||||
"headSpecialWinter2025HealerNotes": "Don’t bother untangling these because they are already in the shape of a hat. Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"headSpecialWinter2025MageText": "Aurora Hat",
|
||||
"headSpecialWinter2025MageNotes": "More than just a fancy fascinator, this hat makes you look like the aurora borealis itself. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
|
||||
"headSpecialGaymerxText": "Rainbow Warrior Helm",
|
||||
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
|
||||
|
||||
@@ -2334,6 +2366,8 @@
|
||||
"headMystery202409Notes": "More than just jaunty decorations, the enchanted sunflowers on this hat fill the wearer with powerful magic energy. Confers no benefit. September 2024 Subscriber Item.",
|
||||
"headMystery202411Text": "Bristled Helm",
|
||||
"headMystery202411Notes": "This helm is quite intimidating to your tasks when you dive in headfirst! Confers no benefit. November 2024 Subscriber Item.",
|
||||
"headMystery202412Text": "Candy Cane Cottontail Hood",
|
||||
"headMystery202412Notes": "Warm and cozy, just like a cup of minty hot cocoa on a winter night! Confers no benefit. December 2024 Subscriber Item.",
|
||||
|
||||
"headMystery301404Text": "Fancy Top Hat",
|
||||
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
|
||||
@@ -2538,6 +2572,8 @@
|
||||
"headArmoireFunnyFoolCapNotes": "The bells on this hat might make your opponents burst into giggles, but they just help you concentrate. Increases Constitution by <%= con %>. Enchanted Armoire: Funny Fool Set (Item 1 of 3)",
|
||||
"headArmoireStormKnightHelmText": "Storm Knight Helm",
|
||||
"headArmoireStormKnightHelmNotes": "Harness lightning through these antlers as you storm the castle. Increases Constitution by <%= con %>. Enchanted Armoire: Storm Knight Set (Item 1 of 3)",
|
||||
"headArmoireFestiveHelperHatText": "Festive Helper Hat",
|
||||
"headArmoireFestiveHelperHatNotes": "Holiday tip #27: have a helper hat handy. This one is big enough to keep an emergency toy underneath! Increases Intelligence by <%= int %>. Enchanted Armoire: Festive Helper Set (Item 1 of 2)",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
@@ -2826,6 +2862,11 @@
|
||||
"shieldSpecialFall2024HealerText": "Space Shield",
|
||||
"shieldSpecialFall2024HealerNotes": "New tasks wanting your attention bounce right off until you’ve completed your current mission. Increases Constitution by <%= con %>. Limited Edition Fall 2024 Gear.",
|
||||
|
||||
"shieldSpecialWinter2025WarriorText": "Moose Warrior Shield",
|
||||
"shieldSpecialWinter2025WarriorNotes": "Block out any unwanted distractions with this shield as strong as a moose. Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
"shieldSpecialWinter2025HealerText": "The Perfect Gift",
|
||||
"shieldSpecialWinter2025HealerNotes": "The perfect gift is just waiting to be opened. What could be inside? Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
|
||||
|
||||
"shieldMystery201601Text": "Resolution Slayer",
|
||||
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
|
||||
"shieldMystery201701Text": "Time-Freezer Shield",
|
||||
|
||||
@@ -223,6 +223,10 @@
|
||||
"fall2024UnderworldSorcerorMageSet": "Underworld Sorceror Set (Mage)",
|
||||
"fall2024SpaceInvaderHealerSet": "Space Invader Set (Healer)",
|
||||
"fall2024BlackCatRogueSet": "Black Cat Set (Rogue)",
|
||||
"winter2025MooseWarriorSet": "Moose Warrior Set",
|
||||
"winter2025AuroraMageSet": "Aurora Mage Set",
|
||||
"winter2025StringLightsHealerSet": "String Lights Healer Set",
|
||||
"winter2025SnowRogueSet": "Snow Rogue Set",
|
||||
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
|
||||
"winterPromoGiftDetails1": "Until January 6th only, when you gift somebody a subscription, you get the same subscription for yourself for free!",
|
||||
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",
|
||||
|
||||
@@ -168,6 +168,7 @@
|
||||
"mysterySet202409": "Heliotrope Magus Set",
|
||||
"mysterySet202410": "Candy Corn Fox Set",
|
||||
"mysterySet202411": "Bristled Brawler Set",
|
||||
"mysterySet202412": "Candy Cane Cottontail Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
"backgroundStormyRooftopsNotes": "Grimpez sur des toits orageux.",
|
||||
"backgroundWindyAutumnText": "Automne venteux",
|
||||
"backgroundWindyAutumnNotes": "Pourchassez les feuilles pendant un automne venteux.",
|
||||
"incentiveBackgrounds": "Arrière-Plans de Base",
|
||||
"incentiveBackgrounds": "Arrière-Plans Standards",
|
||||
"backgroundVioletText": "Violet",
|
||||
"backgroundVioletNotes": "Un arrière-plan violet vibrant.",
|
||||
"backgroundBlueText": "Bleu",
|
||||
@@ -671,7 +671,7 @@
|
||||
"backgrounds022022": "Ensemble 93 : sorti en février 2022",
|
||||
"backgroundWinterWaterfallText": "Chutes d'eau hivernales",
|
||||
"backgroundOrangeGroveText": "Orangeraie",
|
||||
"backgroundOrangeGroveNotes": "Baladez-vous dans une orangeraie parfumée.",
|
||||
"backgroundOrangeGroveNotes": "Baladez-vous dans une Orangeraie parfumée.",
|
||||
"backgroundIridescentCloudsText": "Nuages iridescents",
|
||||
"backgroundIridescentCloudsNotes": "Flottez sur des nuages iridescents.",
|
||||
"backgrounds032022": "Ensemble 94 : sorti en mars 2022",
|
||||
@@ -697,12 +697,12 @@
|
||||
"backgroundOnACastleWallText": "Sur le mur d'un château",
|
||||
"backgroundEnchantedMusicRoomNotes": "Jouez dans une salle de musique enchantée.",
|
||||
"backgrounds072022": "Ensemble 98 : sorti en juillet 2022",
|
||||
"backgroundBioluminescentWavesText": "Vagues bioluminescentes",
|
||||
"backgroundBioluminescentWavesNotes": "Admirez la lueur des vagues bioluminescentes.",
|
||||
"backgroundUnderwaterCaveText": "Grotte sous-marine",
|
||||
"backgroundUnderwaterCaveNotes": "Explorez une grotte sous-marine.",
|
||||
"backgroundUnderwaterStatuesText": "Jardin de statues sous-marin",
|
||||
"backgroundUnderwaterStatuesNotes": "Essayez de ne pas cligner des yeux dans un jardin de statues sous-marin.",
|
||||
"backgroundBioluminescentWavesText": "Vagues Bioluminescentes",
|
||||
"backgroundBioluminescentWavesNotes": "Admirez la lueur des vagues Bioluminescentes.",
|
||||
"backgroundUnderwaterCaveText": "Grotte Sous-marine",
|
||||
"backgroundUnderwaterCaveNotes": "Explorez une Grotte Sous-marine.",
|
||||
"backgroundUnderwaterStatuesText": "Jardin de Statues Sous-marin",
|
||||
"backgroundUnderwaterStatuesNotes": "Essayez de ne pas cligner des yeux dans un Jardin de Statues Sous-marin.",
|
||||
"backgrounds062022": "Ensemble 97 : sorti en juin 2022",
|
||||
"backgroundBeachWithDunesText": "Plage avec des dunes",
|
||||
"backgroundBeachWithDunesNotes": "Explorez une plage avec des dunes.",
|
||||
@@ -710,104 +710,104 @@
|
||||
"backgroundMountainWaterfallNotes": "Admirez une cascade en montagne.",
|
||||
"backgroundSailboatAtSunsetText": "Voilier au coucher du soleil",
|
||||
"backgroundSailboatAtSunsetNotes": "Appréciez la beauté d'un voilier au coucher du soleil.",
|
||||
"backgroundRainbowEucalyptusText": "Eucalyptus arc-en-ciel",
|
||||
"backgroundMessyRoomNotes": "Ranger une chambre en désordre.",
|
||||
"backgroundRainbowEucalyptusText": "Eucalyptus Arc-en-ciel",
|
||||
"backgroundMessyRoomNotes": "Ranger une Chambre en Désordre.",
|
||||
"backgrounds082022": "Ensemble 99 : sorti en août 2022",
|
||||
"backgroundRainbowEucalyptusNotes": "Admirez une forêt d'eucalyptus arc-en-ciel.",
|
||||
"backgroundByACampfireNotes": "Prélassez-vous à la lueur d'un feu de camp.",
|
||||
"backgroundMessyRoomText": "Chambre en désordre",
|
||||
"backgroundByACampfireText": "En bordure d'un feu de camp",
|
||||
"backgroundRainbowEucalyptusNotes": "Admirez une Forêt d'Eucalyptus Arc-en-ciel.",
|
||||
"backgroundByACampfireNotes": "Prélassez-vous à la lueur d'un Feu de Camp.",
|
||||
"backgroundMessyRoomText": "Chambre en Désordre",
|
||||
"backgroundByACampfireText": "En bordure d'Un Feu de Camp",
|
||||
"backgrounds092022": "Ensemble 100 : sorti en septembre 2022",
|
||||
"backgroundTheatreStageText": "Scène de théâtre",
|
||||
"backgroundTheatreStageNotes": "Jouez sur une scène de théâtre.",
|
||||
"backgroundAutumnPicnicText": "Pique-nique automnal",
|
||||
"backgroundOldPhotoText": "Vieille photo",
|
||||
"backgroundAutumnPicnicNotes": "Appréciez un pique-nique automnal.",
|
||||
"backgroundOldPhotoNotes": "Prenez la pose sur une vieille photo.",
|
||||
"backgroundTheatreStageText": "Scène de Théâtre",
|
||||
"backgroundTheatreStageNotes": "Jouez sur une Scène de Théâtre.",
|
||||
"backgroundAutumnPicnicText": "Pique-nique Automnal",
|
||||
"backgroundOldPhotoText": "Vieille Photo",
|
||||
"backgroundAutumnPicnicNotes": "Appréciez un Pique-nique Automnal.",
|
||||
"backgroundOldPhotoNotes": "Prenez la pose sur une Vieille Photo.",
|
||||
"backgrounds112022": "Ensemble 102 : sorti en novembre 2022",
|
||||
"backgroundAmongGiantMushroomsNotes": "Émerveillez-vous parmi les champignons géants.",
|
||||
"backgroundAmongGiantMushroomsText": "Parmi les champignons géants",
|
||||
"backgroundMistyAutumnForestText": "Forêt automnale brumeuse",
|
||||
"backgroundMistyAutumnForestNotes": "Baladez-vous dans une forêt automnale brumeuse.",
|
||||
"backgroundAutumnBridgeText": "Pont en automne",
|
||||
"backgroundAutumnBridgeNotes": "Admirez la beauté d'un pont en automne.",
|
||||
"backgroundAmongGiantMushroomsNotes": "Émerveillez-vous parmi les Champignons Géants.",
|
||||
"backgroundAmongGiantMushroomsText": "Parmi les Champignons Géants",
|
||||
"backgroundMistyAutumnForestText": "Forêt Automnale Brumeuse",
|
||||
"backgroundMistyAutumnForestNotes": "Baladez-vous dans une Forêt Automnale Brumeuse.",
|
||||
"backgroundAutumnBridgeText": "Pont en Automne",
|
||||
"backgroundAutumnBridgeNotes": "Admirez la beauté d'un Pont en Automne.",
|
||||
"backgrounds102022": "Ensemble 101 : sorti en octobre 2022",
|
||||
"backgroundSpookyRuinsText": "Ruines terrifiantes",
|
||||
"backgroundSpookyRuinsNotes": "Explorez des ruines terrifiantes.",
|
||||
"backgroundMaskMakersWorkshopText": "Atelier de fabrication de masques",
|
||||
"backgroundMaskMakersWorkshopNotes": "Essayez un nouveau visage dans l'atelier de fabrication de masques.",
|
||||
"backgroundCemeteryGateText": "Porte de cimetière",
|
||||
"backgroundCemeteryGateNotes": "Hantez la porte d'un cimetière.",
|
||||
"backgroundSpookyRuinsText": "Ruines Terrifiantes",
|
||||
"backgroundSpookyRuinsNotes": "Explorez des Ruines Terrifiantes.",
|
||||
"backgroundMaskMakersWorkshopText": "Atelier de Fabrication de Masques",
|
||||
"backgroundMaskMakersWorkshopNotes": "Essayez un nouveau visage dans l'Atelier de Fabrication de Masques.",
|
||||
"backgroundCemeteryGateText": "Porte du Cimetière",
|
||||
"backgroundCemeteryGateNotes": "Hantez la Porte du Cimetière.",
|
||||
"backgrounds122022": "Ensemble 103 : sorti en décembre 2022",
|
||||
"backgroundBranchesOfAHolidayTreeText": "Branches d'un sapin de Noël",
|
||||
"backgroundBranchesOfAHolidayTreeNotes": "Batifoles sur les branches d'un sapin de Noël.",
|
||||
"backgroundInsideACrystalText": "L'intérieur d'un cristal",
|
||||
"backgroundInsideACrystalNotes": "Surveillez depuis l'intérieur d'un cristal.",
|
||||
"backgroundSnowyVillageText": "Village enneigé",
|
||||
"backgroundSnowyVillageNotes": "Admirez un village enneigé.",
|
||||
"backgroundBranchesOfAHolidayTreeText": "Branches d'un Sapin de Noël",
|
||||
"backgroundBranchesOfAHolidayTreeNotes": "Batifoles sur les Branches d'un Sapin de Noël.",
|
||||
"backgroundInsideACrystalText": "L'intérieur d'un Cristal",
|
||||
"backgroundInsideACrystalNotes": "Surveillez depuis l'Intérieur d'un Cristal.",
|
||||
"backgroundSnowyVillageText": "Village Enneigé",
|
||||
"backgroundSnowyVillageNotes": "Admirez un Village Enneigé.",
|
||||
"backgrounds012023": "Ensemble 104 : sorti en janvier 2023",
|
||||
"backgroundRimeIceText": "Glace givrée",
|
||||
"backgroundRimeIceNotes": "Admirez de la glace givrée scintillante.",
|
||||
"backgroundSnowyTempleText": "Temple enneigé",
|
||||
"backgroundSnowyTempleNotes": "Contemplez un temple enneigé serein.",
|
||||
"backgroundWinterLakeWithSwansText": "Lac d'hiver avec des cygnes",
|
||||
"backgroundWinterLakeWithSwansNotes": "Profitez de la nature près d'un lac d'hiver avec des cygnes.",
|
||||
"eventBackgrounds": "Arrière-plans événementiels",
|
||||
"backgroundBirthdayBashText": "Fête d'anniversaire",
|
||||
"backgroundRimeIceText": "Glace Givrée",
|
||||
"backgroundRimeIceNotes": "Admirez de la Glace Givrée scintillante.",
|
||||
"backgroundSnowyTempleText": "Temple Enneigé",
|
||||
"backgroundSnowyTempleNotes": "Contemplez un Temple Enneigé serein.",
|
||||
"backgroundWinterLakeWithSwansText": "Lac d'Hiver avec des Cygnes",
|
||||
"backgroundWinterLakeWithSwansNotes": "Profitez de la nature près d'un Lac d'Hiver avec des Cygnes.",
|
||||
"eventBackgrounds": "Arrière-plans Événementiels",
|
||||
"backgroundBirthdayBashText": "Fête d'Anniversaire",
|
||||
"backgroundBirthdayBashNotes": "Habitica fait une fête d'anniversaire, et tout le monde est invité !",
|
||||
"backgrounds022023": "Ensemble 105 : sorti en février 2023",
|
||||
"backgroundInFrontOfFountainText": "Devant une fontaine",
|
||||
"backgroundInFrontOfFountainNotes": "Baladez-vous devant une fontaine.",
|
||||
"backgroundGoldenBirdcageText": "Cage à oiseau dorée",
|
||||
"backgroundGoldenBirdcageNotes": "Cachez-vous dans une cage à oiseau dorée.",
|
||||
"backgroundFancyBedroomText": "Chambre fantaisiste",
|
||||
"backgroundFancyBedroomNotes": "Amusez-vous dans une chambre fantaisiste.",
|
||||
"backgroundOldTimeyBasketballCourtNotes": "Faites des tirs sur un vieux terrain de basket.",
|
||||
"backgroundJungleWateringHoleText": "Point d'eau dans la jungle",
|
||||
"backgroundInFrontOfFountainText": "Devant une Fontaine",
|
||||
"backgroundInFrontOfFountainNotes": "Baladez-vous devant une Fontaine.",
|
||||
"backgroundGoldenBirdcageText": "Cage à Oiseau Dorée",
|
||||
"backgroundGoldenBirdcageNotes": "Cachez-vous dans une Cage à Oiseau Dorée.",
|
||||
"backgroundFancyBedroomText": "Chambre Raffinée",
|
||||
"backgroundFancyBedroomNotes": "Amusez-vous dans une Chambre Raffinée.",
|
||||
"backgroundOldTimeyBasketballCourtNotes": "Faites des tirs sur un Vieux Terrain de Basket.",
|
||||
"backgroundJungleWateringHoleText": "Point d'Eau dans la Jungle",
|
||||
"backgroundMangroveForestText": "Mangrove",
|
||||
"backgrounds032023": "Ensemble 106 : sorti en mars 2023",
|
||||
"backgroundOldTimeyBasketballCourtText": "Vieux terrain de basket",
|
||||
"backgroundJungleWateringHoleNotes": "Arrêtez vous pour vous désaltérer à un point d'eau dans la jungle.",
|
||||
"backgroundMangroveForestNotes": "Explorez les abords d'une mangrove.",
|
||||
"backgroundInAPaintingText": "Dans une peinture",
|
||||
"backgroundFlyingOverHedgeMazeText": "Survolant un labyrinthe de haies",
|
||||
"backgroundInAPaintingNotes": "Profitez d'activités créatives dans une peinture.",
|
||||
"backgroundFlyingOverHedgeMazeNotes": "Émerveillez-vous en survolant un labyrinthe de haies.",
|
||||
"backgroundLeafyTreeTunnelText": "Tunnel d'arbre feuillu",
|
||||
"backgroundSpringtimeShowerText": "Douche de printemps",
|
||||
"backgroundOldTimeyBasketballCourtText": "Vieux Terrain de Basket",
|
||||
"backgroundJungleWateringHoleNotes": "Arrêtez vous pour vous désaltérer à un Point d'Eau dans la Jungle.",
|
||||
"backgroundMangroveForestNotes": "Explorez les abords d'une Mangrove.",
|
||||
"backgroundInAPaintingText": "Dans une Peinture",
|
||||
"backgroundFlyingOverHedgeMazeText": "Survolant un Labyrinthe de Haies",
|
||||
"backgroundInAPaintingNotes": "Profitez d'activités créatives Dans une Peinture.",
|
||||
"backgroundFlyingOverHedgeMazeNotes": "Émerveillez-vous en Survolant un Labyrinthe de Haies.",
|
||||
"backgroundLeafyTreeTunnelText": "Tunnel de l'Arbre Feuillu",
|
||||
"backgroundSpringtimeShowerText": "Douche de Printemps",
|
||||
"backgrounds042023": "Ensemble 107 : sorti en avril 2023",
|
||||
"backgroundSpringtimeShowerNotes": "Regardez une douche printanière florale.",
|
||||
"backgroundUnderWisteriaText": "Sous la glycine",
|
||||
"backgroundUnderWisteriaNotes": "Relaxez-vous sous la glycine.",
|
||||
"backgroundSpringtimeShowerNotes": "Regardez une Douche de Printemps Florale.",
|
||||
"backgroundUnderWisteriaText": "Sous la Glycine",
|
||||
"backgroundUnderWisteriaNotes": "Relaxez-vous sous la Glycine.",
|
||||
"backgrounds052023": "Ensemble 108 : sorti en mai 2023",
|
||||
"backgroundCretaceousForestNotes": "Imprégnez-vous de l'ancienne verdure d'une forêt du crétacé.",
|
||||
"backgroundCretaceousForestNotes": "Imprégnez-vous de l'ancienne verdure d'une Forêt du Crétacé.",
|
||||
"backgrounds062023": "Ensemble 109 : sorti en juin 2023",
|
||||
"backgroundInAnAquariumText": "Dans un aquarium",
|
||||
"backgroundInAnAquariumNotes": "Nagez paisiblement avec les poissons dans un aquarium.",
|
||||
"backgroundInsideAdventurersHideoutText": "Dans la cachette d'une aventurière",
|
||||
"backgroundCraterLakeText": "Lac de cratère",
|
||||
"backgroundCraterLakeNotes": "Admirez un magnifique lac de cratère.",
|
||||
"backgroundLeafyTreeTunnelNotes": "Promenez-vous dans un tunnel d'arbre feuillu.",
|
||||
"backgroundInAnAquariumText": "Dans un Aquarium",
|
||||
"backgroundInAnAquariumNotes": "Nagez paisiblement avec les poissons Dans un Aquarium.",
|
||||
"backgroundInsideAdventurersHideoutText": "Dans la Cachette de l'Aventurière",
|
||||
"backgroundCraterLakeText": "Lac de Cratère",
|
||||
"backgroundCraterLakeNotes": "Admirez un magnifique Lac de Cratère.",
|
||||
"backgroundLeafyTreeTunnelNotes": "Promenez-vous dans le Tunnel de l'Arbre Feuillu.",
|
||||
"backgroundCretaceousForestText": "Forêt du Crétacé",
|
||||
"backgroundInsideAdventurersHideoutNotes": "Planifiez votre voyage dans la cachette d'une aventurière.",
|
||||
"backgroundColorfulCoralText": "Corail coloré",
|
||||
"backgroundRockGardenText": "Jardin de rocaille",
|
||||
"backgroundRockGardenNotes": "Détendez-vous dans un jardin de rocaille.",
|
||||
"backgroundInsideAdventurersHideoutNotes": "Planifiez votre voyage Dans la Cachette de l'Aventurière.",
|
||||
"backgroundColorfulCoralText": "Coraux Colorés",
|
||||
"backgroundRockGardenText": "Jardin de Rocaille",
|
||||
"backgroundRockGardenNotes": "Détendez-vous dans un Jardin de Rocaille.",
|
||||
"backgrounds072023": "Ensemble 110 : sorti Juillet 2023",
|
||||
"backgroundColorfulCoralNotes": "Plongez parmi les coraux colorés.",
|
||||
"backgroundColorfulCoralNotes": "Plongez parmi les Coraux Colorés.",
|
||||
"backgrounds082023": "Ensemble 111 : sorti août 2023",
|
||||
"backgroundBonsaiCollectionText": "Collection de bonsaïs",
|
||||
"backgroundBonsaiCollectionNotes": "Admirez une magnifique collection de bonsaïs.",
|
||||
"backgroundOnAPaddlewheelBoatText": "Sur un Bateau à roues à aubes",
|
||||
"backgroundOnAPaddlewheelBoatNotes": "Voyage sur un Bateau à roues à aubes.",
|
||||
"backgroundBoardwalkIntoSunsetText": "Promenade au Coucher de soleil",
|
||||
"backgroundBonsaiCollectionText": "Collection de Bonsaïs",
|
||||
"backgroundBonsaiCollectionNotes": "Admirez une magnifique Collection de Bonsaïs.",
|
||||
"backgroundOnAPaddlewheelBoatText": "Sur un Bateau à Roues à Aubes",
|
||||
"backgroundOnAPaddlewheelBoatNotes": "Voyage sur un Bateau à Roues à Aubes.",
|
||||
"backgroundBoardwalkIntoSunsetText": "Promenade au Coucher du Soleil",
|
||||
"backgroundDreamyIslandText": "Île de Rêve",
|
||||
"backgroundDreamyIslandNotes": "Appréciez le décor d'une Île de Rêve.",
|
||||
"backgroundBoardwalkIntoSunsetNotes": "Balade sur un Promenade au Coucher de soleil.",
|
||||
"backgrounds092023": "Ensemble 112 : Sorti en Septembre 2023",
|
||||
"backgroundBoardwalkIntoSunsetNotes": "Balade sur un Promenade au Coucher du Soleil.",
|
||||
"backgrounds092023": "Ensemble 112 : sorti en Septembre 2023",
|
||||
"backgroundMovingDayText": "Jour de Déménagement",
|
||||
"backgroundMovingDayNotes": "Faites vos cartons pour le Jour du Déménagement.",
|
||||
"backgroundCoveredBridgeInAutumnText": "Pont automnal couvert",
|
||||
"backgroundCoveredBridgeInAutumnText": "Pont Couvert en Automne",
|
||||
"backgroundCoveredBridgeInAutumnNotes": "Traverser un Pont Couvert en Automne.",
|
||||
"backgroundBaobabForestText": "Forêt de Baobab",
|
||||
"backgroundBaobabForestNotes": "Observez avec émerveillement la Forêt de Baobab.",
|
||||
@@ -815,24 +815,24 @@
|
||||
"backgroundMonstrousCaveText": "Cave Monstrueuse",
|
||||
"backgroundMonstrousCaveNotes": "Plongez votre regard dans la gueule de la Cave Monstrueuse.",
|
||||
"backgroundJackOLanternStacksText": "Tas de Citrouilles d'Halloween",
|
||||
"backgrounds102023": "Ensemble 113 : Sortie Octobre 2023",
|
||||
"backgrounds102023": "Ensemble 113 : sorti en octobre 2023",
|
||||
"backgroundJackOLanternStacksNotes": "Admirez un champ de Tas de Citrouilles d'Halloween.",
|
||||
"backgroundSpectralCandleRoomText": "Salle des Bougies Spectrales",
|
||||
"backgroundGiantCatText": "Chat Géant",
|
||||
"backgroundBarrelCellarText": "Cellier de Tonneaux",
|
||||
"backgroundAutumnTreeTunnelText": "Tunnel d'Arbres d'Automne",
|
||||
"backgroundAutumnTreeTunnelNotes": "Appréciez la beauté d'un Tunnel d'Arbres d'Automne.",
|
||||
"backgrounds112023": "Ensemble 114 : Sorti en Novembre 2023",
|
||||
"backgrounds112023": "Ensemble 114 : sorti en novembre 2023",
|
||||
"backgroundGiantCatNotes": "Faites une sieste avec un Chat Géant.",
|
||||
"backgroundBarrelCellarNotes": "Recherchez des délices culinaires dans un Cellier à Tonneaux.",
|
||||
"backgroundHolidayTreeForestText": "Forêt de l'Arbre des Fêtes",
|
||||
"backgroundHolidayTreeForestNotes": "Décorez un Arbre des Fêtes dans une Forêt.",
|
||||
"backgroundHolidayTreeForestText": "Forêt de Sapins de Noël",
|
||||
"backgroundHolidayTreeForestNotes": "Décorez un Sapin de Noël dans une Forêt.",
|
||||
"backgroundIceSculptureFestivalText": "Festival de Sculpture de Glace",
|
||||
"backgroundWinterFullMoonText": "Pleine Lune d'Hiver",
|
||||
"backgroundWinterFullMoonText": "Pleine Lune Hivernale",
|
||||
"backgroundWinterFullMoonNotes": "Admirez la Pleine Lune Hivernale.",
|
||||
"backgrounds122023": "Ensemble 115 : Sorti en Décembre 2023",
|
||||
"backgrounds122023": "Ensemble 115 : sorti en décembre 2023",
|
||||
"backgroundIceSculptureFestivalNotes": "Visitez un Festival de Sculpture de Glace.",
|
||||
"backgrounds012024": "Ensemble 116 : Sorti en Janvier 2024",
|
||||
"backgrounds012024": "Ensemble 116 : sorti en janvier 2024",
|
||||
"backgroundWinterMountainRangeText": "Chaîne de Montagne Hivernale",
|
||||
"backgroundWinterMountainRangeNotes": "Escalader une Chaîne de Montagne Hivernale.",
|
||||
"backgroundFrozenBluePondText": "Lagon Bleu Gelé",
|
||||
@@ -842,48 +842,51 @@
|
||||
"backgroundColorfulStreetText": "Rue Colorée",
|
||||
"backgroundSwanBoatText": "Bateau-Cygne",
|
||||
"backgroundSwanBoatNotes": "Faire une balade en Bateau-Cygne.",
|
||||
"backgroundHeartTreeTunnelText": "Tunnel de l'Arbre Coeur",
|
||||
"backgrounds022024": "SET 117 : Sorti en Février 2024",
|
||||
"backgroundHeartTreeTunnelText": "Tunnel de l'Arbre Cœur",
|
||||
"backgrounds022024": "Ensemble 117 : sorti en février 2024",
|
||||
"backgroundColorfulStreetNotes": "En train de voir une Rue Colorée.",
|
||||
"backgroundHeartTreeTunnelNotes": "Dériver au travers du Tunnel de l'Arbre Coeur.",
|
||||
"backgrounds032024": "Ensemble 118 : Sortie Mars 2024",
|
||||
"backgroundHeartTreeTunnelNotes": "Dériver au travers du Tunnel de l'Arbre Cœur.",
|
||||
"backgrounds032024": "Ensemble 118 : sorti en mars 2024",
|
||||
"backgroundFloweringForestText": "Forêt en Fleur",
|
||||
"backgroundFloweringForestNotes": "Inspirez profondément le parfum d'un Forêt en Fleur.",
|
||||
"backgroundRainyRainforestText": "Forêt Tropicale sous la Pluie",
|
||||
"backgroundRainyRainforestNotes": "Appréciez une averse rafraîchissante dans une Forêt Tropicale sous la Pluie.",
|
||||
"backgroundDogParkText": "Parc Canin",
|
||||
"backgroundDogParkNotes": "Folâtrer gaiement au Parc Canin.",
|
||||
"backgrounds042024": "Ensemble 119 : Sortie Avril 2024",
|
||||
"backgroundForestSunsetText": "Crépuscule sur la Forêt",
|
||||
"backgroundForestSunsetNotes": "Laissez-vous enchanter par la lueur de ce Crépuscule forestier.",
|
||||
"backgrounds042024": "Ensemble 119 : sorti en avril 2024",
|
||||
"backgroundForestSunsetText": "Crépuscule Forestier",
|
||||
"backgroundForestSunsetNotes": "Laissez-vous enchanter par la lueur de ce Crépuscule Forestier.",
|
||||
"backgroundWallFloweringVinesText": "Mur de Vignes en Fleur",
|
||||
"backgroundWallFloweringVinesNotes": "Baladez-vous près d'un mur de Vignes en Fleur.",
|
||||
"backgroundContainerGardenText": "Jardin de Cultivation",
|
||||
"backgroundContainerGardenNotes": "Salissez-vous les mains dans ce Jardin de Cultivation.",
|
||||
"backgroundDragonsBackText": "À dos de Dragon",
|
||||
"backgroundDragonsBackNotes": "Parcourez les cieux sur le Dos d'un Dragon.",
|
||||
"backgroundDragonsBackNotes": "Parcourez les cieux à Dos de Dragon.",
|
||||
"backgroundMaypoleText": "Arbre de Mai",
|
||||
"backgroundMaypoleNotes": "Dansez autour d'un bel Arbre de Mai.",
|
||||
"backgroundPottersStudioNotes": "Créez des œuvres d'art dans le Studio de Poti·er·ère.",
|
||||
"backgroundPottersStudioText": "Studio de Poti·er·ère",
|
||||
"backgrounds052024": "Ensemble 120 : Sorti en Mai 2024",
|
||||
"backgrounds062024": "Ensemble 121 : Sorti Juin 2024",
|
||||
"backgrounds052024": "Ensemble 120 : sorti en mai 2024",
|
||||
"backgrounds062024": "Ensemble 121 : sorti en juin 2024",
|
||||
"backgroundShellGateText": "Portail de Coquillages",
|
||||
"backgrounds072024": "Ensemble 122 : Sorti Juillet 2024",
|
||||
"backgrounds072024": "Ensemble 122 : sorti en juillet 2024",
|
||||
"backgroundRiverBottomText": "Fond de Rivière",
|
||||
"backgroundRiverBottomNotes": "Explorez le Fond d'une Rivière.",
|
||||
"monthlyBackgrounds": "Arrière-plans Mensuels",
|
||||
"backgroundShellGateNotes": "Passez sous les coraux ornant un Portail de Coquillages.",
|
||||
"backgrounds082024": "Ensemble 123 : Sorti Août 2024",
|
||||
"backgrounds082024": "Ensemble 123 : sorti en août 2024",
|
||||
"backgroundSavannaText": "Pâturage sous la Brume",
|
||||
"backgroundSavannaNotes": "Randonnez à travers des Pâturages sous la Brume.",
|
||||
"backgroundMagicDoorInForestText": "Porte Magique dans la Forêt",
|
||||
"backgroundMagicDoorInForestNotes": "Osez franchir la Porte Magique pour entrer dans la Forêt.",
|
||||
"backgrounds092024": "Ensemble 124 : Sortie septembre 2024",
|
||||
"backgroundMagicDoorInForestNotes": "Osez franchir la Porte Magique dans la Forêt.",
|
||||
"backgrounds092024": "Ensemble 124 : sorti en septembre 2024",
|
||||
"backgroundSurroundedByGhostsText": "Entouré·e de Fantômes",
|
||||
"backgrounds102024": "Ensemble 125 : Sortie Octobre 2024",
|
||||
"backgroundSurroundedByGhostsNotes": "Passez une soirée Entouré·e de Fantômes qui vous donnera la chair de poule.",
|
||||
"backgrounds112024": "Ensemble 125 : Sortie Novembre 2024",
|
||||
"backgrounds102024": "Ensemble 125 : sortie en octobre 2024",
|
||||
"backgroundSurroundedByGhostsNotes": "Passez une soirée Entouré·e de Fantômes qui vous donneront la chair de poule.",
|
||||
"backgrounds112024": "Ensemble 125 : sorti en novembre 2024",
|
||||
"backgroundCastleHallWithHearthText": "Âtre dans le Hall du Château",
|
||||
"backgroundCastleHallWithHearthNotes": "Prélassez-vous dans la chaleur de l'Âtre du le Hall du Château."
|
||||
"backgroundCastleHallWithHearthNotes": "Prélassez-vous dans la chaleur de l'Âtre du le Hall du Château.",
|
||||
"backgroundFirstSnowForestText": "Première Neige dans la Forêt",
|
||||
"backgroundFirstSnowForestNotes": "Avancez sous la Première Neige dans la Forêt.",
|
||||
"backgrounds122024": "Ensemble 127 : sorti en décembre 2024"
|
||||
}
|
||||
|
||||
@@ -638,6 +638,9 @@ const backgrounds = {
|
||||
backgrounds112024: {
|
||||
castle_hall_with_hearth: { },
|
||||
},
|
||||
backgrounds122024: {
|
||||
first_snow_forest: { },
|
||||
},
|
||||
eventBackgrounds: {
|
||||
birthday_bash: {
|
||||
price: 0,
|
||||
|
||||
@@ -13,6 +13,7 @@ export const ARMOIRE_RELEASE_DATES = {
|
||||
funnyFoolSet: { year: 2024, month: 9 },
|
||||
frightNightSet: { year: 2024, month: 10 },
|
||||
stormKnightSet: { year: 2024, month: 11 },
|
||||
festiveHelperSet: { year: 2024, month: 12 },
|
||||
};
|
||||
|
||||
export const EGGS_RELEASE_DATES = {
|
||||
@@ -25,4 +26,5 @@ export const EGGS_RELEASE_DATES = {
|
||||
|
||||
export const HATCHING_POTIONS_RELEASE_DATES = {
|
||||
Koi: { year: 2024, month: 6, day: 1 },
|
||||
Gingerbread: { year: 2024, month: 12, day: 21 },
|
||||
};
|
||||
|
||||
@@ -648,6 +648,7 @@ export const MONTHLY_SCHEDULE = {
|
||||
items: [
|
||||
'Peppermint',
|
||||
'Holly',
|
||||
'Gingerbread',
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -57,6 +57,11 @@ const SEASONAL_SETS = {
|
||||
'winter2024PeppermintBarkWarriorSet',
|
||||
'winter2024NarwhalWizardMageSet',
|
||||
'winter2024FrozenHealerSet',
|
||||
|
||||
'winter2025MooseWarriorSet',
|
||||
'winter2025AuroraMageSet',
|
||||
'winter2025StringLightsHealerSet',
|
||||
'winter2025SnowRogueSet',
|
||||
],
|
||||
spring: [
|
||||
// spring 2014
|
||||
|
||||
@@ -502,6 +502,10 @@ const armor = {
|
||||
per: 11,
|
||||
set: 'stormKnightSet',
|
||||
},
|
||||
festiveHelperOveralls: {
|
||||
con: 12,
|
||||
set: 'festiveHelperSet',
|
||||
},
|
||||
};
|
||||
|
||||
const body = {
|
||||
@@ -1027,6 +1031,10 @@ const head = {
|
||||
con: 11,
|
||||
set: 'stormKnightSet',
|
||||
},
|
||||
festiveHelperHat: {
|
||||
int: 12,
|
||||
set: 'festiveHelperSet',
|
||||
},
|
||||
};
|
||||
|
||||
const shield = {
|
||||
|
||||
@@ -67,6 +67,7 @@ const armor = {
|
||||
202401: { },
|
||||
202406: { },
|
||||
202407: { },
|
||||
202412: { },
|
||||
301404: { },
|
||||
301703: { },
|
||||
301704: { },
|
||||
@@ -232,6 +233,7 @@ const head = {
|
||||
202407: { },
|
||||
202409: { },
|
||||
202411: { },
|
||||
202412: { },
|
||||
301404: { },
|
||||
301405: { },
|
||||
301703: { },
|
||||
|
||||
@@ -779,6 +779,18 @@ const armor = {
|
||||
fall2024Rogue: {
|
||||
set: 'fall2024BlackCatRogueSet',
|
||||
},
|
||||
winter2025Warrior: {
|
||||
set: 'winter2025MooseWarriorSet',
|
||||
},
|
||||
winter2025Mage: {
|
||||
set: 'winter2025AuroraMageSet',
|
||||
},
|
||||
winter2025Healer: {
|
||||
set: 'winter2025StringLightsHealerSet',
|
||||
},
|
||||
winter2025Rogue: {
|
||||
set: 'winter2025SnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
const armorStats = {
|
||||
@@ -1868,6 +1880,18 @@ const head = {
|
||||
fall2024Rogue: {
|
||||
set: 'fall2024BlackCatRogueSet',
|
||||
},
|
||||
winter2025Warrior: {
|
||||
set: 'winter2025MooseWarriorSet',
|
||||
},
|
||||
winter2025Mage: {
|
||||
set: 'winter2025AuroraMageSet',
|
||||
},
|
||||
winter2025Healer: {
|
||||
set: 'winter2025StringLightsHealerSet',
|
||||
},
|
||||
winter2025Rogue: {
|
||||
set: 'winter2025SnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
const headStats = {
|
||||
@@ -2558,6 +2582,15 @@ const shield = {
|
||||
fall2024Rogue: {
|
||||
set: 'fall2024BlackCatRogueSet',
|
||||
},
|
||||
winter2025Warrior: {
|
||||
set: 'winter2025MooseWarriorSet',
|
||||
},
|
||||
winter2025Healer: {
|
||||
set: 'winter2025StringLightsHealerSet',
|
||||
},
|
||||
winter2025Rogue: {
|
||||
set: 'winter2025SnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
const shieldStats = {
|
||||
@@ -3237,6 +3270,18 @@ const weapon = {
|
||||
fall2024Rogue: {
|
||||
set: 'fall2024BlackCatRogueSet',
|
||||
},
|
||||
winter2025Warrior: {
|
||||
set: 'winter2025MooseWarriorSet',
|
||||
},
|
||||
winter2025Mage: {
|
||||
set: 'winter2025AuroraMageSet',
|
||||
},
|
||||
winter2025Healer: {
|
||||
set: 'winter2025StringLightsHealerSet',
|
||||
},
|
||||
winter2025Rogue: {
|
||||
set: 'winter2025SnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
const weaponStats = {
|
||||
|
||||
@@ -127,6 +127,7 @@ const premium = {
|
||||
},
|
||||
RoseGold: {},
|
||||
Koi: {},
|
||||
Gingerbread: {},
|
||||
};
|
||||
|
||||
const wacky = {
|
||||
|
||||
@@ -23,7 +23,8 @@ function safeGetSet (currentEvent, year, className) {
|
||||
}
|
||||
|
||||
function getCurrentSeasonalSets (currentEvent) {
|
||||
const year = new Date().getFullYear();
|
||||
const now = new Date();
|
||||
const year = now.getMonth() === 11 ? now.getFullYear() + 1 : now.getFullYear();
|
||||
return {
|
||||
rogue: safeGetSet(currentEvent, year, 'Rogue'),
|
||||
warrior: safeGetSet(currentEvent, year, 'Warrior'),
|
||||
|
||||
@@ -47,6 +47,7 @@ export async function createCheckoutSession (options, stripeInc) {
|
||||
userId: user._id,
|
||||
gift: gift ? JSON.stringify(gift) : undefined,
|
||||
sub: sub ? JSON.stringify(sub) : undefined,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
let lineItems;
|
||||
@@ -141,6 +142,7 @@ export async function createEditCardCheckoutSession (options, stripeInc) {
|
||||
const metadata = {
|
||||
type,
|
||||
userId: user._id,
|
||||
server_url: BASE_URL,
|
||||
};
|
||||
|
||||
let customerId;
|
||||
|
||||
@@ -19,6 +19,8 @@ import { applySubscription, handlePaymentMethodChange } from './subscriptions';
|
||||
|
||||
const endpointSecret = nconf.get('STRIPE_WEBHOOKS_ENDPOINT_SECRET');
|
||||
|
||||
const BASE_URL = nconf.get('BASE_URL');
|
||||
|
||||
export async function handleWebhooks (options, stripeInc) {
|
||||
const { body, headers } = options;
|
||||
|
||||
@@ -67,6 +69,10 @@ export async function handleWebhooks (options, stripeInc) {
|
||||
const session = event.data.object;
|
||||
const { metadata } = session;
|
||||
|
||||
if (metadata.server_url !== BASE_URL) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (metadata.type === 'edit-card-group' || metadata.type === 'edit-card-user') {
|
||||
await handlePaymentMethodChange(session);
|
||||
} else if (metadata.type === 'subscription') {
|
||||
|
||||
Reference in New Issue
Block a user