Compare commits
63 Commits
fiz/respon
...
fiz/confir
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6119be55ca | ||
|
|
e0ac4c128a | ||
|
|
502dff7bb3 | ||
|
|
8cfe46f94c | ||
|
|
1b7af0d93d | ||
|
|
f3f0a70158 | ||
|
|
2a1786c1ea | ||
|
|
af6715501b | ||
|
|
23e5f6c5fd | ||
|
|
1d14bddeb8 | ||
|
|
e45c98ee34 | ||
|
|
348b50d923 | ||
|
|
1f016b0672 | ||
|
|
fee80c8b32 | ||
|
|
e0af620b40 | ||
|
|
bb295551b5 | ||
|
|
fce400f323 | ||
|
|
c0ffb8b968 | ||
|
|
72539f9ba3 | ||
|
|
dabd466719 | ||
|
|
8bf2304330 | ||
|
|
6937dc4e4e | ||
|
|
2917955ef0 | ||
|
|
55d13e44d4 | ||
|
|
90096f995f | ||
|
|
5c74c2b914 | ||
|
|
1f1a44e16f | ||
|
|
a275109a3e | ||
|
|
c65457690b | ||
|
|
f740f12b97 | ||
|
|
9fd0bfae46 | ||
|
|
bee23efbef | ||
|
|
a504b18ce4 | ||
|
|
f556b102c6 | ||
|
|
ac62de7bd8 | ||
|
|
5ff3cc35a6 | ||
|
|
215e5e1c40 | ||
|
|
02ca96ea51 | ||
|
|
e70ae4e9aa | ||
|
|
e2bf8ae493 | ||
|
|
931a70a797 | ||
|
|
e2d2a05315 | ||
|
|
be041f734d | ||
|
|
c430d2279c | ||
|
|
ef592cf35f | ||
|
|
f24cd10a79 | ||
|
|
2cd4e45016 | ||
|
|
8aaff7ae23 | ||
|
|
69a9fb89ef | ||
|
|
e8eeb76cab | ||
|
|
2029739a1b | ||
|
|
5cef106ea5 | ||
|
|
e096d7ac42 | ||
|
|
6db998e726 | ||
|
|
29c658b042 | ||
|
|
66710b8f38 | ||
|
|
c77db3d625 | ||
|
|
c947fa97d9 | ||
|
|
b2b9702797 | ||
|
|
e92503f032 | ||
|
|
8faa5b0582 | ||
|
|
95494c685b | ||
|
|
10978d46ab |
@@ -73,7 +73,7 @@ export default async function processUsers () {
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
query._id = {
|
query._id = {
|
||||||
$gt: users[users.length - 1],
|
$gt: users[users.length - 1]._id,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
89
package-lock.json
generated
@@ -1,18 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "habitica",
|
"name": "habitica",
|
||||||
"version": "5.41.0",
|
"version": "5.42.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "habitica",
|
"name": "habitica",
|
||||||
"version": "5.41.0",
|
"version": "5.42.3",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.22.10",
|
"@babel/core": "^7.22.10",
|
||||||
"@babel/preset-env": "^7.22.10",
|
"@babel/preset-env": "^7.22.10",
|
||||||
"@babel/register": "^7.22.15",
|
"@babel/register": "^7.22.15",
|
||||||
"@google-analytics/data": "^4.12.1",
|
|
||||||
"@google-cloud/trace-agent": "^7.1.2",
|
"@google-cloud/trace-agent": "^7.1.2",
|
||||||
"@parse/node-apn": "^5.2.3",
|
"@parse/node-apn": "^5.2.3",
|
||||||
"@slack/webhook": "^6.1.0",
|
"@slack/webhook": "^6.1.0",
|
||||||
@@ -1975,17 +1974,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
||||||
},
|
},
|
||||||
"node_modules/@google-analytics/data": {
|
|
||||||
"version": "4.12.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@google-analytics/data/-/data-4.12.1.tgz",
|
|
||||||
"integrity": "sha512-LzyrkVrnVUTYTmdmHayOZoroc+YA9GHEUrkSSuiXSmMSNbesuWy/MoTXugC1V7+8PCGqb2eQ1UtVVv/2BCAQYA==",
|
|
||||||
"dependencies": {
|
|
||||||
"google-gax": "^4.0.3"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@google-cloud/common": {
|
"node_modules/@google-cloud/common": {
|
||||||
"version": "4.0.3",
|
"version": "4.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
|
||||||
@@ -2329,6 +2317,7 @@
|
|||||||
"version": "1.10.8",
|
"version": "1.10.8",
|
||||||
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz",
|
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz",
|
||||||
"integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==",
|
"integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grpc/proto-loader": "^0.7.13",
|
"@grpc/proto-loader": "^0.7.13",
|
||||||
"@js-sdsl/ordered-map": "^4.4.2"
|
"@js-sdsl/ordered-map": "^4.4.2"
|
||||||
@@ -2341,6 +2330,7 @@
|
|||||||
"version": "0.7.13",
|
"version": "0.7.13",
|
||||||
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
|
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
|
||||||
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
|
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lodash.camelcase": "^4.3.0",
|
"lodash.camelcase": "^4.3.0",
|
||||||
"long": "^5.0.0",
|
"long": "^5.0.0",
|
||||||
@@ -2358,6 +2348,7 @@
|
|||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
},
|
},
|
||||||
@@ -2372,6 +2363,7 @@
|
|||||||
"version": "8.0.1",
|
"version": "8.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
||||||
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"string-width": "^4.2.0",
|
"string-width": "^4.2.0",
|
||||||
"strip-ansi": "^6.0.1",
|
"strip-ansi": "^6.0.1",
|
||||||
@@ -2385,6 +2377,7 @@
|
|||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-name": "~1.1.4"
|
"color-name": "~1.1.4"
|
||||||
},
|
},
|
||||||
@@ -2395,12 +2388,14 @@
|
|||||||
"node_modules/@grpc/proto-loader/node_modules/color-name": {
|
"node_modules/@grpc/proto-loader/node_modules/color-name": {
|
||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@grpc/proto-loader/node_modules/get-caller-file": {
|
"node_modules/@grpc/proto-loader/node_modules/get-caller-file": {
|
||||||
"version": "2.0.5",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||||
|
"optional": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "6.* || 8.* || >= 10.*"
|
"node": "6.* || 8.* || >= 10.*"
|
||||||
}
|
}
|
||||||
@@ -2409,6 +2404,7 @@
|
|||||||
"version": "7.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-styles": "^4.0.0",
|
"ansi-styles": "^4.0.0",
|
||||||
"string-width": "^4.1.0",
|
"string-width": "^4.1.0",
|
||||||
@@ -2425,6 +2421,7 @@
|
|||||||
"version": "5.0.8",
|
"version": "5.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
||||||
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
||||||
|
"optional": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
@@ -2433,6 +2430,7 @@
|
|||||||
"version": "17.7.2",
|
"version": "17.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
||||||
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cliui": "^8.0.1",
|
"cliui": "^8.0.1",
|
||||||
"escalade": "^3.1.1",
|
"escalade": "^3.1.1",
|
||||||
@@ -2450,6 +2448,7 @@
|
|||||||
"version": "21.1.1",
|
"version": "21.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
||||||
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
||||||
|
"optional": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
@@ -2620,6 +2619,7 @@
|
|||||||
"version": "4.4.2",
|
"version": "4.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
|
||||||
"integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
|
"integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
|
||||||
|
"optional": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/js-sdsl"
|
"url": "https://opencollective.com/js-sdsl"
|
||||||
@@ -2932,27 +2932,32 @@
|
|||||||
"node_modules/@protobufjs/aspromise": {
|
"node_modules/@protobufjs/aspromise": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
|
||||||
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
|
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/base64": {
|
"node_modules/@protobufjs/base64": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
|
||||||
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
|
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/codegen": {
|
"node_modules/@protobufjs/codegen": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
|
||||||
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
|
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/eventemitter": {
|
"node_modules/@protobufjs/eventemitter": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
|
||||||
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
|
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/fetch": {
|
"node_modules/@protobufjs/fetch": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
|
||||||
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
|
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@protobufjs/aspromise": "^1.1.1",
|
"@protobufjs/aspromise": "^1.1.1",
|
||||||
"@protobufjs/inquire": "^1.1.0"
|
"@protobufjs/inquire": "^1.1.0"
|
||||||
@@ -2961,27 +2966,32 @@
|
|||||||
"node_modules/@protobufjs/float": {
|
"node_modules/@protobufjs/float": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
|
||||||
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
|
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/inquire": {
|
"node_modules/@protobufjs/inquire": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
|
||||||
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
|
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/path": {
|
"node_modules/@protobufjs/path": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
|
||||||
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
|
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/pool": {
|
"node_modules/@protobufjs/pool": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
|
||||||
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
|
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@protobufjs/utf8": {
|
"node_modules/@protobufjs/utf8": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
|
||||||
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
|
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@sindresorhus/is": {
|
"node_modules/@sindresorhus/is": {
|
||||||
"version": "4.6.0",
|
"version": "4.6.0",
|
||||||
@@ -3116,7 +3126,8 @@
|
|||||||
"node_modules/@types/caseless": {
|
"node_modules/@types/caseless": {
|
||||||
"version": "0.12.5",
|
"version": "0.12.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz",
|
||||||
"integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="
|
"integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/connect": {
|
"node_modules/@types/connect": {
|
||||||
"version": "3.4.38",
|
"version": "3.4.38",
|
||||||
@@ -3219,7 +3230,8 @@
|
|||||||
"node_modules/@types/long": {
|
"node_modules/@types/long": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
|
||||||
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
|
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/mime": {
|
"node_modules/@types/mime": {
|
||||||
"version": "1.3.5",
|
"version": "1.3.5",
|
||||||
@@ -3269,6 +3281,7 @@
|
|||||||
"version": "2.48.12",
|
"version": "2.48.12",
|
||||||
"resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz",
|
"resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz",
|
||||||
"integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==",
|
"integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/caseless": "*",
|
"@types/caseless": "*",
|
||||||
"@types/node": "*",
|
"@types/node": "*",
|
||||||
@@ -3280,6 +3293,7 @@
|
|||||||
"version": "2.5.1",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
|
||||||
"integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
|
"integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"asynckit": "^0.4.0",
|
"asynckit": "^0.4.0",
|
||||||
"combined-stream": "^1.0.6",
|
"combined-stream": "^1.0.6",
|
||||||
@@ -3319,7 +3333,8 @@
|
|||||||
"node_modules/@types/tough-cookie": {
|
"node_modules/@types/tough-cookie": {
|
||||||
"version": "4.0.5",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
|
||||||
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
|
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/triple-beam": {
|
"node_modules/@types/triple-beam": {
|
||||||
"version": "1.3.5",
|
"version": "1.3.5",
|
||||||
@@ -3529,6 +3544,7 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
||||||
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"event-target-shim": "^5.0.0"
|
"event-target-shim": "^5.0.0"
|
||||||
},
|
},
|
||||||
@@ -9347,6 +9363,7 @@
|
|||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
||||||
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
|
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
|
||||||
|
"optional": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
@@ -11599,6 +11616,7 @@
|
|||||||
"version": "4.3.3",
|
"version": "4.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.3.tgz",
|
||||||
"integrity": "sha512-f4F2Y9X4+mqsrJuLZsuTljYuQpcBnQsCt9ScvZpdM8jGjqrcxyJi5JUiqtq0jtpdHVPzyit0N7f5t07e+kH5EA==",
|
"integrity": "sha512-f4F2Y9X4+mqsrJuLZsuTljYuQpcBnQsCt9ScvZpdM8jGjqrcxyJi5JUiqtq0jtpdHVPzyit0N7f5t07e+kH5EA==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grpc/grpc-js": "~1.10.3",
|
"@grpc/grpc-js": "~1.10.3",
|
||||||
"@grpc/proto-loader": "^0.7.0",
|
"@grpc/proto-loader": "^0.7.0",
|
||||||
@@ -11621,6 +11639,7 @@
|
|||||||
"version": "7.1.1",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
|
||||||
"integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
|
"integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
},
|
},
|
||||||
@@ -11632,6 +11651,7 @@
|
|||||||
"version": "6.6.0",
|
"version": "6.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
|
||||||
"integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==",
|
"integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"extend": "^3.0.2",
|
"extend": "^3.0.2",
|
||||||
"https-proxy-agent": "^7.0.1",
|
"https-proxy-agent": "^7.0.1",
|
||||||
@@ -11647,6 +11667,7 @@
|
|||||||
"version": "6.1.0",
|
"version": "6.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
|
||||||
"integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
|
"integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"gaxios": "^6.0.0",
|
"gaxios": "^6.0.0",
|
||||||
"json-bigint": "^1.0.0"
|
"json-bigint": "^1.0.0"
|
||||||
@@ -11659,6 +11680,7 @@
|
|||||||
"version": "9.10.0",
|
"version": "9.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
|
||||||
"integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
|
"integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"base64-js": "^1.3.0",
|
"base64-js": "^1.3.0",
|
||||||
"ecdsa-sig-formatter": "^1.0.11",
|
"ecdsa-sig-formatter": "^1.0.11",
|
||||||
@@ -11675,6 +11697,7 @@
|
|||||||
"version": "7.1.0",
|
"version": "7.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
|
||||||
"integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
|
"integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"gaxios": "^6.0.0",
|
"gaxios": "^6.0.0",
|
||||||
"jws": "^4.0.0"
|
"jws": "^4.0.0"
|
||||||
@@ -11687,6 +11710,7 @@
|
|||||||
"version": "7.0.4",
|
"version": "7.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
|
||||||
"integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
|
"integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"agent-base": "^7.0.2",
|
"agent-base": "^7.0.2",
|
||||||
"debug": "4"
|
"debug": "4"
|
||||||
@@ -11700,6 +11724,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
|
||||||
"integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
|
"integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@protobufjs/aspromise": "^1.1.2",
|
"@protobufjs/aspromise": "^1.1.2",
|
||||||
"@protobufjs/base64": "^1.1.2",
|
"@protobufjs/base64": "^1.1.2",
|
||||||
@@ -11722,6 +11747,7 @@
|
|||||||
"version": "7.0.2",
|
"version": "7.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
|
||||||
"integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
|
"integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/request": "^2.48.8",
|
"@types/request": "^2.48.8",
|
||||||
"extend": "^3.0.2",
|
"extend": "^3.0.2",
|
||||||
@@ -11735,6 +11761,7 @@
|
|||||||
"version": "9.0.0",
|
"version": "9.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
|
||||||
"integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
|
"integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"http-proxy-agent": "^5.0.0",
|
"http-proxy-agent": "^5.0.0",
|
||||||
"https-proxy-agent": "^5.0.0",
|
"https-proxy-agent": "^5.0.0",
|
||||||
@@ -11750,6 +11777,7 @@
|
|||||||
"version": "6.0.2",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
||||||
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
|
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "4"
|
"debug": "4"
|
||||||
},
|
},
|
||||||
@@ -11761,6 +11789,7 @@
|
|||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
|
||||||
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
|
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"agent-base": "6",
|
"agent-base": "6",
|
||||||
"debug": "4"
|
"debug": "4"
|
||||||
@@ -14239,7 +14268,8 @@
|
|||||||
"node_modules/lodash.camelcase": {
|
"node_modules/lodash.camelcase": {
|
||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
|
||||||
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
|
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash.clonedeep": {
|
"node_modules/lodash.clonedeep": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
@@ -16662,6 +16692,7 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
|
||||||
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
|
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
|
||||||
|
"optional": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 6"
|
"node": ">= 6"
|
||||||
}
|
}
|
||||||
@@ -17884,6 +17915,7 @@
|
|||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz",
|
||||||
"integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==",
|
"integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==",
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"protobufjs": "^7.2.5"
|
"protobufjs": "^7.2.5"
|
||||||
},
|
},
|
||||||
@@ -17896,6 +17928,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz",
|
||||||
"integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==",
|
"integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@protobufjs/aspromise": "^1.1.2",
|
"@protobufjs/aspromise": "^1.1.2",
|
||||||
"@protobufjs/base64": "^1.1.2",
|
"@protobufjs/base64": "^1.1.2",
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "habitica",
|
"name": "habitica",
|
||||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||||
"version": "5.41.0",
|
"version": "5.42.3",
|
||||||
"main": "./website/server/index.js",
|
"main": "./website/server/index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.22.10",
|
"@babel/core": "^7.22.10",
|
||||||
"@babel/preset-env": "^7.22.10",
|
"@babel/preset-env": "^7.22.10",
|
||||||
"@babel/register": "^7.22.15",
|
"@babel/register": "^7.22.15",
|
||||||
"@google-analytics/data": "^4.12.1",
|
|
||||||
"@google-cloud/trace-agent": "^7.1.2",
|
"@google-cloud/trace-agent": "^7.1.2",
|
||||||
"@parse/node-apn": "^5.2.3",
|
"@parse/node-apn": "^5.2.3",
|
||||||
"@slack/webhook": "^6.1.0",
|
"@slack/webhook": "^6.1.0",
|
||||||
@@ -106,8 +105,8 @@
|
|||||||
"start": "node --watch ./website/server/index.js",
|
"start": "node --watch ./website/server/index.js",
|
||||||
"start:simple": "node ./website/server/index.js",
|
"start:simple": "node ./website/server/index.js",
|
||||||
"debug": "node --watch --inspect ./website/server/index.js",
|
"debug": "node --watch --inspect ./website/server/index.js",
|
||||||
"mongo:dev": "run-rs -v 7.0.23 -l ubuntu2204 --keep --dbpath mongodb-data --number 1 --quiet",
|
"mongo:dev": "run-rs -v 7.0.23 -l ubuntu2214 --keep --dbpath mongodb-data --number 1 --quiet",
|
||||||
"mongo:test": "run-rs -v 7.0.23 -l ubuntu2204 --keep --dbpath mongodb-data-testing --number 1 --quiet",
|
"mongo:test": "run-rs -v 7.0.23 -l ubuntu2214 --keep --dbpath mongodb-data-testing --number 1 --quiet",
|
||||||
"postinstall": "git config --global url.\"https://\".insteadOf git:// && gulp build && cd website/client && npm install",
|
"postinstall": "git config --global url.\"https://\".insteadOf git:// && gulp build && cd website/client && npm install",
|
||||||
"apidoc": "gulp apidoc",
|
"apidoc": "gulp apidoc",
|
||||||
"heroku-postbuild": ".heroku/report_deploy.sh"
|
"heroku-postbuild": ".heroku/report_deploy.sh"
|
||||||
|
|||||||
@@ -47,6 +47,12 @@ describe('highlightMentions', () => {
|
|||||||
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
|
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('highlights users with case-insensitive matching', async () => {
|
||||||
|
const text = '@USER: message @User2 @USER3';
|
||||||
|
const result = await highlightMentions(text);
|
||||||
|
expect(result[0]).to.equal('[@USER](/profile/111): message [@User2](/profile/222) [@USER3](/profile/333)');
|
||||||
|
});
|
||||||
|
|
||||||
it('doesn\'t highlight nonexisting users', async () => {
|
it('doesn\'t highlight nonexisting users', async () => {
|
||||||
const text = '@nouser message';
|
const text = '@nouser message';
|
||||||
const result = await highlightMentions(text);
|
const result = await highlightMentions(text);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
||||||
} from '../../../../../website/server/models/group';
|
} from '../../../../../website/server/models/group';
|
||||||
import { MAX_MESSAGE_LENGTH } from '../../../../../website/common/script/constants';
|
import { MAX_MESSAGE_LENGTH, CHAT_FLAG_FROM_SHADOW_MUTE } from '../../../../../website/common/script/constants';
|
||||||
import * as email from '../../../../../website/server/libs/email';
|
import * as email from '../../../../../website/server/libs/email';
|
||||||
|
|
||||||
describe('POST /chat', () => {
|
describe('POST /chat', () => {
|
||||||
@@ -80,17 +80,20 @@ describe('POST /chat', () => {
|
|||||||
member.updateOne({ 'flags.chatRevoked': false });
|
member.updateOne({ 'flags.chatRevoked': false });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not error when chat privileges are revoked when sending a message to a private guild', async () => {
|
it('errors when chat privileges are revoked when sending a message to a private guild', async () => {
|
||||||
await member.updateOne({
|
await member.updateOne({
|
||||||
'flags.chatRevoked': true,
|
'flags.chatRevoked': true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const message = await member.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
await expect(member.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }))
|
||||||
|
.to.eventually.be.rejected.and.eql({
|
||||||
expect(message.message.id).to.exist;
|
code: 401,
|
||||||
|
error: 'NotAuthorized',
|
||||||
|
message: t('chatPrivilegesRevoked'),
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not error when chat privileges are revoked when sending a message to a party', async () => {
|
it('errors when chat privileges are revoked when sending a message to a party', async () => {
|
||||||
const { group, members } = await createAndPopulateGroup({
|
const { group, members } = await createAndPopulateGroup({
|
||||||
groupDetails: {
|
groupDetails: {
|
||||||
name: 'Party',
|
name: 'Party',
|
||||||
@@ -106,9 +109,12 @@ describe('POST /chat', () => {
|
|||||||
'auth.timestamps.created': new Date('2022-01-01'),
|
'auth.timestamps.created': new Date('2022-01-01'),
|
||||||
});
|
});
|
||||||
|
|
||||||
const message = await privatePartyMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage });
|
await expect(privatePartyMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage }))
|
||||||
|
.to.eventually.be.rejected.and.eql({
|
||||||
expect(message.message.id).to.exist;
|
code: 401,
|
||||||
|
error: 'NotAuthorized',
|
||||||
|
message: t('chatPrivilegesRevoked'),
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -123,7 +129,7 @@ describe('POST /chat', () => {
|
|||||||
member.updateOne({ 'flags.chatShadowMuted': false });
|
member.updateOne({ 'flags.chatShadowMuted': false });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('creates a chat with zero flagCount when sending a message to a private guild', async () => {
|
it('creates a chat with flagCount set when sending a message to a private guild', async () => {
|
||||||
await member.updateOne({
|
await member.updateOne({
|
||||||
'flags.chatShadowMuted': true,
|
'flags.chatShadowMuted': true,
|
||||||
});
|
});
|
||||||
@@ -131,10 +137,10 @@ describe('POST /chat', () => {
|
|||||||
const message = await member.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
const message = await member.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
||||||
|
|
||||||
expect(message.message.id).to.exist;
|
expect(message.message.id).to.exist;
|
||||||
expect(message.message.flagCount).to.eql(0);
|
expect(message.message.flagCount).to.eql(CHAT_FLAG_FROM_SHADOW_MUTE);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('creates a chat with zero flagCount when sending a message to a party', async () => {
|
it('creates a chat with flagCount set when sending a message to a party', async () => {
|
||||||
const { group, members } = await createAndPopulateGroup({
|
const { group, members } = await createAndPopulateGroup({
|
||||||
groupDetails: {
|
groupDetails: {
|
||||||
name: 'Party',
|
name: 'Party',
|
||||||
@@ -153,7 +159,7 @@ describe('POST /chat', () => {
|
|||||||
const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage });
|
const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage });
|
||||||
|
|
||||||
expect(message.message.id).to.exist;
|
expect(message.message.id).to.exist;
|
||||||
expect(message.message.flagCount).to.eql(0);
|
expect(message.message.flagCount).to.eql(CHAT_FLAG_FROM_SHADOW_MUTE);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -238,6 +244,18 @@ describe('POST /chat', () => {
|
|||||||
expect(groupMessages[0].id).to.exist;
|
expect(groupMessages[0].id).to.exist;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('creates a chat with case-insensitive mentions', async () => {
|
||||||
|
const originalUsername = member.auth.local.username;
|
||||||
|
const uppercaseUsername = originalUsername.toUpperCase();
|
||||||
|
const messageWithMentions = `hi @${uppercaseUsername}`;
|
||||||
|
const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: messageWithMentions });
|
||||||
|
const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`);
|
||||||
|
|
||||||
|
expect(newMessage.message.id).to.exist;
|
||||||
|
expect(newMessage.message.text).to.include(`[@${uppercaseUsername}](/profile/${member._id})`);
|
||||||
|
expect(groupMessages[0].id).to.exist;
|
||||||
|
});
|
||||||
|
|
||||||
it('creates a chat with a max length of 3000 chars', async () => {
|
it('creates a chat with a max length of 3000 chars', async () => {
|
||||||
const veryLongMessage = `
|
const veryLongMessage = `
|
||||||
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789.
|
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789.
|
||||||
|
|||||||
@@ -61,6 +61,24 @@ describe('Post /groups/:groupId/invite', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fakes sending an invite if user is shadow muted', async () => {
|
||||||
|
const inviterMuted = await inviter.updateOne({ 'flags.chatShadowMuted': true });
|
||||||
|
const userToInvite = await generateUser();
|
||||||
|
|
||||||
|
const response = await inviterMuted.post(`/groups/${group._id}/invite`, {
|
||||||
|
usernames: [userToInvite.auth.local.lowerCaseUsername],
|
||||||
|
});
|
||||||
|
expect(response).to.be.an('Array');
|
||||||
|
expect(response[0]).to.have.all.keys(['_id', 'id', 'name', 'inviter']);
|
||||||
|
expect(response[0]._id).to.be.a('String');
|
||||||
|
expect(response[0].id).to.eql(group._id);
|
||||||
|
expect(response[0].name).to.eql(groupName);
|
||||||
|
expect(response[0].inviter).to.eql(inviter._id);
|
||||||
|
|
||||||
|
await expect(userToInvite.get('/user'))
|
||||||
|
.to.eventually.not.have.nested.property('invitations.parties[0].id', group._id);
|
||||||
|
});
|
||||||
|
|
||||||
it('invites a user to a group by username', async () => {
|
it('invites a user to a group by username', async () => {
|
||||||
const userToInvite = await generateUser();
|
const userToInvite = await generateUser();
|
||||||
|
|
||||||
@@ -209,6 +227,24 @@ describe('Post /groups/:groupId/invite', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fakes sending an invite if user is shadow muted', async () => {
|
||||||
|
const inviterMuted = await inviter.updateOne({ 'flags.chatShadowMuted': true });
|
||||||
|
const userToInvite = await generateUser();
|
||||||
|
|
||||||
|
const response = await inviterMuted.post(`/groups/${group._id}/invite`, {
|
||||||
|
uuids: [userToInvite._id],
|
||||||
|
});
|
||||||
|
expect(response).to.be.an('Array');
|
||||||
|
expect(response[0]).to.have.all.keys(['_id', 'id', 'name', 'inviter']);
|
||||||
|
expect(response[0]._id).to.be.a('String');
|
||||||
|
expect(response[0].id).to.eql(group._id);
|
||||||
|
expect(response[0].name).to.eql(groupName);
|
||||||
|
expect(response[0].inviter).to.eql(inviter._id);
|
||||||
|
|
||||||
|
await expect(userToInvite.get('/user'))
|
||||||
|
.to.eventually.not.have.nested.property('invitations.parties[0].id', group._id);
|
||||||
|
});
|
||||||
|
|
||||||
it('invites a user to a group by uuid', async () => {
|
it('invites a user to a group by uuid', async () => {
|
||||||
const userToInvite = await generateUser();
|
const userToInvite = await generateUser();
|
||||||
|
|
||||||
@@ -281,6 +317,19 @@ describe('Post /groups/:groupId/invite', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fakes sending invite when inviter is shadow muted', async () => {
|
||||||
|
const inviterMuted = await inviter.updateOne({ 'flags.chatShadowMuted': true });
|
||||||
|
const res = await inviterMuted.post(`/groups/${group._id}/invite`, {
|
||||||
|
emails: [testInvite],
|
||||||
|
inviter: 'inviter name',
|
||||||
|
});
|
||||||
|
|
||||||
|
const updatedUser = await inviterMuted.sync();
|
||||||
|
|
||||||
|
expect(res).to.exist;
|
||||||
|
expect(updatedUser.invitesSent).to.eql(1);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns an error when invite is missing an email', async () => {
|
it('returns an error when invite is missing an email', async () => {
|
||||||
await expect(inviter.post(`/groups/${group._id}/invite`, {
|
await expect(inviter.post(`/groups/${group._id}/invite`, {
|
||||||
emails: [{ name: 'test' }],
|
emails: [{ name: 'test' }],
|
||||||
@@ -405,6 +454,19 @@ describe('Post /groups/:groupId/invite', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fakes sending an invite if user is shadow muted', async () => {
|
||||||
|
const inviterMuted = await inviter.updateOne({ 'flags.chatShadowMuted': true });
|
||||||
|
const newUser = await generateUser();
|
||||||
|
const invite = await inviterMuted.post(`/groups/${group._id}/invite`, {
|
||||||
|
uuids: [newUser._id],
|
||||||
|
emails: [{ name: 'test', email: 'test@habitica.com' }],
|
||||||
|
});
|
||||||
|
const invitedUser = await newUser.get('/user');
|
||||||
|
|
||||||
|
expect(invitedUser.invitations.parties[0]).to.not.exist;
|
||||||
|
expect(invite).to.exist;
|
||||||
|
});
|
||||||
|
|
||||||
it('invites users to a group by uuid and email', async () => {
|
it('invites users to a group by uuid and email', async () => {
|
||||||
const newUser = await generateUser();
|
const newUser = await generateUser();
|
||||||
const invite = await inviter.post(`/groups/${group._id}/invite`, {
|
const invite = await inviter.post(`/groups/${group._id}/invite`, {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ describe('POST /members/send-private-message', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns error when to user has blocked the sender', async () => {
|
it('returns error when recipient has blocked the sender', async () => {
|
||||||
const receiver = await generateUser({ 'inbox.blocks': [userToSendMessage._id] });
|
const receiver = await generateUser({ 'inbox.blocks': [userToSendMessage._id] });
|
||||||
|
|
||||||
await expect(userToSendMessage.post('/members/send-private-message', {
|
await expect(userToSendMessage.post('/members/send-private-message', {
|
||||||
@@ -56,7 +56,7 @@ describe('POST /members/send-private-message', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns error when sender has blocked to user', async () => {
|
it('returns error when sender has blocked recipient', async () => {
|
||||||
const receiver = await generateUser();
|
const receiver = await generateUser();
|
||||||
const sender = await generateUser({ 'inbox.blocks': [receiver._id] });
|
const sender = await generateUser({ 'inbox.blocks': [receiver._id] });
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ describe('POST /members/send-private-message', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns error when to user has opted out of messaging', async () => {
|
it('returns error when recipient has opted out of messaging', async () => {
|
||||||
const receiver = await generateUser({ 'inbox.optOut': true });
|
const receiver = await generateUser({ 'inbox.optOut': true });
|
||||||
|
|
||||||
await expect(userToSendMessage.post('/members/send-private-message', {
|
await expect(userToSendMessage.post('/members/send-private-message', {
|
||||||
@@ -174,7 +174,7 @@ describe('POST /members/send-private-message', () => {
|
|||||||
expect(notification.data.excerpt).to.equal(messageExcerpt);
|
expect(notification.data.excerpt).to.equal(messageExcerpt);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('allows admin to send when sender has blocked the admin', async () => {
|
it('allows admin to send when recipient has blocked the admin', async () => {
|
||||||
userToSendMessage = await generateUser({
|
userToSendMessage = await generateUser({
|
||||||
'permissions.moderator': true,
|
'permissions.moderator': true,
|
||||||
});
|
});
|
||||||
@@ -202,7 +202,7 @@ describe('POST /members/send-private-message', () => {
|
|||||||
expect(sendersMessageInSendersInbox).to.exist;
|
expect(sendersMessageInSendersInbox).to.exist;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('allows admin to send when to user has opted out of messaging', async () => {
|
it('allows admin to send when recipient has opted out of messaging', async () => {
|
||||||
userToSendMessage = await generateUser({
|
userToSendMessage = await generateUser({
|
||||||
'permissions.moderator': true,
|
'permissions.moderator': true,
|
||||||
});
|
});
|
||||||
@@ -229,4 +229,58 @@ describe('POST /members/send-private-message', () => {
|
|||||||
expect(sendersMessageInReceiversInbox).to.exist;
|
expect(sendersMessageInReceiversInbox).to.exist;
|
||||||
expect(sendersMessageInSendersInbox).to.exist;
|
expect(sendersMessageInSendersInbox).to.exist;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('sender is shadow muted', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
userToSendMessage = await generateUser({
|
||||||
|
'flags.chatShadowMuted': true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not save the message in the receiver inbox', async () => {
|
||||||
|
const receiver = await generateUser();
|
||||||
|
|
||||||
|
const response = await userToSendMessage.post('/members/send-private-message', {
|
||||||
|
message: messageToSend,
|
||||||
|
toUserId: receiver._id,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.message.uuid).to.equal(receiver._id);
|
||||||
|
|
||||||
|
const updatedReceiver = await receiver.get('/user');
|
||||||
|
const updatedSender = await userToSendMessage.get('/user');
|
||||||
|
|
||||||
|
const sendersMessageInReceiversInbox = _.find(
|
||||||
|
updatedReceiver.inbox.messages,
|
||||||
|
message => message.uuid === userToSendMessage._id && message.text === messageToSend,
|
||||||
|
);
|
||||||
|
|
||||||
|
const sendersMessageInSendersInbox = _.find(
|
||||||
|
updatedSender.inbox.messages,
|
||||||
|
message => message.uuid === receiver._id && message.text === messageToSend,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sendersMessageInReceiversInbox).to.not.exist;
|
||||||
|
expect(sendersMessageInSendersInbox).to.exist;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not save the message message twice if recipient is sender', async () => {
|
||||||
|
const response = await userToSendMessage.post('/members/send-private-message', {
|
||||||
|
message: messageToSend,
|
||||||
|
toUserId: userToSendMessage._id,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.message.uuid).to.equal(userToSendMessage._id);
|
||||||
|
|
||||||
|
const updatedSender = await userToSendMessage.get('/user');
|
||||||
|
|
||||||
|
const sendersMessageInSendersInbox = _.find(
|
||||||
|
updatedSender.inbox.messages,
|
||||||
|
message => message.uuid === userToSendMessage._id && message.text === messageToSend,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sendersMessageInSendersInbox).to.exist;
|
||||||
|
expect(Object.keys(updatedSender.inbox.messages).length).to.equal(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
6
website/client/package-lock.json
generated
@@ -23,7 +23,6 @@
|
|||||||
"eslint-config-habitrpg": "6.2.0",
|
"eslint-config-habitrpg": "6.2.0",
|
||||||
"eslint-plugin-mocha": "5.3.0",
|
"eslint-plugin-mocha": "5.3.0",
|
||||||
"eslint-plugin-vue": "7.20.0",
|
"eslint-plugin-vue": "7.20.0",
|
||||||
"ga-gtag": "^1.2.0",
|
|
||||||
"habitica-markdown": "^3.0.0",
|
"habitica-markdown": "^3.0.0",
|
||||||
"hellojs": "^1.20.0",
|
"hellojs": "^1.20.0",
|
||||||
"intro.js": "^7.2.0",
|
"intro.js": "^7.2.0",
|
||||||
@@ -5175,11 +5174,6 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ga-gtag": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/ga-gtag/-/ga-gtag-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-j9gxutMdpGMdwaX1SzOG31Ddm+IGFjeNf+N3Z5g+BBpS8FSXOALlrM+ORIGc/QKszGJEDlw+6PfIsJZICsqsGQ=="
|
|
||||||
},
|
|
||||||
"node_modules/gensync": {
|
"node_modules/gensync": {
|
||||||
"version": "1.0.0-beta.2",
|
"version": "1.0.0-beta.2",
|
||||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
"eslint-config-habitrpg": "6.2.0",
|
"eslint-config-habitrpg": "6.2.0",
|
||||||
"eslint-plugin-mocha": "5.3.0",
|
"eslint-plugin-mocha": "5.3.0",
|
||||||
"eslint-plugin-vue": "7.20.0",
|
"eslint-plugin-vue": "7.20.0",
|
||||||
"ga-gtag": "^1.2.0",
|
|
||||||
"habitica-markdown": "^3.0.0",
|
"habitica-markdown": "^3.0.0",
|
||||||
"hellojs": "^1.20.0",
|
"hellojs": "^1.20.0",
|
||||||
"intro.js": "^7.2.0",
|
"intro.js": "^7.2.0",
|
||||||
|
|||||||
@@ -1055,6 +1055,11 @@
|
|||||||
width: 141px;
|
width: 141px;
|
||||||
height: 147px;
|
height: 147px;
|
||||||
}
|
}
|
||||||
|
.background_elegant_palace {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_elegant_palace.png');
|
||||||
|
width: 141px;
|
||||||
|
height: 147px;
|
||||||
|
}
|
||||||
.background_enchanted_music_room {
|
.background_enchanted_music_room {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_enchanted_music_room.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_enchanted_music_room.png');
|
||||||
width: 141px;
|
width: 141px;
|
||||||
@@ -1751,6 +1756,11 @@
|
|||||||
width: 141px;
|
width: 141px;
|
||||||
height: 147px;
|
height: 147px;
|
||||||
}
|
}
|
||||||
|
.background_nighttime_street_with_shops {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_nighttime_street_with_shops.png');
|
||||||
|
width: 141px;
|
||||||
|
height: 147px;
|
||||||
|
}
|
||||||
.background_ocean_sunrise {
|
.background_ocean_sunrise {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_ocean_sunrise.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_ocean_sunrise.png');
|
||||||
width: 141px;
|
width: 141px;
|
||||||
@@ -2437,6 +2447,11 @@
|
|||||||
width: 141px;
|
width: 141px;
|
||||||
height: 147px;
|
height: 147px;
|
||||||
}
|
}
|
||||||
|
.background_winter_desert_with_saguaros {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_desert_with_saguaros.png');
|
||||||
|
width: 141px;
|
||||||
|
height: 147px;
|
||||||
|
}
|
||||||
.background_winter_fireworks {
|
.background_winter_fireworks {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_fireworks.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_fireworks.png');
|
||||||
width: 141px;
|
width: 141px;
|
||||||
@@ -29455,6 +29470,11 @@
|
|||||||
width: 60px;
|
width: 60px;
|
||||||
height: 60px;
|
height: 60px;
|
||||||
}
|
}
|
||||||
|
.back_armoire_harpsichord {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_armoire_harpsichord.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.body_armoire_clownsBowtie {
|
.body_armoire_clownsBowtie {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/body_armoire_clownsBowtie.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/body_armoire_clownsBowtie.png');
|
||||||
width: 114px;
|
width: 114px;
|
||||||
@@ -29845,6 +29865,11 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.broad_armor_armoire_loneCowpokeOutfit {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_loneCowpokeOutfit.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.broad_armor_armoire_lunarArmor {
|
.broad_armor_armoire_lunarArmor {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_lunarArmor.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_lunarArmor.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -30480,6 +30505,11 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 87px;
|
height: 87px;
|
||||||
}
|
}
|
||||||
|
.head_armoire_loneCowpokeHat {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_loneCowpokeHat.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.head_armoire_lunarCrown {
|
.head_armoire_lunarCrown {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_lunarCrown.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_lunarCrown.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -30790,6 +30820,11 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.shield_armoire_doubleBass {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_doubleBass.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.shield_armoire_dragonTamerShield {
|
.shield_armoire_dragonTamerShield {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_dragonTamerShield.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_dragonTamerShield.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -30995,6 +31030,11 @@
|
|||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.shield_armoire_prettyPinkGiftBox {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_prettyPinkGiftBox.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.shield_armoire_ramHornShield {
|
.shield_armoire_ramHornShield {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_ramHornShield.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_ramHornShield.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -31465,6 +31505,11 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.slim_armor_armoire_loneCowpokeOutfit {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_loneCowpokeOutfit.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.slim_armor_armoire_lunarArmor {
|
.slim_armor_armoire_lunarArmor {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_lunarArmor.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_lunarArmor.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -31760,6 +31805,11 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.weapon_armoire_bambooFlute {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_bambooFlute.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.weapon_armoire_barristerGavel {
|
.weapon_armoire_barristerGavel {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_barristerGavel.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_barristerGavel.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -32170,6 +32220,11 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.weapon_armoire_prettyPinkParasol {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_prettyPinkParasol.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.weapon_armoire_pushBroom {
|
.weapon_armoire_pushBroom {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pushBroom.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pushBroom.png');
|
||||||
width: 114px;
|
width: 114px;
|
||||||
@@ -34060,6 +34115,46 @@
|
|||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.back_mystery_202601 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202601.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.back_mystery_202602 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202602.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.broad_armor_mystery_202512 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202512.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.head_mystery_202512 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202512.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.head_mystery_202602 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202602.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.slim_armor_mystery_202512 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202512.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.weapon_mystery_202512 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202512.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.weapon_mystery_202601 {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202601.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.back_mystery_201402 {
|
.back_mystery_201402 {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_201402.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_201402.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -38640,6 +38735,26 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.broad_armor_special_winter2026Healer {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Healer.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.broad_armor_special_winter2026Mage {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Mage.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.broad_armor_special_winter2026Rogue {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Rogue.png');
|
||||||
|
width: 117px;
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
.broad_armor_special_winter2026Warrior {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Warrior.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.broad_armor_special_yeti {
|
.broad_armor_special_yeti {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -38935,6 +39050,26 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.head_special_winter2026Healer {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Healer.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.head_special_winter2026Mage {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Mage.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.head_special_winter2026Rogue {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Rogue.png');
|
||||||
|
width: 117px;
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
.head_special_winter2026Warrior {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Warrior.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.head_special_yeti {
|
.head_special_yeti {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -39115,6 +39250,21 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.shield_special_winter2026Healer {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2026Healer.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.shield_special_winter2026Rogue {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2026Rogue.png');
|
||||||
|
width: 117px;
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
.shield_special_winter2026Warrior {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2026Warrior.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.shield_special_yeti {
|
.shield_special_yeti {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -39355,6 +39505,26 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.slim_armor_special_winter2026Healer {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Healer.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.slim_armor_special_winter2026Mage {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Mage.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.slim_armor_special_winter2026Rogue {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Rogue.png');
|
||||||
|
width: 117px;
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
.slim_armor_special_winter2026Warrior {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Warrior.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.slim_armor_special_yeti {
|
.slim_armor_special_yeti {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
@@ -39595,6 +39765,26 @@
|
|||||||
width: 114px;
|
width: 114px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
.weapon_special_winter2026Healer {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Healer.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.weapon_special_winter2026Mage {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Mage.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.weapon_special_winter2026Rogue {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Rogue.png');
|
||||||
|
width: 117px;
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
.weapon_special_winter2026Warrior {
|
||||||
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Warrior.png');
|
||||||
|
width: 114px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
.weapon_special_yeti {
|
.weapon_special_yeti {
|
||||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png');
|
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png');
|
||||||
width: 90px;
|
width: 90px;
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 11 KiB |
9
website/client/src/assets/images/gifts_bg.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="378" height="176" viewBox="0 0 378 176" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M0 0H378V174C378 175.105 377.105 176 376 176H1.99999C0.895423 176 0 175.105 0 174V0Z" fill="url(#paint0_linear_2257_239)"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_2257_239" x1="378" y1="0" x2="0" y2="0" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#925CF3"/>
|
||||||
|
<stop offset="1" stop-color="#34B5C1"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 448 B |
37
website/client/src/assets/images/gifts_start.svg
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<svg width="48" height="96" viewBox="0 0 48 96" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-3.10104 12.0483C-2.82088 9.43721 -3.53422 6.57214 -5.6115 5.24584C-7.68877 3.91954 -9.89543 4.92709 -10.1422 6.808C-10.3891 8.68891 -9.06061 9.83066 -4.97737 13.9337C-3.81821 15.0985 -3.3812 14.6594 -3.10104 12.0483Z" stroke="#FFA624" stroke-width="4"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.34089 15.2054C4.45116 13.6561 7.27707 12.8443 9.45877 13.9889C11.6405 15.1334 11.8754 17.5575 10.3778 18.7127C8.88016 19.868 7.23193 19.2828 1.65411 17.781C0.0706697 17.3546 0.230624 16.7548 2.34089 15.2054Z" stroke="#FFBE5D" stroke-width="4"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.549002 12.0098C-3.61871 9.59194 -3.87667 15.8322 -2.20457 16.8023C-0.532473 17.7724 4.71671 14.4277 0.549002 12.0098Z" fill="#EE9109"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-1.76917 16.0445L13.637 24.9825L9.18965 32.7229L-6.21656 23.785L-1.76917 16.0445Z" fill="#F8F9F9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-6.90457 13.0652L3.36623 19.0238L-1.08116 26.7643L-11.352 20.8057L-6.90457 13.0652Z" fill="#FFBE5D"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-1.76917 16.0445L3.36623 19.0238L1.88377 21.604L-3.25163 18.6247L-1.76917 16.0445Z" fill="#FFA624"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-6.21656 23.785L6.62195 31.2333L-3.75529 49.2944L-16.5938 41.8461L-6.21656 23.785Z" fill="#F8F9F9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-3.64886 25.2747L6.62195 31.2333L5.13948 33.8134L-5.13132 27.8548L-3.64886 25.2747Z" fill="#DDF3F3"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.401307 24.1842L10.6721 30.1428L9.18965 32.7229L-1.08116 26.7643L0.401307 24.1842Z" fill="#DDF3F3"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.7924 38.4607L17.9387 42.0519L21.31 40.5834L24.8838 41.4413L23.4225 38.0537L24.2762 34.4625L20.9049 35.9309L17.3311 35.0731L18.7924 38.4607Z" fill="white" fill-opacity="0.5"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M-3.93867 71.2331L-4.79238 74.8243L-1.42111 73.3559L2.15271 74.2137L0.691383 70.8261L1.54509 67.2349L-1.82618 68.7033L-5.4 67.8455L-3.93867 71.2331Z" fill="white" fill-opacity="0.5"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.8949 25.3807L35.0583 29.8802L37.9424 26.2452L42.4202 25.0761L38.8028 22.178L37.6393 17.6786L34.7552 21.3135L30.2775 22.4826L33.8949 25.3807Z" fill="white" fill-opacity="0.5"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.2596 71.999L40.579 68.1435L45.9507 88.2881L31.6312 92.1436L26.2596 71.999Z" fill="#F8F9F9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.9401 75.8545L26.2589 71.9966L31.6273 92.1421L17.3084 96L11.9401 75.8545Z" fill="#DDF3F3"/>
|
||||||
|
<rect width="2.96589" height="20.8485" transform="matrix(0.965611 -0.25999 0.257652 0.966238 23.3957 72.7701)" fill="#FFA624"/>
|
||||||
|
<rect width="2.96589" height="20.8485" transform="matrix(0.965611 -0.25999 0.257652 0.966238 26.2596 71.999)" fill="#FFBE5D"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.9999 90.0369L30.8638 89.2658L31.6312 92.1436L28.7673 92.9147L27.9999 90.0369Z" fill="#EE9109"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3957 72.7701L26.2596 71.999L27.0269 74.8768L24.163 75.6479L23.3957 72.7701Z" fill="#EE9109"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.9401 75.8545L23.3951 72.7682L24.162 75.6461L12.707 78.7325L11.9401 75.8545Z" fill="#C1E9E9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5443 93.1213L27.9999 90.0369L28.7673 92.9147L17.3117 95.9991L16.5443 93.1213Z" fill="#C1E9E9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.1235 71.2279L40.579 68.1435L41.3464 71.0213L29.8908 74.1057L29.1235 71.2279Z" fill="#DDF3F3"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.7277 88.4947L45.1833 85.4103L45.9507 88.2881L34.4951 91.3725L33.7277 88.4947Z" fill="#DDF3F3"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.8638 89.2658L33.7277 88.4947L34.4951 91.3725L31.6312 92.1436L30.8638 89.2658Z" fill="#FFA624"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.2596 71.999L29.1235 71.2279L29.8908 74.1057L27.0269 74.8768L26.2596 71.999Z" fill="#FFA624"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.5224 56.3076C25.8087 53.7812 24.0792 51.3933 21.6588 50.9455C19.2383 50.4977 17.5679 52.2625 18.0403 54.0994C18.5126 55.9363 20.17 56.4948 25.4855 58.7621C26.9945 59.4057 27.236 58.834 26.5224 56.3076Z" stroke="#FFA624" stroke-width="4"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.745 57.1864C34.124 54.9555 36.4415 53.1391 38.8911 53.3791C41.3406 53.6191 42.4621 55.7782 41.5042 57.413C40.5463 59.0479 38.7999 59.1258 33.0684 59.8329C31.4413 60.0337 31.366 59.4173 32.745 57.1864Z" stroke="#FFBE5D" stroke-width="4"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.8923 54.898C25.1267 54.225 27.2139 60.108 29.1258 60.378C31.0378 60.648 34.6579 55.571 29.8923 54.898Z" fill="#EE9109"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.247 59.5115L46.8635 61.9994L45.6255 70.8503L28.0091 68.3625L29.247 59.5115Z" fill="#F8F9F9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.6306 57.0236L29.247 59.5114L28.0091 68.3624L10.3927 65.8745L11.6306 57.0236Z" fill="#DDF3F3"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3749 58.6822L35.1192 60.3408L33.8813 69.1917L22.137 67.5332L23.3749 58.6822Z" fill="#FFBE5D"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3749 58.6822L29.247 59.5115L28.0091 68.3625L22.137 67.5332L23.3749 58.6822Z" fill="#FFA624"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.247 59.5115L35.1192 60.3408L34.7065 63.2911L28.8344 62.4618L29.247 59.5115Z" fill="#FFA624"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3749 58.6822L29.247 59.5115L28.8344 62.4618L22.9622 61.6326L23.3749 58.6822Z" fill="#EE9109"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.8053 62.9241L22.5496 64.5827L22.137 67.533L10.3927 65.8745L10.8053 62.9241Z" fill="#C1E9E9"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.2939 66.2414L46.0382 67.9L45.6255 70.8503L33.8813 69.1917L34.2939 66.2414Z" fill="#DDF3F3"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.0 KiB |
@@ -30,12 +30,23 @@
|
|||||||
cursor: default;
|
cursor: default;
|
||||||
color: $gray-200;
|
color: $gray-200;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
box-shadow: none;
|
background-color: transparent;
|
||||||
background-color: $gray-700;
|
|
||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
|
box-shadow:
|
||||||
|
0 1px 3px 0 rgba($black, 0.12),
|
||||||
|
0 1px 2px 0 rgba($black, 0.24);
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
padding: 4px 12px;
|
||||||
|
min-height: 32px;
|
||||||
|
max-height: 32px;
|
||||||
|
gap: 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
.svg {
|
.svg {
|
||||||
color: $gray-300;
|
color: $gray-200;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
website/client/src/assets/svg/close-white.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g fill="#FFFFFF" fill-rule="nonzero">
|
||||||
|
<polygon points="12.1973467 2 14 3.80265326 9.80187117 8 14 12.1973467 12.1973467 14 8 9.80187117 3.80265326 14 2 12.1973467 6.19812883 8 2 3.80265326 3.80265326 2 8 6.19812883"></polygon>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 504 B |
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.1792 31.6843L46.8536 22.3769L23.918 28.6988L18.861 42.5218L44.341 58.5813L58.1792 31.6843Z" fill="#FF944C"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L46.1108 26.1328L36.2812 28.8422L46.6218 34.5148Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M30.2393 39.0304L26.4518 31.5515L36.2813 28.8422L30.2393 39.0304Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L36.2813 28.8422L30.2393 39.0304L46.6218 34.5148Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M53.8301 32.5279L46.1108 26.1328L46.6218 34.5148L53.8301 32.5279Z" fill="white"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M23.0309 41.0173L26.4518 31.5516L30.2393 39.0304L23.0309 41.0173Z" fill="#FA8537"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M53.8301 32.5279L46.6218 34.5148L43.0424 53.79L53.8301 32.5279Z" fill="#FA8537"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M23.0309 41.0173L30.2393 39.0304L43.0425 53.79L23.0309 41.0173Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L30.2393 39.0304L43.0425 53.79L46.6218 34.5148Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.555 4.15937L47.026 0.420004L38.7773 1.59601L36.4144 6.17539L44.5675 12.8919L50.555 4.15937Z" fill="#FFBE5D"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L46.6034 1.6924L43.0682 2.1964L46.414 4.62854Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M40.5221 5.46854L39.5331 2.7004L43.0682 2.1964L40.5221 5.46854Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L43.0683 2.1964L40.5221 5.46855L46.414 4.62854Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M49.0064 4.25894L46.6034 1.6924L46.414 4.62854L49.0064 4.25894Z" fill="white"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M37.9296 5.83815L39.5331 2.70041L40.5221 5.46855L37.9296 5.83815Z" fill="#FFA624"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M49.0064 4.25893L46.414 4.62853L44.3259 11.1688L49.0064 4.25893Z" fill="#FFA624"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M37.9297 5.83815L40.5221 5.46855L44.326 11.1688L37.9297 5.83815Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L40.5221 5.46855L44.326 11.1688L46.414 4.62854Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.2986 16.7775L24.6513 8.36623L11.1016 3.94533L4.07056 9.19883L11.614 25.6769L27.2986 16.7775Z" fill="#FF6165"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L23.0573 10.0026L17.2502 8.10789L20.5864 14.3719Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M10.908 11.2141L11.4432 6.21322L17.2502 8.10789L10.908 11.2141Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L17.2502 8.10789L10.9081 11.2141L20.5864 14.3719Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M24.8449 15.7613L23.0573 10.0026L20.5864 14.3719L24.8449 15.7613Z" fill="white"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M6.64955 9.82464L11.4432 6.21321L10.908 11.2141L6.64955 9.82464Z" fill="#F23035"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M24.8449 15.7613L20.5864 14.3719L12.5221 22.8464L24.8449 15.7613Z" fill="#F23035"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.64959 9.82464L10.9081 11.2141L12.5221 22.8463L6.64959 9.82464Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L10.9081 11.2141L12.5221 22.8463L20.5864 14.3719Z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.82083 31.6843L17.1464 22.3769L40.082 28.6988L45.139 42.5218L19.659 58.5813L5.82083 31.6843Z" fill="#24CC8F"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L17.8892 26.1328L27.7188 28.8422L17.3782 34.5148Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M33.7607 39.0304L37.5482 31.5515L27.7187 28.8422L33.7607 39.0304Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L27.7187 28.8422L33.7607 39.0304L17.3782 34.5148Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M10.1699 32.5279L17.8892 26.1328L17.3782 34.5148L10.1699 32.5279Z" fill="white"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M40.9691 41.0173L37.5482 31.5516L33.7607 39.0304L40.9691 41.0173Z" fill="#1CA372"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M10.1699 32.5279L17.3782 34.5148L20.9576 53.79L10.1699 32.5279Z" fill="#1CA372"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M40.9691 41.0173L33.7607 39.0304L20.9575 53.79L40.9691 41.0173Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L33.7607 39.0304L20.9575 53.79L17.3782 34.5148Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.445 4.15937L16.974 0.420004L25.2227 1.59601L27.5856 6.17539L19.4325 12.8919L13.445 4.15937Z" fill="#925CF3"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L17.3966 1.6924L20.9318 2.1964L17.586 4.62854Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M23.4779 5.46854L24.4669 2.7004L20.9318 2.1964L23.4779 5.46854Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L20.9317 2.1964L23.4779 5.46855L17.586 4.62854Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.9936 4.25894L17.3966 1.6924L17.586 4.62854L14.9936 4.25894Z" fill="white"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M26.0704 5.83815L24.4669 2.70041L23.4779 5.46855L26.0704 5.83815Z" fill="#4F2A93"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M14.9936 4.25893L17.586 4.62853L19.6741 11.1688L14.9936 4.25893Z" fill="#4F2A93"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M26.0703 5.83815L23.4779 5.46855L19.674 11.1688L26.0703 5.83815Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L23.4779 5.46855L19.674 11.1688L17.586 4.62854Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M36.7014 16.7775L39.3487 8.36623L52.8984 3.94533L59.9294 9.19883L52.386 25.6769L36.7014 16.7775Z" fill="#50B5E9"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L40.9427 10.0026L46.7498 8.10789L43.4136 14.3719Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M53.092 11.2141L52.5568 6.21322L46.7498 8.10789L53.092 11.2141Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L46.7498 8.10789L53.0919 11.2141L43.4136 14.3719Z" fill="white"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M39.1551 15.7613L40.9427 10.0026L43.4136 14.3719L39.1551 15.7613Z" fill="white"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M57.3504 9.82464L52.5568 6.21321L53.092 11.2141L57.3504 9.82464Z" fill="#46A7D9"/>
|
||||||
|
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M39.1551 15.7613L43.4136 14.3719L51.4779 22.8464L39.1551 15.7613Z" fill="#46A7D9"/>
|
||||||
|
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M57.3504 9.82464L53.0919 11.2141L51.4779 22.8463L57.3504 9.82464Z" fill="white"/>
|
||||||
|
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L53.0919 11.2141L51.4779 22.8463L43.4136 14.3719Z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.0 KiB |
10
website/client/src/assets/svg/warning_icon.svg
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_2649_1708)">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M27 36H21V30H27V36ZM48 6V42C48 45.3 45.3 48 42 48H6C2.7 48 0 45.3 0 42V6C0 2.7 2.7 0 6 0H42C45.3 0 48 2.7 48 6ZM42 6H6V42H42V6ZM27 12H21V27H27V12Z" fill="#DE3F3F"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_2649_1708">
|
||||||
|
<rect width="48" height="48" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 463 B |
@@ -117,7 +117,7 @@ export default {
|
|||||||
closeWithAction () {
|
closeWithAction () {
|
||||||
this.close();
|
this.close();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.$router.push({ name: 'achievements' });
|
this.$router.push(`/profile/${this.$store.state.user.data._id}#achievements`);
|
||||||
}, 200);
|
}, 200);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -672,7 +672,7 @@ export default {
|
|||||||
|
|
||||||
this.login();
|
this.login();
|
||||||
},
|
},
|
||||||
async forgotPasswordLink () {
|
forgotPasswordLink: debounce(async function forgotPassLink () {
|
||||||
if (!this.username) {
|
if (!this.username) {
|
||||||
window.alert(this.$t('missingEmail')); // eslint-disable-line no-alert
|
window.alert(this.$t('missingEmail')); // eslint-disable-line no-alert
|
||||||
return;
|
return;
|
||||||
@@ -683,7 +683,7 @@ export default {
|
|||||||
});
|
});
|
||||||
|
|
||||||
window.alert(this.$t('newPassSent')); // eslint-disable-line no-alert
|
window.alert(this.$t('newPassSent')); // eslint-disable-line no-alert
|
||||||
},
|
}, 500),
|
||||||
async resetPasswordSetNewOneLink () {
|
async resetPasswordSetNewOneLink () {
|
||||||
if (!this.password) {
|
if (!this.password) {
|
||||||
window.alert(this.$t('missingNewPassword')); // eslint-disable-line no-alert
|
window.alert(this.$t('missingNewPassword')); // eslint-disable-line no-alert
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
@update-challenge="updateChallenge"
|
@update-challenge="updateChallenge"
|
||||||
/>
|
/>
|
||||||
<close-challenge-modal
|
<close-challenge-modal
|
||||||
:members="members"
|
|
||||||
:challenge-id="challenge._id"
|
:challenge-id="challenge._id"
|
||||||
:prize="challenge.prize"
|
:prize="challenge.prize"
|
||||||
:flag-count="challenge.flagCount"
|
:flag-count="challenge.flagCount"
|
||||||
@@ -72,32 +71,40 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-6 text-right">
|
<div class="col-12 col-md-6 text-right">
|
||||||
<div
|
<div
|
||||||
class="box member-count"
|
class="box member-count p-2"
|
||||||
@click="showMemberModal()"
|
@click="showMemberModal()"
|
||||||
>
|
>
|
||||||
<div
|
<div class="box-content">
|
||||||
class="svg-icon member-icon"
|
<div class="icon-number-row">
|
||||||
v-html="icons.memberIcon"
|
<div
|
||||||
></div>
|
class="svg-icon member-icon"
|
||||||
{{ challenge.memberCount }}
|
v-html="icons.memberIcon"
|
||||||
<div
|
></div>
|
||||||
v-once
|
<span class="number">{{ challenge.memberCount }}</span>
|
||||||
class="details"
|
</div>
|
||||||
>
|
<div
|
||||||
{{ $t('participantsTitle') }}
|
v-once
|
||||||
|
class="details"
|
||||||
|
>
|
||||||
|
{{ $t('participantsTitle') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box">
|
<div class="box prize-count p-2">
|
||||||
<div
|
<div class="box-content">
|
||||||
class="svg-icon gem-icon"
|
<div class="icon-number-row">
|
||||||
v-html="icons.gemIcon"
|
<div
|
||||||
></div>
|
class="svg-icon gem-icon"
|
||||||
{{ challenge.prize || 0 }}
|
v-html="icons.gemIcon"
|
||||||
<div
|
></div>
|
||||||
v-once
|
<span class="number">{{ challenge.prize || 0 }}</span>
|
||||||
class="details"
|
</div>
|
||||||
>
|
<div
|
||||||
{{ $t('prize') }}
|
v-once
|
||||||
|
class="details"
|
||||||
|
>
|
||||||
|
{{ $t('prize') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -304,7 +311,6 @@
|
|||||||
|
|
||||||
.box {
|
.box {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 1em;
|
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
background-color: $white;
|
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(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||||
@@ -314,22 +320,88 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
&.member-count:hover {
|
&.member-count:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.box-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-number-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 0.1em;
|
||||||
|
|
||||||
|
.number {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: normal;
|
||||||
|
margin-left: 0.2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.svg-icon {
|
.svg-icon {
|
||||||
width: 30px;
|
width: 30px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-right: .2em;
|
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
.details {
|
.details {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
margin-top: 0.4em;
|
|
||||||
color: $gray-200;
|
color: $gray-200;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 4px;
|
||||||
|
line-height: 1.15;
|
||||||
|
word-break: break-word;
|
||||||
|
max-height: 2.3em;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.member-count {
|
||||||
|
.icon-number-row {
|
||||||
|
.svg-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.number {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.details {
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 1.1;
|
||||||
|
max-height: 2.2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.prize-count {
|
||||||
|
.icon-number-row {
|
||||||
|
.svg-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.number {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.details {
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 1.1;
|
||||||
|
max-height: 2.2em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -624,7 +696,6 @@ export default {
|
|||||||
this.members = [];
|
this.members = [];
|
||||||
},
|
},
|
||||||
closeChallenge () {
|
closeChallenge () {
|
||||||
this.initialMembersLoad();
|
|
||||||
this.$root.$emit('bv::show::modal', 'close-challenge-modal');
|
this.$root.$emit('bv::show::modal', 'close-challenge-modal');
|
||||||
},
|
},
|
||||||
edit () {
|
edit () {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
id="close-challenge-modal"
|
id="close-challenge-modal"
|
||||||
:title="$t('endChallenge')"
|
:title="$t('endChallenge')"
|
||||||
size="md"
|
size="md"
|
||||||
|
:hide-header="false"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
slot="modal-header"
|
slot="modal-header"
|
||||||
@@ -15,6 +16,9 @@
|
|||||||
>
|
>
|
||||||
{{ $t('endChallenge') }}
|
{{ $t('endChallenge') }}
|
||||||
</h2>
|
</h2>
|
||||||
|
<close-x
|
||||||
|
@close="$root.$emit('bv::hide::modal', 'close-challenge-modal')"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<span
|
<span
|
||||||
@@ -28,28 +32,67 @@
|
|||||||
class="col-12"
|
class="col-12"
|
||||||
>
|
>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="support-habitica">
|
<div class="badge-section">
|
||||||
<!-- @TODO: Add challenge achievement badge here-->
|
<div
|
||||||
|
class="gems-left"
|
||||||
|
v-html="icons.gemsOrange"
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
class="challenge-badge"
|
||||||
|
v-html="icons.endChallengeBadge"
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
class="gems-right"
|
||||||
|
v-html="icons.gemsPurple"
|
||||||
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<strong v-once>{{ $t('selectChallengeWinnersDescription') }}</strong>
|
<strong v-once>{{ $t('selectChallengeWinnersDescription') }}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12 search-input-container">
|
||||||
<member-search-dropdown
|
<div class="search-input-wrapper">
|
||||||
:text="winnerText"
|
<div
|
||||||
:members="members"
|
class="search-icon"
|
||||||
:challenge-id="challengeId"
|
v-html="icons.search"
|
||||||
@member-selected="selectMember"
|
></div>
|
||||||
/>
|
<input
|
||||||
|
v-model="searchTerm"
|
||||||
|
class="search-input"
|
||||||
|
type="text"
|
||||||
|
placeholder="@Username"
|
||||||
|
@input="searchMembers"
|
||||||
|
@focus="showResults = true"
|
||||||
|
@blur="handleBlur"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="showResults && filteredMembers.length > 0"
|
||||||
|
class="search-results"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="member in filteredMembers"
|
||||||
|
:key="member._id"
|
||||||
|
class="search-result-item"
|
||||||
|
@mousedown="selectMember(member)"
|
||||||
|
>
|
||||||
|
{{ getMemberDisplayName(member) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<button
|
<button
|
||||||
v-once
|
class="btn award-winner-btn"
|
||||||
class="btn btn-primary"
|
:class="{'has-winner': winner._id}"
|
||||||
|
:disabled="!winner._id"
|
||||||
@click="closeChallenge"
|
@click="closeChallenge"
|
||||||
>
|
>
|
||||||
{{ $t('awardWinners') }}
|
<span>{{ $t('awardWinners') }}</span>
|
||||||
|
<div
|
||||||
|
class="gem-icon"
|
||||||
|
v-html="icons.gem"
|
||||||
|
></div>
|
||||||
|
<span>{{ prize }} {{ prize === 1 ? $t('gem') : $t('gems') }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
@@ -60,14 +103,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<strong v-once>{{ $t('doYouWantedToDeleteChallenge') }}</strong>
|
<strong
|
||||||
|
v-once
|
||||||
|
class="delete-challenge-text"
|
||||||
|
>{{ $t('doYouWantedToDeleteChallenge') }}</strong>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-once
|
||||||
|
class="col-12 refund-text"
|
||||||
|
>
|
||||||
|
{{ $t('deleteChallengeRefundDescription') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<button
|
<button
|
||||||
v-once
|
v-once
|
||||||
class="btn btn-danger"
|
class="btn btn-danger delete-challenge-btn"
|
||||||
@click="deleteChallenge()"
|
@click="deleteChallenge()"
|
||||||
>
|
>
|
||||||
|
<div
|
||||||
|
class="svg-icon color delete-icon"
|
||||||
|
v-html="icons.deleteIcon"
|
||||||
|
></div>
|
||||||
{{ $t('deleteChallenge') }}
|
{{ $t('deleteChallenge') }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -82,6 +138,7 @@
|
|||||||
|
|
||||||
<style lang='scss'>
|
<style lang='scss'>
|
||||||
@import '@/assets/scss/colors.scss';
|
@import '@/assets/scss/colors.scss';
|
||||||
|
@import '@/assets/scss/button.scss';
|
||||||
|
|
||||||
#close-challenge-modal {
|
#close-challenge-modal {
|
||||||
h2 {
|
h2 {
|
||||||
@@ -94,26 +151,190 @@
|
|||||||
|
|
||||||
.header-wrap {
|
.header-wrap {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-top: 2em;
|
padding-top: 32px;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.support-habitica {
|
.modal-close {
|
||||||
background-image: url('@/assets/svg/for-css/support-habitica-gems.svg?raw');
|
position: absolute;
|
||||||
width: 325px;
|
right: 16px;
|
||||||
height: 89px;
|
top: 16px;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-input-container {
|
||||||
|
margin-top: 1em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-input-wrapper {
|
||||||
|
position: relative;
|
||||||
|
width: 384px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
|
||||||
|
.search-icon {
|
||||||
|
position: absolute;
|
||||||
|
left: 12px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-55%);
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
color: $gray-200;
|
||||||
|
pointer-events: none;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-input {
|
||||||
|
width: 100%;
|
||||||
|
height: 32px;
|
||||||
|
padding-left: 36px;
|
||||||
|
padding-right: 12px;
|
||||||
|
border: 1px solid $gray-400;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 14px;
|
||||||
|
transition: border-color 0.2s ease, border-width 0.2s ease;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border: 2px solid $purple-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::placeholder {
|
||||||
|
color: $gray-300;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-results {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background: $white;
|
||||||
|
border: 1px solid $gray-400;
|
||||||
|
border-top: none;
|
||||||
|
border-radius: 0 0 4px 4px;
|
||||||
|
max-height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
|
z-index: 1000;
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||||
|
|
||||||
|
.search-result-item {
|
||||||
|
padding: 8px 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $purple-600;
|
||||||
|
color: $purple-300;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.delete-challenge-text {
|
||||||
|
color: $maroon-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.refund-text {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: $gray-50;
|
||||||
|
margin-top: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delete-challenge-btn {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 24px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
.delete-icon {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.award-winner-btn {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
min-height: 32px;
|
||||||
|
padding: 4px 12px;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
|
||||||
|
&:not(:disabled) {
|
||||||
|
background-color: $white;
|
||||||
|
color: $gray-200;
|
||||||
|
border: 1px solid $gray-400;
|
||||||
|
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||||
|
|
||||||
|
&.has-winner {
|
||||||
|
background-color: $purple-200;
|
||||||
|
color: $white;
|
||||||
|
border-color: $purple-200;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover:not(.has-winner) {
|
||||||
|
background-color: $gray-700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.gem-icon {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
color: $gems-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge-section {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 1.5rem;
|
||||||
|
margin: -24px auto 0;
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
|
||||||
|
.gems-left, .gems-right {
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.challenge-badge {
|
||||||
|
width: 48px;
|
||||||
|
height: 52px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-footer, .modal-header {
|
.modal-footer, .modal-header {
|
||||||
border: none !important;
|
border: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal-header {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
.footer-wrap {
|
.footer-wrap {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.col-12 {
|
.col-12 {
|
||||||
margin-top: 2em;
|
margin-top: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-12:first-child {
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.or {
|
.or {
|
||||||
@@ -123,21 +344,41 @@
|
|||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
color: $gray-100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import memberSearchDropdown from '@/components/members/memberSearchDropdown';
|
import debounce from 'lodash/debounce';
|
||||||
|
import searchIcon from '@/assets/svg/for-css/search.svg?raw';
|
||||||
|
import deleteIcon from '@/assets/svg/delete.svg?raw';
|
||||||
|
import gemIcon from '@/assets/svg/gem.svg?raw';
|
||||||
|
import endChallengeBadge from '@/assets/svg/for-css/end_challenge_badge.svg?raw';
|
||||||
|
import gemsOrange from '@/assets/svg/for-css/orange100_red100_yellow100_gems.svg?raw';
|
||||||
|
import gemsPurple from '@/assets/svg/for-css/purple200_green10_blue100_gems.svg?raw';
|
||||||
|
import closeX from '@/components/ui/closeX';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
memberSearchDropdown,
|
closeX,
|
||||||
},
|
},
|
||||||
props: ['challengeId', 'members', 'prize', 'flagCount'],
|
props: ['challengeId', 'prize', 'flagCount'],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
winner: {},
|
winner: {},
|
||||||
|
searchTerm: '',
|
||||||
|
showResults: false,
|
||||||
|
filteredMembers: [],
|
||||||
|
isSearching: false,
|
||||||
|
icons: Object.freeze({
|
||||||
|
search: searchIcon,
|
||||||
|
deleteIcon,
|
||||||
|
gem: gemIcon,
|
||||||
|
endChallengeBadge,
|
||||||
|
gemsOrange,
|
||||||
|
gemsPurple,
|
||||||
|
}),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -149,9 +390,58 @@ export default {
|
|||||||
return this.flagCount > 0;
|
return this.flagCount > 0;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
created () {
|
||||||
|
this.searchMembersDebounced = debounce(this.performSearch, 500);
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
searchMembers () {
|
||||||
|
if (!this.searchTerm) {
|
||||||
|
this.filteredMembers = [];
|
||||||
|
this.isSearching = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.isSearching = true;
|
||||||
|
this.searchMembersDebounced();
|
||||||
|
},
|
||||||
|
async performSearch () {
|
||||||
|
if (!this.searchTerm) {
|
||||||
|
this.filteredMembers = [];
|
||||||
|
this.isSearching = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchTerm = this.searchTerm.replace('@', '');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const members = await this.$store.dispatch('members:getChallengeMembers', {
|
||||||
|
challengeId: this.challengeId,
|
||||||
|
searchTerm,
|
||||||
|
includeAllPublicFields: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.filteredMembers = members.slice(0, 10);
|
||||||
|
} catch (err) {
|
||||||
|
this.filteredMembers = [];
|
||||||
|
} finally {
|
||||||
|
this.isSearching = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getMemberDisplayName (member) {
|
||||||
|
if (member.auth?.local?.username) {
|
||||||
|
return `@${member.auth.local.username}`;
|
||||||
|
}
|
||||||
|
return member.profile?.name || '';
|
||||||
|
},
|
||||||
selectMember (member) {
|
selectMember (member) {
|
||||||
this.winner = member;
|
this.winner = member;
|
||||||
|
this.searchTerm = this.getMemberDisplayName(member);
|
||||||
|
this.showResults = false;
|
||||||
|
},
|
||||||
|
handleBlur () {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.showResults = false;
|
||||||
|
}, 200);
|
||||||
},
|
},
|
||||||
async closeChallenge () {
|
async closeChallenge () {
|
||||||
this.challenge = await this.$store.dispatch('challenges:selectChallengeWinner', {
|
this.challenge = await this.$store.dispatch('challenges:selectChallengeWinner', {
|
||||||
|
|||||||
@@ -52,17 +52,21 @@
|
|||||||
<div
|
<div
|
||||||
v-if="!group.purchased.plan.dateTerminated
|
v-if="!group.purchased.plan.dateTerminated
|
||||||
&& group.purchased.plan.paymentMethod === 'Stripe'"
|
&& group.purchased.plan.paymentMethod === 'Stripe'"
|
||||||
class="btn btn-primary"
|
class="btn btn-primary mb-3"
|
||||||
@click="redirectToStripeEdit({groupId: group.id})"
|
@click="redirectToStripeEdit({groupId: group.id})"
|
||||||
>
|
>
|
||||||
{{ $t('subUpdateCard') }}
|
{{ $t('subUpdateCard') }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-if="!group.purchased.plan.dateTerminated">
|
||||||
v-if="!group.purchased.plan.dateTerminated"
|
<div class="small gray-50 mb-3" v-once>
|
||||||
class="btn btn-sm btn-danger"
|
{{ $t('groupPlanBillingFYIShort') }}
|
||||||
@click="cancelSubscriptionConfirm({group: group})"
|
</div>
|
||||||
>
|
<div
|
||||||
{{ $t('cancelGroupSub') }}
|
class="btn btn-sm btn-danger"
|
||||||
|
@click="cancelSubscriptionConfirm({group: group})"
|
||||||
|
>
|
||||||
|
{{ $t('cancelGroupSub') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -82,9 +82,7 @@
|
|||||||
<select-translated-array
|
<select-translated-array
|
||||||
:items="[
|
:items="[
|
||||||
'groupParentChildren',
|
'groupParentChildren',
|
||||||
'groupCouple',
|
|
||||||
'groupFriends',
|
'groupFriends',
|
||||||
'groupCoworkers',
|
|
||||||
'groupManager',
|
'groupManager',
|
||||||
'groupTeacher'
|
'groupTeacher'
|
||||||
]"
|
]"
|
||||||
|
|||||||
@@ -218,13 +218,19 @@
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
|
max-width: 400px;
|
||||||
// somehow the browser felt like setting this 398px instead
|
width: 100%;
|
||||||
// now its fixed to 400 :)
|
|
||||||
width: 400px;
|
|
||||||
|
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
|
|
||||||
|
@media (max-width: 589px) {
|
||||||
|
max-width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 353px) {
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
.quest-col {
|
.quest-col {
|
||||||
::v-deep {
|
::v-deep {
|
||||||
.item-wrapper {
|
.item-wrapper {
|
||||||
@@ -251,6 +257,28 @@
|
|||||||
::v-deep & {
|
::v-deep & {
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
width: 448px !important;
|
width: 448px !important;
|
||||||
|
max-width: calc(100vw - 20px);
|
||||||
|
margin: 0.5rem auto;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
@media (max-width: 468px) {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 353px) {
|
||||||
|
width: 100% !important;
|
||||||
|
margin: 0.25rem auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
@media (max-width: 300px) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="banner d-flex align-items-center justify-content-between py-3 px-4"
|
|
||||||
id="privacy-banner"
|
|
||||||
v-if="!hidden"
|
v-if="!hidden"
|
||||||
|
id="privacy-banner"
|
||||||
|
class="banner d-flex align-items-center justify-content-between py-3 px-4"
|
||||||
>
|
>
|
||||||
<p
|
<p
|
||||||
class="mr-3 mb-0"
|
class="mr-3 mb-0"
|
||||||
|
|||||||
@@ -1,37 +1,43 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="notification d-flex flex-column justify-content-center text-center"
|
class="notification d-flex justify-content-center align-items-center"
|
||||||
>
|
>
|
||||||
<strong
|
<img
|
||||||
v-once
|
src="@/assets/images/gifts_start.svg"
|
||||||
class="mx-auto mb-2"
|
class="gift-start"
|
||||||
|
alt=""
|
||||||
>
|
>
|
||||||
{{ $t('g1g1') }}
|
<div class="content-wrapper d-flex flex-column justify-content-center text-center">
|
||||||
</strong>
|
<strong
|
||||||
<small
|
|
||||||
v-once
|
|
||||||
class="mx-4 mb-3"
|
|
||||||
>
|
|
||||||
{{ $t('g1g1Details') }}
|
|
||||||
</small>
|
|
||||||
<div
|
|
||||||
class="btn-secondary mx-auto d-flex"
|
|
||||||
@click="showSelectUser()"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-once
|
v-once
|
||||||
class="m-auto"
|
class="mx-auto mb-2"
|
||||||
|
>
|
||||||
|
{{ $t('g1g1') }}
|
||||||
|
</strong>
|
||||||
|
<small
|
||||||
|
v-once
|
||||||
|
class="mx-4 mb-3"
|
||||||
|
>
|
||||||
|
{{ $t('g1g1Details') }}
|
||||||
|
</small>
|
||||||
|
<button
|
||||||
|
class="btn btn-secondary mx-auto"
|
||||||
|
@click="showSelectUser()"
|
||||||
>
|
>
|
||||||
{{ $t('sendGift') }}
|
{{ $t('sendGift') }}
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
<img
|
||||||
|
src="@/assets/images/gifts_start.svg"
|
||||||
|
class="gift-end"
|
||||||
|
alt=""
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
class="notification-remove"
|
class="close-x"
|
||||||
@click.stop="remove()"
|
@click="remove()"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-once
|
class="svg-icon svg-close"
|
||||||
class="svg-icon"
|
|
||||||
v-html="icons.close"
|
v-html="icons.close"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -41,51 +47,89 @@
|
|||||||
<style lang='scss' scoped>
|
<style lang='scss' scoped>
|
||||||
@import '@/assets/scss/colors.scss';
|
@import '@/assets/scss/colors.scss';
|
||||||
|
|
||||||
small, strong {
|
small {
|
||||||
color: $white;
|
color: $white;
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.714;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
color: $white;
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.714;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification {
|
.notification {
|
||||||
background-image: url('@/assets/images/g1g1-notif.png');
|
background-image: url('@/assets/images/gifts_bg.svg');
|
||||||
|
background-size: cover;
|
||||||
|
background-position: center;
|
||||||
height: 10rem;
|
height: 10rem;
|
||||||
padding: 3rem;
|
padding: 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-remove {
|
.content-wrapper {
|
||||||
position: absolute;
|
flex: 1;
|
||||||
width: 18px;
|
padding: 2rem;
|
||||||
height: 18px;
|
z-index: 1;
|
||||||
padding: 4px;
|
|
||||||
right: 24px;
|
|
||||||
top: 24px;
|
|
||||||
|
|
||||||
.svg-icon {
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-secondary {
|
.gift-start {
|
||||||
width: 5.75rem;
|
height: 96px;
|
||||||
min-height: 1.5rem;
|
width: auto;
|
||||||
border-radius: 2px;
|
position: absolute;
|
||||||
border-color: $white;
|
left: 0;
|
||||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
top: 50%;
|
||||||
font-size: 12px;
|
transform: translateY(-50%);
|
||||||
font-weight: bold;
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gift-end {
|
||||||
|
height: 96px;
|
||||||
|
width: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%) scaleX(-1);
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-x {
|
||||||
|
position: absolute;
|
||||||
|
right: 16px;
|
||||||
|
top: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
|
&:hover .svg-close {
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svg-close {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
opacity: 0.5;
|
||||||
|
transition: opacity 0.2s ease;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import closeIcon from '@/assets/svg/close-teal.svg?raw';
|
import closeIcon from '@/assets/svg/close-white.svg?raw';
|
||||||
import { mapActions } from '@/libs/store';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: ['notification'],
|
props: ['notification', 'eventKey'],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
icons: Object.freeze({
|
icons: Object.freeze({
|
||||||
@@ -94,11 +138,11 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions({
|
|
||||||
readNotification: 'notifications:readNotification',
|
|
||||||
}),
|
|
||||||
remove () {
|
remove () {
|
||||||
this.readNotification({ notificationId: this.notification.id });
|
if (this.eventKey) {
|
||||||
|
window.sessionStorage.setItem(`hide-g1g1-${this.eventKey}`, 'true');
|
||||||
|
}
|
||||||
|
this.$emit('notification-removed');
|
||||||
},
|
},
|
||||||
showSelectUser () {
|
showSelectUser () {
|
||||||
this.$root.$emit('bv::show::modal', 'select-user-modal');
|
this.$root.$emit('bv::show::modal', 'select-user-modal');
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export default {
|
|||||||
props: ['notification', 'canRemove'],
|
props: ['notification', 'canRemove'],
|
||||||
methods: {
|
methods: {
|
||||||
action () {
|
action () {
|
||||||
this.$router.push({ name: 'achievements' });
|
this.$router.push(`/profile/${this.$store.state.user.data._id}#achievements`);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
action () {
|
action () {
|
||||||
this.$router.push({ name: 'stats' });
|
this.$router.push(`/profile/${this.$store.state.user.data._id}#stats`);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -49,6 +49,12 @@
|
|||||||
v-if="showOnboardingGuide"
|
v-if="showOnboardingGuide"
|
||||||
:never-seen="hasSpecialBadge"
|
:never-seen="hasSpecialBadge"
|
||||||
/>
|
/>
|
||||||
|
<gift-one-get-one-notification
|
||||||
|
v-if="shouldShowG1g1"
|
||||||
|
:notification="g1g1Notification"
|
||||||
|
:event-key="g1g1EventKey"
|
||||||
|
@notification-removed="handleG1g1Removed"
|
||||||
|
/>
|
||||||
<component
|
<component
|
||||||
:is="notification.type"
|
:is="notification.type"
|
||||||
v-for="notification in notifications"
|
v-for="notification in notifications"
|
||||||
@@ -114,6 +120,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import * as quests from '@/../../common/script/content/quests';
|
import * as quests from '@/../../common/script/content/quests';
|
||||||
import { hasCompletedOnboarding } from '@/../../common/script/libs/onboarding';
|
import { hasCompletedOnboarding } from '@/../../common/script/libs/onboarding';
|
||||||
|
import find from 'lodash/find';
|
||||||
import { mapState, mapActions } from '@/libs/store';
|
import { mapState, mapActions } from '@/libs/store';
|
||||||
import notificationsIcon from '@/assets/svg/notifications.svg?raw';
|
import notificationsIcon from '@/assets/svg/notifications.svg?raw';
|
||||||
import MenuDropdown from '../ui/customMenuDropdown';
|
import MenuDropdown from '../ui/customMenuDropdown';
|
||||||
@@ -151,6 +158,7 @@ export default {
|
|||||||
CARD_RECEIVED,
|
CARD_RECEIVED,
|
||||||
CHALLENGE_INVITATION,
|
CHALLENGE_INVITATION,
|
||||||
GIFT_ONE_GET_ONE,
|
GIFT_ONE_GET_ONE,
|
||||||
|
GiftOneGetOneNotification: GIFT_ONE_GET_ONE,
|
||||||
GROUP_TASK_ASSIGNED,
|
GROUP_TASK_ASSIGNED,
|
||||||
GROUP_TASK_CLAIMED,
|
GROUP_TASK_CLAIMED,
|
||||||
GROUP_TASK_NEEDS_WORK,
|
GROUP_TASK_NEEDS_WORK,
|
||||||
@@ -178,17 +186,14 @@ export default {
|
|||||||
hasSpecialBadge: false,
|
hasSpecialBadge: false,
|
||||||
quests,
|
quests,
|
||||||
openStatus: undefined,
|
openStatus: undefined,
|
||||||
|
g1g1Hidden: false,
|
||||||
actionableNotifications: [
|
actionableNotifications: [
|
||||||
'GUILD_INVITATION', 'PARTY_INVITATION', 'CHALLENGE_INVITATION',
|
'GUILD_INVITATION', 'PARTY_INVITATION', 'CHALLENGE_INVITATION',
|
||||||
'QUEST_INVITATION',
|
'QUEST_INVITATION',
|
||||||
],
|
],
|
||||||
// A list of notifications handled by this component,
|
|
||||||
// listed in the order they should appear in the notifications panel.
|
|
||||||
// NOTE: Those not listed here won't be shown in the notification panel!
|
|
||||||
handledNotifications: [
|
handledNotifications: [
|
||||||
'NEW_STUFF',
|
'NEW_STUFF',
|
||||||
'ITEM_RECEIVED',
|
'ITEM_RECEIVED',
|
||||||
'GIFT_ONE_GET_ONE',
|
|
||||||
'GROUP_TASK_NEEDS_WORK',
|
'GROUP_TASK_NEEDS_WORK',
|
||||||
'GUILD_INVITATION',
|
'GUILD_INVITATION',
|
||||||
'PARTY_INVITATION',
|
'PARTY_INVITATION',
|
||||||
@@ -207,7 +212,10 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState({ user: 'user.data' }),
|
...mapState({
|
||||||
|
user: 'user.data',
|
||||||
|
currentEventList: 'worldState.data.currentEventList',
|
||||||
|
}),
|
||||||
notificationsOrder () {
|
notificationsOrder () {
|
||||||
// Returns a map of NOTIFICATION_TYPE -> POSITION
|
// Returns a map of NOTIFICATION_TYPE -> POSITION
|
||||||
const orderMap = {};
|
const orderMap = {};
|
||||||
@@ -286,9 +294,9 @@ export default {
|
|||||||
|
|
||||||
return notifications;
|
return notifications;
|
||||||
},
|
},
|
||||||
// The total number of notification, shown inside the dropdown
|
|
||||||
notificationsCount () {
|
notificationsCount () {
|
||||||
return this.notifications.length;
|
const g1g1Count = this.shouldShowG1g1 ? 1 : 0;
|
||||||
|
return this.notifications.length + g1g1Count;
|
||||||
},
|
},
|
||||||
hasUnseenNotifications () {
|
hasUnseenNotifications () {
|
||||||
return this.notifications.some(notification => (notification.seen === false));
|
return this.notifications.some(notification => (notification.seen === false));
|
||||||
@@ -299,6 +307,30 @@ export default {
|
|||||||
showOnboardingGuide () {
|
showOnboardingGuide () {
|
||||||
return !hasCompletedOnboarding(this.user);
|
return !hasCompletedOnboarding(this.user);
|
||||||
},
|
},
|
||||||
|
currentG1g1Event () {
|
||||||
|
return find(this.currentEventList, event => event.promo === 'g1g1');
|
||||||
|
},
|
||||||
|
g1g1EventKey () {
|
||||||
|
if (!this.currentG1g1Event || !this.currentG1g1Event.start) return null;
|
||||||
|
const startDate = new Date(this.currentG1g1Event.start);
|
||||||
|
return `${startDate.getFullYear()}-${startDate.getMonth()}`;
|
||||||
|
},
|
||||||
|
shouldShowG1g1 () {
|
||||||
|
if (!this.currentG1g1Event) return false;
|
||||||
|
const eventKey = this.g1g1EventKey;
|
||||||
|
if (eventKey && window.sessionStorage.getItem(`hide-g1g1-${eventKey}`) === 'true') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !this.g1g1Hidden;
|
||||||
|
},
|
||||||
|
g1g1Notification () {
|
||||||
|
return {
|
||||||
|
type: 'GIFT_ONE_GET_ONE',
|
||||||
|
id: `g1g1-event-${this.currentG1g1Event?.start || 'default'}`,
|
||||||
|
data: {},
|
||||||
|
seen: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
const onboardingPanelState = getLocalSetting(CONSTANTS.keyConstants.ONBOARDING_PANEL_STATE);
|
const onboardingPanelState = getLocalSetting(CONSTANTS.keyConstants.ONBOARDING_PANEL_STATE);
|
||||||
@@ -364,6 +396,9 @@ export default {
|
|||||||
isActionable (notification) {
|
isActionable (notification) {
|
||||||
return this.actionableNotifications.indexOf(notification.type) !== -1;
|
return this.actionableNotifications.indexOf(notification.type) !== -1;
|
||||||
},
|
},
|
||||||
|
handleG1g1Removed () {
|
||||||
|
this.g1g1Hidden = true;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -176,7 +176,12 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
showProfile (startingPage) {
|
showProfile (startingPage) {
|
||||||
this.$router.push({ name: startingPage });
|
const userId = this.$store.state.user.data._id;
|
||||||
|
let path = `/profile/${userId}`;
|
||||||
|
if (startingPage !== 'profile') {
|
||||||
|
path += `#${startingPage}`;
|
||||||
|
}
|
||||||
|
this.$router.push(path);
|
||||||
},
|
},
|
||||||
toLearnMore () {
|
toLearnMore () {
|
||||||
this.$router.push({ name: 'subscription' });
|
this.$router.push({ name: 'subscription' });
|
||||||
|
|||||||
@@ -454,17 +454,14 @@ export default {
|
|||||||
},
|
},
|
||||||
isUserMentioned () {
|
isUserMentioned () {
|
||||||
const message = this.msg;
|
const message = this.msg;
|
||||||
|
|
||||||
if (message.highlight) {
|
if (message.highlight) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { user } = this;
|
const { user } = this;
|
||||||
const displayName = user.profile.name;
|
|
||||||
const { username } = user.auth.local;
|
const { username } = user.auth.local;
|
||||||
const pattern = `@(${escapeRegExp(displayName)}|${escapeRegExp(username)})(\\b)`;
|
if (!username) return false;
|
||||||
message.highlight = new RegExp(pattern, 'i').test(message.text);
|
const usernamePattern = new RegExp(`@${escapeRegExp(username)}(?:\\b|(?=[^a-zA-Z0-9_]))`, 'i');
|
||||||
|
message.highlight = usernamePattern.test(message.text);
|
||||||
return message.highlight;
|
return message.highlight;
|
||||||
},
|
},
|
||||||
flagCountDescription () {
|
flagCountDescription () {
|
||||||
@@ -494,6 +491,9 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
mapProfileLinksToModal () {
|
mapProfileLinksToModal () {
|
||||||
|
if (!this.$refs?.markdownContainer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const links = this.$refs.markdownContainer.getElementsByTagName('a');
|
const links = this.$refs.markdownContainer.getElementsByTagName('a');
|
||||||
for (let i = 0; i < links.length; i += 1) {
|
for (let i = 0; i < links.length; i += 1) {
|
||||||
let link = links[i].pathname;
|
let link = links[i].pathname;
|
||||||
|
|||||||
@@ -328,6 +328,8 @@ export default {
|
|||||||
alreadyReadNotification,
|
alreadyReadNotification,
|
||||||
nextCron: null,
|
nextCron: null,
|
||||||
handledNotifications,
|
handledNotifications,
|
||||||
|
isInitialLoadComplete: false,
|
||||||
|
pendingRebirthNotification: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -453,6 +455,18 @@ export default {
|
|||||||
|
|
||||||
return this.runYesterDailies();
|
return this.runYesterDailies();
|
||||||
},
|
},
|
||||||
|
async showPendingRebirthModal () {
|
||||||
|
if (this.pendingRebirthNotification) {
|
||||||
|
this.playSound('Achievement_Unlocked');
|
||||||
|
this.$root.$emit('bv::show::modal', 'rebirth');
|
||||||
|
|
||||||
|
await axios.post('/api/v4/notifications/read', {
|
||||||
|
notificationIds: [this.pendingRebirthNotification.id],
|
||||||
|
});
|
||||||
|
|
||||||
|
this.pendingRebirthNotification = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
showDeathModal () {
|
showDeathModal () {
|
||||||
this.playSound('Death');
|
this.playSound('Death');
|
||||||
this.$root.$emit('bv::show::modal', 'death');
|
this.$root.$emit('bv::show::modal', 'death');
|
||||||
@@ -661,6 +675,18 @@ export default {
|
|||||||
this.showLevelUpNotifications(this.user.stats.lvl);
|
this.showLevelUpNotifications(this.user.stats.lvl);
|
||||||
}
|
}
|
||||||
this.handleUserNotifications(this.user.notifications);
|
this.handleUserNotifications(this.user.notifications);
|
||||||
|
|
||||||
|
this.isInitialLoadComplete = true;
|
||||||
|
|
||||||
|
const hasRebirthConfirmationFlag = localStorage.getItem('show-rebirth-confirmation') === 'true';
|
||||||
|
|
||||||
|
if (hasRebirthConfirmationFlag) {
|
||||||
|
localStorage.removeItem('show-rebirth-confirmation');
|
||||||
|
this.playSound('Achievement_Unlocked');
|
||||||
|
this.$root.$emit('bv::show::modal', 'rebirth');
|
||||||
|
} else {
|
||||||
|
this.showPendingRebirthModal();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
async handleUserNotifications (after) {
|
async handleUserNotifications (after) {
|
||||||
if (this.$store.state.isRunningYesterdailies) return;
|
if (this.$store.state.isRunningYesterdailies) return;
|
||||||
@@ -700,8 +726,15 @@ export default {
|
|||||||
this.$root.$emit('habitica:won-challenge', notification);
|
this.$root.$emit('habitica:won-challenge', notification);
|
||||||
break;
|
break;
|
||||||
case 'REBIRTH_ACHIEVEMENT':
|
case 'REBIRTH_ACHIEVEMENT':
|
||||||
this.playSound('Achievement_Unlocked');
|
if (localStorage.getItem('show-rebirth-confirmation') === 'true') {
|
||||||
this.$root.$emit('bv::show::modal', 'rebirth');
|
markAsRead = false;
|
||||||
|
} else if (!this.isInitialLoadComplete) {
|
||||||
|
this.pendingRebirthNotification = notification;
|
||||||
|
markAsRead = false;
|
||||||
|
} else {
|
||||||
|
this.playSound('Achievement_Unlocked');
|
||||||
|
this.$root.$emit('bv::show::modal', 'rebirth');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'STREAK_ACHIEVEMENT':
|
case 'STREAK_ACHIEVEMENT':
|
||||||
this.text(`${this.$t('streaks')}: ${this.user.achievements.streak}`, () => {
|
this.text(`${this.$t('streaks')}: ${this.user.achievements.streak}`, () => {
|
||||||
|
|||||||
@@ -197,9 +197,7 @@
|
|||||||
<select-translated-array
|
<select-translated-array
|
||||||
:items="[
|
:items="[
|
||||||
'groupParentChildren',
|
'groupParentChildren',
|
||||||
'groupCouple',
|
|
||||||
'groupFriends',
|
'groupFriends',
|
||||||
'groupCoworkers',
|
|
||||||
'groupManager',
|
'groupManager',
|
||||||
'groupTeacher'
|
'groupTeacher'
|
||||||
]"
|
]"
|
||||||
|
|||||||
@@ -12,6 +12,12 @@
|
|||||||
box-shadow: 0 1px 2px 0 rgba($black, 0.2);
|
box-shadow: 0 1px 2px 0 rgba($black, 0.2);
|
||||||
z-index: 9;
|
z-index: 9;
|
||||||
height: 3rem;
|
height: 3rem;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
@media (max-width: 683px) {
|
||||||
|
height: auto;
|
||||||
|
min-height: 3rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-link {
|
.nav-link {
|
||||||
@@ -23,6 +29,19 @@
|
|||||||
padding: 0.75rem;
|
padding: 0.75rem;
|
||||||
|
|
||||||
color: $gray-50;
|
color: $gray-50;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
@media (max-width: 683px) {
|
||||||
|
padding: 0.5rem;
|
||||||
|
font-size: 13px;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-width: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 576px) {
|
||||||
|
padding: 0.5rem 0.4rem;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
color: $purple-300;
|
color: $purple-300;
|
||||||
|
|||||||
@@ -189,6 +189,7 @@
|
|||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
<div
|
<div
|
||||||
|
v-if="paymentMethodLogo.icon"
|
||||||
class="svg svg-icon mb-4"
|
class="svg svg-icon mb-4"
|
||||||
:class="paymentMethodLogo.class"
|
:class="paymentMethodLogo.class"
|
||||||
v-html="paymentMethodLogo.icon"
|
v-html="paymentMethodLogo.icon"
|
||||||
@@ -205,6 +206,13 @@
|
|||||||
<div>{{ $t('subUpdateCard') }}</div>
|
<div>{{ $t('subUpdateCard') }}</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-once
|
||||||
|
v-if="!hasGroupPlan"
|
||||||
|
class="small text-center mb-4"
|
||||||
|
>
|
||||||
|
{{ $t('subscriptionBillingFYIShort') }}
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="purchasedPlanExtraMonthsDetails.months > 0"
|
v-if="purchasedPlanExtraMonthsDetails.months > 0"
|
||||||
class="extra-months green-10 py-2 px-3 mb-4"
|
class="extra-months green-10 py-2 px-3 mb-4"
|
||||||
@@ -407,6 +415,13 @@
|
|||||||
<div class="purple-bar my-auto"></div>
|
<div class="purple-bar my-auto"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex flex-column align-items-center mt-3">
|
<div class="d-flex flex-column align-items-center mt-3">
|
||||||
|
<div
|
||||||
|
v-once
|
||||||
|
v-if="!hasSubscription"
|
||||||
|
class="small gray-100 w-50 text-center mb-5"
|
||||||
|
>
|
||||||
|
{{ $t('subscriptionBillingFYI') }}
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-once
|
v-once
|
||||||
class="svg-icon svg-gift-box mb-2"
|
class="svg-icon svg-gift-box mb-2"
|
||||||
@@ -631,7 +646,7 @@
|
|||||||
background-color: $purple-400;
|
background-color: $purple-400;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
max-width: 432px;
|
max-width: 417px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.purple-gradient {
|
.purple-gradient {
|
||||||
@@ -654,6 +669,12 @@
|
|||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.67;
|
||||||
|
max-width: 874px;
|
||||||
|
}
|
||||||
|
|
||||||
.stats-card {
|
.stats-card {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
width: 192px;
|
width: 192px;
|
||||||
|
|||||||
@@ -12,14 +12,12 @@
|
|||||||
class="staff col-6 p-0"
|
class="staff col-6 p-0"
|
||||||
>
|
>
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<router-link
|
<div
|
||||||
class="title"
|
class="title"
|
||||||
:to="{'name': 'userProfile', 'params': {'userId': user.uuid}}"
|
|
||||||
>
|
>
|
||||||
{{ user.name }}
|
{{ user.name }}
|
||||||
</router-link>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="user.type === 'Staff'"
|
|
||||||
class="svg-icon staff-icon ml-1"
|
class="svg-icon staff-icon ml-1"
|
||||||
v-html="icons.tierStaff"
|
v-html="icons.tierStaff"
|
||||||
></div>
|
></div>
|
||||||
|
|||||||
@@ -1,231 +1,231 @@
|
|||||||
<template>
|
<template>
|
||||||
<b-modal
|
<b-modal
|
||||||
id="buy-modal"
|
id="buy-modal"
|
||||||
:hide-header="true"
|
:hide-header="true"
|
||||||
@change="onChange($event)"
|
@change="onChange($event)"
|
||||||
>
|
|
||||||
<span
|
|
||||||
v-if="withPin"
|
|
||||||
class="badge-dialog"
|
|
||||||
tabindex="0"
|
|
||||||
@click.prevent.stop="togglePinned()"
|
|
||||||
@keypress.enter.prevent.stop="togglePinned()"
|
|
||||||
>
|
>
|
||||||
<pin-badge
|
|
||||||
:pinned="isPinned"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
<div>
|
|
||||||
<span
|
<span
|
||||||
class="svg-icon close-icon icon-16 color"
|
v-if="withPin"
|
||||||
aria-hidden="true"
|
class="badge-dialog"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
@click="hideDialog()"
|
@click.prevent.stop="togglePinned()"
|
||||||
@keypress.enter="hideDialog()"
|
@keypress.enter.prevent.stop="togglePinned()"
|
||||||
v-html="icons.close"
|
>
|
||||||
></span>
|
<pin-badge
|
||||||
</div>
|
:pinned="isPinned"
|
||||||
<div
|
/>
|
||||||
v-if="item != null"
|
</span>
|
||||||
class="content"
|
<div>
|
||||||
>
|
<span
|
||||||
<div class="inner-content">
|
class="svg-icon close-icon icon-16 color"
|
||||||
<slot
|
aria-hidden="true"
|
||||||
name="item"
|
tabindex="0"
|
||||||
:item="item"
|
@click="hideDialog()"
|
||||||
>
|
@keypress.enter="hideDialog()"
|
||||||
<div v-if="showAvatar">
|
v-html="icons.close"
|
||||||
<avatar
|
></span>
|
||||||
:show-visual-buffs="false"
|
</div>
|
||||||
:member="user"
|
<div
|
||||||
:avatar-only="true"
|
v-if="item != null"
|
||||||
:hide-class-badge="true"
|
class="content"
|
||||||
:with-background="true"
|
>
|
||||||
:override-avatar-gear="getAvatarOverrides(item)"
|
<div class="inner-content">
|
||||||
:sprites-margin="'0px auto 0px -24px'"
|
<slot
|
||||||
|
name="item"
|
||||||
|
:item="item"
|
||||||
|
>
|
||||||
|
<div v-if="showAvatar">
|
||||||
|
<avatar
|
||||||
|
:show-visual-buffs="false"
|
||||||
|
:member="user"
|
||||||
|
:avatar-only="true"
|
||||||
|
:hide-class-badge="true"
|
||||||
|
:with-background="true"
|
||||||
|
:override-avatar-gear="getAvatarOverrides(item)"
|
||||||
|
:sprites-margin="'0px auto 0px -24px'"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<item
|
||||||
|
v-else-if="item.key === 'gem'"
|
||||||
|
class="flat bordered-item"
|
||||||
|
:item="item"
|
||||||
|
:item-content-class="item.class"
|
||||||
|
:show-popover="false"
|
||||||
/>
|
/>
|
||||||
|
<item
|
||||||
|
v-else-if="item.key != 'gem'"
|
||||||
|
class="flat bordered-item"
|
||||||
|
:item="item"
|
||||||
|
:item-content-class="item.class"
|
||||||
|
:show-popover="false"
|
||||||
|
/>
|
||||||
|
</slot>
|
||||||
|
<div
|
||||||
|
v-if="!showAvatar && user.items[item.purchaseType]"
|
||||||
|
class="owned"
|
||||||
|
:class="totalOwned"
|
||||||
|
>
|
||||||
|
<!-- eslint-disable-next-line max-len -->
|
||||||
|
<span class="owned-text">{{ $t('owned') }}: <span class="user-amount">{{ totalOwned }}</span></span>
|
||||||
</div>
|
</div>
|
||||||
<item
|
<h4 class="title">
|
||||||
v-else-if="item.key === 'gem'"
|
{{ itemText }}
|
||||||
class="flat bordered-item"
|
</h4>
|
||||||
|
<div class="item-notes">
|
||||||
|
{{ itemNotes }}
|
||||||
|
</div>
|
||||||
|
<slot
|
||||||
|
name="additionalInfo"
|
||||||
:item="item"
|
:item="item"
|
||||||
:item-content-class="item.class"
|
>
|
||||||
:show-popover="false"
|
<equipmentAttributesGrid
|
||||||
/>
|
v-if="showAttributesGrid"
|
||||||
<item
|
class="attributesGrid"
|
||||||
v-else-if="item.key != 'gem'"
|
:item="item"
|
||||||
class="flat bordered-item"
|
:user="user"
|
||||||
:item="item"
|
/>
|
||||||
:item-content-class="item.class"
|
</slot>
|
||||||
:show-popover="false"
|
<div
|
||||||
/>
|
v-if="item.value > 0 && !(item.key === 'gem' && gemsLeft < 1)"
|
||||||
</slot>
|
class="purchase-amount"
|
||||||
<div
|
>
|
||||||
v-if="!showAvatar && user.items[item.purchaseType]"
|
<div class="item-cost justify-content-center my-3">
|
||||||
class="owned"
|
|
||||||
:class="totalOwned"
|
|
||||||
>
|
|
||||||
<!-- eslint-disable-next-line max-len -->
|
|
||||||
<span class="owned-text">{{ $t('owned') }}: <span class="user-amount">{{ totalOwned }}</span></span>
|
|
||||||
</div>
|
|
||||||
<h4 class="title">
|
|
||||||
{{ itemText }}
|
|
||||||
</h4>
|
|
||||||
<div class="item-notes">
|
|
||||||
{{ itemNotes }}
|
|
||||||
</div>
|
|
||||||
<slot
|
|
||||||
name="additionalInfo"
|
|
||||||
:item="item"
|
|
||||||
>
|
|
||||||
<equipmentAttributesGrid
|
|
||||||
v-if="showAttributesGrid"
|
|
||||||
class="attributesGrid"
|
|
||||||
:item="item"
|
|
||||||
:user="user"
|
|
||||||
/>
|
|
||||||
</slot>
|
|
||||||
<div
|
|
||||||
v-if="item.value > 0 && !(item.key === 'gem' && gemsLeft < 1)"
|
|
||||||
class="purchase-amount"
|
|
||||||
>
|
|
||||||
<div class="item-cost justify-content-center my-3">
|
|
||||||
<span
|
|
||||||
class="cost d-flex mx-auto"
|
|
||||||
:class="getPriceClass()"
|
|
||||||
>
|
|
||||||
<span
|
<span
|
||||||
class="svg-icon icon-24 my-auto mr-1"
|
class="cost d-flex mx-auto"
|
||||||
aria-hidden="true"
|
:class="getPriceClass()"
|
||||||
v-html="icons[getPriceClass()]"
|
|
||||||
>
|
>
|
||||||
|
<span
|
||||||
|
class="svg-icon icon-24 my-auto mr-1"
|
||||||
|
aria-hidden="true"
|
||||||
|
v-html="icons[getPriceClass()]"
|
||||||
|
>
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="my-auto"
|
||||||
|
:class="getPriceClass()"
|
||||||
|
>{{ item.value }}</span>
|
||||||
</span>
|
</span>
|
||||||
<span
|
</div>
|
||||||
class="my-auto"
|
|
||||||
:class="getPriceClass()"
|
|
||||||
>{{ item.value }}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
v-if="showAmountToBuy(item)"
|
|
||||||
class="how-many-to-buy"
|
|
||||||
>
|
|
||||||
{{ $t('howManyToBuy') }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="showAmountToBuy(item)"
|
|
||||||
>
|
|
||||||
<number-increment
|
|
||||||
class="number-increment"
|
|
||||||
@updateQuantity="selectedAmountToBuy = $event"
|
|
||||||
/>
|
|
||||||
<div
|
<div
|
||||||
:class="{'notEnough': notEnoughCurrency}"
|
v-if="showAmountToBuy(item)"
|
||||||
class="total"
|
class="how-many-to-buy"
|
||||||
>
|
>
|
||||||
<span class="total-text">{{ $t('sendTotal') }}</span>
|
{{ $t('howManyToBuy') }}
|
||||||
<span
|
</div>
|
||||||
class="svg-icon total icon-24"
|
<div
|
||||||
aria-hidden="true"
|
v-if="showAmountToBuy(item)"
|
||||||
v-html="icons[getPriceClass()]"
|
>
|
||||||
></span>
|
<number-increment
|
||||||
<span
|
class="number-increment"
|
||||||
class="total-text"
|
@updateQuantity="selectedAmountToBuy = $event"
|
||||||
:class="getPriceClass()"
|
/>
|
||||||
>{{ item.value * selectedAmountToBuy }}</span>
|
<div
|
||||||
|
:class="{'notEnough': notEnoughCurrency}"
|
||||||
|
class="total"
|
||||||
|
>
|
||||||
|
<span class="total-text">{{ $t('sendTotal') }}</span>
|
||||||
|
<span
|
||||||
|
class="svg-icon total icon-24"
|
||||||
|
aria-hidden="true"
|
||||||
|
v-html="icons[getPriceClass()]"
|
||||||
|
></span>
|
||||||
|
<span
|
||||||
|
class="total-text"
|
||||||
|
:class="getPriceClass()"
|
||||||
|
>{{ item.value * selectedAmountToBuy }}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="item.key === 'gem' && gemsLeft < 1"
|
||||||
|
class="no-more-gems"
|
||||||
|
>
|
||||||
|
{{ $t('notEnoughGemsToBuy') }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="nonSubscriberHourglasses"
|
||||||
|
class="hourglass-nonsub mt-3"
|
||||||
|
>
|
||||||
|
{{ $t('mysticHourglassNeededNoSub') }}
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
v-if="getPriceClass() === 'gems'
|
||||||
|
&& !enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)"
|
||||||
|
class="btn btn-primary mb-3"
|
||||||
|
@click="purchaseGems()"
|
||||||
|
>
|
||||||
|
{{ $t('purchaseGems') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-else-if="nonSubscriberHourglasses"
|
||||||
|
class="btn btn-primary"
|
||||||
|
@click="viewSubscriptions(item)"
|
||||||
|
>
|
||||||
|
{{ $t('viewSubscriptions') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-else-if="!(item.key === 'gem' && gemsLeft < 1)"
|
||||||
|
class="btn btn-primary"
|
||||||
|
:disabled="item.key === 'gem' && gemsLeft === 0 ||
|
||||||
|
attemptingToPurchaseMoreGemsThanAreLeft || numberInvalid || item.locked ||
|
||||||
|
!preventHealthPotion ||
|
||||||
|
!enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)"
|
||||||
|
:class="{'notEnough': !preventHealthPotion ||
|
||||||
|
!enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)}"
|
||||||
|
tabindex="0"
|
||||||
|
@click="buyItem()"
|
||||||
|
>
|
||||||
|
{{ $t('buyNow') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
v-if="item.key === 'gem' && gemsLeft < 1"
|
|
||||||
class="no-more-gems"
|
|
||||||
>
|
|
||||||
{{ $t('notEnoughGemsToBuy') }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="nonSubscriberHourglasses"
|
|
||||||
class="hourglass-nonsub mt-3"
|
|
||||||
>
|
|
||||||
{{ $t('mysticHourglassNeededNoSub') }}
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
v-if="getPriceClass() === 'gems'
|
|
||||||
&& !enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)"
|
|
||||||
class="btn btn-primary mb-3"
|
|
||||||
@click="purchaseGems()"
|
|
||||||
>
|
|
||||||
{{ $t('purchaseGems') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
v-else-if="nonSubscriberHourglasses"
|
|
||||||
class="btn btn-primary"
|
|
||||||
@click="viewSubscriptions(item)"
|
|
||||||
>
|
|
||||||
{{ $t('viewSubscriptions') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
v-else-if="!(item.key === 'gem' && gemsLeft < 1)"
|
|
||||||
class="btn btn-primary"
|
|
||||||
:disabled="item.key === 'gem' && gemsLeft === 0 ||
|
|
||||||
attemptingToPurchaseMoreGemsThanAreLeft || numberInvalid || item.locked ||
|
|
||||||
!preventHealthPotion ||
|
|
||||||
!enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)"
|
|
||||||
:class="{'notEnough': !preventHealthPotion ||
|
|
||||||
!enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)}"
|
|
||||||
tabindex="0"
|
|
||||||
@click="buyItem()"
|
|
||||||
>
|
|
||||||
{{ $t('buyNow') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<countdown-banner
|
||||||
<countdown-banner
|
v-if="item.end && item.owned == null"
|
||||||
v-if="item.end && item.owned == null"
|
:end-date="endDate"
|
||||||
:end-date="endDate"
|
class="limitedTime available"
|
||||||
class="limitedTime available"
|
|
||||||
/>
|
|
||||||
<div
|
|
||||||
v-if="item.key === 'rebirth_orb' && item.value > 0 && user.stats.lvl >= 100"
|
|
||||||
class="free-rebirth d-flex align-items-center"
|
|
||||||
>
|
|
||||||
<div class="m-auto">
|
|
||||||
<span
|
|
||||||
class="svg-icon inline icon-16 mr-2 pt-015"
|
|
||||||
v-html="icons.whiteClock"
|
|
||||||
></span>
|
|
||||||
<span v-html="$t('nextFreeRebirth', {days: nextFreeRebirth})"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="item.key === 'gem'"
|
|
||||||
class="d-flex justify-content-center align-items-center"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="gemsLeft > 0"
|
|
||||||
class="gems-left d-flex justify-content-center align-items-center"
|
|
||||||
>
|
|
||||||
<strong>{{ $t('monthlyGems') }} </strong>
|
|
||||||
{{ gemsLeft }} / {{ totalGems }} {{ $t('gemsRemaining') }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="gemsLeft === 0"
|
|
||||||
class="out-of-gems-banner d-flex justify-content-center align-items-center"
|
|
||||||
>
|
|
||||||
<strong>{{ $t('monthlyGems') }} </strong>
|
|
||||||
{{ gemsLeft }} / {{ totalGems }} {{ $t('gemsRemaining') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
slot="modal-footer"
|
|
||||||
>
|
|
||||||
<span class="user-balance ml-3 my-auto">{{ $t('yourBalance') }}</span>
|
|
||||||
<balanceInfo
|
|
||||||
class="mr-3"
|
|
||||||
:currency-needed="getPriceClass()"
|
|
||||||
:amount-needed="item.value"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
<div
|
||||||
|
v-if="item.key === 'rebirth_orb' && item.value > 0 && user.stats.lvl >= 100"
|
||||||
|
class="free-rebirth d-flex align-items-center"
|
||||||
|
>
|
||||||
|
<div class="m-auto">
|
||||||
|
<span
|
||||||
|
class="svg-icon inline icon-16 mr-2 pt-015"
|
||||||
|
v-html="icons.whiteClock"
|
||||||
|
></span>
|
||||||
|
<span v-html="$t('nextFreeRebirth', {days: nextFreeRebirth})"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="item.key === 'gem'"
|
||||||
|
class="d-flex justify-content-center align-items-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="gemsLeft > 0"
|
||||||
|
class="gems-left d-flex justify-content-center align-items-center"
|
||||||
|
>
|
||||||
|
<strong>{{ $t('monthlyGems') }} </strong>
|
||||||
|
{{ gemsLeft }} / {{ totalGems }} {{ $t('gemsRemaining') }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="gemsLeft === 0"
|
||||||
|
class="out-of-gems-banner d-flex justify-content-center align-items-center"
|
||||||
|
>
|
||||||
|
<strong>{{ $t('monthlyGems') }} </strong>
|
||||||
|
{{ gemsLeft }} / {{ totalGems }} {{ $t('gemsRemaining') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
slot="modal-footer"
|
||||||
|
>
|
||||||
|
<span class="user-balance ml-3 my-auto">{{ $t('yourBalance') }}</span>
|
||||||
|
<balanceInfo
|
||||||
|
class="mr-3"
|
||||||
|
:currency-needed="getPriceClass()"
|
||||||
|
:amount-needed="item.value"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</b-modal>
|
</b-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -269,7 +269,13 @@
|
|||||||
|
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
width: 448px;
|
width: 448px;
|
||||||
|
max-width: calc(100vw - 20px);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
@media (max-width: 468px) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.badge-dialog {
|
.badge-dialog {
|
||||||
@@ -346,7 +352,23 @@
|
|||||||
|
|
||||||
.content {
|
.content {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 448px;
|
width: 100%;
|
||||||
|
max-width: 448px;
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
@media (max-width: 468px) {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
@media (max-width: 300px) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-wrapper {
|
.item-wrapper {
|
||||||
@@ -564,7 +586,7 @@
|
|||||||
|
|
||||||
.limitedTime {
|
.limitedTime {
|
||||||
height: 32px;
|
height: 32px;
|
||||||
width: 446px;
|
width: 100%;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
margin: 24px 0 0 0;
|
margin: 24px 0 0 0;
|
||||||
background-color: $purple-300;
|
background-color: $purple-300;
|
||||||
@@ -829,10 +851,17 @@ export default {
|
|||||||
- ownedMounts
|
- ownedMounts
|
||||||
- ownedItems;
|
- ownedItems;
|
||||||
|
|
||||||
if (
|
if (petsRemaining < 0) {
|
||||||
petsRemaining < 0
|
const confirmed = await new Promise(resolve => {
|
||||||
&& !window.confirm(this.$t('purchasePetItemConfirm', { itemText: this.item.text })) // eslint-disable-line no-alert
|
this.$root.$emit('habitica:purchase-confirm', {
|
||||||
) return;
|
message: this.$t('purchasePetItemConfirm', { itemText: this.item.text }),
|
||||||
|
currency: this.item.currency,
|
||||||
|
cost: this.item.value * this.selectedAmountToBuy,
|
||||||
|
resolve,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!confirmed) return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.item.purchaseType === 'customization') {
|
if (this.item.purchaseType === 'customization') {
|
||||||
@@ -844,15 +873,23 @@ export default {
|
|||||||
this.purchased(this.item.text);
|
this.purchased(this.item.text);
|
||||||
} else {
|
} else {
|
||||||
const shouldConfirmPurchase = this.item.currency === 'gems' || this.item.currency === 'hourglasses';
|
const shouldConfirmPurchase = this.item.currency === 'gems' || this.item.currency === 'hourglasses';
|
||||||
if (
|
if (shouldConfirmPurchase) {
|
||||||
shouldConfirmPurchase
|
const confirmed = await this.confirmPurchase(
|
||||||
&& !this.confirmPurchase(this.item.currency, this.item.value * this.selectedAmountToBuy)
|
this.item.currency,
|
||||||
) {
|
this.item.value * this.selectedAmountToBuy,
|
||||||
return;
|
);
|
||||||
|
if (!confirmed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (this.genericPurchase) {
|
if (this.genericPurchase) {
|
||||||
|
if (this.item.key === 'rebirth_orb') {
|
||||||
|
localStorage.setItem('show-rebirth-confirmation', 'true');
|
||||||
|
}
|
||||||
await this.makeGenericPurchase(this.item, 'buyModal', this.selectedAmountToBuy);
|
await this.makeGenericPurchase(this.item, 'buyModal', this.selectedAmountToBuy);
|
||||||
await this.purchased(this.item.text);
|
if (this.item.key !== 'rebirth_orb') {
|
||||||
|
await this.purchased(this.item.text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,22 @@
|
|||||||
|
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
width: 448px;
|
width: 448px;
|
||||||
|
max-width: calc(100vw - 20px);
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
@media (max-width: 468px) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
@media (max-width: 300px) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-body {
|
.modal-body {
|
||||||
|
|||||||
207
website/client/src/components/shops/purchaseConfirmModal.vue
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
<template>
|
||||||
|
<b-modal
|
||||||
|
id="purchase-confirm-modal"
|
||||||
|
:hide-footer="true"
|
||||||
|
:hide-header="true"
|
||||||
|
modal-class="purchase-confirm-modal"
|
||||||
|
centered
|
||||||
|
>
|
||||||
|
<div class="modal-content-wrapper">
|
||||||
|
<div class="top-bar"></div>
|
||||||
|
<div class="modal-body-content">
|
||||||
|
<div
|
||||||
|
class="currency-chip"
|
||||||
|
:class="currency"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="svg-icon icon-24"
|
||||||
|
v-html="icons[currency]"
|
||||||
|
></span>
|
||||||
|
<span class="cost-value">{{ cost }}</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="modal-title">
|
||||||
|
{{ $t('confirmPurchase') }}
|
||||||
|
</h2>
|
||||||
|
<p class="modal-subtitle">
|
||||||
|
{{ confirmationMessage }}
|
||||||
|
</p>
|
||||||
|
<div class="button-wrapper">
|
||||||
|
<button
|
||||||
|
class="btn btn-primary"
|
||||||
|
@click="confirm()"
|
||||||
|
>
|
||||||
|
{{ $t('confirm') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn-cancel"
|
||||||
|
@click="cancel()"
|
||||||
|
>
|
||||||
|
{{ $t('cancel') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</b-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import svgGem from '@/assets/svg/gem.svg?raw';
|
||||||
|
import svgHourglass from '@/assets/svg/hourglass.svg?raw';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
confirmationMessage: '',
|
||||||
|
currency: 'gems',
|
||||||
|
cost: 0,
|
||||||
|
resolveCallback: null,
|
||||||
|
icons: Object.freeze({
|
||||||
|
gems: svgGem,
|
||||||
|
hourglasses: svgHourglass,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
this.$root.$on('habitica:purchase-confirm', config => {
|
||||||
|
this.confirmationMessage = config.message;
|
||||||
|
this.currency = config.currency || 'gems';
|
||||||
|
this.cost = config.cost || 0;
|
||||||
|
this.resolveCallback = config.resolve;
|
||||||
|
this.$root.$emit('bv::show::modal', 'purchase-confirm-modal');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
beforeDestroy () {
|
||||||
|
this.$root.$off('habitica:purchase-confirm');
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
confirm () {
|
||||||
|
if (this.resolveCallback) {
|
||||||
|
this.resolveCallback(true);
|
||||||
|
}
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
cancel () {
|
||||||
|
if (this.resolveCallback) {
|
||||||
|
this.resolveCallback(false);
|
||||||
|
}
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
close () {
|
||||||
|
this.$root.$emit('bv::hide::modal', 'purchase-confirm-modal');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import '@/assets/scss/colors.scss';
|
||||||
|
|
||||||
|
::v-deep .purchase-confirm-modal {
|
||||||
|
.modal-dialog {
|
||||||
|
max-width: 330px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-bar {
|
||||||
|
height: 8px;
|
||||||
|
background-color: $purple-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.currency-chip {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
margin-top: 40px;
|
||||||
|
padding: 8px 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.4;
|
||||||
|
|
||||||
|
&.gems {
|
||||||
|
color: $gems-color;
|
||||||
|
background-color: rgba($green-10, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.hourglasses {
|
||||||
|
color: $hourglass-color;
|
||||||
|
background-color: rgba($blue-10, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-24 {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title {
|
||||||
|
margin-top: 16px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
color: $purple-300;
|
||||||
|
font-family: 'Roboto Condensed', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-subtitle {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
text-align: center;
|
||||||
|
color: $gray-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 16px;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-cancel {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: $purple-300;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 8px 16px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,119 +1,119 @@
|
|||||||
<template>
|
<template>
|
||||||
<b-modal
|
<b-modal
|
||||||
id="buy-quest-modal"
|
id="buy-quest-modal"
|
||||||
:hide-header="true"
|
:hide-header="true"
|
||||||
@change="onChange($event)"
|
@change="onChange($event)"
|
||||||
>
|
|
||||||
<span
|
|
||||||
v-if="withPin"
|
|
||||||
class="badge-dialog"
|
|
||||||
@click.prevent.stop="togglePinned()"
|
|
||||||
>
|
>
|
||||||
<pin-badge
|
<span
|
||||||
:pinned="isPinned"
|
v-if="withPin"
|
||||||
/>
|
class="badge-dialog"
|
||||||
</span>
|
@click.prevent.stop="togglePinned()"
|
||||||
<div class="dialog-close">
|
>
|
||||||
<close-icon @click="hideDialog()" />
|
<pin-badge
|
||||||
</div>
|
:pinned="isPinned"
|
||||||
<h2 class="text-center textCondensed">
|
|
||||||
{{ $t('questDetails') }}
|
|
||||||
</h2>
|
|
||||||
<div
|
|
||||||
v-if="item != null"
|
|
||||||
class="content"
|
|
||||||
>
|
|
||||||
<div class="inner-content">
|
|
||||||
<questDialogContent
|
|
||||||
:item="item"
|
|
||||||
:abbreviated="true"
|
|
||||||
/>
|
/>
|
||||||
<div
|
</span>
|
||||||
v-if="item.addlNotes"
|
<div class="dialog-close">
|
||||||
class="mx-4 mb-3"
|
<close-icon @click="hideDialog()" />
|
||||||
>
|
</div>
|
||||||
{{ item.addlNotes }}
|
<h2 class="text-center textCondensed">
|
||||||
</div>
|
{{ $t('questDetails') }}
|
||||||
<quest-rewards :quest="item" />
|
</h2>
|
||||||
<div
|
<div
|
||||||
v-if="!item.locked"
|
v-if="item != null"
|
||||||
class="purchase-amount"
|
class="content"
|
||||||
>
|
>
|
||||||
<div class="item-cost">
|
<div class="inner-content">
|
||||||
<span
|
<questDialogContent
|
||||||
class="cost"
|
:item="item"
|
||||||
:class="priceType"
|
:abbreviated="true"
|
||||||
>
|
/>
|
||||||
|
<div
|
||||||
|
v-if="item.addlNotes"
|
||||||
|
class="mx-4 mb-3"
|
||||||
|
>
|
||||||
|
{{ item.addlNotes }}
|
||||||
|
</div>
|
||||||
|
<quest-rewards :quest="item" />
|
||||||
|
<div
|
||||||
|
v-if="!item.locked"
|
||||||
|
class="purchase-amount"
|
||||||
|
>
|
||||||
|
<div class="item-cost">
|
||||||
<span
|
<span
|
||||||
class="svg-icon inline icon-24"
|
class="cost"
|
||||||
aria-hidden="true"
|
:class="priceType"
|
||||||
v-html="icons[priceType]"
|
|
||||||
>
|
>
|
||||||
|
<span
|
||||||
|
class="svg-icon inline icon-24"
|
||||||
|
aria-hidden="true"
|
||||||
|
v-html="icons[priceType]"
|
||||||
|
>
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
:class="priceType"
|
||||||
|
>{{ item.value }}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="how-many-to-buy">
|
||||||
|
<strong>{{ $t('howManyToBuy') }}</strong>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<number-increment
|
||||||
|
@updateQuantity="selectedAmountToBuy = $event"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="total-row">
|
||||||
|
<span class="total-text">
|
||||||
|
{{ $t('sendTotal') }}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
|
class="svg-icon inline icon-20"
|
||||||
|
aria-hidden="true"
|
||||||
|
v-html="currencyIcon"
|
||||||
|
></span>
|
||||||
|
<span
|
||||||
|
class="total"
|
||||||
:class="priceType"
|
:class="priceType"
|
||||||
>{{ item.value }}</span>
|
>{{ item.value * selectedAmountToBuy }}</span>
|
||||||
</span>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="how-many-to-buy">
|
|
||||||
<strong>{{ $t('howManyToBuy') }}</strong>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<number-increment
|
|
||||||
@updateQuantity="selectedAmountToBuy = $event"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="total-row">
|
|
||||||
<span class="total-text">
|
|
||||||
{{ $t('sendTotal') }}
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="svg-icon inline icon-20"
|
|
||||||
aria-hidden="true"
|
|
||||||
v-html="currencyIcon"
|
|
||||||
></span>
|
|
||||||
<span
|
|
||||||
class="total"
|
|
||||||
:class="priceType"
|
|
||||||
>{{ item.value * selectedAmountToBuy }}</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
<button
|
||||||
|
v-if="priceType === 'gems'
|
||||||
|
&& !enoughCurrency(priceType, item.value * selectedAmountToBuy)
|
||||||
|
&& !item.locked"
|
||||||
|
class="btn btn-primary mb-3"
|
||||||
|
@click="purchaseGems()"
|
||||||
|
>
|
||||||
|
{{ $t('purchaseGems') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-else
|
||||||
|
class="btn btn-primary mb-4"
|
||||||
|
:class="{'notEnough': !enoughCurrency(priceType, item.value * selectedAmountToBuy)}"
|
||||||
|
:disabled="numberInvalid"
|
||||||
|
@click="buyItem()"
|
||||||
|
>
|
||||||
|
{{ $t('buyNow') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<button
|
|
||||||
v-if="priceType === 'gems'
|
|
||||||
&& !enoughCurrency(priceType, item.value * selectedAmountToBuy)
|
|
||||||
&& !item.locked"
|
|
||||||
class="btn btn-primary mb-3"
|
|
||||||
@click="purchaseGems()"
|
|
||||||
>
|
|
||||||
{{ $t('purchaseGems') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
v-else
|
|
||||||
class="btn btn-primary mb-4"
|
|
||||||
:class="{'notEnough': !enoughCurrency(priceType, item.value * selectedAmountToBuy)}"
|
|
||||||
:disabled="numberInvalid"
|
|
||||||
@click="buyItem()"
|
|
||||||
>
|
|
||||||
{{ $t('buyNow') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<countdown-banner
|
||||||
<countdown-banner
|
v-if="item.end"
|
||||||
v-if="item.end"
|
:end-date="endDate"
|
||||||
:end-date="endDate"
|
|
||||||
/>
|
|
||||||
<div
|
|
||||||
slot="modal-footer"
|
|
||||||
class="clearfix"
|
|
||||||
>
|
|
||||||
<span class="balance float-left">{{ $t('yourBalance') }}</span>
|
|
||||||
<balanceInfo
|
|
||||||
class="float-right"
|
|
||||||
:with-hourglass="priceType === 'hourglasses'"
|
|
||||||
:currency-needed="priceType"
|
|
||||||
:amount-needed="item.value"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
<div
|
||||||
|
slot="modal-footer"
|
||||||
|
class="clearfix"
|
||||||
|
>
|
||||||
|
<span class="balance float-left">{{ $t('yourBalance') }}</span>
|
||||||
|
<balanceInfo
|
||||||
|
class="float-right"
|
||||||
|
:with-hourglass="priceType === 'hourglasses'"
|
||||||
|
:currency-needed="priceType"
|
||||||
|
:amount-needed="item.value"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</b-modal>
|
</b-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -163,8 +163,33 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
margin-top: 8%;
|
|
||||||
width: 448px !important;
|
width: 448px !important;
|
||||||
|
max-width: calc(100vw - 20px);
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
@media (max-width: 468px) {
|
||||||
|
width: 100% !important;
|
||||||
|
margin: 3rem auto 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 353px) {
|
||||||
|
margin: 2.5rem auto 0.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge-dialog {
|
||||||
|
left: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
@media (max-width: 300px) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
@@ -485,8 +510,12 @@ export default {
|
|||||||
this.selectedAmountToBuy = 1;
|
this.selectedAmountToBuy = 1;
|
||||||
this.$emit('change', $event);
|
this.$emit('change', $event);
|
||||||
},
|
},
|
||||||
buyItem () {
|
async buyItem () {
|
||||||
if (!this.confirmPurchase(this.item.currency, this.item.value * this.selectedAmountToBuy)) {
|
const confirmed = await this.confirmPurchase(
|
||||||
|
this.item.currency,
|
||||||
|
this.item.value * this.selectedAmountToBuy,
|
||||||
|
);
|
||||||
|
if (!confirmed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.makeGenericPurchase(this.item, 'buyQuestModal', this.selectedAmountToBuy);
|
this.makeGenericPurchase(this.item, 'buyQuestModal', this.selectedAmountToBuy);
|
||||||
|
|||||||
@@ -120,9 +120,9 @@
|
|||||||
>
|
>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
{{ $t('commGuideAKA', {habitName: 'heyeilatan', realName: 'Natalie'}) }}
|
{{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}
|
||||||
({{ $t('commGuideOnGitHub', {gitHubName: 'CuriousMagpie'}) }})
|
({{ $t('commGuideOnGitHub', {gitHubName: 'phillipthelen'}) }})
|
||||||
- Web Developer
|
- Developer
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
{{ $t('commGuideAKA', {habitName: 'redphoenix', realName: 'Vicky'}) }}
|
{{ $t('commGuideAKA', {habitName: 'redphoenix', realName: 'Vicky'}) }}
|
||||||
@@ -133,10 +133,6 @@
|
|||||||
{{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }}
|
{{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }}
|
||||||
- Art, Community Management, Many Hats
|
- Art, Community Management, Many Hats
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
{{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Sabe'}) }}
|
|
||||||
- Web Developer
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
{{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }}
|
{{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }}
|
||||||
- Designer
|
- Designer
|
||||||
@@ -146,8 +142,12 @@
|
|||||||
- Mobile Designer
|
- Mobile Designer
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
{{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}
|
{{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Kalista'}) }}
|
||||||
- Mobile Developer
|
- Web Developer
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
{{ $t('commGuideAKA', {habitName: 'fizself', realName: 'Hafiz'}) }}
|
||||||
|
- Developer
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p v-html="$t('commGuidePara013')"></p>
|
<p v-html="$t('commGuidePara013')"></p>
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
<em>
|
<em>
|
||||||
Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8,
|
Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8,
|
||||||
Breadstrings, Megan, Blade, Daniel the Bard, deilann, shanaqui, Nakonana,
|
Breadstrings, Megan, Blade, Daniel the Bard, deilann, shanaqui, Nakonana,
|
||||||
Dewines, Alys, Fox_town, MaybeSteveRogers, and Cantras.
|
Dewines, Alys, Fox_town, MaybeSteveRogers, Cantras, and heyeilatan.
|
||||||
</em>
|
</em>
|
||||||
</p>
|
</p>
|
||||||
<h2 id="final">
|
<h2 id="final">
|
||||||
|
|||||||
@@ -45,6 +45,9 @@
|
|||||||
<p class="gray-200">
|
<p class="gray-200">
|
||||||
{{ $t('billedMonthly') }}
|
{{ $t('billedMonthly') }}
|
||||||
</p>
|
</p>
|
||||||
|
<small class="gray-200">
|
||||||
|
{{ $t('groupPlanBillingFYI') }}
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="top-right"></div>
|
<div class="top-right"></div>
|
||||||
<div class="d-flex justify-content-between align-items-middle w-100 gap-72 mb-100">
|
<div class="d-flex justify-content-between align-items-middle w-100 gap-72 mb-100">
|
||||||
@@ -114,6 +117,9 @@
|
|||||||
<p class="gray-200">
|
<p class="gray-200">
|
||||||
{{ $t('billedMonthly') }}
|
{{ $t('billedMonthly') }}
|
||||||
</p>
|
</p>
|
||||||
|
<small class="gray-200">
|
||||||
|
{{ $t('groupPlanBillingFYI') }}
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="bot-right"></div>
|
<div class="bot-right"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -174,6 +180,11 @@
|
|||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.67;
|
||||||
|
}
|
||||||
|
|
||||||
// Major layout elements
|
// Major layout elements
|
||||||
|
|
||||||
.bottom-banner {
|
.bottom-banner {
|
||||||
|
|||||||
@@ -11,12 +11,12 @@
|
|||||||
<privacy-banner
|
<privacy-banner
|
||||||
class="privacy-banner"
|
class="privacy-banner"
|
||||||
/>
|
/>
|
||||||
<div class="bg-purple-300 white">
|
<div class="bg-purple-300 white pt-5">
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div
|
||||||
id="intro-signup"
|
id="intro-signup"
|
||||||
>
|
>
|
||||||
<div class="d-flex justify-content-center">
|
<div class="d-flex justify-content-center pb-5 mb-5">
|
||||||
<div class="w-33 mr-5 mt-5">
|
<div class="w-33 mr-5 mt-5">
|
||||||
<img
|
<img
|
||||||
src="@/assets/images/home/home-main@3x.png"
|
src="@/assets/images/home/home-main@3x.png"
|
||||||
|
|||||||
@@ -64,9 +64,11 @@
|
|||||||
<li>sexual orientation; and</li>
|
<li>sexual orientation; and</li>
|
||||||
<li>information collected from a known child.</li>
|
<li>information collected from a known child.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p><strong>
|
<p>
|
||||||
NOTE: Please do not provide us “sensitive personal information” or “sensitive personal data”, as those terms are defined under applicable privacy laws, unless we directly request that you do so. If you feel, after careful consideration, that it is necessary to provide us certain sensitive personal information or data, please provide us the minimum amount of such information or data that is necessary.
|
<strong>
|
||||||
</strong></p>
|
NOTE: Please do not provide us “sensitive personal information” or “sensitive personal data”, as those terms are defined under applicable privacy laws, unless we directly request that you do so. If you feel, after careful consideration, that it is necessary to provide us certain sensitive personal information or data, please provide us the minimum amount of such information or data that is necessary.
|
||||||
|
</strong>
|
||||||
|
</p>
|
||||||
<h3 id="section_1_1">
|
<h3 id="section_1_1">
|
||||||
1.1 Information You Provide Directly
|
1.1 Information You Provide Directly
|
||||||
</h3>
|
</h3>
|
||||||
@@ -617,7 +619,7 @@
|
|||||||
7. General Audience Services
|
7. General Audience Services
|
||||||
</h2>
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
The Service is intended for users 18 years or older; you are not permitted to access or use the Service if you are younger than 18. We do not knowingly collect personal information from children under the age of 18 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 18 has provided personal information to us, please contact us at <a href='mailto:privacy@habitica.com'>privacy@habitica.com</a>, and we will delete that information from our databases.
|
The Service is intended for users 18 years or older; you are not permitted to access or use the Service if you are younger than 18. We do not knowingly collect personal information from children under the age of 18 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 18 has provided personal information to us, please contact us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>, and we will delete that information from our databases.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="section_8">
|
<h2 id="section_8">
|
||||||
@@ -708,7 +710,7 @@
|
|||||||
|
|
||||||
<p><strong><u>Nevada Residents</u></strong></p>
|
<p><strong><u>Nevada Residents</u></strong></p>
|
||||||
<p>
|
<p>
|
||||||
Nevada residents may opt out of the sale of certain “covered information” collected by operators of websites or online services. We currently do not sell covered information, as “sale” is defined by such law, and do not have plans to do so. In accordance with Nevada law, you may submit to us a verified request instructing us not to sell your covered information by sending an email to <a href='mailto:privacy@habitica.com'>privacy@habitica.com</a>.
|
Nevada residents may opt out of the sale of certain “covered information” collected by operators of websites or online services. We currently do not sell covered information, as “sale” is defined by such law, and do not have plans to do so. In accordance with Nevada law, you may submit to us a verified request instructing us not to sell your covered information by sending an email to <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>.
|
||||||
</p>
|
</p>
|
||||||
<p><strong><u>Notice to United Kingdom/European/Switzerland Residents.</u></strong></p>
|
<p><strong><u>Notice to United Kingdom/European/Switzerland Residents.</u></strong></p>
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
<router-view />
|
<router-view />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
id="bottom-background"
|
|
||||||
v-if="loginFlow"
|
v-if="loginFlow"
|
||||||
|
id="bottom-background"
|
||||||
class="bg-purple-300"
|
class="bg-purple-300"
|
||||||
>
|
>
|
||||||
<div class="seamless_mountains_demo_repeat"></div>
|
<div class="seamless_mountains_demo_repeat"></div>
|
||||||
@@ -31,7 +31,10 @@
|
|||||||
id="bottom-wrap"
|
id="bottom-wrap"
|
||||||
class="purple-4"
|
class="purple-4"
|
||||||
>
|
>
|
||||||
<div id="bottom-background" v-if="!loginFlow">
|
<div
|
||||||
|
v-if="!loginFlow"
|
||||||
|
id="bottom-background"
|
||||||
|
>
|
||||||
<div class="seamless_mountains_demo_repeat"></div>
|
<div class="seamless_mountains_demo_repeat"></div>
|
||||||
<div class="midground_foreground_extended2"></div>
|
<div class="midground_foreground_extended2"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -158,7 +158,7 @@
|
|||||||
BY PURCHASING PREMIUM YOU EXPRESSLY UNDERSTAND AND AGREE TO OUR REFUND POLICY:
|
BY PURCHASING PREMIUM YOU EXPRESSLY UNDERSTAND AND AGREE TO OUR REFUND POLICY:
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
YOU CAN REQUEST A REFUND OF YOUR MOST RECENT PAYMENT TO US BY CONTACTING US AT <a href='mailto:admin@habitica.com'>ADMIN@HABITICA.COM</a>. THE AMOUNT OF YOUR REFUND, IF ANY, WILL BE BASED ON (1) THE AMOUNT OF YOUR PURCHASED BUT UNUSED SUBSCRIPTION BENEFITS AND (2) THE TERMS IMPOSED ON US BY OUR PAYMENT PROCESSING VENDORS (E.G., WITH RESPECT TO THE DURATION OF THE REFUND PERIOD).
|
YOU CAN REQUEST A REFUND OF YOUR MOST RECENT PAYMENT TO US BY CONTACTING US AT <a href="mailto:admin@habitica.com">ADMIN@HABITICA.COM</a>. THE AMOUNT OF YOUR REFUND, IF ANY, WILL BE BASED ON (1) THE AMOUNT OF YOUR PURCHASED BUT UNUSED SUBSCRIPTION BENEFITS AND (2) THE TERMS IMPOSED ON US BY OUR PAYMENT PROCESSING VENDORS (E.G., WITH RESPECT TO THE DURATION OF THE REFUND PERIOD).
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
|
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
|
||||||
|
|||||||
@@ -1,65 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<b-modal
|
<b-modal
|
||||||
id="broken-task-modal"
|
id="broken-task-modal"
|
||||||
title="Broken Challenge"
|
|
||||||
size="sm"
|
|
||||||
:hide-footer="true"
|
:hide-footer="true"
|
||||||
|
:hide-header="true"
|
||||||
|
modal-class="broken-task-confirm-modal"
|
||||||
|
centered
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-if="brokenChallengeTask && brokenChallengeTask.challenge"
|
v-if="brokenChallengeTask && brokenChallengeTask.challenge"
|
||||||
class="modal-body"
|
class="modal-content-wrapper"
|
||||||
>
|
>
|
||||||
<div
|
<div class="top-bar"></div>
|
||||||
v-if="brokenChallengeTask.challenge.broken === 'TASK_DELETED'
|
<div class="modal-body-content">
|
||||||
|| brokenChallengeTask.challenge.broken === 'CHALLENGE_TASK_NOT_FOUND'"
|
<div
|
||||||
>
|
class="icon-wrapper"
|
||||||
<h2>{{ $t('brokenTask') }}</h2>
|
v-html="icons.warningIcon"
|
||||||
<div>
|
></div>
|
||||||
|
<h2 class="modal-title">
|
||||||
|
{{ modalTitle }}
|
||||||
|
</h2>
|
||||||
|
<p class="modal-subtitle">
|
||||||
|
{{ modalSubtitle }}
|
||||||
|
</p>
|
||||||
|
<div class="button-wrapper">
|
||||||
<button
|
<button
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
@click="unlink('keep')"
|
@click="keepAction()"
|
||||||
>
|
>
|
||||||
{{ $t('keepIt') }}
|
{{ keepButtonText }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="btn btn-danger"
|
class="btn btn-danger"
|
||||||
@click="removeTask(obj)"
|
@click="removeAction()"
|
||||||
>
|
>
|
||||||
{{ $t('removeIt') }}
|
{{ removeButtonText }}
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="brokenChallengeTask.challenge.broken === 'CHALLENGE_DELETED'">
|
|
||||||
<h2>{{ $t('brokenChallenge') }}</h2>
|
|
||||||
<div>
|
|
||||||
<button
|
|
||||||
class="btn btn-primary"
|
|
||||||
@click="unlink('keep-all')"
|
|
||||||
>
|
|
||||||
{{ $t('keepTasks') }}
|
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="btn btn-danger"
|
class="btn-cancel"
|
||||||
@click="unlink('remove-all')"
|
@click="close()"
|
||||||
>
|
>
|
||||||
{{ $t('removeTasks') }}
|
{{ $t('cancel') }}
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="brokenChallengeTask.challenge.broken === 'CHALLENGE_CLOSED'">
|
|
||||||
<h2 v-html="$t('challengeCompleted', {user: brokenChallengeTask.challenge.winner})"></h2>
|
|
||||||
<div>
|
|
||||||
<button
|
|
||||||
class="btn btn-primary"
|
|
||||||
@click="unlink('keep-all')"
|
|
||||||
>
|
|
||||||
{{ $t('keepTasks') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
class="btn btn-danger"
|
|
||||||
@click="unlink('remove-all')"
|
|
||||||
>
|
|
||||||
{{ $t('removeTasks') }}
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -67,23 +47,171 @@
|
|||||||
</b-modal>
|
</b-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss" scoped>
|
||||||
.modal-body {
|
@import '@/assets/scss/colors.scss';
|
||||||
padding-bottom: 2em;
|
|
||||||
|
::v-deep .broken-task-confirm-modal {
|
||||||
|
.modal-dialog {
|
||||||
|
max-width: 330px;
|
||||||
|
margin: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-bar {
|
||||||
|
height: 8px;
|
||||||
|
background-color: $maroon-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wrapper {
|
||||||
|
margin-top: 40px;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
|
||||||
|
::v-deep svg {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title {
|
||||||
|
margin-top: 16px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
color: $maroon-100;
|
||||||
|
font-family: 'Roboto Condensed', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-subtitle {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
text-align: center;
|
||||||
|
color: $gray-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 16px;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-cancel {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: $purple-300;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 8px 16px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapActions } from '@/libs/store';
|
import { mapActions } from '@/libs/store';
|
||||||
import notifications from '@/mixins/notifications';
|
import notifications from '@/mixins/notifications';
|
||||||
|
import warningIcon from '@/assets/svg/warning_icon.svg?raw';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: [notifications],
|
mixins: [notifications],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
brokenChallengeTask: {},
|
brokenChallengeTask: {},
|
||||||
|
icons: Object.freeze({
|
||||||
|
warningIcon,
|
||||||
|
}),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
brokenType () {
|
||||||
|
return this.brokenChallengeTask.challenge?.broken;
|
||||||
|
},
|
||||||
|
isSingleTask () {
|
||||||
|
return this.brokenType === 'TASK_DELETED'
|
||||||
|
|| this.brokenType === 'CHALLENGE_TASK_NOT_FOUND';
|
||||||
|
},
|
||||||
|
brokenChallengeTaskCount () {
|
||||||
|
if (!this.brokenChallengeTask.challenge?.id) return 0;
|
||||||
|
const challengeId = this.brokenChallengeTask.challenge.id;
|
||||||
|
const tasksData = this.$store.state.tasks.data;
|
||||||
|
let count = 0;
|
||||||
|
['habits', 'dailys', 'todos', 'rewards'].forEach(type => {
|
||||||
|
if (tasksData[type]) {
|
||||||
|
count += tasksData[type].filter(
|
||||||
|
t => t.challenge && t.challenge.id === challengeId,
|
||||||
|
).length;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
modalTitle () {
|
||||||
|
if (this.isSingleTask) {
|
||||||
|
return this.$t('brokenTask');
|
||||||
|
}
|
||||||
|
if (this.brokenType === 'CHALLENGE_CLOSED') {
|
||||||
|
return this.$t('challengeCompleted');
|
||||||
|
}
|
||||||
|
return this.$t('brokenChallenge');
|
||||||
|
},
|
||||||
|
modalSubtitle () {
|
||||||
|
if (this.isSingleTask) {
|
||||||
|
return this.$t('brokenTaskDescription');
|
||||||
|
}
|
||||||
|
if (this.brokenType === 'CHALLENGE_CLOSED') {
|
||||||
|
return this.$t('challengeCompletedDescription', { user: this.brokenChallengeTask.challenge?.winner });
|
||||||
|
}
|
||||||
|
return this.$t('brokenChallengeDescription');
|
||||||
|
},
|
||||||
|
keepButtonText () {
|
||||||
|
if (this.isSingleTask) {
|
||||||
|
return this.$t('keepIt');
|
||||||
|
}
|
||||||
|
return this.$t('keepTasks');
|
||||||
|
},
|
||||||
|
removeButtonText () {
|
||||||
|
if (this.isSingleTask) {
|
||||||
|
return this.$t('removeIt');
|
||||||
|
}
|
||||||
|
return this.$t('removeTasks');
|
||||||
|
},
|
||||||
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
this.$root.$on('handle-broken-task', task => {
|
this.$root.$on('handle-broken-task', task => {
|
||||||
this.brokenChallengeTask = { ...task };
|
this.brokenChallengeTask = { ...task };
|
||||||
@@ -99,8 +227,36 @@ export default {
|
|||||||
unlinkOneTask: 'tasks:unlinkOneTask',
|
unlinkOneTask: 'tasks:unlinkOneTask',
|
||||||
unlinkAllTasks: 'tasks:unlinkAllTasks',
|
unlinkAllTasks: 'tasks:unlinkAllTasks',
|
||||||
}),
|
}),
|
||||||
|
keepAction () {
|
||||||
|
if (this.isSingleTask) {
|
||||||
|
this.unlink('keep');
|
||||||
|
} else {
|
||||||
|
this.unlink('keep-all');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async removeAction () {
|
||||||
|
if (this.isSingleTask) {
|
||||||
|
await this.removeTask();
|
||||||
|
} else {
|
||||||
|
await this.unlink('remove-all');
|
||||||
|
}
|
||||||
|
},
|
||||||
async unlink (keepOption) {
|
async unlink (keepOption) {
|
||||||
if (keepOption.indexOf('-all') !== -1) {
|
if (keepOption.indexOf('-all') !== -1) {
|
||||||
|
if (keepOption === 'remove-all') {
|
||||||
|
const count = this.brokenChallengeTaskCount;
|
||||||
|
const confirmed = await new Promise(resolve => {
|
||||||
|
this.$root.$emit('habitica:delete-task-confirm', {
|
||||||
|
title: count === 1 ? this.$t('deleteTask') : this.$t('deleteXTasks', { count }),
|
||||||
|
description: this.$t('brokenChallengeTaskCount', { count }),
|
||||||
|
message: this.$t('confirmDeleteTasks'),
|
||||||
|
buttonText: count === 1 ? this.$t('deleteTask') : this.$t('deleteXTasks', { count }),
|
||||||
|
resolve,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!confirmed) return;
|
||||||
|
}
|
||||||
|
|
||||||
await this.unlinkAllTasks({
|
await this.unlinkAllTasks({
|
||||||
challengeId: this.brokenChallengeTask.challenge.id,
|
challengeId: this.brokenChallengeTask.challenge.id,
|
||||||
keep: keepOption,
|
keep: keepOption,
|
||||||
@@ -122,8 +278,14 @@ export default {
|
|||||||
});
|
});
|
||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
removeTask () {
|
async removeTask () {
|
||||||
if (!window.confirm('Are you sure you want to delete this task?')) return; // eslint-disable-line no-alert
|
const confirmed = await new Promise(resolve => {
|
||||||
|
this.$root.$emit('habitica:delete-task-confirm', {
|
||||||
|
message: this.$t('sureDelete'),
|
||||||
|
resolve,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!confirmed) return;
|
||||||
this.destroyTask(this.brokenChallengeTask);
|
this.destroyTask(this.brokenChallengeTask);
|
||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
ref="tasksList"
|
ref="tasksList"
|
||||||
class="sortable-tasks"
|
class="sortable-tasks"
|
||||||
:disabled="activeFilter.label === 'scheduled' || !canBeDragged()"
|
:disabled="activeFilter.label === 'scheduled' || !canBeDragged()"
|
||||||
scrollSensitivity="64"
|
scroll-sensitivity="64"
|
||||||
:delay-on-touch-only="true"
|
:delay-on-touch-only="true"
|
||||||
:delay="100"
|
:delay="100"
|
||||||
@update="taskSorted"
|
@update="taskSorted"
|
||||||
|
|||||||
219
website/client/src/components/tasks/deleteTaskConfirmModal.vue
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
<template>
|
||||||
|
<b-modal
|
||||||
|
id="delete-task-confirm-modal"
|
||||||
|
:hide-footer="true"
|
||||||
|
:hide-header="true"
|
||||||
|
modal-class="delete-confirm-modal"
|
||||||
|
centered
|
||||||
|
>
|
||||||
|
<div class="modal-content-wrapper">
|
||||||
|
<div class="top-bar"></div>
|
||||||
|
<div class="modal-body-content">
|
||||||
|
<div
|
||||||
|
class="icon-wrapper"
|
||||||
|
v-html="icons.warningIcon"
|
||||||
|
></div>
|
||||||
|
<h2 class="modal-title">
|
||||||
|
{{ displayTitle }}
|
||||||
|
</h2>
|
||||||
|
<p
|
||||||
|
v-if="description"
|
||||||
|
class="modal-description"
|
||||||
|
>
|
||||||
|
{{ description }}
|
||||||
|
</p>
|
||||||
|
<p class="modal-subtitle">
|
||||||
|
{{ confirmationMessage }}
|
||||||
|
</p>
|
||||||
|
<div class="button-wrapper">
|
||||||
|
<button
|
||||||
|
class="btn btn-danger"
|
||||||
|
@click="confirm()"
|
||||||
|
>
|
||||||
|
{{ buttonText }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn-cancel"
|
||||||
|
@click="cancel()"
|
||||||
|
>
|
||||||
|
{{ $t('cancel') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</b-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import warningIcon from '@/assets/svg/warning_icon.svg?raw';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
confirmationMessage: '',
|
||||||
|
taskType: '',
|
||||||
|
description: '',
|
||||||
|
customTitle: '',
|
||||||
|
customButtonText: '',
|
||||||
|
resolveCallback: null,
|
||||||
|
icons: Object.freeze({
|
||||||
|
warningIcon,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
displayTitle () {
|
||||||
|
if (this.customTitle) return this.customTitle;
|
||||||
|
return this.$t('deleteType', { type: this.taskType });
|
||||||
|
},
|
||||||
|
buttonText () {
|
||||||
|
if (this.customButtonText) return this.customButtonText;
|
||||||
|
return this.displayTitle;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
this.$root.$on('habitica:delete-task-confirm', config => {
|
||||||
|
this.confirmationMessage = config.message;
|
||||||
|
this.taskType = config.taskType || '';
|
||||||
|
this.description = config.description || '';
|
||||||
|
this.customTitle = config.title || '';
|
||||||
|
this.customButtonText = config.buttonText || '';
|
||||||
|
this.resolveCallback = config.resolve;
|
||||||
|
this.$root.$emit('bv::show::modal', 'delete-task-confirm-modal');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
beforeDestroy () {
|
||||||
|
this.$root.$off('habitica:delete-task-confirm');
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
confirm () {
|
||||||
|
if (this.resolveCallback) {
|
||||||
|
this.resolveCallback(true);
|
||||||
|
}
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
cancel () {
|
||||||
|
if (this.resolveCallback) {
|
||||||
|
this.resolveCallback(false);
|
||||||
|
}
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
close () {
|
||||||
|
this.$root.$emit('bv::hide::modal', 'delete-task-confirm-modal');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import '@/assets/scss/colors.scss';
|
||||||
|
|
||||||
|
::v-deep .delete-confirm-modal {
|
||||||
|
.modal-dialog {
|
||||||
|
max-width: 330px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-bar {
|
||||||
|
height: 8px;
|
||||||
|
background-color: $maroon-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wrapper {
|
||||||
|
margin-top: 40px;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
|
||||||
|
::v-deep svg {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title {
|
||||||
|
margin-top: 16px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
color: $maroon-100;
|
||||||
|
font-family: 'Roboto Condensed', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-description {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
text-align: center;
|
||||||
|
color: $gray-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-description + .modal-subtitle {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-subtitle {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
text-align: center;
|
||||||
|
color: $gray-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 16px;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-cancel {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: $purple-300;
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 8px 16px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -3,421 +3,421 @@
|
|||||||
class="task-wrapper"
|
class="task-wrapper"
|
||||||
draggable
|
draggable
|
||||||
>
|
>
|
||||||
<div
|
|
||||||
class="task transition"
|
|
||||||
:class="[{
|
|
||||||
'groupTask': task.group.id,
|
|
||||||
'task-not-editable': !teamManagerAccess,
|
|
||||||
'task-not-scoreable': showTaskLockIcon,
|
|
||||||
'link-exempt': !isChallengeTask && !isGroupTask,
|
|
||||||
}, `type_${task.type}`
|
|
||||||
]"
|
|
||||||
@click="castEnd($event, task)"
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
class="d-flex"
|
class="task transition"
|
||||||
:class="{'task-not-scoreable': showTaskLockIcon }"
|
:class="[{
|
||||||
|
'groupTask': task.group.id,
|
||||||
|
'task-not-editable': !teamManagerAccess,
|
||||||
|
'task-not-scoreable': showTaskLockIcon,
|
||||||
|
'link-exempt': !isChallengeTask && !isGroupTask,
|
||||||
|
}, `type_${task.type}`
|
||||||
|
]"
|
||||||
|
@click="castEnd($event, task)"
|
||||||
>
|
>
|
||||||
<!-- Habits left side control-->
|
|
||||||
<div
|
<div
|
||||||
v-if="task.type === 'habit'"
|
class="d-flex"
|
||||||
class="left-control d-flex justify-content-center pt-3"
|
:class="{'task-not-scoreable': showTaskLockIcon }"
|
||||||
:class="[{
|
|
||||||
'control-bottom-box': task.group.id && !isOpenTask,
|
|
||||||
'control-top-box': approvalsClass
|
|
||||||
}, controlClass.up.bg]"
|
|
||||||
>
|
>
|
||||||
|
<!-- Habits left side control-->
|
||||||
<div
|
<div
|
||||||
class="task-control habit-control"
|
v-if="task.type === 'habit'"
|
||||||
|
class="left-control d-flex justify-content-center pt-3"
|
||||||
:class="[{
|
:class="[{
|
||||||
'habit-control-positive-enabled': task.up && !showTaskLockIcon,
|
'control-bottom-box': task.group.id && !isOpenTask,
|
||||||
'habit-control-positive-disabled': !task.up && !showTaskLockIcon,
|
'control-top-box': approvalsClass
|
||||||
'task-not-scoreable': showTaskLockIcon,
|
}, controlClass.up.bg]"
|
||||||
}, controlClass.up.inner]"
|
|
||||||
tabindex="0"
|
|
||||||
role="button"
|
|
||||||
:aria-label="$t('scoreUp')"
|
|
||||||
:aria-disabled="showTaskLockIcon || (!task.up && !showTaskLockIcon)"
|
|
||||||
@click="score('up')"
|
|
||||||
@keypress.enter="score('up')"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-if="showTaskLockIcon"
|
class="task-control habit-control"
|
||||||
class="svg-icon lock"
|
:class="[{
|
||||||
:class="task.up ? controlClass.up.icon : 'positive'"
|
'habit-control-positive-enabled': task.up && !showTaskLockIcon,
|
||||||
v-html="icons.lock"
|
'habit-control-positive-disabled': !task.up && !showTaskLockIcon,
|
||||||
></div>
|
'task-not-scoreable': showTaskLockIcon,
|
||||||
<div
|
}, controlClass.up.inner]"
|
||||||
v-else
|
tabindex="0"
|
||||||
class="svg-icon positive"
|
role="button"
|
||||||
v-html="icons.positive"
|
:aria-label="$t('scoreUp')"
|
||||||
></div>
|
:aria-disabled="showTaskLockIcon || (!task.up && !showTaskLockIcon)"
|
||||||
</div>
|
@click="score('up')"
|
||||||
</div>
|
@keypress.enter="score('up')"
|
||||||
<!-- Dailies and todos left side control-->
|
|
||||||
<div
|
|
||||||
v-if="task.type === 'daily' || task.type === 'todo'"
|
|
||||||
class="left-control d-flex justify-content-center"
|
|
||||||
:class="[{
|
|
||||||
'control-bottom-box': task.group.id && !isOpenTask,
|
|
||||||
'control-top-box': approvalsClass}, controlClass.bg]"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="task-control daily-todo-control"
|
|
||||||
:class="[
|
|
||||||
{ 'task-not-scoreable': showTaskLockIcon },
|
|
||||||
controlClass.inner,
|
|
||||||
]"
|
|
||||||
tabindex="0"
|
|
||||||
role="checkbox"
|
|
||||||
@click="score(showCheckIcon ? 'down' : 'up' )"
|
|
||||||
@keypress.enter="score(showCheckIcon ? 'down' : 'up' )"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="showTaskLockIcon"
|
|
||||||
class="svg-icon lock"
|
|
||||||
:class="controlClass.icon"
|
|
||||||
v-html="icons.lock"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
v-else
|
|
||||||
class="svg-icon check"
|
|
||||||
:class="{
|
|
||||||
'display-check-icon': showCheckIcon,
|
|
||||||
[controlClass.checkbox]: true,
|
|
||||||
}"
|
|
||||||
v-html="icons.check"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Task title, description and icons-->
|
|
||||||
<div
|
|
||||||
class="task-content"
|
|
||||||
:class="contentClass"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="task-clickable-area pt-1 pl-75 pb-0"
|
|
||||||
:class="{ 'cursor-auto': !teamManagerAccess }"
|
|
||||||
tabindex="0"
|
|
||||||
@click="edit($event, task)"
|
|
||||||
@keypress.enter="edit($event, task)"
|
|
||||||
>
|
|
||||||
<div class="d-flex justify-content-between">
|
|
||||||
<h3
|
|
||||||
v-markdown="task.text"
|
|
||||||
class="task-title markdown"
|
|
||||||
:class="{ 'has-notes': task.notes }"
|
|
||||||
></h3>
|
|
||||||
<menu-dropdown
|
|
||||||
v-if="!isRunningYesterdailies && showOptions"
|
|
||||||
ref="taskDropdown"
|
|
||||||
v-b-tooltip.hover.top="$t('options')"
|
|
||||||
tabindex="0"
|
|
||||||
class="task-dropdown mr-1"
|
|
||||||
:right="task.type === 'reward'"
|
|
||||||
>
|
|
||||||
<div slot="dropdown-toggle">
|
|
||||||
<div
|
|
||||||
class="svg-icon dropdown-icon"
|
|
||||||
v-html="icons.menu"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
<div slot="dropdown-content">
|
|
||||||
<div
|
|
||||||
v-if="showEdit"
|
|
||||||
ref="editTaskItem"
|
|
||||||
class="dropdown-item edit-task-item"
|
|
||||||
tabindex="0"
|
|
||||||
@keypress.enter="edit($event, task)"
|
|
||||||
>
|
|
||||||
<span class="dropdown-icon-item">
|
|
||||||
<span
|
|
||||||
class="svg-icon inline edit-icon"
|
|
||||||
v-html="icons.edit"
|
|
||||||
></span>
|
|
||||||
<span class="text">{{ $t('edit') }}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="dropdown-item"
|
|
||||||
tabindex="0"
|
|
||||||
@click="moveToTop"
|
|
||||||
@keypress.enter="moveToTop"
|
|
||||||
>
|
|
||||||
<span class="dropdown-icon-item">
|
|
||||||
<span
|
|
||||||
class="svg-icon inline push-to-top"
|
|
||||||
v-html="icons.top"
|
|
||||||
></span>
|
|
||||||
<span class="text">{{ $t('taskToTop') }}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="dropdown-item"
|
|
||||||
tabindex="0"
|
|
||||||
@click="moveToBottom"
|
|
||||||
@keypress.enter="moveToBottom"
|
|
||||||
>
|
|
||||||
<span class="dropdown-icon-item">
|
|
||||||
<span
|
|
||||||
class="svg-icon inline push-to-bottom"
|
|
||||||
v-html="icons.bottom"
|
|
||||||
></span>
|
|
||||||
<span class="text">{{ $t('taskToBottom') }}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="showDelete"
|
|
||||||
class="dropdown-item"
|
|
||||||
tabindex="0"
|
|
||||||
@click="destroy"
|
|
||||||
@keypress.enter="destroy"
|
|
||||||
>
|
|
||||||
<span class="dropdown-icon-item delete-task-item">
|
|
||||||
<span
|
|
||||||
class="svg-icon inline delete"
|
|
||||||
v-html="icons.delete"
|
|
||||||
></span>
|
|
||||||
<span class="text">{{ $t('delete') }}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</menu-dropdown>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-markdown="task.notes"
|
|
||||||
class="task-notes small-text"
|
|
||||||
:class="{'has-checklist': task.notes && hasChecklist}"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="canViewchecklist"
|
|
||||||
class="checklist"
|
|
||||||
:class="{isOpen: !task.collapseChecklist}"
|
|
||||||
>
|
|
||||||
<div class="d-inline-flex">
|
|
||||||
<div
|
|
||||||
v-b-tooltip.hover.right="$t(`${task.collapseChecklist
|
|
||||||
? 'expand': 'collapse'}Checklist`)"
|
|
||||||
class="collapse-checklist mb-2 d-flex align-items-center expand-toggle"
|
|
||||||
:class="{open: !task.collapseChecklist}"
|
|
||||||
tabindex="0"
|
|
||||||
@click="collapseChecklist(task)"
|
|
||||||
@keypress.enter="collapseChecklist(task)"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-once
|
|
||||||
class="svg-icon"
|
|
||||||
v-html="icons.checklist"
|
|
||||||
></div>
|
|
||||||
<span>{{ checklistProgress }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
|
||||||
<div
|
|
||||||
v-for="item in task.checklist"
|
|
||||||
v-if="!task.collapseChecklist"
|
|
||||||
:key="item.id"
|
|
||||||
class="custom-control custom-checkbox checklist-item"
|
|
||||||
:class="{'checklist-item-done': item.completed, 'cursor-auto': showTaskLockIcon}"
|
|
||||||
>
|
|
||||||
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
|
|
||||||
<input
|
|
||||||
:id="`checklist-${item.id}-${random}`"
|
|
||||||
class="custom-control-input"
|
|
||||||
tabindex="0"
|
|
||||||
type="checkbox"
|
|
||||||
:checked="item.completed"
|
|
||||||
:disabled="castingSpell || showTaskLockIcon"
|
|
||||||
@change="toggleChecklistItem(item)"
|
|
||||||
@keypress.enter="toggleChecklistItem(item)"
|
|
||||||
>
|
|
||||||
<label
|
|
||||||
v-markdown="item.text"
|
|
||||||
class="custom-control-label"
|
|
||||||
:class="{ 'cursor-auto': showTaskLockIcon }"
|
|
||||||
:for="`checklist-${item.id}-${random}`"
|
|
||||||
></label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="icons small-text d-flex align-items-center">
|
|
||||||
<div
|
|
||||||
v-if="task.type === 'todo' && task.date"
|
|
||||||
class="d-flex align-items-center"
|
|
||||||
:class="{'due-overdue': checkIfOverdue() }"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-b-tooltip.hover.bottom="$t('dueDate')"
|
v-if="showTaskLockIcon"
|
||||||
class="svg-icon calendar my-auto"
|
class="svg-icon lock"
|
||||||
v-html="icons.calendar"
|
:class="task.up ? controlClass.up.icon : 'positive'"
|
||||||
|
v-html="icons.lock"
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
v-else
|
||||||
|
class="svg-icon positive"
|
||||||
|
v-html="icons.positive"
|
||||||
></div>
|
></div>
|
||||||
<span>{{ formatDueDate() }}</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="icons-right d-flex justify-content-end">
|
</div>
|
||||||
|
<!-- Dailies and todos left side control-->
|
||||||
|
<div
|
||||||
|
v-if="task.type === 'daily' || task.type === 'todo'"
|
||||||
|
class="left-control d-flex justify-content-center"
|
||||||
|
:class="[{
|
||||||
|
'control-bottom-box': task.group.id && !isOpenTask,
|
||||||
|
'control-top-box': approvalsClass}, controlClass.bg]"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="task-control daily-todo-control"
|
||||||
|
:class="[
|
||||||
|
{ 'task-not-scoreable': showTaskLockIcon },
|
||||||
|
controlClass.inner,
|
||||||
|
]"
|
||||||
|
tabindex="0"
|
||||||
|
role="checkbox"
|
||||||
|
@click="score(showCheckIcon ? 'down' : 'up' )"
|
||||||
|
@keypress.enter="score(showCheckIcon ? 'down' : 'up' )"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
v-if="showStreak"
|
v-if="showTaskLockIcon"
|
||||||
class="d-flex align-items-center"
|
class="svg-icon lock"
|
||||||
>
|
:class="controlClass.icon"
|
||||||
<div
|
v-html="icons.lock"
|
||||||
v-b-tooltip.hover.bottom="task.type === 'daily'
|
></div>
|
||||||
? $t('streakCounter') : $t('counter')"
|
|
||||||
class="svg-icon streak"
|
|
||||||
v-html="icons.streak"
|
|
||||||
></div>
|
|
||||||
<span v-if="task.type === 'daily'">{{ task.streak }}</span>
|
|
||||||
<span v-if="task.type === 'habit'">
|
|
||||||
<span
|
|
||||||
v-if="task.up && task.counterUp != 0 && task.down"
|
|
||||||
class="m-0"
|
|
||||||
>+{{ task.counterUp }}</span>
|
|
||||||
<span
|
|
||||||
v-else-if=" task.counterUp !=0 && task.counterDown ==0"
|
|
||||||
class="m-0"
|
|
||||||
>{{ task.counterUp }}</span>
|
|
||||||
<span
|
|
||||||
v-else-if="task.up"
|
|
||||||
class="m-0"
|
|
||||||
>0</span>
|
|
||||||
<span
|
|
||||||
v-if="task.up && task.down"
|
|
||||||
class="m-0"
|
|
||||||
> | </span>
|
|
||||||
<span
|
|
||||||
v-if="task.down && task.counterDown != 0 && task.up"
|
|
||||||
class="m-0"
|
|
||||||
>-{{ task.counterDown }}</span>
|
|
||||||
<span
|
|
||||||
v-else-if="task.counterDown !=0 && task.counterUp ==0"
|
|
||||||
class="m-0"
|
|
||||||
>{{ task.counterDown }}</span>
|
|
||||||
<span
|
|
||||||
v-else-if="task.down"
|
|
||||||
class="m-0"
|
|
||||||
>0</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
v-if="task.challenge && task.challenge.id"
|
v-else
|
||||||
class="d-flex align-items-center"
|
class="svg-icon check"
|
||||||
>
|
:class="{
|
||||||
<div
|
'display-check-icon': showCheckIcon,
|
||||||
v-if="!task.challenge.broken"
|
[controlClass.checkbox]: true,
|
||||||
v-b-tooltip.hover.bottom="shortName"
|
}"
|
||||||
class="svg-icon challenge"
|
v-html="icons.check"
|
||||||
v-html="icons.challenge"
|
></div>
|
||||||
></div>
|
</div>
|
||||||
<div
|
</div>
|
||||||
v-if="task.challenge.broken"
|
<!-- Task title, description and icons-->
|
||||||
v-b-tooltip.hover.bottom="$t('brokenChaLink')"
|
<div
|
||||||
class="svg-icon challenge broken"
|
class="task-content"
|
||||||
@click="handleBrokenTask(task)"
|
:class="contentClass"
|
||||||
v-html="icons.brokenChallengeIcon"
|
>
|
||||||
></div>
|
<div
|
||||||
</div>
|
class="task-clickable-area pt-1 pl-75 pb-0"
|
||||||
<div
|
:class="{ 'cursor-auto': !teamManagerAccess }"
|
||||||
v-if="hasTags && !task.group.id"
|
tabindex="0"
|
||||||
:id="`tags-icon-${task._id}`"
|
@click="edit($event, task)"
|
||||||
class="d-flex align-items-center"
|
@keypress.enter="edit($event, task)"
|
||||||
>
|
>
|
||||||
<div
|
<div class="d-flex justify-content-between">
|
||||||
class="svg-icon tags"
|
<h3
|
||||||
v-html="icons.tags"
|
v-markdown="task.text"
|
||||||
></div>
|
class="task-title markdown"
|
||||||
</div>
|
:class="{ 'has-notes': task.notes }"
|
||||||
<b-popover
|
></h3>
|
||||||
v-if="hasTags && !task.group.id"
|
<menu-dropdown
|
||||||
:target="`tags-icon-${task._id}`"
|
v-if="!isRunningYesterdailies && showOptions"
|
||||||
triggers="hover"
|
ref="taskDropdown"
|
||||||
placement="bottom"
|
v-b-tooltip.hover.top="$t('options')"
|
||||||
>
|
tabindex="0"
|
||||||
<div class="tags-popover">
|
class="task-dropdown mr-1"
|
||||||
<div class="d-flex align-items-center tags-container">
|
:right="task.type === 'reward'"
|
||||||
|
>
|
||||||
|
<div slot="dropdown-toggle">
|
||||||
<div
|
<div
|
||||||
v-once
|
class="svg-icon dropdown-icon"
|
||||||
class="tags-popover-title"
|
v-html="icons.menu"
|
||||||
>
|
|
||||||
{{ `${$t('tags')}:` }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-for="tag in getTagsFor(task)"
|
|
||||||
:key="tag"
|
|
||||||
v-markdown="tag"
|
|
||||||
class="tag-label"
|
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div slot="dropdown-content">
|
||||||
|
<div
|
||||||
|
v-if="showEdit"
|
||||||
|
ref="editTaskItem"
|
||||||
|
class="dropdown-item edit-task-item"
|
||||||
|
tabindex="0"
|
||||||
|
@keypress.enter="edit($event, task)"
|
||||||
|
>
|
||||||
|
<span class="dropdown-icon-item">
|
||||||
|
<span
|
||||||
|
class="svg-icon inline edit-icon"
|
||||||
|
v-html="icons.edit"
|
||||||
|
></span>
|
||||||
|
<span class="text">{{ $t('edit') }}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="dropdown-item"
|
||||||
|
tabindex="0"
|
||||||
|
@click="moveToTop"
|
||||||
|
@keypress.enter="moveToTop"
|
||||||
|
>
|
||||||
|
<span class="dropdown-icon-item">
|
||||||
|
<span
|
||||||
|
class="svg-icon inline push-to-top"
|
||||||
|
v-html="icons.top"
|
||||||
|
></span>
|
||||||
|
<span class="text">{{ $t('taskToTop') }}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="dropdown-item"
|
||||||
|
tabindex="0"
|
||||||
|
@click="moveToBottom"
|
||||||
|
@keypress.enter="moveToBottom"
|
||||||
|
>
|
||||||
|
<span class="dropdown-icon-item">
|
||||||
|
<span
|
||||||
|
class="svg-icon inline push-to-bottom"
|
||||||
|
v-html="icons.bottom"
|
||||||
|
></span>
|
||||||
|
<span class="text">{{ $t('taskToBottom') }}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="showDelete"
|
||||||
|
class="dropdown-item"
|
||||||
|
tabindex="0"
|
||||||
|
@click="destroy"
|
||||||
|
@keypress.enter="destroy"
|
||||||
|
>
|
||||||
|
<span class="dropdown-icon-item delete-task-item">
|
||||||
|
<span
|
||||||
|
class="svg-icon inline delete"
|
||||||
|
v-html="icons.delete"
|
||||||
|
></span>
|
||||||
|
<span class="text">{{ $t('delete') }}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</menu-dropdown>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-markdown="task.notes"
|
||||||
|
class="task-notes small-text"
|
||||||
|
:class="{'has-checklist': task.notes && hasChecklist}"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="canViewchecklist"
|
||||||
|
class="checklist"
|
||||||
|
:class="{isOpen: !task.collapseChecklist}"
|
||||||
|
>
|
||||||
|
<div class="d-inline-flex">
|
||||||
|
<div
|
||||||
|
v-b-tooltip.hover.right="$t(`${task.collapseChecklist
|
||||||
|
? 'expand': 'collapse'}Checklist`)"
|
||||||
|
class="collapse-checklist mb-2 d-flex align-items-center expand-toggle"
|
||||||
|
:class="{open: !task.collapseChecklist}"
|
||||||
|
tabindex="0"
|
||||||
|
@click="collapseChecklist(task)"
|
||||||
|
@keypress.enter="collapseChecklist(task)"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-once
|
||||||
|
class="svg-icon"
|
||||||
|
v-html="icons.checklist"
|
||||||
|
></div>
|
||||||
|
<span>{{ checklistProgress }}</span>
|
||||||
</div>
|
</div>
|
||||||
</b-popover>
|
</div>
|
||||||
|
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
||||||
|
<div
|
||||||
|
v-for="item in task.checklist"
|
||||||
|
v-if="!task.collapseChecklist"
|
||||||
|
:key="item.id"
|
||||||
|
class="custom-control custom-checkbox checklist-item"
|
||||||
|
:class="{'checklist-item-done': item.completed, 'cursor-auto': showTaskLockIcon}"
|
||||||
|
>
|
||||||
|
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
|
||||||
|
<input
|
||||||
|
:id="`checklist-${item.id}-${random}`"
|
||||||
|
class="custom-control-input"
|
||||||
|
tabindex="0"
|
||||||
|
type="checkbox"
|
||||||
|
:checked="item.completed"
|
||||||
|
:disabled="castingSpell || showTaskLockIcon"
|
||||||
|
@change="toggleChecklistItem(item)"
|
||||||
|
@keypress.enter="toggleChecklistItem(item)"
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
v-markdown="item.text"
|
||||||
|
class="custom-control-label"
|
||||||
|
:class="{ 'cursor-auto': showTaskLockIcon }"
|
||||||
|
:for="`checklist-${item.id}-${random}`"
|
||||||
|
></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="icons small-text d-flex align-items-center">
|
||||||
|
<div
|
||||||
|
v-if="task.type === 'todo' && task.date"
|
||||||
|
class="d-flex align-items-center"
|
||||||
|
:class="{'due-overdue': checkIfOverdue() }"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-b-tooltip.hover.bottom="$t('dueDate')"
|
||||||
|
class="svg-icon calendar my-auto"
|
||||||
|
v-html="icons.calendar"
|
||||||
|
></div>
|
||||||
|
<span>{{ formatDueDate() }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="icons-right d-flex justify-content-end">
|
||||||
|
<div
|
||||||
|
v-if="showStreak"
|
||||||
|
class="d-flex align-items-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-b-tooltip.hover.bottom="task.type === 'daily'
|
||||||
|
? $t('streakCounter') : $t('counter')"
|
||||||
|
class="svg-icon streak"
|
||||||
|
v-html="icons.streak"
|
||||||
|
></div>
|
||||||
|
<span v-if="task.type === 'daily'">{{ task.streak }}</span>
|
||||||
|
<span v-if="task.type === 'habit'">
|
||||||
|
<span
|
||||||
|
v-if="task.up && task.counterUp != 0 && task.down"
|
||||||
|
class="m-0"
|
||||||
|
>+{{ task.counterUp }}</span>
|
||||||
|
<span
|
||||||
|
v-else-if=" task.counterUp !=0 && task.counterDown ==0"
|
||||||
|
class="m-0"
|
||||||
|
>{{ task.counterUp }}</span>
|
||||||
|
<span
|
||||||
|
v-else-if="task.up"
|
||||||
|
class="m-0"
|
||||||
|
>0</span>
|
||||||
|
<span
|
||||||
|
v-if="task.up && task.down"
|
||||||
|
class="m-0"
|
||||||
|
> | </span>
|
||||||
|
<span
|
||||||
|
v-if="task.down && task.counterDown != 0 && task.up"
|
||||||
|
class="m-0"
|
||||||
|
>-{{ task.counterDown }}</span>
|
||||||
|
<span
|
||||||
|
v-else-if="task.counterDown !=0 && task.counterUp ==0"
|
||||||
|
class="m-0"
|
||||||
|
>{{ task.counterDown }}</span>
|
||||||
|
<span
|
||||||
|
v-else-if="task.down"
|
||||||
|
class="m-0"
|
||||||
|
>0</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="task.challenge && task.challenge.id"
|
||||||
|
class="d-flex align-items-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="!task.challenge.broken"
|
||||||
|
v-b-tooltip.hover.bottom="shortName"
|
||||||
|
class="svg-icon challenge"
|
||||||
|
v-html="icons.challenge"
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
v-if="task.challenge.broken"
|
||||||
|
v-b-tooltip.hover.bottom="$t('brokenChaLink')"
|
||||||
|
class="svg-icon challenge broken"
|
||||||
|
@click="handleBrokenTask(task)"
|
||||||
|
v-html="icons.brokenChallengeIcon"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="hasTags && !task.group.id"
|
||||||
|
:id="`tags-icon-${task._id}`"
|
||||||
|
class="d-flex align-items-center"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="svg-icon tags"
|
||||||
|
v-html="icons.tags"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
<b-popover
|
||||||
|
v-if="hasTags && !task.group.id"
|
||||||
|
:target="`tags-icon-${task._id}`"
|
||||||
|
triggers="hover"
|
||||||
|
placement="bottom"
|
||||||
|
>
|
||||||
|
<div class="tags-popover">
|
||||||
|
<div class="d-flex align-items-center tags-container">
|
||||||
|
<div
|
||||||
|
v-once
|
||||||
|
class="tags-popover-title"
|
||||||
|
>
|
||||||
|
{{ `${$t('tags')}:` }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-for="tag in getTagsFor(task)"
|
||||||
|
:key="tag"
|
||||||
|
v-markdown="tag"
|
||||||
|
class="tag-label"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</b-popover>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<!-- Habits right side control-->
|
||||||
<!-- Habits right side control-->
|
|
||||||
<div
|
|
||||||
v-if="task.type === 'habit'"
|
|
||||||
class="right-control d-flex justify-content-center pt-3"
|
|
||||||
:class="[{
|
|
||||||
'control-bottom-box': task.group.id && !isOpenTask,
|
|
||||||
'control-top-box': approvalsClass}, controlClass.down.bg]"
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
class="task-control habit-control"
|
v-if="task.type === 'habit'"
|
||||||
|
class="right-control d-flex justify-content-center pt-3"
|
||||||
:class="[{
|
:class="[{
|
||||||
'habit-control-negative-enabled': task.down && !showTaskLockIcon,
|
'control-bottom-box': task.group.id && !isOpenTask,
|
||||||
'habit-control-negative-disabled': !task.down && !showTaskLockIcon,
|
'control-top-box': approvalsClass}, controlClass.down.bg]"
|
||||||
'task-not-scoreable': showTaskLockIcon,
|
>
|
||||||
}, controlClass.down.inner]"
|
<div
|
||||||
|
class="task-control habit-control"
|
||||||
|
:class="[{
|
||||||
|
'habit-control-negative-enabled': task.down && !showTaskLockIcon,
|
||||||
|
'habit-control-negative-disabled': !task.down && !showTaskLockIcon,
|
||||||
|
'task-not-scoreable': showTaskLockIcon,
|
||||||
|
}, controlClass.down.inner]"
|
||||||
|
tabindex="0"
|
||||||
|
role="button"
|
||||||
|
:aria-label="$t('scoreDown')"
|
||||||
|
:aria-disabled="showTaskLockIcon || (!task.down && !showTaskLockIcon)"
|
||||||
|
@click="score('down')"
|
||||||
|
@keypress.enter="score('down')"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="showTaskLockIcon"
|
||||||
|
class="svg-icon lock"
|
||||||
|
:class="task.down ? controlClass.down.icon : 'negative'"
|
||||||
|
v-html="icons.lock"
|
||||||
|
></div>
|
||||||
|
<div
|
||||||
|
v-else
|
||||||
|
class="svg-icon negative"
|
||||||
|
v-html="icons.negative"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Rewards right side control-->
|
||||||
|
<div
|
||||||
|
v-if="task.type === 'reward'"
|
||||||
|
class="right-control d-flex align-items-center justify-content-center reward-control"
|
||||||
|
:class="[
|
||||||
|
{ 'task-not-scoreable': showTaskLockIcon },
|
||||||
|
controlClass.bg,
|
||||||
|
]"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
role="button"
|
|
||||||
:aria-label="$t('scoreDown')"
|
|
||||||
:aria-disabled="showTaskLockIcon || (!task.down && !showTaskLockIcon)"
|
|
||||||
@click="score('down')"
|
@click="score('down')"
|
||||||
@keypress.enter="score('down')"
|
@keypress.enter="score('down')"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-if="showTaskLockIcon"
|
v-if="showTaskLockIcon"
|
||||||
class="svg-icon lock"
|
class="svg-icon color lock"
|
||||||
:class="task.down ? controlClass.down.icon : 'negative'"
|
|
||||||
v-html="icons.lock"
|
v-html="icons.lock"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
class="svg-icon negative"
|
class="svg-icon mb-1"
|
||||||
v-html="icons.negative"
|
v-html="icons.gold"
|
||||||
></div>
|
></div>
|
||||||
|
<div class="small-text">
|
||||||
|
{{ task.value }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- Rewards right side control-->
|
<approval-footer
|
||||||
<div
|
v-if="task.group.id && !isOpenTask"
|
||||||
v-if="task.type === 'reward'"
|
:task="task"
|
||||||
class="right-control d-flex align-items-center justify-content-center reward-control"
|
:group="group"
|
||||||
:class="[
|
/>
|
||||||
{ 'task-not-scoreable': showTaskLockIcon },
|
|
||||||
controlClass.bg,
|
|
||||||
]"
|
|
||||||
tabindex="0"
|
|
||||||
@click="score('down')"
|
|
||||||
@keypress.enter="score('down')"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="showTaskLockIcon"
|
|
||||||
class="svg-icon color lock"
|
|
||||||
v-html="icons.lock"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
v-else
|
|
||||||
class="svg-icon mb-1"
|
|
||||||
v-html="icons.gold"
|
|
||||||
></div>
|
|
||||||
<div class="small-text">
|
|
||||||
{{ task.value }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<approval-footer
|
|
||||||
v-if="task.group.id && !isOpenTask"
|
|
||||||
:task="task"
|
|
||||||
:group="group"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -1177,9 +1177,16 @@ export default {
|
|||||||
moveToBottom () {
|
moveToBottom () {
|
||||||
this.$emit('moveTo', this.task, 'bottom');
|
this.$emit('moveTo', this.task, 'bottom');
|
||||||
},
|
},
|
||||||
destroy () {
|
async destroy () {
|
||||||
const type = this.$t(this.task.type);
|
const type = this.$t(this.task.type);
|
||||||
if (!window.confirm(this.$t('sureDeleteType', { type }))) return; // eslint-disable-line no-alert
|
const confirmed = await new Promise(resolve => {
|
||||||
|
this.$root.$emit('habitica:delete-task-confirm', {
|
||||||
|
message: this.$t('sureDeleteType', { type }),
|
||||||
|
taskType: type,
|
||||||
|
resolve,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!confirmed) return;
|
||||||
this.destroyTask(this.task);
|
this.destroyTask(this.task);
|
||||||
this.$emit('taskDestroyed', this.task);
|
this.$emit('taskDestroyed', this.task);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
:checked="isChecked"
|
:checked="isChecked"
|
||||||
:value="value"
|
:value="value"
|
||||||
@change="handleChange"
|
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
|
@change="handleChange"
|
||||||
>
|
>
|
||||||
<label
|
<label
|
||||||
class="toggle-switch-label"
|
class="toggle-switch-label"
|
||||||
|
|||||||
@@ -1126,7 +1126,12 @@ export default {
|
|||||||
this.loadUser();
|
this.loadUser();
|
||||||
this.oldTitle = this.$store.state.title;
|
this.oldTitle = this.$store.state.title;
|
||||||
this.handleExternalLinks();
|
this.handleExternalLinks();
|
||||||
this.selectPage(this.startingPage);
|
// Check if there's a hash in the URL to determine the starting page
|
||||||
|
let pageToSelect = this.startingPage;
|
||||||
|
if (window.location.hash && (window.location.hash === '#stats' || window.location.hash === '#achievements')) {
|
||||||
|
pageToSelect = window.location.hash.substring(1);
|
||||||
|
}
|
||||||
|
this.selectPage(pageToSelect);
|
||||||
this.$root.$on('habitica:report-profile-result', () => {
|
this.$root.$on('habitica:report-profile-result', () => {
|
||||||
this.loadUser();
|
this.loadUser();
|
||||||
});
|
});
|
||||||
@@ -1211,10 +1216,15 @@ export default {
|
|||||||
},
|
},
|
||||||
selectPage (page) {
|
selectPage (page) {
|
||||||
this.selectedPage = page || 'profile';
|
this.selectedPage = page || 'profile';
|
||||||
window.history.replaceState(null, null, '');
|
const profileUserId = this.userId || this.userLoggedIn._id;
|
||||||
|
let newPath = `/profile/${profileUserId}`;
|
||||||
|
if (page !== 'profile') {
|
||||||
|
newPath += `#${page}`;
|
||||||
|
}
|
||||||
|
window.history.replaceState(null, null, newPath);
|
||||||
this.$store.dispatch('common:setTitle', {
|
this.$store.dispatch('common:setTitle', {
|
||||||
section: this.$t('user'),
|
section: this.$t('user'),
|
||||||
subSection: this.$t(this.startingPage),
|
subSection: this.$t(page),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
getNextIncentive () {
|
getNextIncentive () {
|
||||||
|
|||||||
@@ -3,14 +3,10 @@ import isEqual from 'lodash/isEqual';
|
|||||||
import keys from 'lodash/keys';
|
import keys from 'lodash/keys';
|
||||||
import pick from 'lodash/pick';
|
import pick from 'lodash/pick';
|
||||||
import amplitude from 'amplitude-js';
|
import amplitude from 'amplitude-js';
|
||||||
import { gtag, install } from 'ga-gtag';
|
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getStore from '@/store';
|
import getStore from '@/store';
|
||||||
|
|
||||||
const AMPLITUDE_KEY = import.meta.env.AMPLITUDE_KEY;
|
const AMPLITUDE_KEY = import.meta.env.AMPLITUDE_KEY;
|
||||||
const DEBUG_ENABLED = import.meta.env.DEBUG_ENABLED === 'true';
|
|
||||||
const GA_ID = import.meta.env.GA_ID;
|
|
||||||
const IS_PRODUCTION = import.meta.env.NODE_ENV === 'production';
|
|
||||||
const REQUIRED_FIELDS = ['eventCategory', 'eventAction'];
|
const REQUIRED_FIELDS = ['eventCategory', 'eventAction'];
|
||||||
|
|
||||||
let analyticsLoading = false;
|
let analyticsLoading = false;
|
||||||
@@ -69,10 +65,6 @@ function _gatherUserStats (properties) {
|
|||||||
export function safeSetup (userId) {
|
export function safeSetup (userId) {
|
||||||
if (analyticsLoading || analyticsReady) return;
|
if (analyticsLoading || analyticsReady) return;
|
||||||
analyticsLoading = true;
|
analyticsLoading = true;
|
||||||
install(GA_ID, {
|
|
||||||
debug_mode: DEBUG_ENABLED || !IS_PRODUCTION,
|
|
||||||
user_id: userId,
|
|
||||||
});
|
|
||||||
amplitude.getInstance().init(AMPLITUDE_KEY, userId);
|
amplitude.getInstance().init(AMPLITUDE_KEY, userId);
|
||||||
analyticsReady = true;
|
analyticsReady = true;
|
||||||
analyticsLoading = false;
|
analyticsLoading = false;
|
||||||
@@ -90,7 +82,6 @@ export function track (properties, options = {}) {
|
|||||||
// Track events on the server by default
|
// Track events on the server by default
|
||||||
if (trackOnClient === true) {
|
if (trackOnClient === true) {
|
||||||
amplitude.getInstance().logEvent(properties.eventAction, properties);
|
amplitude.getInstance().logEvent(properties.eventAction, properties);
|
||||||
gtag('event', properties.eventAction, properties);
|
|
||||||
} else {
|
} else {
|
||||||
const store = getStore();
|
const store = getStore();
|
||||||
store.dispatch('analytics:trackEvent', properties);
|
store.dispatch('analytics:trackEvent', properties);
|
||||||
@@ -105,7 +96,6 @@ export function updateUser (properties = {}) {
|
|||||||
// Use nextTick to avoid blocking the UI
|
// Use nextTick to avoid blocking the UI
|
||||||
Vue.nextTick(() => {
|
Vue.nextTick(() => {
|
||||||
_gatherUserStats(properties);
|
_gatherUserStats(properties);
|
||||||
gtag('set', 'user_properties', properties);
|
|
||||||
forEach(properties, (value, key) => {
|
forEach(properties, (value, key) => {
|
||||||
const identify = new amplitude.Identify().set(key, value);
|
const identify = new amplitude.Identify().set(key, value);
|
||||||
amplitude.getInstance().identify(identify);
|
amplitude.getInstance().identify(identify);
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
import habiticaMarkdown from 'habitica-markdown/withMentions';
|
import habiticaMarkdown from 'habitica-markdown/withMentions';
|
||||||
|
import escapeRegExp from 'lodash/escapeRegExp';
|
||||||
|
|
||||||
export default function renderWithMentions (text, user) {
|
export default function renderWithMentions (text, user) {
|
||||||
if (!text) return null;
|
if (!text) return null;
|
||||||
const env = { userName: user.auth.local.username, displayName: user.profile.name };
|
const env = { userName: user.auth.local.username };
|
||||||
return habiticaMarkdown.render(String(text), env);
|
let html = habiticaMarkdown.render(String(text), env);
|
||||||
|
|
||||||
|
if (user.auth.local.username) {
|
||||||
|
const username = escapeRegExp(user.auth.local.username);
|
||||||
|
const regex = new RegExp(`(<span class="at-text">@)(${username})(</span>)`, 'gi');
|
||||||
|
html = html.replace(regex, (match, p1, p2, p3) => `${p1.replace('at-text', 'at-text at-highlight')}${p2}${p3}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ export default [
|
|||||||
uuid: '61b2c855-0a30-444c-bcc6-1cac876460b0',
|
uuid: '61b2c855-0a30-444c-bcc6-1cac876460b0',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'heyeilatan',
|
name: 'fizself',
|
||||||
type: 'Staff',
|
type: 'Staff',
|
||||||
uuid: 'f4e5c6da-0617-48bf-b3bd-9f97636774a8',
|
uuid: 'e39ea3eb-28d2-48da-8568-7a5b0e64498e',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -39,7 +39,15 @@ export default {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const purchaseForKey = currencyToPurchaseForKey[currency];
|
const purchaseForKey = currencyToPurchaseForKey[currency];
|
||||||
return window.confirm(this.$t(purchaseForKey, { cost })); // eslint-disable-line no-alert
|
|
||||||
|
return new Promise(resolve => {
|
||||||
|
this.$root.$emit('habitica:purchase-confirm', {
|
||||||
|
message: this.$t(purchaseForKey, { cost }),
|
||||||
|
currency,
|
||||||
|
cost,
|
||||||
|
resolve,
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -217,8 +217,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async changeClassAndClose () {
|
async changeClassAndClose () {
|
||||||
if (!this.classDisabled && !window.confirm(this.$t('changeClassConfirmCost'))) {
|
if (!this.classDisabled) {
|
||||||
return;
|
const confirmed = await new Promise(resolve => {
|
||||||
|
this.$root.$emit('habitica:purchase-confirm', {
|
||||||
|
message: this.$t('changeClassConfirmCost'),
|
||||||
|
currency: 'gems',
|
||||||
|
cost: 3,
|
||||||
|
resolve,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!confirmed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$root.$once('bv::hide::modal', () => {
|
this.$root.$once('bv::hide::modal', () => {
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="3"
|
<td
|
||||||
v-if="!mixinData.inlineSettingMixin.modalVisible"
|
v-if="!mixinData.inlineSettingMixin.modalVisible"
|
||||||
|
colspan="3"
|
||||||
>
|
>
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
<div class="d-flex justify-content-between align-items-center">
|
||||||
<h3
|
<h3
|
||||||
@@ -18,8 +19,9 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="3"
|
<td
|
||||||
v-if="mixinData.inlineSettingMixin.modalVisible"
|
v-if="mixinData.inlineSettingMixin.modalVisible"
|
||||||
|
colspan="3"
|
||||||
>
|
>
|
||||||
<h3
|
<h3
|
||||||
v-once
|
v-once
|
||||||
@@ -59,8 +61,8 @@
|
|||||||
{{ $t('performanceAnalytics') }}
|
{{ $t('performanceAnalytics') }}
|
||||||
</label>
|
</label>
|
||||||
<toggle-switch
|
<toggle-switch
|
||||||
class="mb-auto"
|
|
||||||
v-model="user.preferences.analyticsConsent"
|
v-model="user.preferences.analyticsConsent"
|
||||||
|
class="mb-auto"
|
||||||
@change="prefToggled()"
|
@change="prefToggled()"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -151,14 +153,14 @@ import { mapState } from '@/libs/store';
|
|||||||
import alert from '@/assets/svg/for-css/alert.svg?raw';
|
import alert from '@/assets/svg/for-css/alert.svg?raw';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: [
|
|
||||||
GenericUserPreferencesMixin,
|
|
||||||
InlineSettingMixin,
|
|
||||||
],
|
|
||||||
components: {
|
components: {
|
||||||
SaveCancelButtons,
|
SaveCancelButtons,
|
||||||
ToggleSwitch,
|
ToggleSwitch,
|
||||||
},
|
},
|
||||||
|
mixins: [
|
||||||
|
GenericUserPreferencesMixin,
|
||||||
|
InlineSettingMixin,
|
||||||
|
],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
icons: Object.freeze({
|
icons: Object.freeze({
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
<bug-report-success-modal v-if="isUserLoaded" />
|
<bug-report-success-modal v-if="isUserLoaded" />
|
||||||
<external-link-modal />
|
<external-link-modal />
|
||||||
<birthday-modal />
|
<birthday-modal />
|
||||||
|
<purchase-confirm-modal v-if="isUserLoaded" />
|
||||||
|
<delete-task-confirm-modal v-if="isUserLoaded" />
|
||||||
<template v-if="isUserLoaded">
|
<template v-if="isUserLoaded">
|
||||||
<privacy-banner />
|
<privacy-banner />
|
||||||
<chat-banner />
|
<chat-banner />
|
||||||
@@ -138,6 +140,8 @@ import paymentsSuccessModal from '@/components/payments/successModal';
|
|||||||
import subCancelModalConfirm from '@/components/payments/cancelModalConfirm';
|
import subCancelModalConfirm from '@/components/payments/cancelModalConfirm';
|
||||||
import subCanceledModal from '@/components/payments/canceledModal';
|
import subCanceledModal from '@/components/payments/canceledModal';
|
||||||
import externalLinkModal from '@/components/externalLinkModal.vue';
|
import externalLinkModal from '@/components/externalLinkModal.vue';
|
||||||
|
import purchaseConfirmModal from '@/components/shops/purchaseConfirmModal.vue';
|
||||||
|
import deleteTaskConfirmModal from '@/components/tasks/deleteTaskConfirmModal.vue';
|
||||||
|
|
||||||
import spellsMixin from '@/mixins/spells';
|
import spellsMixin from '@/mixins/spells';
|
||||||
import {
|
import {
|
||||||
@@ -172,6 +176,8 @@ export default {
|
|||||||
bugReportModal,
|
bugReportModal,
|
||||||
bugReportSuccessModal,
|
bugReportSuccessModal,
|
||||||
externalLinkModal,
|
externalLinkModal,
|
||||||
|
purchaseConfirmModal,
|
||||||
|
deleteTaskConfirmModal,
|
||||||
},
|
},
|
||||||
mixins: [notifications, spellsMixin],
|
mixins: [notifications, spellsMixin],
|
||||||
data () {
|
data () {
|
||||||
|
|||||||
@@ -90,6 +90,9 @@ const router = new VueRouter({
|
|||||||
path: '/profile/:userId',
|
path: '/profile/:userId',
|
||||||
props: true,
|
props: true,
|
||||||
},
|
},
|
||||||
|
{ name: 'profile', path: '/user/profile' },
|
||||||
|
{ name: 'stats', path: '/user/stats' },
|
||||||
|
{ name: 'achievements', path: '/user/achievements' },
|
||||||
{
|
{
|
||||||
path: '/inventory',
|
path: '/inventory',
|
||||||
component: InventoryContainer,
|
component: InventoryContainer,
|
||||||
@@ -369,6 +372,10 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
if (to.params.startingPage !== undefined) {
|
if (to.params.startingPage !== undefined) {
|
||||||
startingPage = to.params.startingPage;
|
startingPage = to.params.startingPage;
|
||||||
}
|
}
|
||||||
|
// Check if there's a hash in the URL for stats or achievements
|
||||||
|
if (to.hash === '#stats' || to.hash === '#achievements') {
|
||||||
|
startingPage = to.hash.substring(1);
|
||||||
|
}
|
||||||
if (from.name === null) {
|
if (from.name === null) {
|
||||||
store.state.postLoadModal = `profile/${to.params.userId}`;
|
store.state.postLoadModal = `profile/${to.params.userId}`;
|
||||||
return next({ name: 'tasks' });
|
return next({ name: 'tasks' });
|
||||||
@@ -389,10 +396,18 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((to.name === 'stats' || to.name === 'achievements' || to.name === 'profile') && from.name !== null) {
|
if ((to.name === 'stats' || to.name === 'achievements' || to.name === 'profile') && from.name !== null) {
|
||||||
|
const userId = store.state.user.data._id;
|
||||||
|
let redirectPath = `/profile/${userId}`;
|
||||||
|
if (to.name === 'stats') {
|
||||||
|
redirectPath += '#stats';
|
||||||
|
} else if (to.name === 'achievements') {
|
||||||
|
redirectPath += '#achievements';
|
||||||
|
}
|
||||||
router.app.$emit('habitica:show-profile', {
|
router.app.$emit('habitica:show-profile', {
|
||||||
|
userId,
|
||||||
startingPage: to.name,
|
startingPage: to.name,
|
||||||
fromPath: from.path,
|
fromPath: from.path,
|
||||||
toPath: to.path,
|
toPath: redirectPath,
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { authAsCredentialsState, LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
|
import { authAsCredentialsState, LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
|
||||||
|
|
||||||
const GA_ID = import.meta.env.GA_ID;
|
|
||||||
|
|
||||||
function saveLocalDataAuth (store, apiId, apiToken) {
|
function saveLocalDataAuth (store, apiId, apiToken) {
|
||||||
const credentialsObj = {
|
const credentialsObj = {
|
||||||
auth: {
|
auth: {
|
||||||
@@ -123,9 +121,6 @@ export async function appleAuth (store, params) {
|
|||||||
export function logout (store, options = {}) {
|
export function logout (store, options = {}) {
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
sessionStorage.clear();
|
sessionStorage.clear();
|
||||||
if (window.gtag) {
|
|
||||||
window.gtag('config', GA_ID, { user_id: null });
|
|
||||||
}
|
|
||||||
const query = options.redirectToLogin === true ? '?redirectToLogin=true' : '';
|
const query = options.redirectToLogin === true ? '?redirectToLogin=true' : '';
|
||||||
window.location.href = `/logout-server${query}`;
|
window.location.href = `/logout-server${query}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ describe('renderWithMentions', () => {
|
|||||||
expect(result).to.be.null;
|
expect(result).to.be.null;
|
||||||
});
|
});
|
||||||
|
|
||||||
test('highlights displayname', () => {
|
test('does not highlight displayname to prevent impersonation', () => {
|
||||||
const text = 'hello @displayedUser with text after';
|
const text = 'hello @displayedUser with text after';
|
||||||
|
|
||||||
const result = renderMarkdown(text, user('user', 'displayedUser'));
|
const result = renderMarkdown(text, user('user', 'displayedUser'));
|
||||||
|
expect(result).to.contain('<span class="at-text">@displayedUser</span>');
|
||||||
expect(result).to.contain('<span class="at-text at-highlight">@displayedUser</span>');
|
expect(result).to.not.contain('<span class="at-text at-highlight">@displayedUser</span>');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('highlights username', () => {
|
test('highlights username', () => {
|
||||||
@@ -56,7 +56,8 @@ describe('renderWithMentions', () => {
|
|||||||
|
|
||||||
const result = renderMarkdown(plainText, user('use', 'mentions'));
|
const result = renderMarkdown(plainText, user('use', 'mentions'));
|
||||||
|
|
||||||
expect(result).to.contain('<span class="at-text at-highlight">@mentions</span>');
|
expect(result).to.contain('<span class="at-text">@mentions</span>');
|
||||||
|
expect(result).to.not.contain('<span class="at-text at-highlight">@mentions</span>');
|
||||||
expect(result).to.contain('<span class="at-text at-highlight">@use</span>');
|
expect(result).to.contain('<span class="at-text at-highlight">@use</span>');
|
||||||
expect(result).to.contain('<span class="at-text">@mail</span>');
|
expect(result).to.contain('<span class="at-text">@mail</span>');
|
||||||
expect(result).to.not.contain('<span class="at-text at-highlight">@mentions</span>.com');
|
expect(result).to.not.contain('<span class="at-text at-highlight">@mentions</span>.com');
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ const envVars = [
|
|||||||
'EMAILS_COMMUNITY_MANAGER_EMAIL',
|
'EMAILS_COMMUNITY_MANAGER_EMAIL',
|
||||||
'EMAILS_TECH_ASSISTANCE_EMAIL',
|
'EMAILS_TECH_ASSISTANCE_EMAIL',
|
||||||
'EMAILS_PRESS_ENQUIRY_EMAIL',
|
'EMAILS_PRESS_ENQUIRY_EMAIL',
|
||||||
'GA_ID',
|
|
||||||
'STRIPE_PUB_KEY',
|
'STRIPE_PUB_KEY',
|
||||||
'GOOGLE_CLIENT_ID',
|
'GOOGLE_CLIENT_ID',
|
||||||
'APPLE_AUTH_CLIENT_ID',
|
'APPLE_AUTH_CLIENT_ID',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"achievement": "Достижения",
|
"achievement": "Постижение",
|
||||||
"onwards": "Напред!",
|
"onwards": "Напред!",
|
||||||
"levelup": "Изпълнявайки целите си в истинския живот, Вие се качихте ниво и здравето Ви беше запълнено!",
|
"levelup": "Изпълнявайки целите си в истинския живот, Вие се качихте ниво и здравето Ви беше запълнено!",
|
||||||
"reachedLevel": "Достигнахте Ниво <%= level %>",
|
"reachedLevel": "Достигнахте Ниво <%= level %>",
|
||||||
@@ -106,5 +106,25 @@
|
|||||||
"achievementSeasonalSpecialist": "Сезонен експерт",
|
"achievementSeasonalSpecialist": "Сезонен експерт",
|
||||||
"achievementRedLetterDayText": "Са събрали всички Червени животни.",
|
"achievementRedLetterDayText": "Са събрали всички Червени животни.",
|
||||||
"achievementSeeingRedModalText": "Събрали сте всички Червени любимци!",
|
"achievementSeeingRedModalText": "Събрали сте всички Червени любимци!",
|
||||||
"achievementSkeletonCrewText": "Събрали са всички Скелетни животни."
|
"achievementSkeletonCrewText": "Събрали са всички Скелетни животни.",
|
||||||
|
"achievementVioletsAreBlueText": "Събра всички сини пет-ове Памучен бонбон.",
|
||||||
|
"achievementWildBlueYonderModalText": "Ти укроти всички маунт-ове Памучен бонбон синьо!",
|
||||||
|
"achievementWildBlueYonderText": "Укроти всички маунт-ове Памучен бонбон синьо.",
|
||||||
|
"achievementVioletsAreBlue": "Розите са червени, Теменужките са сини",
|
||||||
|
"achievementVioletsAreBlueModalText": "Ти събра (или колекционира) всички домашни любимци (или пет-ове) от серията Памучен бонбон синьо!",
|
||||||
|
"achievementWildBlueYonder": "Дивото синьо небе",
|
||||||
|
"achievementSeasonalSpecialistText": "Завърши всички сезонни куестове от пролетта и зимата: Лов на яйца (Egg Hunt), Дядо Коледа-ловец (Trapper Santa) и Намери мечето (Find the Cub)!",
|
||||||
|
"achievementSeasonalSpecialistModalText": "Вие завършихте всичките сезонни куестове!",
|
||||||
|
"achievementDomesticatedModalText": "Ти събра (или колекционира) всички опитомени домашни любимци (пет-ове)!",
|
||||||
|
"achievementDomesticatedText": "Излюпи (или Отгледа) всички стандартни цветове на опитомени домашни любимци (пет-ове): пор, морско свинче, петел, летящо прасе), плъх, заек, кон и крава!",
|
||||||
|
"achievementShadyCustomerText": "Събра всички пет-ове Сянка.",
|
||||||
|
"achievementShadyCustomerModalText": "Събра всички пет-ове Сянка.",
|
||||||
|
"achievementShadyCustomer": "Сенчест тип",
|
||||||
|
"achievementDomesticated": "И-Я–И–Я–ЙО",
|
||||||
|
"achievementZodiacZookeeper": "Пазител на Зодиака",
|
||||||
|
"achievementShadeOfItAll": "В сянката на света",
|
||||||
|
"achievementShadeOfItAllText": "Опитоми всички сенчести коне.",
|
||||||
|
"achievementZodiacZookeeperText": "Излюпи всички стандартни животни(базов цвят) от зодиака: Плъх, Крава, Заек, Змия, Овца, Маймуна, Кокошка, Вълк, Тигър, Летящо прасе, и Дракон!",
|
||||||
|
"achievementZodiacZookeeperModalText": "Събрахте всички животни от зодиака!",
|
||||||
|
"achievementBirdsOfAFeather": "От една порода"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -921,5 +921,14 @@
|
|||||||
"backgroundInsideForestWitchsCottageNotes": "Webe Zauber in der Hütte der Waldhexe.",
|
"backgroundInsideForestWitchsCottageNotes": "Webe Zauber in der Hütte der Waldhexe.",
|
||||||
"backgroundCastleKeepWithBannersText": "Burghalle mit Bannern",
|
"backgroundCastleKeepWithBannersText": "Burghalle mit Bannern",
|
||||||
"backgroundCastleKeepWithBannersNotes": "Singe Geschichten von Heldentaten in einer Burghalle mit Bannern.",
|
"backgroundCastleKeepWithBannersNotes": "Singe Geschichten von Heldentaten in einer Burghalle mit Bannern.",
|
||||||
"backgrounds112025": "SET 138: Veröffentlicht im November 2025"
|
"backgrounds112025": "SET 138: Veröffentlicht im November 2025",
|
||||||
|
"backgrounds122025": "SET 139: Veröffentlicht im Dezember 2025",
|
||||||
|
"backgroundNighttimeStreetWithShopsNotes": "Genieße das warme Leuchten einer Nächtlichen Straße mit Geschäften.",
|
||||||
|
"backgroundNighttimeStreetWithShopsText": "Nächtliche Straße mit Geschäften",
|
||||||
|
"backgrounds012026": "SET 140: Veröffentlicht im Januar 2026",
|
||||||
|
"backgrounds022026": "SET 141: Veröffentlicht im Februar 2026",
|
||||||
|
"backgroundElegantPalaceText": "Eleganter Palast",
|
||||||
|
"backgroundElegantPalaceNotes": "Bewundere die farbenfrohen Hallen eines Eleganten Palastes.",
|
||||||
|
"backgroundWinterDesertWithSaguarosText": "Winter-Wüste mit Kakteen",
|
||||||
|
"backgroundWinterDesertWithSaguarosNotes": "Atme die kalte Luft Wunder Winter-Wüste mit Kakteen."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,5 +108,6 @@
|
|||||||
"resetFlagCount": "Markierungszähler zurücksetzen",
|
"resetFlagCount": "Markierungszähler zurücksetzen",
|
||||||
"cannotClone": "Diese Herausforderung kann nicht dupliziert werden, weil einer oder mehrere Spieler sie als unangemessen gemeldet haben. Einer der Mitarbeiter wird dich in Kürze mit Anweisungen kontaktieren. Wenn mehr als 48 Stunden vergangen sind, und du nichts von ihnen gehört hast, schicke bitte eine Email an admin@habitica.com, um Unterstützung zu erhalten.",
|
"cannotClone": "Diese Herausforderung kann nicht dupliziert werden, weil einer oder mehrere Spieler sie als unangemessen gemeldet haben. Einer der Mitarbeiter wird dich in Kürze mit Anweisungen kontaktieren. Wenn mehr als 48 Stunden vergangen sind, und du nichts von ihnen gehört hast, schicke bitte eine Email an admin@habitica.com, um Unterstützung zu erhalten.",
|
||||||
"resetFlags": "Markierungen zurücksetzen",
|
"resetFlags": "Markierungen zurücksetzen",
|
||||||
"messageChallengeFlagOfficial": "Offizielle Herausforderungen können nicht gemeldet werden."
|
"messageChallengeFlagOfficial": "Offizielle Herausforderungen können nicht gemeldet werden.",
|
||||||
|
"deleteChallengeRefundDescription": "Wenn du diese Herausforderung löschst, bekommst du den Preis in Edelsteinen erstattet und die Aufgaben der Herausforderung verbleiben auf der Aufgabentafel der Teilnehmer."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"dontDespair": "Nicht verzweifeln!",
|
"dontDespair": "Nicht verzweifeln!",
|
||||||
"deathPenaltyDetails": "Du hast ein Level, Dein Gold und ein Stück Ausrüstung verloren, aber Du kannst alles durch harte Arbeit wieder zurückbekommen! Viel Glück -- Du schaffst das.",
|
"deathPenaltyDetails": "Du hast ein Level, Dein Gold und ein Stück Ausrüstung verloren, aber Du kannst alles durch harte Arbeit wieder zurückbekommen! Viel Glück -- Du schaffst das.",
|
||||||
"refillHealthTryAgain": "Lebenspunkte wiederherstellen & Nochmal versuchen",
|
"refillHealthTryAgain": "Lebenspunkte wiederherstellen & Nochmal versuchen",
|
||||||
"dyingOftenTips": "Passiert das öfters? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Hier gibt es einige Tipps!</a>",
|
"dyingOftenTips": "Passiert das öfters? <a href='/static/faq#prevent-damage' target='_blank'>Hier gibt es einige Tipps!</a>",
|
||||||
"losingHealthWarning": "Vorsicht - Du verlierst Lebenspunkte!",
|
"losingHealthWarning": "Vorsicht - Du verlierst Lebenspunkte!",
|
||||||
"losingHealthWarning2": "Lass Deine Lebenspunkte nicht auf null fallen! Sollte das passieren wirst Du ein Level, Dein Gold und einen Gegenstand Deiner Ausrüstung verlieren.",
|
"losingHealthWarning2": "Lass Deine Lebenspunkte nicht auf null fallen! Sollte das passieren wirst Du ein Level, Dein Gold und einen Gegenstand Deiner Ausrüstung verlieren.",
|
||||||
"toRegainHealth": "Um Deine Lebenspunkte wiederherzustellen:",
|
"toRegainHealth": "Um Deine Lebenspunkte wiederherzustellen:",
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
"faqQuestion29": "Wie kann ich HP wiederherstellen?",
|
"faqQuestion29": "Wie kann ich HP wiederherstellen?",
|
||||||
"webFaqAnswer29": "Du kannst 15 HP wiederherstellen, indem du einen Gesundheitstrank in deiner Belohnungsspalte für 25 Gold kaufst. Außerdem erhältst du immer volle HP, wenn du auflevelst!",
|
"webFaqAnswer29": "Du kannst 15 HP wiederherstellen, indem du einen Gesundheitstrank in deiner Belohnungsspalte für 25 Gold kaufst. Außerdem erhältst du immer volle HP, wenn du auflevelst!",
|
||||||
"faqQuestion30": "Was passiert, wenn ich keine HP mehr habe?",
|
"faqQuestion30": "Was passiert, wenn ich keine HP mehr habe?",
|
||||||
"webFaqAnswer30": "Wenn deine HP Null erreichen, verlierst du eine Stufe, dein gesamtes Gold und ein Ausrüstungsstück, das du wieder kaufen kannst.",
|
"webFaqAnswer30": "Wenn deine HP Null erreichen, verlierst du ein Level, dessen Attribut-Punkt, dein gesamtes Gold und ein Ausrüstungsstück, das du wieder kaufen kannst. Du kannst dich wieder aufbauen, indem du Aufgaben erledigst und dich wieder hochlevelst.",
|
||||||
"faqQuestion31": "Warum habe ich HP verloren, wenn ich mit einer nicht-negativen Aufgabe interagiere?",
|
"faqQuestion31": "Warum habe ich HP verloren, wenn ich mit einer nicht-negativen Aufgabe interagiere?",
|
||||||
"faqQuestion32": "Wie kann ich eine Klasse wählen?",
|
"faqQuestion32": "Wie kann ich eine Klasse wählen?",
|
||||||
"faqQuestion33": "Was ist der blaue Balken, der nach Level 10 erscheint?",
|
"faqQuestion33": "Was ist der blaue Balken, der nach Level 10 erscheint?",
|
||||||
@@ -243,5 +243,7 @@
|
|||||||
"subscriptionDetail470": "Gruppenabonnentenvorteile verhalten sich genauso wie die eines wiederkehrenden 1-Monats-Abonnements. Du erhältst eine Mystische Sanduhr am Anfang jedes Monats und die Anzahl an Edelsteinen, die du jeden Monat auf dem Marktplatz kaufen kannst, wird sich erhöhen bis zu einem Limit von 50.",
|
"subscriptionDetail470": "Gruppenabonnentenvorteile verhalten sich genauso wie die eines wiederkehrenden 1-Monats-Abonnements. Du erhältst eine Mystische Sanduhr am Anfang jedes Monats und die Anzahl an Edelsteinen, die du jeden Monat auf dem Marktplatz kaufen kannst, wird sich erhöhen bis zu einem Limit von 50.",
|
||||||
"subscriptionPara3": "Wir hoffen, dass dieser neue Rhythmus besser vorhersagbar ist, mehr Zugang zur fantastischen Gegenstandauswahl im Laden des Zeitreisenden ermöglicht und noch mehr Motivation bietet, jeden Monat Fortschritte an deinen Aufgaben zu machen!",
|
"subscriptionPara3": "Wir hoffen, dass dieser neue Rhythmus besser vorhersagbar ist, mehr Zugang zur fantastischen Gegenstandauswahl im Laden des Zeitreisenden ermöglicht und noch mehr Motivation bietet, jeden Monat Fortschritte an deinen Aufgaben zu machen!",
|
||||||
"faqQuestion67": "Was sind die Klassen in Habitica?",
|
"faqQuestion67": "Was sind die Klassen in Habitica?",
|
||||||
"webFaqAnswer67": "Klassen sind verschiedene Rollen, die dein Charakter spielen kann. Jede Klasse bietet ihre eigene Reihe von einzigartigen Vorteilen und Fähigkeiten beim Aufsteigen auf höhere Level. Diese Fähigkeiten können das Bearbeiten deiner Aufgaben ergänzen oder dabei helfen, deine Party beim Abschließen von Quests zu unterstützen.\n\nDeine Klasse bestimmt auch, welche Ausrüstung für dich in den Belohnungen, im Marktplatz und im Jahreszeitenmarkt zum Kauf erhältlich ist.\n\nHier ist eine Zusammenfassung jeder Klasse, um dir dabei zu helfen, diejenige zu wählen, welche am besten zu deinem Spielstil passt:\n#### **Krieger**\n* Die Krieger verursachen hohen Schaden bei Bossen und haben eine hohe Chance für kritische Treffer beim Abschließen von Aufgaben, was dich mit extra Erfahrung und Gold belohnt.\n* Stärke ist ihr primäres Attribut, welches den Schaden erhöht, den sie verursachen.\n* Ausdauer ist ihr sekundäres Attribut, welches den Schaden verringert, den sie erhalten.\n* Die Fähigkeiten der Krieger erhöhen die Ausdauer und Stärke der Gruppenmitglieder.\n* Erwäge, einen Krieger zu spielen, wenn du es liebst, Bosse zu bekämpfen und auch ein wenig Schutz möchtest, wenn du gelegentlich Aufgaben versäumst.\n#### **Heiler**\n* Die Heiler haben eine starke Verteidigung und können sich selbst, sowie Gruppenmitglieder, heilen.\n* Ausdauer ist ihr primäres Attribut, welches ihre Heilungen verstärkt und den Schaden, den sie erhalten, verringert.\n* Intelligenz ist ihr sekundäres Attribut, welches ihr Mana und ihre Erfahrung erhöht.\n* Die Fähigkeiten der Heiler bewirken, dass ihre Aufgaben weniger rot werden und erhöhen die Ausdauer der Gruppenmitglieder.\n* Erwäge, einen Heiler zu spielen, wenn du oft Aufgaben versäumst, und die Fähigkeit benötigst, dich selbst und deine Gruppenmitglieder zu heilen. Heiler erreichen schnell neue Level.\n#### **Magier**\n* Die Magier gewinnen schnell neue Level und viel Mana, und verursachen Schaden bei Bossen in Quests.\n* Intelligenz ist ihr primäres Attribut, welches ihr Mana und ihre Erfahrung erhöht.\n* Wahrnehmung ist ihr sekundäres Attribut, welches ihr gefundenes Gold und ihre gefundenen Gegenstände vermehrt.\n* Die Fähigkeiten der Magier bewirken, dass ihre Aufgaben Strähnen eingefroren werden, stellen das Mana ihrer Gruppenmitglieder wieder her, und erhöhen ihre Intelligenz.\n* Erwäge, einen Magier zu spielen, wenn du durch das schnelle Erreichen neuer Level und das Beisteuern von Schaden in Boss Quests motiviert wirst.\n#### **Schurke**\n* Die Schurken bekommen die meisten erbeuteten Gegenstände und das meiste Gold beim Erledigen von Aufgaben und haben eine höhere Chance, kritische Treffer zu erzielen, was ihnen noch mehr Erfahrung und Gold beschert.\n* Wahrnehmung ist ihr primäres Attribut, welches ihr gefundenes Gold und ihre gefundenen Gegenstände vermehrt.\n* Stärke ist ihr sekundäres Attribut, welches den Schaden erhöht, den sie verursachen.\n* Die Fähigkeiten der Schurken helfen ihnen, versäumten Tagesaufgaben auszuweichen, Gold zu klauen und die Wahrnehmung ihrer Gruppenmitglieder zu erhöhen.\n* Erwäge, einen Schurken zu spielen, wenn du durch Belohnungen sehr motiviert wirst."
|
"webFaqAnswer67": "Klassen sind verschiedene Rollen, die dein Charakter spielen kann. Jede Klasse bietet ihre eigene Reihe von einzigartigen Vorteilen und Fähigkeiten beim Aufsteigen auf höhere Level. Diese Fähigkeiten können das Bearbeiten deiner Aufgaben ergänzen oder dabei helfen, deine Party beim Abschließen von Quests zu unterstützen.\n\nDeine Klasse bestimmt auch, welche Ausrüstung für dich in den Belohnungen, im Marktplatz und im Jahreszeitenmarkt zum Kauf erhältlich ist.\n\nHier ist eine Zusammenfassung jeder Klasse, um dir dabei zu helfen, diejenige zu wählen, welche am besten zu deinem Spielstil passt:\n#### **Krieger**\n* Die Krieger verursachen hohen Schaden bei Bossen und haben eine hohe Chance für kritische Treffer beim Abschließen von Aufgaben, was dich mit extra Erfahrung und Gold belohnt.\n* Stärke ist ihr primäres Attribut, welches den Schaden erhöht, den sie verursachen.\n* Ausdauer ist ihr sekundäres Attribut, welches den Schaden verringert, den sie erhalten.\n* Die Fähigkeiten der Krieger erhöhen die Ausdauer und Stärke der Gruppenmitglieder.\n* Erwäge, einen Krieger zu spielen, wenn du es liebst, Bosse zu bekämpfen und auch ein wenig Schutz möchtest, wenn du gelegentlich Aufgaben versäumst.\n#### **Heiler**\n* Die Heiler haben eine starke Verteidigung und können sich selbst, sowie Gruppenmitglieder, heilen.\n* Ausdauer ist ihr primäres Attribut, welches ihre Heilungen verstärkt und den Schaden, den sie erhalten, verringert.\n* Intelligenz ist ihr sekundäres Attribut, welches ihr Mana und ihre Erfahrung erhöht.\n* Die Fähigkeiten der Heiler bewirken, dass ihre Aufgaben weniger rot werden und erhöhen die Ausdauer der Gruppenmitglieder.\n* Erwäge, einen Heiler zu spielen, wenn du oft Aufgaben versäumst, und die Fähigkeit benötigst, dich selbst und deine Gruppenmitglieder zu heilen. Heiler erreichen schnell neue Level.\n#### **Magier**\n* Die Magier gewinnen schnell neue Level und viel Mana, und verursachen Schaden bei Bossen in Quests.\n* Intelligenz ist ihr primäres Attribut, welches ihr Mana und ihre Erfahrung erhöht.\n* Wahrnehmung ist ihr sekundäres Attribut, welches ihr gefundenes Gold und ihre gefundenen Gegenstände vermehrt.\n* Die Fähigkeiten der Magier bewirken, dass ihre Aufgaben Strähnen eingefroren werden, stellen das Mana ihrer Gruppenmitglieder wieder her, und erhöhen ihre Intelligenz.\n* Erwäge, einen Magier zu spielen, wenn du durch das schnelle Erreichen neuer Level und das Beisteuern von Schaden in Boss Quests motiviert wirst.\n#### **Schurke**\n* Die Schurken bekommen die meisten erbeuteten Gegenstände und das meiste Gold beim Erledigen von Aufgaben und haben eine höhere Chance, kritische Treffer zu erzielen, was ihnen noch mehr Erfahrung und Gold beschert.\n* Wahrnehmung ist ihr primäres Attribut, welches ihr gefundenes Gold und ihre gefundenen Gegenstände vermehrt.\n* Stärke ist ihr sekundäres Attribut, welches den Schaden erhöht, den sie verursachen.\n* Die Fähigkeiten der Schurken helfen ihnen, versäumten Tagesaufgaben auszuweichen, Gold zu klauen und die Wahrnehmung ihrer Gruppenmitglieder zu erhöhen.\n* Erwäge, einen Schurken zu spielen, wenn du durch Belohnungen sehr motiviert wirst.",
|
||||||
|
"faqQuestion68": "Wie kann ich den Verlust von HP verhindern?",
|
||||||
|
"webFaqAnswer68": "Wenn du häufig LP verlierst, probiere diese Tipps aus:\n\n– Pausiere deine täglichen Aufgaben. Die Schaltfläche „Schaden pausieren“ in den Einstellungen verhindert, dass du HP für verpasste Aufgaben verlierst.\n– Passe den Zeitplan deiner täglichen Aufgaben an. Indem du sie so einstellst, dass sie nie fällig sind, kannst du sie trotzdem abschließen und Belohnungen erhalten, ohne HP zu verlieren.\n– Versuche, Klassenfertigkeiten einzusetzen:\n– Schurken können „Schleichen“ einsetzen, um Schaden durch verpasste tägliche Aufgaben zu vermeiden.\n– Krieger können „Gewaltschlag“ einsetzen, um die Röte einer täglichen Aufgabe zu verringern und so den erlittenen Schaden beim Verpassen zu reduzieren.\n– Heiler können „Brennende Helle“ einsetzen, um die Röte einer täglichen Aufgabe zu verringern und so den erlittenen Schaden beim Verpassen zu reduzieren"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,16 +28,16 @@
|
|||||||
"marketing1Lead1Title": "Mache dein Leben zum Spiel",
|
"marketing1Lead1Title": "Mache dein Leben zum Spiel",
|
||||||
"marketing1Lead1": "Habitica ist die perfekte App, für alle die Probleme mit ToDo-Listen haben. Wir verwenden bekannte Spiel-Mechaniken wie Belohnungen in Gold, XP und Gegenstände, die dir dabei helfen, dich produktiver zu fühlen und dein Erfolgserlebnis zu steigern, wenn du Aufgaben vollendest. Je besser Du Dich dabei anstellst, umso weiter kommst Du im Spiel.",
|
"marketing1Lead1": "Habitica ist die perfekte App, für alle die Probleme mit ToDo-Listen haben. Wir verwenden bekannte Spiel-Mechaniken wie Belohnungen in Gold, XP und Gegenstände, die dir dabei helfen, dich produktiver zu fühlen und dein Erfolgserlebnis zu steigern, wenn du Aufgaben vollendest. Je besser Du Dich dabei anstellst, umso weiter kommst Du im Spiel.",
|
||||||
"marketing1Lead2Title": "Rüsten dich mit Stil aus",
|
"marketing1Lead2Title": "Rüsten dich mit Stil aus",
|
||||||
"marketing1Lead2": "Sammele Schwerter, Rüstungen und vieles mehr mit Gold, welches du beim Vollenden von Aufgaben verdienst. Mit hunderten von Ausrüstungsstücken, die du sammeln und auswählen kannst, werden dir nie Kombinationen zum Ausprobieren ausgehen. Optimiere deine Statistik, deinen Style oder beides zusammen! ",
|
"marketing1Lead2": "Sammele Schwerter, Rüstungen und vieles mehr mit dem Gold, das du beim Vollenden von Aufgaben verdienst. Mit hunderten von Stücken zum Sammeln, aus denen du auswählen kannst, werden dir die Kombinationen zum Ausprobieren nie ausgehen. Optimiere deine Werte, deinen Style oder beides! ",
|
||||||
"marketing1Lead3Title": "Verdiene Belohnungen für deine Bemühungen",
|
"marketing1Lead3Title": "Verdiene Belohnungen für deine Bemühungen",
|
||||||
"marketing1Lead3": "Etwas zu haben, auf das man sich freuen kann, mag den Unterschied ausmachen, ob man eine Aufgabe erledigt oder ob sie einen wochenlang quält. Wenn das Leben keine Belohnung bietet ist Habitica für dich da! Du wirst für jede Aufgabe belohnt, aber Überraschungen gibt es an jeder Ecke - also mach weiter so! ",
|
"marketing1Lead3": "Etwas zu haben, auf das man sich freuen kann, mag den Unterschied ausmachen, ob man eine Aufgabe erledigt oder ob sie einen wochenlang quält. Wenn das Leben keine Belohnung bietet ist Habitica für dich da! Du wirst für jede Aufgabe belohnt, aber Überraschungen gibt es an jeder Ecke - also mach weiter so! ",
|
||||||
"marketing2Header": "Schließe dich mit Freunden zusammen",
|
"marketing2Header": "Verbünde dich mit Freunden",
|
||||||
"marketing2Lead1Title": "Soziale Produktivität",
|
"marketing2Lead1Title": "Soziale Produktivität",
|
||||||
"marketing2Lead1": "Hole dir einen Motivationsschub, indem du mit anderen zusammenarbeitest, konkurrierst und interagierst! Habitica wurde entwickelt, um den effektivsten Teil eines jeden Selbstverbesserungsprogramms zu nutzen: soziale Verantwortung.",
|
"marketing2Lead1": "Hole dir einen Motivationsschub, indem du mit anderen zusammenarbeitest, konkurrierst und interagierst! Habitica wurde entwickelt, um den effektivsten Teil eines jeden Selbstverbesserungsprogramms zu nutzen: soziale Verantwortung.",
|
||||||
"marketing2Lead2Title": "Bekämpfe Monster in Quests",
|
"marketing2Lead2Title": "Bekämpfe Monster in Quests",
|
||||||
"marketing2Lead2": "Nimm dich einer unserer hunderten von Quests mit einer Gruppe von Freunden an, um dich ins Getümmel zu stürzen. Die Monster der Quests bringen deine Verantwortlichkeit auf die Spitze. Wenn du vergisst, Zahnseide zu benutzen, schadet das allen!",
|
"marketing2Lead2": "Nimm dich einer unserer hunderten von Quests mit einer Gruppe von Freunden an, um dich ins Getümmel zu stürzen. Die Monster der Quests bringen deine Verantwortlichkeit auf die Spitze. Wenn du vergisst, Zahnseide zu benutzen, schadet das allen!",
|
||||||
"marketing2Lead3Title": "Fordert einander heraus",
|
"marketing2Lead3Title": "Fordert einander heraus",
|
||||||
"marketing2Lead3": "Nimm an Herausforderungen teil, die von unserer Community erstellt wurden und erhalte zusammengestellte Aufgabenlisten, die deinen Interessen und Zielen entsprechen. Gib dein Bestes dabei, um den Edelsteinpreis zu wetteifern, der dem Gewinner verliehen wird!",
|
"marketing2Lead3": "Nimm an Herausforderungen teil, die von unserer Community erstellt wurden, und erhalte handverlesene Aufgabenlisten, die deinen Interessen und Zielen entsprechen. Gib dein Bestes, um den Edelsteinpreis zu gewinnen!",
|
||||||
"marketing3Header": "Weitere Möglichkeiten, Habitica zu nutzen",
|
"marketing3Header": "Weitere Möglichkeiten, Habitica zu nutzen",
|
||||||
"marketing3Lead1": "Du kannst Habitica auf deinem Android- oder iOS-Gerät nutzen, um Aufgaben überall abzuhaken. Schau dir unsere preisgekrönten Apps an, um einen neuen Ansatz zur Erledigung von Aufgaben zu finden.",
|
"marketing3Lead1": "Du kannst Habitica auf deinem Android- oder iOS-Gerät nutzen, um Aufgaben überall abzuhaken. Schau dir unsere preisgekrönten Apps an, um einen neuen Ansatz zur Erledigung von Aufgaben zu finden.",
|
||||||
"marketing3Lead2Title": "Open-Source Community",
|
"marketing3Lead2Title": "Open-Source Community",
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
"passwordReset": "Wenn wir Deine E-Mail-Adresse oder Deinen Benutzernamen kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
|
"passwordReset": "Wenn wir Deine E-Mail-Adresse oder Deinen Benutzernamen kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
|
||||||
"invalidLoginCredentialsLong": "Deine E-Mail-Adresse, deine Benutzername oder Passwort sind nicht korrekt. Bitte versuche es erneut oder wähle \"Passwort vergessen.\"",
|
"invalidLoginCredentialsLong": "Deine E-Mail-Adresse, deine Benutzername oder Passwort sind nicht korrekt. Bitte versuche es erneut oder wähle \"Passwort vergessen.\"",
|
||||||
"invalidCredentials": "Es gibt kein Konto, das diese Anmeldedaten verwendet.",
|
"invalidCredentials": "Es gibt kein Konto, das diese Anmeldedaten verwendet.",
|
||||||
"accountSuspended": "Dieser Account, Benutzer-ID \"<%= userId %>\", wurde gesperrt wegen Verletzung der Community-Richtlinien (https://habitica.com/static/community-guidelines) oder der Allgemeinen Geschäftsbedingungen (https://habitica.com/static/terms). Für genauere Angaben oder um die Aufgebung der Sperre zu erbitten, kontaktiere bitte unseren Community Manager unter <%= communityManagerEmail %> oder bitte Deine Eltern oder Erziehungsberechtigten ihm zu schreiben. Bitte nenne Deine @Benutzer-ID in der E-Mail.",
|
"accountSuspended": "Dieser Account \"<%= userId %>\", wurde gesperrt. Für weitere Informationen oder um Widerspruch einzulegen, sende bitte eine E-Mail an admin@habitica.com mit deinem Habitica-Benutzernamen oder User-ID.",
|
||||||
"accountSuspendedTitle": "Dieser Account wurde suspendiert",
|
"accountSuspendedTitle": "Dieser Account wurde suspendiert",
|
||||||
"unsupportedNetwork": "Dieses Netzwerk wird aktuell nicht unterstützt.",
|
"unsupportedNetwork": "Dieses Netzwerk wird aktuell nicht unterstützt.",
|
||||||
"cantDetachSocial": "Der Account hat nur noch diese Authentifizierung, sie kann nicht getrennt werden.",
|
"cantDetachSocial": "Der Account hat nur noch diese Authentifizierung, sie kann nicht getrennt werden.",
|
||||||
@@ -132,12 +132,12 @@
|
|||||||
"invalidReqParams": "Ungültige Anfrageparameter.",
|
"invalidReqParams": "Ungültige Anfrageparameter.",
|
||||||
"memberIdRequired": "\"member\" muss eine gültige UUID sein.",
|
"memberIdRequired": "\"member\" muss eine gültige UUID sein.",
|
||||||
"heroIdRequired": "\"herold\" muss eine gültige UUID sein.",
|
"heroIdRequired": "\"herold\" muss eine gültige UUID sein.",
|
||||||
"cannotFulfillReq": "Bitte gib eine gültige E-Mail-Adresse ein. Schreibe eine E-Mail an admin@habitica.com, falls dieser Fehler weiterhin auftritt.",
|
"cannotFulfillReq": "Diese Mailadresse ist bereits in Gebrauch. Du kannst versuchen dich einzuloggen oder eine andere Mailadresse zur Registrierung verwenden. Wende dich an admin@habitica.com, falls du Hilfe benötigst.",
|
||||||
"modelNotFound": "Diese Vorlage existiert nicht.",
|
"modelNotFound": "Diese Vorlage existiert nicht.",
|
||||||
"signUpWithSocial": "Mit <%= social %> fortfahren",
|
"signUpWithSocial": "Mit <%= social %> fortfahren",
|
||||||
"loginWithSocial": "Mit <%= social %> anmelden",
|
"loginWithSocial": "Mit <%= social %> anmelden",
|
||||||
"confirmPassword": "Passwort bestätigen",
|
"confirmPassword": "Passwort bestätigen",
|
||||||
"usernameLimitations": "Benutzernamen können jederzeit geändert werden. Sie müssen zwischen 1 und 20 Zeichen lang sein und dürfen nur Buchstaben von A bis Z, Zahlen von 0 bis 9, Bindestriche und Unterstriche beinhalten.",
|
"usernameLimitations": "Benutzernamen können jederzeit geändert werden. Sie müssen zwischen 1 und 20 Zeichen lang sein und dürfen nur Buchstaben von a bis z, Zahlen von 0 bis 9, Bindestriche und Unterstriche beinhalten.",
|
||||||
"usernamePlaceholder": "z.B., HabitRabbit",
|
"usernamePlaceholder": "z.B., HabitRabbit",
|
||||||
"emailPlaceholder": "z.B., gryphon@beispiel.com",
|
"emailPlaceholder": "z.B., gryphon@beispiel.com",
|
||||||
"passwordPlaceholder": "z.B., ******************",
|
"passwordPlaceholder": "z.B., ******************",
|
||||||
|
|||||||
@@ -140,7 +140,7 @@
|
|||||||
"weaponSpecialFallRogueText": "Silberner Pflock",
|
"weaponSpecialFallRogueText": "Silberner Pflock",
|
||||||
"weaponSpecialFallRogueNotes": "Befördert Untote dauerhaft ins Jenseits. Notfalls auch gegen Werwölfe einsetzbar - Vielseitigkeit kann nie schaden. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2014 Herbstausrüstung.",
|
"weaponSpecialFallRogueNotes": "Befördert Untote dauerhaft ins Jenseits. Notfalls auch gegen Werwölfe einsetzbar - Vielseitigkeit kann nie schaden. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2014 Herbstausrüstung.",
|
||||||
"weaponSpecialFallWarriorText": "Krabbige Klaue der Wissenschaft",
|
"weaponSpecialFallWarriorText": "Krabbige Klaue der Wissenschaft",
|
||||||
"weaponSpecialFallWarriorNotes": "Diese Krabbige Klaue ist technisch auf dem neusten Stand! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2014 Sommerausrüstung.",
|
"weaponSpecialFallWarriorNotes": "Diese Krabbige Klaue ist technisch auf dem neusten Stand! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2014 Herbstausrüstung.",
|
||||||
"weaponSpecialFallMageText": "Fliegender Besen",
|
"weaponSpecialFallMageText": "Fliegender Besen",
|
||||||
"weaponSpecialFallMageNotes": "Dieser fliegende Besen ist schneller als ein Drache! Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2014 Herbstausrüstung.",
|
"weaponSpecialFallMageNotes": "Dieser fliegende Besen ist schneller als ein Drache! Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2014 Herbstausrüstung.",
|
||||||
"weaponSpecialFallHealerText": "Skarabäus-Zauberstab",
|
"weaponSpecialFallHealerText": "Skarabäus-Zauberstab",
|
||||||
@@ -526,7 +526,7 @@
|
|||||||
"armorSpecialFall2015RogueText": "Geflügelte Kampfrüstung",
|
"armorSpecialFall2015RogueText": "Geflügelte Kampfrüstung",
|
||||||
"armorSpecialFall2015RogueNotes": "Flieg in den Kampf! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2015 Herbstausrüstung.",
|
"armorSpecialFall2015RogueNotes": "Flieg in den Kampf! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2015 Herbstausrüstung.",
|
||||||
"armorSpecialFall2015WarriorText": "Vogelscheuchenrüstung",
|
"armorSpecialFall2015WarriorText": "Vogelscheuchenrüstung",
|
||||||
"armorSpecialFall2015WarriorNotes": "Obwohl sie nur mit Stroh ausgestopft ist, ist diese Rüstung extrem rüstig! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2015 Herbstausrüstung.",
|
"armorSpecialFall2015WarriorNotes": "Zwar nur mit Stroh ausgestopft, ist diese Rüstung doch extrem rüstig! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2015 Herbstausrüstung.",
|
||||||
"armorSpecialFall2015MageText": "Genähte Roben",
|
"armorSpecialFall2015MageText": "Genähte Roben",
|
||||||
"armorSpecialFall2015MageNotes": "Jede Masche dieser Rüstung schimmert mit Zauberei. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2015 Herbstausrüstung.",
|
"armorSpecialFall2015MageNotes": "Jede Masche dieser Rüstung schimmert mit Zauberei. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2015 Herbstausrüstung.",
|
||||||
"armorSpecialFall2015HealerText": "Roben des Tränkebrauers",
|
"armorSpecialFall2015HealerText": "Roben des Tränkebrauers",
|
||||||
@@ -1873,7 +1873,7 @@
|
|||||||
"weaponSpecialFall2019WarriorText": "Krallen-Kriegsgabel",
|
"weaponSpecialFall2019WarriorText": "Krallen-Kriegsgabel",
|
||||||
"weaponSpecialFall2019RogueNotes": "Ob Du ein Orchester dirigierst oder eine Arie singst, dieses Hilfsmittel hält Deine Hände frei für dramatische Gesten! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2019 Herbstausrüstung.",
|
"weaponSpecialFall2019RogueNotes": "Ob Du ein Orchester dirigierst oder eine Arie singst, dieses Hilfsmittel hält Deine Hände frei für dramatische Gesten! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2019 Herbstausrüstung.",
|
||||||
"weaponSpecialFall2019RogueText": "Notenständer",
|
"weaponSpecialFall2019RogueText": "Notenständer",
|
||||||
"headSpecialFall2019RogueNotes": "Hast Du diese Kopfbedeckung in einer Auktion vermeintlich verwünschter Kostümstücke oder auf dem Speicher eines extentrischen Großelternteils gefunden? Welchen Ursprungs auch immer, ihr Alter und ihre Abnutzung tragen zu Deiner mystischen Aura bei. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2019 Herbstausrüstung.",
|
"headSpecialFall2019RogueNotes": "Hast Du diese Kopfbedeckung in einer Auktion vermeintlich verwünschter Kostümstücke oder auf dem Speicher eines exzentrischen Großelternteils gefunden? Welchen Ursprungs auch immer, ihr Alter und ihre Abnutzung tragen zu Deiner mystischen Aura bei. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2019 Herbstausrüstung.",
|
||||||
"headSpecialFall2019RogueText": "Antiker Opernhut",
|
"headSpecialFall2019RogueText": "Antiker Opernhut",
|
||||||
"armorMystery201909Notes": "Deine robuste Außenschale ist schützend, aber es ist angeraten nach Eichhörnchen Ausschau zu halten... Gewährt keinen Attributionsbonus. Abonnentengegenstand, September 2019.",
|
"armorMystery201909Notes": "Deine robuste Außenschale ist schützend, aber es ist angeraten nach Eichhörnchen Ausschau zu halten... Gewährt keinen Attributionsbonus. Abonnentengegenstand, September 2019.",
|
||||||
"armorMystery201909Text": "Affabler Eichelanzug",
|
"armorMystery201909Text": "Affabler Eichelanzug",
|
||||||
@@ -2409,7 +2409,7 @@
|
|||||||
"weaponSpecialFall2021MageNotes": "Wissen sucht Wissen. Geformt aus Erinnerungen und Sehnsüchten giert diese furchteinflößende Hand nach mehr. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
"weaponSpecialFall2021MageNotes": "Wissen sucht Wissen. Geformt aus Erinnerungen und Sehnsüchten giert diese furchteinflößende Hand nach mehr. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||||
"weaponSpecialFall2021HealerText": "Beschwörungszauberstab",
|
"weaponSpecialFall2021HealerText": "Beschwörungszauberstab",
|
||||||
"headArmoireHeraldsCapNotes": "Dieser Herolds-Hut kommt mit einer flotten Feder. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Herolds Set (Gegenstand 2 von 4).",
|
"headArmoireHeraldsCapNotes": "Dieser Herolds-Hut kommt mit einer flotten Feder. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Herolds Set (Gegenstand 2 von 4).",
|
||||||
"armorSpecialFall2021RogueNotes": "Es hat einen Totenkopf, eine Ledertunika und Metallnieten! Großartig! Allerdings bietet es kein luftdichtes Siegel gegen Pampe! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
"armorSpecialFall2021RogueNotes": "Es hat einen Totenkopf, eine Ledertunika und Metallnieten! Großartig! Allerdings bietet es kein luftdichtes Siegel gegen Pampe! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||||
"armorSpecialFall2021WarriorText": "Formaler Wollanzug",
|
"armorSpecialFall2021WarriorText": "Formaler Wollanzug",
|
||||||
"armorSpecialFall2021WarriorNotes": "Ein atemberaubender Anzug, perfekt für die Überquerung von Brücken in stockdunkler Nacht. Erhöht Ausdauer um <%= con %>. Limiterte Ausgabe 2021, Herbstausrüstung.",
|
"armorSpecialFall2021WarriorNotes": "Ein atemberaubender Anzug, perfekt für die Überquerung von Brücken in stockdunkler Nacht. Erhöht Ausdauer um <%= con %>. Limiterte Ausgabe 2021, Herbstausrüstung.",
|
||||||
"armorSpecialFall2021MageText": "Robe der abgrundtiefen Finsternis",
|
"armorSpecialFall2021MageText": "Robe der abgrundtiefen Finsternis",
|
||||||
@@ -3074,7 +3074,7 @@
|
|||||||
"headSpecialFall2024RogueText": "Schwarze Katzenmaske",
|
"headSpecialFall2024RogueText": "Schwarze Katzenmaske",
|
||||||
"headSpecialFall2024HealerText": "Space Invader-Maske",
|
"headSpecialFall2024HealerText": "Space Invader-Maske",
|
||||||
"headSpecialWinter2025HealerNotes": "Es ist nicht nötig, sie zu entwirren, da sie bereits die Form eines Hutes haben. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Winterausrüstung 2024-2025.",
|
"headSpecialWinter2025HealerNotes": "Es ist nicht nötig, sie zu entwirren, da sie bereits die Form eines Hutes haben. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Winterausrüstung 2024-2025.",
|
||||||
"headSpecialWinter2025MageText": "Aurorahut",
|
"headSpecialWinter2025MageText": "Aurora Kopfschmuck",
|
||||||
"headSpecialWinter2025MageNotes": "Dieser Hut ist mehr als nur ein schicker Fascinator, er lässt dich wie das Polarlicht selbst aussehen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe Winterausrüstung 2024-2025.",
|
"headSpecialWinter2025MageNotes": "Dieser Hut ist mehr als nur ein schicker Fascinator, er lässt dich wie das Polarlicht selbst aussehen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe Winterausrüstung 2024-2025.",
|
||||||
"headSpecialSummer2024MageText": "Seeanemonen-Hut",
|
"headSpecialSummer2024MageText": "Seeanemonen-Hut",
|
||||||
"headSpecialSummer2024HealerText": "Seeschneckenhaus",
|
"headSpecialSummer2024HealerText": "Seeschneckenhaus",
|
||||||
@@ -3437,5 +3437,12 @@
|
|||||||
"shieldSpecialFall2025WarriorText": "Sasquatch Schild",
|
"shieldSpecialFall2025WarriorText": "Sasquatch Schild",
|
||||||
"shieldSpecialFall2025WarriorNotes": "Verschaffe dir etwas mehr Zeit zum Nachdenken und Planen, indem du dich vor deinen nächsten Tagesaufgaben abschirmst. Erhöht die Konstitution um <%= con %>. Limitierte Auflage Herbst 2025 Ausrüstung.",
|
"shieldSpecialFall2025WarriorNotes": "Verschaffe dir etwas mehr Zeit zum Nachdenken und Planen, indem du dich vor deinen nächsten Tagesaufgaben abschirmst. Erhöht die Konstitution um <%= con %>. Limitierte Auflage Herbst 2025 Ausrüstung.",
|
||||||
"shieldSpecialFall2025HealerNotes": "Verschaffe dir etwas mehr Zeit, um Vorräte zu sammeln, indem du dich vor deinen Aufgaben abschirmst. Erhöht die Konstitution um <%= con %>. Limitierte Ausgabe Herbst 2025 Ausrüstung.",
|
"shieldSpecialFall2025HealerNotes": "Verschaffe dir etwas mehr Zeit, um Vorräte zu sammeln, indem du dich vor deinen Aufgaben abschirmst. Erhöht die Konstitution um <%= con %>. Limitierte Ausgabe Herbst 2025 Ausrüstung.",
|
||||||
"shieldArmoireSoftOrangePillowNotes": "Der vorbereitete Krieger packt für jede Expedition ein Kissen ein. Mach dich bereit, neue Verpflichtungen zu übernehmen ... sogar während du ein Nickerchen machst. Erhöht Intelligenz und Wahrnehmung um jeweils <%= attrs %>. Verzauberter Kleiderschrank: Orangenes Loungewear-Set (Gegenstand 3 von 3)."
|
"shieldArmoireSoftOrangePillowNotes": "Der vorbereitete Krieger packt für jede Expedition ein Kissen ein. Mach dich bereit, neue Verpflichtungen zu übernehmen ... sogar während du ein Nickerchen machst. Erhöht Intelligenz und Wahrnehmung um jeweils <%= attrs %>. Verzauberter Kleiderschrank: Orangenes Loungewear-Set (Gegenstand 3 von 3).",
|
||||||
|
"bodyMystery202509Text": "Schal des windgepeitschten Wanderers",
|
||||||
|
"armorSpecialFall2025RogueNotes": "Ein hartes und schmales Ziel in dieser saisonalen Rüstung ist am schwersten zu treffen. Erhöht die Wahrnehmung um <%= per %>. Limitierte Ausgabe Herbst 2025 Ausrüstung.",
|
||||||
|
"weaponSpecialWinter2026WarriorText": "Raureif Sense",
|
||||||
|
"weaponSpecialWinter2026WarriorNotes": "Sensen helfen beim Schneiden, Ernten und beim Abdecken großer Bereiche - alles Dinge, die du beim Verfeinern von Aufgabenlisten brauchst. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Winterausrüstung 2025-2026.",
|
||||||
|
"weaponSpecialWinter2026RogueText": "Skistock",
|
||||||
|
"weaponSpecialWinter2026RogueNotes": "Stistöcke helfen dir dabei, Balance, Stabilität und Timing zu wahren - alles Dinge, die du brauchst, um wirklich produktiv zu sein. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Winterausrüstung 2025-2026.",
|
||||||
|
"weaponSpecialWinter2026HealerText": "Polarstab"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -241,5 +241,6 @@
|
|||||||
"titleCustomizations": "Individualisierungen",
|
"titleCustomizations": "Individualisierungen",
|
||||||
"targetUserNotExist": "Zielbenutzer: '<%= userName %>' existiert nicht.",
|
"targetUserNotExist": "Zielbenutzer: '<%= userName %>' existiert nicht.",
|
||||||
"newMessage": "Neue Nachricht",
|
"newMessage": "Neue Nachricht",
|
||||||
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>."
|
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>.",
|
||||||
|
"gem": "Edelstein"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
"optional": "Optional",
|
"optional": "Optional",
|
||||||
"needsTextPlaceholder": "Gib Deine Nachricht hier ein.",
|
"needsTextPlaceholder": "Gib Deine Nachricht hier ein.",
|
||||||
"leaderOnlyChallenges": "Nur die Gruppenleitung kann Herausforderungen erstellen",
|
"leaderOnlyChallenges": "Nur die Gruppenleitung kann Herausforderungen erstellen",
|
||||||
"sendGift": "Ein Geschenk schicken",
|
"sendGift": "Geschenk schicken",
|
||||||
"inviteFriends": "Lade Freunde ein",
|
"inviteFriends": "Lade Freunde ein",
|
||||||
"inviteByEmail": "Lade per E-Mail ein",
|
"inviteByEmail": "Lade per E-Mail ein",
|
||||||
"inviteMembersHowTo": "Leute einladen: mit einer gültigen E-Mailadresse oder der 36-stelligen Nutzer ID. Wenn eine E-Mailadresse noch nicht registriert ist, laden wir diejenigen nach Habitica ein.",
|
"inviteMembersHowTo": "Leute einladen: mit einer gültigen E-Mailadresse oder der 36-stelligen Nutzer ID. Wenn eine E-Mailadresse noch nicht registriert ist, laden wir diejenigen nach Habitica ein.",
|
||||||
@@ -365,12 +365,6 @@
|
|||||||
"groupUseDefault": "Wähle eine Antwort",
|
"groupUseDefault": "Wähle eine Antwort",
|
||||||
"createGroup": "Erstelle eine Gruppe",
|
"createGroup": "Erstelle eine Gruppe",
|
||||||
"groupUse": "Was beschreibt den Zweck Deiner Gruppe am Besten?*",
|
"groupUse": "Was beschreibt den Zweck Deiner Gruppe am Besten?*",
|
||||||
"groupParentChildren": "Eltern(teile), die Aufgaben für ihre Kinder erstellen",
|
|
||||||
"groupCouple": "Ein Paar, das sich Aufgaben teilt",
|
|
||||||
"groupFriends": "Freunde, die sich Aufgaben teilen",
|
|
||||||
"groupCoworkers": "Arbeitskollegen, die sich Aufgaben teilen",
|
|
||||||
"groupManager": "Ein Manager, der Aufgaben für seine Mitarbeiter erstellt",
|
|
||||||
"groupTeacher": "Ein Lehrer, der Aufgaben für seine Schüler oder Studierenden erstellt",
|
|
||||||
"nameStar": "Name*",
|
"nameStar": "Name*",
|
||||||
"descriptionOptional": "Beschreibung",
|
"descriptionOptional": "Beschreibung",
|
||||||
"descriptionOptionalText": "Füge eine Beschreibung hinzu",
|
"descriptionOptionalText": "Füge eine Beschreibung hinzu",
|
||||||
@@ -428,5 +422,11 @@
|
|||||||
"readyToUpgrade": "Bereit zum Aufrüsten?",
|
"readyToUpgrade": "Bereit zum Aufrüsten?",
|
||||||
"interestedLearningMore": "Willst du mehr erfahren?",
|
"interestedLearningMore": "Willst du mehr erfahren?",
|
||||||
"checkGroupPlanFAQ": "Schau in die <a href='/static/faq#what-is-group-plan'>Gruppenpläne FAQ</a> um herauszufinden, wie du deine gemeinsamen Aufgaben optimal nutzen kannst.",
|
"checkGroupPlanFAQ": "Schau in die <a href='/static/faq#what-is-group-plan'>Gruppenpläne FAQ</a> um herauszufinden, wie du deine gemeinsamen Aufgaben optimal nutzen kannst.",
|
||||||
"messageCopiedToClipboard": "Nachricht in Zwischenablage kopiert."
|
"messageCopiedToClipboard": "Nachricht in Zwischenablage kopiert.",
|
||||||
|
"groupTeacher": "Nutzung in der Bildung",
|
||||||
|
"groupParentChildren": "Nutzung mit der Familie",
|
||||||
|
"groupManager": "Nutzung für die Arbeit",
|
||||||
|
"groupFriends": "Nutzung mit Freunden",
|
||||||
|
"groupPlanBillingFYIShort": "Gruppenpläne verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Die Abbuchung erfolgt innerhalb von 24 Stunden vor der Verlängerung deines Abos, basierend auf der Anzahl der Mitglieder in deinem Gruppenplan zu diesem Zeitpunkt. Wenn du zwischen den Abrechnungszeiträumen Mitglieder hinzufügst, wird dir deren Leistung anteilig in deinem nächsten Abrechnungszeitraum in Rechnung gestellt.",
|
||||||
|
"groupPlanBillingFYI": "Gruppenpläne verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Die Kündigung kann über den Tab „Gruppen-Abrechnung“ deines Gruppenplans erfolgen. Die Abbuchung erfolgt innerhalb von 24 Stunden vor der Verlängerung deines Abos, basierend auf der Anzahl der Mitglieder in deinem Gruppenplan zu diesem Zeitpunkt. Wenn du zwischen den Abrechnungszeiträumen Mitglieder hinzufügst, wird dir deren Leistung anteilig in deinem nächsten Abrechnungszeitraum in Rechnung gestellt."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -234,18 +234,18 @@
|
|||||||
"fall2023BogCreatureHealerSet": "Sumpf Kreatur (Heiler)",
|
"fall2023BogCreatureHealerSet": "Sumpf Kreatur (Heiler)",
|
||||||
"anniversaryGryphatricePrice": "Besitze es heute für <strong>$9.99</strong> oder <strong>60 Edelsteine</strong>",
|
"anniversaryGryphatricePrice": "Besitze es heute für <strong>$9.99</strong> oder <strong>60 Edelsteine</strong>",
|
||||||
"wantToPayWithMoneyText": "Willst du mit Stripe, Paypal oder Amazon bezahlen?",
|
"wantToPayWithMoneyText": "Willst du mit Stripe, Paypal oder Amazon bezahlen?",
|
||||||
"jubilantSuccess": "Du hast das <strong>Jubilierende Greifatrix</strong> erfolgreich gekauft!",
|
"jubilantSuccess": "Du hast das <strong>Jubelnde Greifatrix</strong> erfolgreich gekauft!",
|
||||||
"takeMeToStable": "Bring mich zum Stall",
|
"takeMeToStable": "Bring mich zum Stall",
|
||||||
"ownJubilantGryphatrice": "<strong>Du besitzt das Jubilierende Greifatrix!</strong> Besuche den Stall, um es auszurüsten!",
|
"ownJubilantGryphatrice": "<strong>Du besitzt das Jubelnde Greifatrix!</strong> Besuche den Stall, um es auszurüsten!",
|
||||||
"celebrateAnniversary": "Feiere Habiticas 10. Geburtstag mit untenstehenden Geschenken und exklusiven Gegenständen!",
|
"celebrateAnniversary": "Feiere Habiticas 10. Geburtstag mit untenstehenden Geschenken und exklusiven Gegenständen!",
|
||||||
"celebrateBirthday": "Feiere Habiticas 10. Geburtstag mit Geschenken und exklusiven Gegenständen!",
|
"celebrateBirthday": "Feiere Habiticas 10. Geburtstag mit Geschenken und exklusiven Gegenständen!",
|
||||||
"jubilantGryphatricePromo": "Animiertes Jubilierender Greifatrix Haustier",
|
"jubilantGryphatricePromo": "Animiertes Jubelndes Greifatrix Haustier",
|
||||||
"limitedEdition": "Limitierte Ausgabe",
|
"limitedEdition": "Limitierte Ausgabe",
|
||||||
"anniversaryGryphatriceText": "Das seltene Jubilierende Greifatrix schließt sich den Geburtstagsfeiern an! Verpass nicht deine Chance, dieses exklusive animierte Haustier zu besitzen.",
|
"anniversaryGryphatriceText": "Das seltene Jubelnde Greifatrix schließt sich den Geburtstagsfeiern an! Verpass nicht deine Chance, dieses exklusive animierte Haustier zu besitzen.",
|
||||||
"buyNowMoneyButton": "Kaufe Jetzt für $9.99",
|
"buyNowMoneyButton": "Kaufe Jetzt für $9.99",
|
||||||
"buyNowGemsButton": "Kaufe Jetzt für 60 Edelsteine",
|
"buyNowGemsButton": "Kaufe Jetzt für 60 Edelsteine",
|
||||||
"wantToPayWithGemsText": "Willst du mit Edelsteinen bezahlen?",
|
"wantToPayWithGemsText": "Willst du mit Edelsteinen bezahlen?",
|
||||||
"anniversaryLimitations": "Dies ist eine zeitlich begrenzte Aktion, die am 30. Januar um 8:00 AM ET (13:00 UTC) startet und am 8. Februar um 11:59 PM ET (04:59 UTC) endet. Die Limitierte Ausgabe des Jubilierenden Greifatrix und zehn Magische Schlüpfelixiere werden in diesem Zeitraum zum Kauf angeboten. Die anderen Geschenke, die im Gratis Abschnitt aufgeführt sind, werden automatisch an alle Accounts geliefert, die in den 30 Tagen vor dem Tag aktiv waren, an dem das Geschenk versendet wird. Accounts, die nach dem Versenden der Geschenke erstellt sind, werden die Geschenke nicht beanspruchen können.",
|
"anniversaryLimitations": "Dies ist eine zeitlich begrenzte Aktion, die am 30. Januar um 8:00 AM ET (13:00 UTC) startet und am 8. Februar um 11:59 PM ET (04:59 UTC) endet. Die limitierte Ausgabe des Jubelnden Greifatrix und zehn magische Schlüpfelixiere werden in diesem Zeitraum zum Kauf angeboten. Die anderen Geschenke, die im Gratis Abschnitt aufgeführt sind, werden automatisch an alle Accounts geliefert, die in den 30 Tagen vor dem Tag aktiv waren, an dem das Geschenk versendet wird. Accounts, die nach dem Versenden der Geschenke erstellt sind, werden die Geschenke nicht beanspruchen können.",
|
||||||
"plentyOfPotionsText": "Wir bringen 10 der beliebtesten Magischen Schlüpfelixiere der Community zurück. Geh rüber zum Marktplatz, um deine Sammlung zu vervollständigen!",
|
"plentyOfPotionsText": "Wir bringen 10 der beliebtesten Magischen Schlüpfelixiere der Community zurück. Geh rüber zum Marktplatz, um deine Sammlung zu vervollständigen!",
|
||||||
"visitTheMarketButton": "Besuche den Marktplatz",
|
"visitTheMarketButton": "Besuche den Marktplatz",
|
||||||
"fourForFree": "Vier gratis",
|
"fourForFree": "Vier gratis",
|
||||||
@@ -282,5 +282,9 @@
|
|||||||
"fall2025SasquatchWarriorSet": "Sasquatch Krieger Set",
|
"fall2025SasquatchWarriorSet": "Sasquatch Krieger Set",
|
||||||
"fall2025SkeletonRogueSet": "Skelett Schurken Set",
|
"fall2025SkeletonRogueSet": "Skelett Schurken Set",
|
||||||
"fall2025KoboldHealerSet": "Kobold Heiler Set",
|
"fall2025KoboldHealerSet": "Kobold Heiler Set",
|
||||||
"fall2025MaskedGhostMageSet": "Maskengeist Magier Set"
|
"fall2025MaskedGhostMageSet": "Maskengeist Magier Set",
|
||||||
|
"winter2026RimeReaperWarriorSet": "Frostschnitter Krieger Set",
|
||||||
|
"winter2026SkiRogueSet": "Ski Schurken Set",
|
||||||
|
"winter2026PolarBearHealerSet": "Eisbär Heiler Set",
|
||||||
|
"winter2026MidwinterCandleMageSet": "Mittwinterkerzen Magier Set"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"stable": "Haus- und Reittiere",
|
"stable": "Haustiere und Reittiere",
|
||||||
"pets": "Haustiere",
|
"pets": "Haustiere",
|
||||||
"activePet": "Aktives Haustier",
|
"activePet": "Aktives Haustier",
|
||||||
"noActivePet": "Kein aktives Haustier",
|
"noActivePet": "Kein aktives Haustier",
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
"questRoosterUnlockText": "Schaltet den Kauf von Hahneneiern auf dem Marktplatz frei",
|
"questRoosterUnlockText": "Schaltet den Kauf von Hahneneiern auf dem Marktplatz frei",
|
||||||
"questSpiderText": "Die eisige Arachnoide",
|
"questSpiderText": "Die eisige Arachnoide",
|
||||||
"questSpiderNotes": "Das Wetter kühlt sich ab und leichter Frost beginnt auf den Fensterscheiben der Einwohner von Habitica in Form von filigranen Netzen zu erscheinen ... außer bei @Arcosine, dessen Fenster komplett zugefroren sind und bei dem sich die Frostspinne eingenistet hat. Oh je.",
|
"questSpiderNotes": "Das Wetter kühlt sich ab und leichter Frost beginnt auf den Fensterscheiben der Einwohner von Habitica in Form von filigranen Netzen zu erscheinen ... außer bei @Arcosine, dessen Fenster komplett zugefroren sind und bei dem sich die Frostspinne eingenistet hat. Oh je.",
|
||||||
"questSpiderCompletion": "Die Frostspinne bricht zusammen. Von ihr bleibt nur ein kleiner Haufen Frost und ein paar ihrer verzauberten Eiersäcke übrig. @Arcosine bietet sie Dir recht hastig als Belohnung an – vielleicht könntest Du ein paar ungefährliche Spinnen als Deine Haustiere aufziehen?",
|
"questSpiderCompletion": "Die Frostspinne bricht zusammen. Von ihr bleibt nur ein kleiner Haufen Frost und ein paar ihrer verzauberten Eiersäcke zurück. @Arcosine bietet sie Dir recht hastig als Belohnung an – vielleicht könntest Du ein paar ungefährliche Spinnen als Deine Haustiere aufziehen?",
|
||||||
"questSpiderBoss": "Spinnentier",
|
"questSpiderBoss": "Spinnentier",
|
||||||
"questSpiderDropSpiderEgg": "Spinnentier (Ei)",
|
"questSpiderDropSpiderEgg": "Spinnentier (Ei)",
|
||||||
"questSpiderUnlockText": "Schaltet den Kauf von Spinneneiern auf dem Marktplatz frei",
|
"questSpiderUnlockText": "Schaltet den Kauf von Spinneneiern auf dem Marktplatz frei",
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
"questGoldenknight3DropWeapon": "Mustaines Meilenstein-matschender Morgenstern (Zweithand-Waffe)",
|
"questGoldenknight3DropWeapon": "Mustaines Meilenstein-matschender Morgenstern (Zweithand-Waffe)",
|
||||||
"questGroupEarnable": "Verdienbare Quests",
|
"questGroupEarnable": "Verdienbare Quests",
|
||||||
"questBasilistText": "Der Basi-List",
|
"questBasilistText": "Der Basi-List",
|
||||||
"questBasilistNotes": "Da ist ein Aufruhr auf dem Marktplatz – es sieht ganz so aus, als ob man lieber in die andere Richtung rennen sollte. Da Du aber ein mutiger Abenteurer bist, rennst Du stattdessen darauf zu und entdeckst einen Basi-List, der sich aus einem Haufen unerledigter Aufgaben geformt hat! Alle umstehenden Habiticaner sind aus Angst vor der Länge des Basi-Lists gelähmt und können nicht anfangen zu arbeiten. Von irgendwo in der Nähe hörst Du @Arcosine schreien: \"Schnell! Erledige Deine To-Dos und Tagesaufgaben, um dem Monster die Zähne zu entfernen, bevor sich jemand am Papier schneidet!\" Greife schnell an, Abenteurer, und hake etwas ab - aber Vorsicht! Wenn Du irgendwelche Tagesaufgaben nicht erledigst, wird der Basi-List Dich und Deine Party angreifen!",
|
"questBasilistNotes": "Da ist ein Aufruhr auf dem Marktplatz—es sieht ganz so aus, als ob man lieber in die andere Richtung rennen sollte. Da Du aber ein mutiger Abenteurer bist, rennst Du stattdessen darauf zu und entdeckst einen Basi-List, der sich aus einem Haufen unerledigter Aufgaben geformt hat! Alle umstehenden Habiticaner sind aus Angst vor der Länge des Basi-Lists gelähmt und können nicht anfangen zu arbeiten. Von irgendwo in der Nähe hörst Du @Arcosine schreien: \"Schnell! Erledige Deine To-Dos und Tagesaufgaben, um dem Monster die Zähne zu entfernen, bevor sich jemand am Papier schneidet!\" Greife schnell an, Abenteurer, und hake etwas ab - aber Vorsicht! Wenn Du irgendwelche Tagesaufgaben nicht erledigst, wird der Basi-List Dich und Deine Party angreifen!",
|
||||||
"questBasilistCompletion": "Der Basi-List ist in Papierschnitzel zerfallen, die sanft in Regenbogenfarben schimmern. \"Puh!\" sagt @Arcosine. \"Gut, dass ihr gerade hier wart!\" Du fühlst Dich erfahrener als vorher und sammelst ein paar verstreute Goldstücke zwischen den Papierstücken auf.",
|
"questBasilistCompletion": "Der Basi-List ist in Papierschnitzel zerfallen, die sanft in Regenbogenfarben schimmern. \"Puh!\" sagt @Arcosine. \"Gut, dass ihr gerade hier wart!\" Du fühlst Dich erfahrener als vorher und sammelst ein paar verstreute Goldstücke zwischen den Papierstücken auf.",
|
||||||
"questBasilistBoss": "Der Basi-List",
|
"questBasilistBoss": "Der Basi-List",
|
||||||
"questEggHuntText": "Eierjagd",
|
"questEggHuntText": "Eierjagd",
|
||||||
@@ -253,7 +253,7 @@
|
|||||||
"questDilatoryDistress3DropWeapon": "Dreizack der zerschmetternden Gezeiten (Waffe)",
|
"questDilatoryDistress3DropWeapon": "Dreizack der zerschmetternden Gezeiten (Waffe)",
|
||||||
"questDilatoryDistress3DropShield": "Mondperlenschild (Schildhand-Gegenstand)",
|
"questDilatoryDistress3DropShield": "Mondperlenschild (Schildhand-Gegenstand)",
|
||||||
"questCheetahText": "Der Mogel-Gepard",
|
"questCheetahText": "Der Mogel-Gepard",
|
||||||
"questCheetahNotes": "Während Du mit Deinen Freunden @PainterProphet, @tivaquinn, @Unruly Hyena und @Crawford durch die Ruhilangsam-Savanne wanderst, schreckst Du plötzlich hoch, als Du einen Mogel-Geparden vorbeischnellen siehst, der einen kreischenden Jung-Habiticaner mit dem Maul gepackt hat. Unter den feurigen Pfoten des Geparden verbrennen die Aufgaben, als ob sie erledigt wären -- bevor überhaupt jemand die Möglichkeit dazu hat, diese tatsächlich abzuschließen! Der Habiticaner sieht Dich und ruft: \"Bitte hilf mir! Der Mogel-Gepard lässt meinen Level zu schnell ansteigen, ohne dass ich wirklich etwas erledigen kann. Ich will langsamer machen und das Spiel genießen. Halte ihn auf!\" Liebevoll erinnerst Du Dich an die Tage, and denen Du selbst flügge wurdest, und Du weißt, dass Du dem Neuling helfen musst, indem Du den Mogel-Geparden aufhältst!",
|
"questCheetahNotes": "Während Du mit Deinen Freunden @PainterProphet, @tivaquinn, @Unruly Hyena und @Crawford durch die Ruhilangsam-Savanne wanderst, schreckst Du plötzlich hoch, als Du einen Mogel-Geparden vorbeischnellen siehst, der einen kreischenden Jung-Habiticaner mit dem Maul gepackt hat. Unter den feurigen Pfoten des Geparden verbrennen die Aufgaben, als ob sie erledigt wären—bevor überhaupt jemand die Möglichkeit dazu hat, diese tatsächlich abzuschließen! Der Habiticaner sieht Dich und ruft: \"Bitte hilf mir! Der Mogel-Gepard lässt meinen Level zu schnell ansteigen, ohne dass ich wirklich etwas erledigen kann. Ich will langsamer machen und das Spiel genießen. Halte ihn auf!\" Liebevoll erinnerst Du Dich an die Tage, and denen Du selbst flügge wurdest, und Du weißt, dass Du dem Neuling helfen musst, indem Du den Mogel-Geparden aufhältst!",
|
||||||
"questCheetahCompletion": "Der Jung-Habiticaner atmet schwer nach dem wilden Ritt, aber er dankt Dir und Deinen Freunden für eure Hilfe: \"Ich bin froh, dass der Gepard niemand anderen mehr schnappen kann. Er hat aber ein paar Gepardeneier für uns hinterlassen, vielleicht können wir die zu vertrauenswürdigeren Haustieren großziehen!\"",
|
"questCheetahCompletion": "Der Jung-Habiticaner atmet schwer nach dem wilden Ritt, aber er dankt Dir und Deinen Freunden für eure Hilfe: \"Ich bin froh, dass der Gepard niemand anderen mehr schnappen kann. Er hat aber ein paar Gepardeneier für uns hinterlassen, vielleicht können wir die zu vertrauenswürdigeren Haustieren großziehen!\"",
|
||||||
"questCheetahBoss": "Gepard",
|
"questCheetahBoss": "Gepard",
|
||||||
"questCheetahDropCheetahEgg": "Gepard (Ei)",
|
"questCheetahDropCheetahEgg": "Gepard (Ei)",
|
||||||
@@ -277,7 +277,7 @@
|
|||||||
"questBurnoutBossRageSeasonalShop": "`Burnout benutzt ERSCHÖPFUNGSSCHLAG!`\n\nAhh!!! Unsere unerledigten Tagesaufgaben haben die Flammen von Burnout genährt und nun hat es genug Energie, um nochmal anzugreifen! Es lässt einen Schwall von Spektralflammen los, welches den Jahreszeitenmarkt ansengt. Du bist erschrocken zu sehen, dass die heitere Jahreszeitenzauberin in einen schlaffen Erschöpfungsgeist transformiert wurde.\n\nWir müssen die NPCs retten! Schnell, Habiticaner, erledigt eure Aufgaben und besiegt Burnout bevor es ein drittes Mal zuschlägt!",
|
"questBurnoutBossRageSeasonalShop": "`Burnout benutzt ERSCHÖPFUNGSSCHLAG!`\n\nAhh!!! Unsere unerledigten Tagesaufgaben haben die Flammen von Burnout genährt und nun hat es genug Energie, um nochmal anzugreifen! Es lässt einen Schwall von Spektralflammen los, welches den Jahreszeitenmarkt ansengt. Du bist erschrocken zu sehen, dass die heitere Jahreszeitenzauberin in einen schlaffen Erschöpfungsgeist transformiert wurde.\n\nWir müssen die NPCs retten! Schnell, Habiticaner, erledigt eure Aufgaben und besiegt Burnout bevor es ein drittes Mal zuschlägt!",
|
||||||
"questBurnoutBossRageTavern": "`Burnout benutzt ERSCHÖPFUNGSSCHLAG!`\n\nViele Habiticaner haben sich vor Burnout in der Taverne versteckt, aber nicht mehr lange! Mit einem kreischenden Heulen harkt Burnout die Taverne mit seinen weiß glühenden Händen. Während die Taverne-Gäste fliehen, wird Daniel von Burnouts Klauen gepackt und verwandelt sich direkt vor Deinen Augen in einen Erschöpfungsgeist!.\n\nDieser unbeherrschte Horror dauert schon viel zu lange. Gib nicht auf ... wir sind so nah dran Burnout ein für alle Mal zu bezwingen!",
|
"questBurnoutBossRageTavern": "`Burnout benutzt ERSCHÖPFUNGSSCHLAG!`\n\nViele Habiticaner haben sich vor Burnout in der Taverne versteckt, aber nicht mehr lange! Mit einem kreischenden Heulen harkt Burnout die Taverne mit seinen weiß glühenden Händen. Während die Taverne-Gäste fliehen, wird Daniel von Burnouts Klauen gepackt und verwandelt sich direkt vor Deinen Augen in einen Erschöpfungsgeist!.\n\nDieser unbeherrschte Horror dauert schon viel zu lange. Gib nicht auf ... wir sind so nah dran Burnout ein für alle Mal zu bezwingen!",
|
||||||
"questFrogText": "Sumpf des Chaos-Froschs",
|
"questFrogText": "Sumpf des Chaos-Froschs",
|
||||||
"questFrogNotes": "Als Du Dich mit Deinen Freunden durch den Sumpf des Stillstands schlägst, deutet @starsystemic auf ein großes Schild: \"Auf dem Weg bleiben – wenn möglich.\"<br><br>\"Das ist sicher nicht schwer\" sagt @RosemonkeyCT. \"Er ist breit und frei.\"<br><br>Aber als Ihr weitergeht, bemerkst Du, dass der Weg langsam immer mehr vom Moor des Sumpfs eingenommen wird, übersät mit Stücken blauen Gerölls und Müll. Irgendwann ist es unmöglich voranzukommen.<br><br>Als Du Dich umsiehst und Dich fragst, wie es hier so verschmutzt werden konnte, ruft @Jon Arjinborn: \"Passt auf!\" Ein wütender Frosch springt aus dem Schlamm hervor, bekleidet mit dreckigen Lumpen und von blauem Feuer entfacht. Du musst diesen giftigen Chaos-Frosch überwältigen um weiterzukommen!",
|
"questFrogNotes": "Als Du Dich mit Deinen Freunden durch den Sumpf des Stillstands schlägst, deutet @starsystemic auf ein großes Schild: \"Auf dem Weg bleiben—wenn möglich.\"<br><br>\"Das ist sicher nicht schwer\" sagt @RosemonkeyCT. \"Er ist breit und frei.\"<br><br>Aber als Ihr weitergeht, bemerkst Du, dass der Weg langsam immer mehr vom Moor des Sumpfs eingenommen wird, übersät mit Stücken blauen Gerölls und Müll. Irgendwann ist es unmöglich voranzukommen.<br><br>Als Du Dich umsiehst und Dich fragst, wie es hier so verschmutzt werden konnte, ruft @Jon Arjinborn: \"Passt auf!\" Ein wütender Frosch springt aus dem Schlamm hervor, bekleidet mit dreckigen Lumpen und von blauem Feuer entfacht. Du musst diesen giftigen Chaos-Frosch überwältigen um weiterzukommen!",
|
||||||
"questFrogCompletion": "Der Frosch duckt sich weg in den Dreck, geschlagen. Als er von dannen zieht, verschwindet der blaue Schleim und gibt den Weg frei.<br><br>Mitten im Weg stehen drei makellose Eier. \"Man kann sogar die winzigen Kaulquappen durch die Schale sehen!\" sagt @Breadstring. \"Hier, Du solltest sie nehmen.\"",
|
"questFrogCompletion": "Der Frosch duckt sich weg in den Dreck, geschlagen. Als er von dannen zieht, verschwindet der blaue Schleim und gibt den Weg frei.<br><br>Mitten im Weg stehen drei makellose Eier. \"Man kann sogar die winzigen Kaulquappen durch die Schale sehen!\" sagt @Breadstring. \"Hier, Du solltest sie nehmen.\"",
|
||||||
"questFrogBoss": "Chaos-Frosch",
|
"questFrogBoss": "Chaos-Frosch",
|
||||||
"questFrogDropFrogEgg": "Frosch (Ei)",
|
"questFrogDropFrogEgg": "Frosch (Ei)",
|
||||||
@@ -313,7 +313,7 @@
|
|||||||
"questSnailDropSnailEgg": "Schnecke (Ei)",
|
"questSnailDropSnailEgg": "Schnecke (Ei)",
|
||||||
"questSnailUnlockText": "Schaltet den Kauf von Schneckeneiern auf dem Marktplatz frei",
|
"questSnailUnlockText": "Schaltet den Kauf von Schneckeneiern auf dem Marktplatz frei",
|
||||||
"questBewilderText": "Der Verwirrer",
|
"questBewilderText": "Der Verwirrer",
|
||||||
"questBewilderNotes": "Die Party beginnt wie jede Andere.<br><br>Die Appetithäppchen sind exzellent, die Musik sorgt für lockere Stimmung und sogar an die tanzenden Elefanten hat man sich gewöhnt. Habiticaner lachen ausgelassen zwischen den ausladenden Blumengestecken, froh um eine Ablenkung von Ihren meist-gehassten Aufgaben, und der April-Scherzkeks wirbelt zwischen ihnen herum, eifrig Scherze und Schabernack treibend.<br><br>Als die Uhr des Mistiflying Uhrturms Mitternacht schlägt, springt der April-Scherzkeks auf die Bühne um eine Rede zu halten.<br><br>\"Freunde! Feinde! Tolerante Bekannte! Leiht mir euer Ohr!\" Als aus ihren Köpfen Tierohren sprießen, kichert die Schar und posiert mit ihren neuen Verkleidungen.<br><br>\"Wie ihr alle wisst,\" fährt der April-Scherzkeks weiter, \"dauern meine verwirrenden Illusionen normalerweise nur einen Tag. Deshalb freue ich mich besonders euch mitzuteilen, dass ich eine Abkürzung gefunden habe, die uns Spaß ohne Ende verspricht, ohne dass wir uns um die mühsame Last unserer Pflichten sorgen müssen. Liebe Habiticaner, ich stelle euch hiermit meinen neuen, magischen Freund vor: den Verwirrer!\"<br><br>Lemoness wird plötzlich bleich und lässt ihre Häppchen fallen. \"Wartet! Traut ihm ni--\"<br><br>Doch schon stürzen Nebelschwaden in den Saal, dick und glitzernd. Sie wirbeln um den April-Scherzkeks und vereinen sich zu verschwommenen Federn und einem langen Hals. The Menge ist sprachlos, während sich vor ihr ein monströser Vogel entfaltet, seine Flügel schimmernd vor lauter Illusionen. Er gibt ein fürchterliches, kreischendes Lachen von sich.<br><br>\"Oh, es ist schon Ewigkeiten her, seit ein Habiticaner töricht genug war, mich herbeizurufen! Wie wundervoll es ist, endlich eine greifbare Form zu haben!\"<br><br>Erschreckt summend fliehen die magischen Bienen von Mistiflying aus der fliegenden Stadt, die aus dem Himmel sackt. Eine nach der anderen verwelken die leuchtenden Frühlingsblumen und schrumpfen weg.<br><br>\"Meine liebsten Freunde, warum so beunruhigt?\" krächzt der Verwirrer, während er mit den Flügeln schlägt. \"Es gibt keinen Grund mehr, euch für eure Belohnungen abzurackern. Ich werde euch alles geben, was ihr euch wünscht!\"<br><br>Ein Münzenschauer stürzt aus dem Himmel und hämmert sich mit brutaler Kraft in den Boden. Die Menge schreit und sucht Deckung. \"Soll das ein Scherz sein?\" ruft Baconsaur, während das Gold Fenster einschlägt und die Schindeln auf den Dächern zerschmettert.<br><br>PainterProphet duckt sich, als Blitze über den Himmel schießen und Nebel die Sonne verdunkelt. \"Nein! Diesmal ist es glaube ich kein Scherz!\"<br><br>Schnell, Habiticaner, lasst diesen Weltboss euch nicht von euren Zielen ablenken! Konzentriert euch auf das, was ihr zu erledigen habt, um Mistiflying zu retten -- und hoffentlich euch selbst.",
|
"questBewilderNotes": "Die Party beginnt wie jede Andere.<br><br>Die Appetithäppchen sind exzellent, die Musik sorgt für lockere Stimmung und sogar an die tanzenden Elefanten hat man sich gewöhnt. Habiticaner lachen ausgelassen zwischen den ausladenden Blumengestecken, froh um eine Ablenkung von Ihren meist-gehassten Aufgaben, und der April-Scherzkeks wirbelt zwischen ihnen herum, eifrig Scherze und Schabernack treibend.<br><br>Als die Uhr des Mistiflying Uhrturms Mitternacht schlägt, springt der April-Scherzkeks auf die Bühne um eine Rede zu halten.<br><br>\"Freunde! Feinde! Tolerante Bekannte! Leiht mir euer Ohr!\" Als aus ihren Köpfen Tierohren sprießen, kichert die Schar und posiert mit ihren neuen Verkleidungen.<br><br>\"Wie ihr alle wisst,\" fährt der April-Scherzkeks weiter, \"dauern meine verwirrenden Illusionen normalerweise nur einen Tag. Deshalb freue ich mich besonders euch mitzuteilen, dass ich eine Abkürzung gefunden habe, die uns Spaß ohne Ende verspricht, ohne dass wir uns um die mühsame Last unserer Pflichten sorgen müssen. Liebe Habiticaner, ich stelle euch hiermit meinen neuen, magischen Freund vor: den Verwirrer!\"<br><br>Lemoness wird plötzlich bleich und lässt ihre Häppchen fallen. \"Wartet! Traut ihm ni--\"<br><br>Doch schon stürzen Nebelschwaden in den Saal, dick und glitzernd. Sie wirbeln um den April-Scherzkeks und vereinen sich zu verschwommenen Federn und einem langen Hals. The Menge ist sprachlos, während sich vor ihr ein monströser Vogel entfaltet, seine Flügel schimmernd vor lauter Illusionen. Er gibt ein fürchterliches, kreischendes Lachen von sich.<br><br>\"Oh, es ist schon Ewigkeiten her, seit ein Habiticaner töricht genug war, mich herbeizurufen! Wie wundervoll es ist, endlich eine greifbare Form zu haben!\"<br><br>Erschreckt summend fliehen die magischen Bienen von Mistiflying aus der fliegenden Stadt, die aus dem Himmel sackt. Eine nach der anderen verwelken die leuchtenden Frühlingsblumen und schrumpfen weg.<br><br>\"Meine liebsten Freunde, warum so beunruhigt?\" krächzt der Verwirrer, während er mit den Flügeln schlägt. \"Es gibt keinen Grund mehr, euch für eure Belohnungen abzurackern. Ich werde euch alles geben, was ihr euch wünscht!\"<br><br>Ein Münzenschauer stürzt aus dem Himmel und hämmert sich mit brutaler Kraft in den Boden. Die Menge schreit und sucht Deckung. \"Soll das ein Scherz sein?\" ruft Baconsaur, während das Gold Fenster einschlägt und die Schindeln auf den Dächern zerschmettert.<br><br>PainterProphet duckt sich, als Blitze über den Himmel schießen und Nebel die Sonne verdunkelt. \"Nein! Diesmal ist es glaube ich kein Scherz!\"<br><br>Schnell, Habiticaner, lasst diesen Weltboss euch nicht von euren Zielen ablenken! Konzentriert euch auf das, was ihr zu erledigen habt, um Mistiflying zu retten—und hoffentlich euch selbst.",
|
||||||
"questBewilderCompletion": "<strong>Der Verwirrer ist BESIEGT!</strong><br><br>Wir haben es geschafft! Der Verwirrer stößt einen heulenden Schrei aus, windet sich in der Luft und verliert büschelweise Federn. Langsam, nach und nach wickelt er sich zu einer funkelnden Nebelwoke auf. Die enthüllte Sonne durchdingt den Nebel, vertreibt ihn und enthüllt die hustenden, glücklicherweise menschlichen Formen von Matt, Bailey, Alex ... und dem April-Scherzkeks persönlich.<br><br><strong>Mistiflying ist gerettet!</strong><br><br>Der April-Scherzkeks schämt sich immerhin genug, um etwas verlegen dazustehen. \"Oh, ähm,\" sagt er. \"Vielleicht habe ich mich ein wenig ... gehen lassen.\"”<br><br>Die Menschenmenge murrt. Durchnässte Blumen werden auf Gehsteigen angeschwemmt. Irgendwo in der Ferne stürzt ein Dach mit spektakulärem Krachen ein.<br><br>\"Ähm, ja,\" sagt der April-Scherzkeks. \"Also, was ich sagen wollte, es tut mir schrecklich leid.\" Er seufzt schwer. \"Ich vermute mal, es kann doch nicht nur Spaß und Spiel geben. Es kann wohl nicht schaden, sich ab und zu mal auf etwas zu konzentrieren. Vielleicht kann ich ja schon mal den nächsten Aprilscherz vorbereiten.\"<br><br>Redphoenix räuspert sich vielsagend.<br><br>\"Ich meine, den nächsten Frühjahrsputz!\" korrigiert sich der April-Scherzkeks. \"Habt keine Angst, ich werde Habit City rasch wieder blitzblank haben. Niemand ist besser als ich mit dem Doppelmopp.\"<br><br>Ermuntert beginnt die Kapelle zu spielen.<br><br>Es dauert nicht lange bis alles in Habit City wieder seinen normalen Lauf nimmt. Außerdem, jetzt wo der Verwirrer pulverisiert ist, sind die magischen Bienen von Mistiflying wieder eifrig am Werk und schon bald blühen die Blumen und die Stadt schwebt von Neuem.<br><br>Als die Habiticaner die magischen, flaumigen Bienen knuddeln, beginnen die Augen des April-Scherzkeks zu leuchten. \"Oho, mir kommt eine Idee! Warum haltet ihr euch eigentlich keine dieser flaumigen Bienen als Haustiere und Reittiere? Das ist ein Geschenk, welches das Gleichgewicht zwischen harter Arbeit und süßer Belohnung symbolisiert, wenn ich das mal so langweilig und sinnbildlich sagen darf.\" Er zwinkert. \"Und außerdem haben sie keinen Stachel! Narrenehrenwort.\"",
|
"questBewilderCompletion": "<strong>Der Verwirrer ist BESIEGT!</strong><br><br>Wir haben es geschafft! Der Verwirrer stößt einen heulenden Schrei aus, windet sich in der Luft und verliert büschelweise Federn. Langsam, nach und nach wickelt er sich zu einer funkelnden Nebelwoke auf. Die enthüllte Sonne durchdingt den Nebel, vertreibt ihn und enthüllt die hustenden, glücklicherweise menschlichen Formen von Matt, Bailey, Alex ... und dem April-Scherzkeks persönlich.<br><br><strong>Mistiflying ist gerettet!</strong><br><br>Der April-Scherzkeks schämt sich immerhin genug, um etwas verlegen dazustehen. \"Oh, ähm,\" sagt er. \"Vielleicht habe ich mich ein wenig ... gehen lassen.\"”<br><br>Die Menschenmenge murrt. Durchnässte Blumen werden auf Gehsteigen angeschwemmt. Irgendwo in der Ferne stürzt ein Dach mit spektakulärem Krachen ein.<br><br>\"Ähm, ja,\" sagt der April-Scherzkeks. \"Also, was ich sagen wollte, es tut mir schrecklich leid.\" Er seufzt schwer. \"Ich vermute mal, es kann doch nicht nur Spaß und Spiel geben. Es kann wohl nicht schaden, sich ab und zu mal auf etwas zu konzentrieren. Vielleicht kann ich ja schon mal den nächsten Aprilscherz vorbereiten.\"<br><br>Redphoenix räuspert sich vielsagend.<br><br>\"Ich meine, den nächsten Frühjahrsputz!\" korrigiert sich der April-Scherzkeks. \"Habt keine Angst, ich werde Habit City rasch wieder blitzblank haben. Niemand ist besser als ich mit dem Doppelmopp.\"<br><br>Ermuntert beginnt die Kapelle zu spielen.<br><br>Es dauert nicht lange bis alles in Habit City wieder seinen normalen Lauf nimmt. Außerdem, jetzt wo der Verwirrer pulverisiert ist, sind die magischen Bienen von Mistiflying wieder eifrig am Werk und schon bald blühen die Blumen und die Stadt schwebt von Neuem.<br><br>Als die Habiticaner die magischen, flaumigen Bienen knuddeln, beginnen die Augen des April-Scherzkeks zu leuchten. \"Oho, mir kommt eine Idee! Warum haltet ihr euch eigentlich keine dieser flaumigen Bienen als Haustiere und Reittiere? Das ist ein Geschenk, welches das Gleichgewicht zwischen harter Arbeit und süßer Belohnung symbolisiert, wenn ich das mal so langweilig und sinnbildlich sagen darf.\" Er zwinkert. \"Und außerdem haben sie keinen Stachel! Narrenehrenwort.\"",
|
||||||
"questBewilderCompletionChat": "`Der Verwirrer is BESIEGT!`\n\nWir haben es geschafft! Der Verwirrer stößt einen heulenden Schrei aus, windet sich in der Luft und verliert büschelweise Federn. Langsam, nach und nach wickelt er sich zu einer funkelnden Nebelwoke auf. Die enthüllte Sonne durchdingt den Nebel, vertreibt ihn und enthüllt die hustenden, glücklicherweise menschlichen Formen von Matt, Bailey, Alex ... und dem April-Scherzkeks persönlich.\n\n`Mistiflying ist gerettet!`\n\nDer April-Scherzkeks schämt sich immerhin genug, um etwas verlegen dazustehen. \"Oh, ähm,\" sagt er. \"Vielleicht habe ich mich ein wenig ... gehen lassen.\"\n\nDie Menschenmenge murrt. Durchnässte Blumen werden auf Gehsteigen angeschwemmt. Irgendwo in der Ferne stürzt ein Dach mit spektakulärem Krachen ein.\n\n\"Ähm, ja,\" sagt der April-Scherzkeks. \"Also, was ich sagen wollte, es tut mir schrecklich leid.\" Er seufzt schwer. \"Ich vermute mal, es kann doch nicht nur Spaß und Spiel geben. Es kann wohl nicht schaden, sich ab und zu mal auf etwas zu konzentrieren. Vielleicht kann ich ja schon mal den nächsten Aprilscherz vorbereiten.\"\n\nRedphoenix räuspert sich vielsagend.\n\n\"Ich meine, den nächsten Frühjahrsputz!\" korrigiert sich der April-Scherzkeks. \"Habt keine Angst, ich werde Habit City rasch wieder blitzblank haben. Niemand ist besser als ich mit dem Doppelmopp.\"\n\nErmuntert beginnt die Kapelle zu spielen\n\nEs dauert nicht lange bis alles in Habit City wieder seinen normalen Lauf nimmt. Außerdem, jetzt wo der Verwirrer pulverisiert ist, sind die magischen Bienen von Mistiflying wieder eifrig am Werk und schon bald blühen die Blumen und schwebt die Stadt von Neuem.\n\nAls die Habiticaner die magischen, flaumigen Bienen knuddeln, beginnen die Augen des April-Scherzkeks zu leuchten. \"Oho, mir kommt eine Idee! Warum haltet ihr euch eigentlich keine dieser flaumigen Bienen als Haustiere und Reittiere? Das ist ein Geschenk, welches das Gleichgewicht zwischen harter Arbeit und süßer Belohnung symbolisiert, wenn ich das mal so langweilig und sinnbildlich sagen darf.\" Er zwinkert. \"Und außerdem haben sie keinen Stachel! Narrenehrenwort.\"",
|
"questBewilderCompletionChat": "`Der Verwirrer is BESIEGT!`\n\nWir haben es geschafft! Der Verwirrer stößt einen heulenden Schrei aus, windet sich in der Luft und verliert büschelweise Federn. Langsam, nach und nach wickelt er sich zu einer funkelnden Nebelwoke auf. Die enthüllte Sonne durchdingt den Nebel, vertreibt ihn und enthüllt die hustenden, glücklicherweise menschlichen Formen von Matt, Bailey, Alex ... und dem April-Scherzkeks persönlich.\n\n`Mistiflying ist gerettet!`\n\nDer April-Scherzkeks schämt sich immerhin genug, um etwas verlegen dazustehen. \"Oh, ähm,\" sagt er. \"Vielleicht habe ich mich ein wenig ... gehen lassen.\"\n\nDie Menschenmenge murrt. Durchnässte Blumen werden auf Gehsteigen angeschwemmt. Irgendwo in der Ferne stürzt ein Dach mit spektakulärem Krachen ein.\n\n\"Ähm, ja,\" sagt der April-Scherzkeks. \"Also, was ich sagen wollte, es tut mir schrecklich leid.\" Er seufzt schwer. \"Ich vermute mal, es kann doch nicht nur Spaß und Spiel geben. Es kann wohl nicht schaden, sich ab und zu mal auf etwas zu konzentrieren. Vielleicht kann ich ja schon mal den nächsten Aprilscherz vorbereiten.\"\n\nRedphoenix räuspert sich vielsagend.\n\n\"Ich meine, den nächsten Frühjahrsputz!\" korrigiert sich der April-Scherzkeks. \"Habt keine Angst, ich werde Habit City rasch wieder blitzblank haben. Niemand ist besser als ich mit dem Doppelmopp.\"\n\nErmuntert beginnt die Kapelle zu spielen\n\nEs dauert nicht lange bis alles in Habit City wieder seinen normalen Lauf nimmt. Außerdem, jetzt wo der Verwirrer pulverisiert ist, sind die magischen Bienen von Mistiflying wieder eifrig am Werk und schon bald blühen die Blumen und schwebt die Stadt von Neuem.\n\nAls die Habiticaner die magischen, flaumigen Bienen knuddeln, beginnen die Augen des April-Scherzkeks zu leuchten. \"Oho, mir kommt eine Idee! Warum haltet ihr euch eigentlich keine dieser flaumigen Bienen als Haustiere und Reittiere? Das ist ein Geschenk, welches das Gleichgewicht zwischen harter Arbeit und süßer Belohnung symbolisiert, wenn ich das mal so langweilig und sinnbildlich sagen darf.\" Er zwinkert. \"Und außerdem haben sie keinen Stachel! Narrenehrenwort.\"",
|
||||||
"questBewilderBossRageTitle": "Betörungsschlag",
|
"questBewilderBossRageTitle": "Betörungsschlag",
|
||||||
@@ -357,7 +357,7 @@
|
|||||||
"questArmadilloDropArmadilloEgg": "Gürteltier (Ei)",
|
"questArmadilloDropArmadilloEgg": "Gürteltier (Ei)",
|
||||||
"questArmadilloUnlockText": "Schaltet den Kauf von Gürteltiereiern auf dem Marktplatz frei",
|
"questArmadilloUnlockText": "Schaltet den Kauf von Gürteltiereiern auf dem Marktplatz frei",
|
||||||
"questCowText": "Die Muhtanten-Kuh",
|
"questCowText": "Die Muhtanten-Kuh",
|
||||||
"questCowNotes": "Es war ein langer, heißer Tag auf der Übungs-Farm, und Du würdest nichts lieber tun als einen großen Schluck Wasser zu trinken und etwas zu schlafen. Während Du vor Dich hinträumst, schreit @Soloana plötzlich: \"Lauft! Die Siegerkuh ist muhtiert!\"<br><br>@eevachu schluckt. \"Unsere schlechten Angewohnheiten müssen sie infiziert haben.\"<br><br>\"Schnell!\", meint @Feralem Tau. \"Lasst uns etwas unternehmen, bevor die anderen Kühe ebenfalls muhtieren.\"<br><br>Du hast genug gehört. Keine Tagträumereien mehr -- Es ist Zeit die schlechten Angewohnheiten unter Kontrolle zu bringen!",
|
"questCowNotes": "Es war ein langer, heißer Tag auf der Übungs-Farm, und Du würdest nichts lieber tun als einen großen Schluck Wasser zu trinken und etwas zu schlafen. Während Du vor Dich hinträumst, schreit @Soloana plötzlich: \"Lauft! Die Siegerkuh ist muhtiert!\"<br><br>@eevachu schluckt. \"Unsere schlechten Angewohnheiten müssen sie infiziert haben.\"<br><br>\"Schnell!\", meint @Feralem Tau. \"Lasst uns etwas unternehmen, bevor die anderen Kühe ebenfalls muhtieren.\"<br><br>Du hast genug gehört. Keine Tagträumereien mehr—Es ist Zeit die schlechten Angewohnheiten unter Kontrolle zu bringen!",
|
||||||
"questCowCompletion": "Du pflegst Deine guten Gewohnheiten solange, bis die Kuh wieder ihre ursprüngliche Gestalt annimmt. Die Kuh sieht Dich mit ihren schönen, braunen Augen an und schubst drei Eier zu Dir herüber.<br><br>@fuzzytrees lacht und überreicht Dir die Eier: \"Vielleicht sind die Babykühe darin immernoch muhtiert. Aber ich vertraue darauf, dass Du Deine guten Gewohnheiten beibehältst, wenn Du sie großziehst!\"",
|
"questCowCompletion": "Du pflegst Deine guten Gewohnheiten solange, bis die Kuh wieder ihre ursprüngliche Gestalt annimmt. Die Kuh sieht Dich mit ihren schönen, braunen Augen an und schubst drei Eier zu Dir herüber.<br><br>@fuzzytrees lacht und überreicht Dir die Eier: \"Vielleicht sind die Babykühe darin immernoch muhtiert. Aber ich vertraue darauf, dass Du Deine guten Gewohnheiten beibehältst, wenn Du sie großziehst!\"",
|
||||||
"questCowBoss": "Muhtanten-Kuh",
|
"questCowBoss": "Muhtanten-Kuh",
|
||||||
"questCowDropCowEgg": "Kuh (Ei)",
|
"questCowDropCowEgg": "Kuh (Ei)",
|
||||||
@@ -387,7 +387,7 @@
|
|||||||
"questTaskwoodsTerror2CollectDryads": "Dryaden",
|
"questTaskwoodsTerror2CollectDryads": "Dryaden",
|
||||||
"questTaskwoodsTerror2DropArmor": "Roben des Feuerkundlers (Rüstung)",
|
"questTaskwoodsTerror2DropArmor": "Roben des Feuerkundlers (Rüstung)",
|
||||||
"questTaskwoodsTerror3Text": "Schrecken in den Aufgabenwäldern, Teil 3: Jacko aus der Laterne",
|
"questTaskwoodsTerror3Text": "Schrecken in den Aufgabenwäldern, Teil 3: Jacko aus der Laterne",
|
||||||
"questTaskwoodsTerror3Notes": "Bereit zum Kampf, marschiert Deine Gruppe in das Herz des Waldes, dort wo der abtrünnige Geist versucht einen uralten Apfelbaum zu zerstören, der von ertragreichen Beerenbüschen umgeben ist. Sein Kürbis-ähnlicher Schädel verströmt ein schreckliches Licht, wohin auch immer es sich dreht, und in seiner linken Hand hält er einen langen Stab, an dessen Spitze eine Laterne herabhängt. Statt Feuers oder Flammen, enthält die Laterne jedoch einen dunklen Kristall, der Dich bis auf die Knochen frösteln lässt.<br><br>Der Fröhliche Reaper führt eine Knochenhand zum Mund. \"Das – das ist Jacko, der Laternengeist! Aber er ist ein hilfreicher Erntegeist, der unsere Bauern anführt. Was könnte mit der armen Seele geschehen sein, dass sie so etwas anrichtet?\"<br><br>\"Ich habe keine Ahnung\", sagt @bridgetteempress. \"Aber es hat den Anschein, als würde die 'arme Seele' uns gleich angreifen!\"",
|
"questTaskwoodsTerror3Notes": "Bereit zum Kampf, marschiert Deine Gruppe in das Herz des Waldes, dort wo der abtrünnige Geist versucht einen uralten Apfelbaum zu zerstören, der von ertragreichen Beerenbüschen umgeben ist. Sein Kürbis-ähnlicher Schädel verströmt ein schreckliches Licht, wohin auch immer es sich dreht, und in seiner linken Hand hält er einen langen Stab, an dessen Spitze eine Laterne herabhängt. Statt Feuers oder Flammen, enthält die Laterne jedoch einen dunklen Kristall, der Dich bis auf die Knochen frösteln lässt.<br><br>Der Fröhliche Reaper führt eine Knochenhand zum Mund. \"Das—das ist Jacko, der Laternengeist! Aber er ist ein hilfreicher Erntegeist, der unsere Bauern anführt. Was könnte mit der armen Seele geschehen sein, dass sie so etwas anrichtet?\"<br><br>\"Ich habe keine Ahnung\", sagt @bridgetteempress. \"Aber es hat den Anschein, als würde die 'arme Seele' uns gleich angreifen!\"",
|
||||||
"questTaskwoodsTerror3Completion": "Nach einem langen Kampf schaffst Du es schließlich mit einen wohl-gezielten Schuss die Laterne, die Jacko mit sich führt, zu treffen, und der Kristall darin zerbirst. Jackos Sinne kehren plötzlich zurück, und er bricht in glühende Tränen aus. \"Oh, mein schöner Wald! Was habe ich bloß getan!?\" wimmert er. Seine Tränen löschen die übriggebliebenen Flammen, und der Apfelbaum und die wilden Beeren sind gerettet.<br><br>Nachdem Du ihm geholfen hast sich zu beruhigen, erklärt er: \"Ich traf diese charmante Dame namens Tzina, und sie hat mir diesen glühenden Kristall als Geschenk überreicht. Auf ihr Drängen hin, habe ich ihn in meine Laterne gestellt... aber das ist das Letzte, an das ich mich erinnern kann.\" Er dreht sich mit einem goldenen Lächeln zu Dir. \"Vielleicht solltest Du sie für eine Weile an Dich nehmen, um sie sicher zu verwahren, solange ich dabei helfe die wilden Obstplantagen wieder wachsen zu lassen.\"",
|
"questTaskwoodsTerror3Completion": "Nach einem langen Kampf schaffst Du es schließlich mit einen wohl-gezielten Schuss die Laterne, die Jacko mit sich führt, zu treffen, und der Kristall darin zerbirst. Jackos Sinne kehren plötzlich zurück, und er bricht in glühende Tränen aus. \"Oh, mein schöner Wald! Was habe ich bloß getan!?\" wimmert er. Seine Tränen löschen die übriggebliebenen Flammen, und der Apfelbaum und die wilden Beeren sind gerettet.<br><br>Nachdem Du ihm geholfen hast sich zu beruhigen, erklärt er: \"Ich traf diese charmante Dame namens Tzina, und sie hat mir diesen glühenden Kristall als Geschenk überreicht. Auf ihr Drängen hin, habe ich ihn in meine Laterne gestellt... aber das ist das Letzte, an das ich mich erinnern kann.\" Er dreht sich mit einem goldenen Lächeln zu Dir. \"Vielleicht solltest Du sie für eine Weile an Dich nehmen, um sie sicher zu verwahren, solange ich dabei helfe die wilden Obstplantagen wieder wachsen zu lassen.\"",
|
||||||
"questTaskwoodsTerror3Boss": "Jacko aus der Laterne",
|
"questTaskwoodsTerror3Boss": "Jacko aus der Laterne",
|
||||||
"questTaskwoodsTerror3DropStrawberry": "Erdbeere (Futter)",
|
"questTaskwoodsTerror3DropStrawberry": "Erdbeere (Futter)",
|
||||||
@@ -425,14 +425,14 @@
|
|||||||
"questSlothDropSlothEgg": "Faultier (Ei)",
|
"questSlothDropSlothEgg": "Faultier (Ei)",
|
||||||
"questSlothUnlockText": "Schaltet den Kauf von Faultiereiern auf dem Marktplatz frei",
|
"questSlothUnlockText": "Schaltet den Kauf von Faultiereiern auf dem Marktplatz frei",
|
||||||
"questTriceratopsText": "Der Trampelnde Triceratops",
|
"questTriceratopsText": "Der Trampelnde Triceratops",
|
||||||
"questTriceratopsNotes": "Auf den schneebedeckten Stoïstillen Vulkanen herrscht stets ein reger Trubel von Wanderern und Besichtigenden. Eine Touristin, @plumilla, ruft ein Grüppchen von Leuten herbei. \"Schaut! Ich habe den Boden leuchtend gezaubert, damit wir ein Outdoor-Spielfeld für unsere Tagesaufgaben draußen haben!\" Tatsächlich wirbeln glühend rote Muster auf dem Boden umher. Sogar ein paar der prähistorischen Haustiere kommen zum Spielen herüber.<br><br>Plötzlich hört man ein lautes Knacken – ein neugieriger Triceratops ist auf @plumillas Zauberstab getreten! Er wird von einem Ausbruch magischer Energie umhüllt, und der Boden beginnt zu beben und heiß zu werden. Rot glühen die Augen des Triceratops, unter lautem Brüllen fängt er an wild umherzutrampeln!<br><br>\"Das ist nicht gut\", ruft @McCoyly in die Ferne zeigend. Jeder magisch verstärkte Stampfer lässt die Vulkane mehr ausbrechen, und der glühende Boden unter seinen Saurierfüßen wird zu Lava! Schnell, Du musst den Trampelnden Triceratops aufhalten, bis jemand den Zauberspruch rückgängig macht!",
|
"questTriceratopsNotes": "Auf den schneebedeckten Stoïstillen Vulkanen herrscht stets ein reger Trubel von Wanderern und Besichtigenden. Eine Touristin, @plumilla, ruft ein Grüppchen von Leuten herbei. \"Schaut! Ich habe den Boden leuchtend gezaubert, damit wir ein Outdoor-Spielfeld für unsere Tagesaufgaben draußen haben!\" Tatsächlich wirbeln glühend rote Muster auf dem Boden umher. Sogar ein paar der prähistorischen Haustiere kommen zum Spielen herüber.<br><br>Plötzlich hört man ein lautes Knacken—ein neugieriger Triceratops ist auf @plumillas Zauberstab getreten! Er wird von einem Ausbruch magischer Energie umhüllt, und der Boden beginnt zu beben und heiß zu werden. Rot glühen die Augen des Triceratops, unter lautem Brüllen fängt er an wild umherzutrampeln!<br><br>\"Das ist nicht gut\", ruft @McCoyly in die Ferne zeigend. Jeder magisch verstärkte Stampfer lässt die Vulkane mehr ausbrechen, und der glühende Boden unter seinen Saurierfüßen wird zu Lava! Schnell, Du musst den Trampelnden Triceratops aufhalten, bis jemand den Zauberspruch rückgängig macht!",
|
||||||
"questTriceratopsCompletion": "Geistesgegenwärtig treibst du die Kreatur in Richtung der beruhigenden Stoïstillen Steppen, so dass @*~Seraphina~* und @PainterProphet ungestört den Lavaspruch rückgängig machen können. Die besänftigende Aura der Steppen fängt an zu wirken und der Triceratops rollt sich ein, die Vulkane werden wieder inaktiv. @PainterProphet reicht Dir ein paar Eier, die vor der Lava gerettet wurden. \"Wir hätten ohne Dich nicht die Konzentration gefunden, um die Ausbrüche zu stoppen. Gib diesen Haustieren ein gutes Zuhause.\"",
|
"questTriceratopsCompletion": "Geistesgegenwärtig treibst du die Kreatur in Richtung der beruhigenden Stoïstillen Steppen, so dass @*~Seraphina~* und @PainterProphet ungestört den Lavaspruch rückgängig machen können. Die besänftigende Aura der Steppen fängt an zu wirken und der Triceratops rollt sich ein, die Vulkane werden wieder inaktiv. @PainterProphet reicht Dir ein paar Eier, die vor der Lava gerettet wurden. \"Wir hätten ohne Dich nicht die Konzentration gefunden, um die Ausbrüche zu stoppen. Gib diesen Haustieren ein gutes Zuhause.\"",
|
||||||
"questTriceratopsBoss": "Trampelnder Triceratops",
|
"questTriceratopsBoss": "Trampelnder Triceratops",
|
||||||
"questTriceratopsDropTriceratopsEgg": "Triceratops (Ei)",
|
"questTriceratopsDropTriceratopsEgg": "Triceratops (Ei)",
|
||||||
"questTriceratopsUnlockText": "Schaltet den Kauf von Triceratopseiern auf dem Marktplatz frei",
|
"questTriceratopsUnlockText": "Schaltet den Kauf von Triceratopseiern auf dem Marktplatz frei",
|
||||||
"questGroupStoikalmCalamity": "Stoïstilles Unglück",
|
"questGroupStoikalmCalamity": "Stoïstilles Unglück",
|
||||||
"questStoikalmCalamity1Text": "Stoïstilles Unglück, Teil 1: Erdgegner",
|
"questStoikalmCalamity1Text": "Stoïstilles Unglück, Teil 1: Erdgegner",
|
||||||
"questStoikalmCalamity1Notes": "Ein knappes Schreiben von @Kiwibot trifft ein; nicht nur ist die frostbedeckte Schriftrolle eiskalt, sondern sie lässt Dir auch kalte Schauer den Rücken runterlaufen. \"Bin in Stoïstillen Steppen – Monster platzen aus Boden – brauche Hilfe!\" Du versammelst Deine Party und reitest gen Norden, doch gerade, als Ihr Euch den Berg hinabbewegt, explodiert der Schnee unter Euren Füßen und grausig grinsende Schädel umzingeln Euch! <br><br>Plötzlich fliegt ein Speer an Euch vorbei und gräbt sich in einen Schädel, der Dich, sich durch den Schnee buddelnd, unbemerkt angreifen wollte. Eine große Frau in fein geschmiedeter Rüstung galoppiert auf dem Rücken eines Mastodons in die Schlacht und zieht mit wehendem Zopf rabiat den Speer wieder aus dem zerquetschten Biest. Zeit, die Feinde mit der Hilfe von Lady Glaciate, der Anführerin der Mammutreiter, zu bekämpfen!",
|
"questStoikalmCalamity1Notes": "Ein knappes Schreiben von @Kiwibot trifft ein; nicht nur ist die frostbedeckte Schriftrolle eiskalt, sondern sie lässt Dir auch kalte Schauer den Rücken runterlaufen. \"Bin in Stoïstillen Steppen—Monster platzen aus Boden—brauche Hilfe!\" Du versammelst Deine Party und reitest gen Norden, doch gerade, als Ihr Euch den Berg hinabbewegt, explodiert der Schnee unter Euren Füßen und grausig grinsende Schädel umzingeln Euch! <br><br>Plötzlich fliegt ein Speer an Euch vorbei und gräbt sich in einen Schädel, der Dich, sich durch den Schnee buddelnd, unbemerkt angreifen wollte. Eine große Frau in fein geschmiedeter Rüstung galoppiert auf dem Rücken eines Mastodons in die Schlacht und zieht mit wehendem Zopf rabiat den Speer wieder aus dem zerquetschten Biest. Zeit, die Feinde mit der Hilfe von Lady Glaciate, der Anführerin der Mammutreiter, zu bekämpfen!",
|
||||||
"questStoikalmCalamity1Completion": "Als Du den letzten Schädeln den Gnadenstoß versetzt, lösen sie sich in einen Hauch Magie auf. \"Der verflixte Schwarm mag zwar verschwunden sein\", sagt Lady Glaciate, \"aber wir haben größere Probleme. Folge mir.\" Sie wirft Dir zum Schutz vor der eisigen Luft einen Mantel zu und Du reitest ihr nach.",
|
"questStoikalmCalamity1Completion": "Als Du den letzten Schädeln den Gnadenstoß versetzt, lösen sie sich in einen Hauch Magie auf. \"Der verflixte Schwarm mag zwar verschwunden sein\", sagt Lady Glaciate, \"aber wir haben größere Probleme. Folge mir.\" Sie wirft Dir zum Schutz vor der eisigen Luft einen Mantel zu und Du reitest ihr nach.",
|
||||||
"questStoikalmCalamity1Boss": "Erdschädelschwarm",
|
"questStoikalmCalamity1Boss": "Erdschädelschwarm",
|
||||||
"questStoikalmCalamity1RageTitle": "Schwarmnachwuchs",
|
"questStoikalmCalamity1RageTitle": "Schwarmnachwuchs",
|
||||||
@@ -442,7 +442,7 @@
|
|||||||
"questStoikalmCalamity1DropDesertPotion": "Wüstenfarbenes Schlüpfelixier",
|
"questStoikalmCalamity1DropDesertPotion": "Wüstenfarbenes Schlüpfelixier",
|
||||||
"questStoikalmCalamity1DropArmor": "Mammutreiter-Rüstung",
|
"questStoikalmCalamity1DropArmor": "Mammutreiter-Rüstung",
|
||||||
"questStoikalmCalamity2Text": "Stoïstilles Unglück, Teil 2: Such' die Eiszapfenhöhlen",
|
"questStoikalmCalamity2Text": "Stoïstilles Unglück, Teil 2: Such' die Eiszapfenhöhlen",
|
||||||
"questStoikalmCalamity2Notes": "Die imposante Halle der Mammutrreiter ist ein asketisches Meiserwerk der Architektur, allerdings ist sie auch absolut leer. Es ist keine Ausstattung vorhanden, die Waffen fehlen und sogar in Säulen wurden ihrer Verzierungen beraubt. \"Die Totenschädel haben diese Halle leergeräumt,\" sagt Lady Glaciate; in ihrer Stimme tobt ein Wirbelsturm. \"Das ist erniedrigend. Kein Wort hiervon an den prilnarren, oder ich bekomme das ewig vorgehalten.\"<br><br>\"Wie misteriös!\", sagt @Beffymaroo. \"Doch wohin sind sie–\"<br><br>\"Die Eiszapfendrachenhöhle.\" Lady Glaciate deutet auf glänzende Münzen, die draußen im Schnee verstreut liegen. \"Schlampig.\"<br>\"Aber sind Eiszapfendrachen nicht ehrenhafte Wesen mit ihrem eigenen Schatzhort?\", fragt @Beffymaroon. \"Warum würden sie jemals--\"<br>\"Gedankenkontrolle\", sagt Lady Glaciate völlig unbeeindruckt. \"Oder etwas, dass genauso melodramatisch und lästig ist.\" Sie beginnt aus der Halle zu schreiteb. \"Was stehst Du da so rum?\"<br><br>Schnell, folge der Spur aus Eiszapfenmünzen!",
|
"questStoikalmCalamity2Notes": "Die imposante Halle der Mammutrreiter ist ein asketisches Meiserwerk der Architektur, allerdings ist sie auch absolut leer. Es ist keine Ausstattung vorhanden, die Waffen fehlen und sogar in Säulen wurden ihrer Verzierungen beraubt. \"Die Totenschädel haben diese Halle leergeräumt,\" sagt Lady Glaciate; in ihrer Stimme tobt ein Wirbelsturm. \"Das ist erniedrigend. Kein Wort hiervon an den prilnarren, oder ich bekomme das ewig vorgehalten.\"<br><br>\"Wie misteriös!\", sagt @Beffymaroo. \"Doch wohin sind sie—\"<br><br>\"Die Eiszapfendrachenhöhle.\" Lady Glaciate deutet auf glänzende Münzen, die draußen im Schnee verstreut liegen. \"Schlampig.\"<br>\"Aber sind Eiszapfendrachen nicht ehrenhafte Wesen mit ihrem eigenen Schatzhort?\", fragt @Beffymaroon. \"Warum würden sie jemals—\"<br>\"Gedankenkontrolle\", sagt Lady Glaciate völlig unbeeindruckt. \"Oder etwas, dass genauso melodramatisch und lästig ist.\" Sie beginnt aus der Halle zu schreiteb. \"Was stehst Du da so rum?\"<br><br>Schnell, folge der Spur aus Eiszapfenmünzen!",
|
||||||
"questStoikalmCalamity2Completion": "Die Eiszapfenmünzen führen Dich geradewegs zum vergrabenen Eingang einer geschickt versteckten Höhle. Obwohl das Wetter draußen ruhig und friedlich ist und das Sonnenlicht über den Schneeweiten glitzert, ertönt von drinnen ein Heulen wie ein wilder Wintersturm. Lady Glaciate verzieht das Gesicht und reicht Dir einen Mammutreiter-Helm. \"Zieh' das an\", sagt sie. \"Du wirst es brauchen.\"",
|
"questStoikalmCalamity2Completion": "Die Eiszapfenmünzen führen Dich geradewegs zum vergrabenen Eingang einer geschickt versteckten Höhle. Obwohl das Wetter draußen ruhig und friedlich ist und das Sonnenlicht über den Schneeweiten glitzert, ertönt von drinnen ein Heulen wie ein wilder Wintersturm. Lady Glaciate verzieht das Gesicht und reicht Dir einen Mammutreiter-Helm. \"Zieh' das an\", sagt sie. \"Du wirst es brauchen.\"",
|
||||||
"questStoikalmCalamity2CollectIcicleCoins": "Eiszapfenmünzen",
|
"questStoikalmCalamity2CollectIcicleCoins": "Eiszapfenmünzen",
|
||||||
"questStoikalmCalamity2DropHeadgear": "Mammutreiter-Helm (Kopfbedeckung)",
|
"questStoikalmCalamity2DropHeadgear": "Mammutreiter-Helm (Kopfbedeckung)",
|
||||||
@@ -454,19 +454,19 @@
|
|||||||
"questStoikalmCalamity3DropShield": "Mammutreiter-Horn (Schildhand-Gegenstand)",
|
"questStoikalmCalamity3DropShield": "Mammutreiter-Horn (Schildhand-Gegenstand)",
|
||||||
"questStoikalmCalamity3DropWeapon": "Mammutreiter-Speer (Waffe)",
|
"questStoikalmCalamity3DropWeapon": "Mammutreiter-Speer (Waffe)",
|
||||||
"questGuineaPigText": "Die Meerschweinchengang",
|
"questGuineaPigText": "Die Meerschweinchengang",
|
||||||
"questGuineaPigNotes": "Du bummelst lässig durch den berühmten Markt in Habit City, als @Pandah Dich heranwinkt. \"Hey, zieh' Dir das hier rein!\" Ein beige-braunes Ei wird Dir vorgehalten, das Du nicht kennst. <br><br>Alexander der Händler runzelt die Stirn. \"Ich erinnere mich nicht, das ausgestellt zu haben, ich frage mich, woher–\" Ein kleines Pfötchen hält ihn vom Weitersprechen ab. <br><br>\"Gib 'meer' Dein ganzes Gold her, Händler!\" quiekt eine winzige, von Bosheit erfüllte Stimme. <br><br>\"Oh nein, das Ei war eine Ablenkung!\" ruft @mewrose! \"Es ist die gierige, marodierende Meerschweinchengang! Sie erledigen nie ihre Tagesaufgaben und stehlen daher Gold, um Heiltränke zu kaufen.\" <br><br>\"Den Markt plündern?\", sagt @emmavig. \"Nicht, während wir hier wachen!\" Ohne auf eine Einladung zu warten springst du Alexander zur Seite.",
|
"questGuineaPigNotes": "Du bummelst lässig durch den berühmten Markt in Habit City, als @Pandah Dich heranwinkt. \"Hey, zieh' Dir das hier rein!\" Ein beige-braunes Ei wird Dir vorgehalten, das Du nicht kennst. <br><br>Alexander der Händler runzelt die Stirn. \"Ich erinnere mich nicht, das ausgestellt zu haben, ich frage mich, woher—\" Ein kleines Pfötchen hält ihn vom Weitersprechen ab. <br><br>\"Gib 'meer' Dein ganzes Gold her, Händler!\" quiekt eine winzige, von Bosheit erfüllte Stimme. <br><br>\"Oh nein, das Ei war eine Ablenkung!\" ruft @mewrose! \"Es ist die gierige, marodierende Meerschweinchengang! Sie erledigen nie ihre Tagesaufgaben und stehlen daher Gold, um Heiltränke zu kaufen.\" <br><br>\"Den Markt plündern?\", sagt @emmavig. \"Nicht, während wir hier wachen!\" Ohne auf eine Einladung zu warten springst du Alexander zur Seite.",
|
||||||
"questGuineaPigCompletion": "\"Wir ergeben uns!\" Der Meerschweinchenbanden-Boss winkt Dir mit seinen Pfötchen, sein wuscheliger Kopf hängt in Schande herab. Aus seinem Hut fällt eine Liste herunter, die @snazzyorange schnurstracks als Beweis beschlagnahmt. \"Warte mal kurz\", sagst Du. \"Kein Wunder, dass Ihr Schaden nehmt! Ihr habt viel zu viele Tagesaufgaben. Ihr braucht keine Heiltränke – Ihr braucht einfach Hilfe beim Organisieren.\" <br><br>\"Wirklich?\" piept der Meerschweinchenbanden-Boss. \"Wir haben so viele Leute deswegen ausgeraubt! Bitte nehmt unsere Eier als Entschuldigung für unser unehrliches Verhalten.\"",
|
"questGuineaPigCompletion": "\"Wir ergeben uns!\" Der Meerschweinchenbanden-Boss winkt Dir mit seinen Pfötchen, sein wuscheliger Kopf hängt in Schande herab. Aus seinem Hut fällt eine Liste herunter, die @snazzyorange schnurstracks als Beweis beschlagnahmt. \"Warte mal kurz\", sagst Du. \"Kein Wunder, dass Ihr Schaden nehmt! Ihr habt viel zu viele Tagesaufgaben. Ihr braucht keine Heiltränke—Ihr braucht einfach Hilfe beim Organisieren.\" <br><br>\"Wirklich?\" piept der Meerschweinchenbanden-Boss. \"Wir haben so viele Leute deswegen ausgeraubt! Bitte nehmt unsere Eier als Entschuldigung für unser unehrliches Verhalten.\"",
|
||||||
"questGuineaPigBoss": "Meerschweinchengang",
|
"questGuineaPigBoss": "Meerschweinchengang",
|
||||||
"questGuineaPigDropGuineaPigEgg": "Meerschweinchenbock (Ei)",
|
"questGuineaPigDropGuineaPigEgg": "Meerschweinchenbock (Ei)",
|
||||||
"questGuineaPigUnlockText": "Schaltet den Kauf von Meerschweinchenbockeiern auf dem Marktplatz frei",
|
"questGuineaPigUnlockText": "Schaltet den Kauf von Meerschweinchenbockeiern auf dem Marktplatz frei",
|
||||||
"questPeacockText": "Der Für-und-Wider-Pfau",
|
"questPeacockText": "Der Für-und-Wider-Pfau",
|
||||||
"questPeacockNotes": "Du stapfst durch den Aufgabenwald und fragst Dich, welches nächste verlockende Ziel Du Dir vornimmst. Als Du tiefer in den Wald gehst, merkst Du, dass Du nicht der einzige Unentschlossene bist: \"Ich könnte eine neue Sprache lernen, oder ins Fitnessstudio gehen…\", murmelt @Cecily Perez. \"Ich könnte mehr schlafen\", überlegt @Lilith of Alfheim, \"oder Zeit mit meinen Freunden verbringen…\" Es sieht so aus, als ob @PainterProphet, @Pfeffernusse und @Draayder von der Qual der Wahl genauso gelähmt sind. <br><br>Du merkst, dass diese vereinnahmenden Gefühle gar nicht Deine eigenen sind… Du bist dem verführerischen Für-und-Wider-Pfau mitten in die Falle getappt! Er springt aus dem Busch, bevor Du fliehen kannst. Dich mit jeweils einem Kopf in eine andere Richtung ziehend, spürst Du, wie Burnout über Dich kommt. Du kannst nicht zwei Gegner auf einmal bezwingen und hast daher nur eine Option – konzentrier' Dich auf die näheste Aufgabe um zurückzuschlagen!",
|
"questPeacockNotes": "Du stapfst durch den Aufgabenwald und fragst Dich, welches nächste verlockende Ziel Du Dir vornimmst. Als Du tiefer in den Wald gehst, merkst Du, dass Du nicht der einzige Unentschlossene bist: \"Ich könnte eine neue Sprache lernen, oder ins Fitnessstudio gehen…\", murmelt @Cecily Perez. \"Ich könnte mehr schlafen\", überlegt @Lilith of Alfheim, \"oder Zeit mit meinen Freunden verbringen…\" Es sieht so aus, als ob @PainterProphet, @Pfeffernusse und @Draayder von der Qual der Wahl genauso gelähmt sind. <br><br>Du merkst, dass diese vereinnahmenden Gefühle gar nicht Deine eigenen sind… Du bist dem verführerischen Für-und-Wider-Pfau mitten in die Falle getappt! Er springt aus dem Busch, bevor Du fliehen kannst. Dich mit jeweils einem Kopf in eine andere Richtung ziehend, spürst Du, wie Burnout über Dich kommt. Du kannst nicht zwei Gegner auf einmal bezwingen und hast daher nur eine Option—konzentrier' Dich auf die näheste Aufgabe um zurückzuschlagen!",
|
||||||
"questPeacockCompletion": "Der Für-und-Wider-Pfau ist überrascht von Deiner plötzlichen Überzeugtheit. Deine konzentrierte Zielstrebigkeit hat ihn besiegt und seine Köpfe verschmelzen wieder zu einem und enthüllen das schönste Wesen, das Du jemals gesehen hast. \"Vielen Dank\", sagt der Pfau. \"Ich habe mich selbst so lange in verschiedene Richtungen gezogen, dass ich das, was ich wirklich wollte, aus den Augen verlor. Bitte nimm' diese Eier als Zeichen meiner Dankbarkeit an.\"",
|
"questPeacockCompletion": "Der Für-und-Wider-Pfau ist überrascht von Deiner plötzlichen Überzeugtheit. Deine konzentrierte Zielstrebigkeit hat ihn besiegt und seine Köpfe verschmelzen wieder zu einem und enthüllen das schönste Wesen, das Du jemals gesehen hast. \"Vielen Dank\", sagt der Pfau. \"Ich habe mich selbst so lange in verschiedene Richtungen gezogen, dass ich das, was ich wirklich wollte, aus den Augen verlor. Bitte nimm' diese Eier als Zeichen meiner Dankbarkeit an.\"",
|
||||||
"questPeacockBoss": "Für-und-Wider-Pfau",
|
"questPeacockBoss": "Für-und-Wider-Pfau",
|
||||||
"questPeacockDropPeacockEgg": "Pfau (Ei)",
|
"questPeacockDropPeacockEgg": "Pfau (Ei)",
|
||||||
"questPeacockUnlockText": "Schaltet den Kauf von Pfaueiern auf dem Marktplatz frei",
|
"questPeacockUnlockText": "Schaltet den Kauf von Pfaueiern auf dem Marktplatz frei",
|
||||||
"questButterflyText": "Flieg' weiter, Funkenfalter",
|
"questButterflyText": "Flieg' weiter, Funkenfalter",
|
||||||
"questButterflyNotes": "Deine Gärtner-Freundin @Megan schickt Dir eine Einladung: \"Diese warmen Tage wären doch perfekt für einen Besuch des Schmetterlingsgartens in Aufgabistan. Komm, lass uns Schmetterlinge beobachten!\" Doch als Du ankommst, ist der Garten verdorrt – es ist kaum mehr als verbranntes Gras und vertrocknetes Unkraut übrig. Es war so heiß, dass die Habiticaner nicht vorbei gekommen sind, um die Blumen zu gießen, und die dunkelroten Tagesaufgaben haben alles zu einer trockenen, sonnenverglühten Brandgefahr gemacht. Es ist nur noch ein Schmetterling übrig, aber etwas ist seltsam an ihm...<br><br>\"Oh nein! Das sind perfekte Schlüpfbedingungen für den Entflammten Funkenfalter\", ruft @Leephon.<br><br>\"Wenn wir ihn nicht einfangen, wird er alles zerstören!\" keucht @Eevachu.<br><br>Es wird Zeit, dem Funkenfalter auf Wiedersehen zu sagen!",
|
"questButterflyNotes": "Deine Gärtner-Freundin @Megan schickt Dir eine Einladung: \"Diese warmen Tage wären doch perfekt für einen Besuch des Schmetterlingsgartens in Aufgabistan. Komm, lass uns Schmetterlinge beobachten!\" Doch als Du ankommst, ist der Garten verdorrt—es ist kaum mehr als verbranntes Gras und vertrocknetes Unkraut übrig. Es war so heiß, dass die Habiticaner nicht vorbei gekommen sind, um die Blumen zu gießen, und die dunkelroten Tagesaufgaben haben alles zu einer trockenen, sonnenverglühten Brandgefahr gemacht. Es ist nur noch ein Schmetterling übrig, aber etwas ist seltsam an ihm...<br><br>\"Oh nein! Das sind perfekte Schlüpfbedingungen für den Entflammten Funkenfalter\", ruft @Leephon.<br><br>\"Wenn wir ihn nicht einfangen, wird er alles zerstören!\" keucht @Eevachu.<br><br>Es wird Zeit, dem Funkenfalter auf Wiedersehen zu sagen!",
|
||||||
"questButterflyCompletion": "Nach einer lodernden Schlacht ist der Entflammte Funkenfalter gefangen. \"Tolle Leistung, diesen Möchtegern-Brandstifter einzufangen\", sagt @Megan mit einem Seufzer der Erleichterung. \"Dennoch ist es schwer, selbst den fiesesten Falter zu verunglimpfen. Wir sollten diesen Funkenfalter besser an einem sicheren Ort freilassen... zum Beispiel in der Wüste.\"<br><br>Eine der anderen Gärtnerinnen, @Beffymaroo, kommt zu euch - angesengt, aber mit einem Lächeln. \"Möchtest Du uns dabei helfen, diese verwaisten Schmetterlingspuppen großzuziehen, die wir gefunden haben? Vielleicht werden wir nächstes Jahr einen grüneren Garten für sie haben.\"",
|
"questButterflyCompletion": "Nach einer lodernden Schlacht ist der Entflammte Funkenfalter gefangen. \"Tolle Leistung, diesen Möchtegern-Brandstifter einzufangen\", sagt @Megan mit einem Seufzer der Erleichterung. \"Dennoch ist es schwer, selbst den fiesesten Falter zu verunglimpfen. Wir sollten diesen Funkenfalter besser an einem sicheren Ort freilassen... zum Beispiel in der Wüste.\"<br><br>Eine der anderen Gärtnerinnen, @Beffymaroo, kommt zu euch - angesengt, aber mit einem Lächeln. \"Möchtest Du uns dabei helfen, diese verwaisten Schmetterlingspuppen großzuziehen, die wir gefunden haben? Vielleicht werden wir nächstes Jahr einen grüneren Garten für sie haben.\"",
|
||||||
"questButterflyBoss": "Entflammter Funkenfalter",
|
"questButterflyBoss": "Entflammter Funkenfalter",
|
||||||
"questButterflyDropButterflyEgg": "Raupe (Ei)",
|
"questButterflyDropButterflyEgg": "Raupe (Ei)",
|
||||||
@@ -612,7 +612,7 @@
|
|||||||
"questSeaSerpentDropSeaSerpentEgg": "Seeschlange (Ei)",
|
"questSeaSerpentDropSeaSerpentEgg": "Seeschlange (Ei)",
|
||||||
"questSeaSerpentUnlockText": "Schaltet den Kauf von Seeschlangeneiern auf dem Marktplatz frei",
|
"questSeaSerpentUnlockText": "Schaltet den Kauf von Seeschlangeneiern auf dem Marktplatz frei",
|
||||||
"questKangarooText": "Känguru-Katastrophe",
|
"questKangarooText": "Känguru-Katastrophe",
|
||||||
"questKangarooNotes": "Vielleicht hättest Du diese letzte Aufgabe erledigen sollen.... Du weißt schon, diejenige, die Du immer meidest, auch wenn sie immer wieder auftritt? Aber @Mewrose und @LilithofAlfheim haben Dich und @stefalupagus eingeladen, um eine seltene Kängurutruppe durch die Sloensteadi Savanne hüpfen zu sehen; wie kannst Du nein sagen?! Als die Truppe in Sichtweite kommt, trifft Dich etwas mit einem mächtigen Schlag auf den <em>Hinterkopf!</em><br><br>Du siehst Sterne und schüttelst den Kopf. Dann nimmst Du das verantwortliche Objekt auf - einen dunkelroten Bumerang, mit genau der Aufgabe eingraviert, die Du immer wieder verdrängst. Ein kurzer Blick in die Runde bestätigt, dass den Rest Deiner Party ein ähnliches Schicksal ereilt hat. Ein größeres Känguru sieht Dich mit einem selbstgefälligen Grinsen an, als würde es Dich auffordern, Dich ihm und dieser gefürchteten Aufgabe ein für allemal zu stellen!",
|
"questKangarooNotes": "Vielleicht hättest Du diese letzte Aufgabe erledigen sollen.... Du weißt schon, diejenige, die Du immer meidest, auch wenn sie immer wieder auftritt? Aber @Mewrose und @LilithofAlfheim haben Dich und @stefalupagus eingeladen, um eine seltene Kängurutruppe durch die Sloensteadi Savanne hüpfen zu sehen; wie kannst Du nein sagen?! Als die Truppe in Sichtweite kommt, trifft Dich etwas mit einem mächtigen Schlag auf den <em>Hinterkopf!</em><br><br>Du siehst Sterne und schüttelst den Kopf. Dann nimmst Du das verantwortliche Objekt auf—einen dunkelroten Bumerang, mit genau der Aufgabe eingraviert, die Du immer wieder verdrängst. Ein kurzer Blick in die Runde bestätigt, dass den Rest Deiner Party ein ähnliches Schicksal ereilt hat. Ein größeres Känguru sieht Dich mit einem selbstgefälligen Grinsen an, als würde es Dich auffordern, Dich ihm und dieser gefürchteten Aufgabe ein für allemal zu stellen!",
|
||||||
"questKangarooCompletion": "“JETZT!” signalisierst Du Deiner Party, die Bumerangs zurück auf das Känguru zu werfen. Das Tier hüpft bei jedem Treffer weiter weg, bis es flieht, und hinterlässt nichts anderes als eine dunkelrote Staubwolke, ein paar Eier und einige Goldmünzen.<br><br>@Mewrose geht zu der Stelle, wo vorher das Känguru stand. “Hey, wo sind die Bumerangs hin?”<br><br>“Sie haben sich wahrscheinlich in Staub aufgelöst und diese dunkelrote Wolke gebildet, als wir unsere jeweiligen Aufgaben erledigt hatten”, spekuliert @stefalupagus.<br><br>@LilithofAlfheim kneift die Augen zu und schaut zum Horizont. “Ist das eine weitere Kängurutruppe, die uns entgegenkommt?”<br><br>Ihr brecht alle im Laufschritt auf, zurück nach Habit City. Besser, sich Deinen schwierigen Aufgaben zu stellen, als einen weiteren Schlag auf den Hinterkopf zu bekommen!",
|
"questKangarooCompletion": "“JETZT!” signalisierst Du Deiner Party, die Bumerangs zurück auf das Känguru zu werfen. Das Tier hüpft bei jedem Treffer weiter weg, bis es flieht, und hinterlässt nichts anderes als eine dunkelrote Staubwolke, ein paar Eier und einige Goldmünzen.<br><br>@Mewrose geht zu der Stelle, wo vorher das Känguru stand. “Hey, wo sind die Bumerangs hin?”<br><br>“Sie haben sich wahrscheinlich in Staub aufgelöst und diese dunkelrote Wolke gebildet, als wir unsere jeweiligen Aufgaben erledigt hatten”, spekuliert @stefalupagus.<br><br>@LilithofAlfheim kneift die Augen zu und schaut zum Horizont. “Ist das eine weitere Kängurutruppe, die uns entgegenkommt?”<br><br>Ihr brecht alle im Laufschritt auf, zurück nach Habit City. Besser, sich Deinen schwierigen Aufgaben zu stellen, als einen weiteren Schlag auf den Hinterkopf zu bekommen!",
|
||||||
"questKangarooBoss": "Katastrophales Känguru",
|
"questKangarooBoss": "Katastrophales Känguru",
|
||||||
"questKangarooDropKangarooEgg": "Känguru (Ei)",
|
"questKangarooDropKangarooEgg": "Känguru (Ei)",
|
||||||
@@ -669,7 +669,7 @@
|
|||||||
"questRobotText": "Mysteriöse Mechanische Merkwürdigkeiten!",
|
"questRobotText": "Mysteriöse Mechanische Merkwürdigkeiten!",
|
||||||
"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.",
|
"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",
|
"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!",
|
"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!\"",
|
"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!\"",
|
||||||
"questAmberText": "Der Bernstein-Bund",
|
"questAmberText": "Der Bernstein-Bund",
|
||||||
"questAmberBoss": "Trerezin",
|
"questAmberBoss": "Trerezin",
|
||||||
@@ -692,7 +692,7 @@
|
|||||||
"questWaffleNotes": "\"April-Scherzkeks!\" entrüstet sich Lady Glaciate verunsichert. \"Du sagtest, Dein Wüsten-Scherz sei 'erledigt und komplett weggeräumt'!\"<br><br>\"Nun ja, das war er und ist er immer noch, meine Liebe\", antwortet der Scherzkeks verwirrt. \"Und ich bin der ehrlichste aller Scherzkekse. Ist etwas nicht in Ordnung?\"<br><br>\"Da ist ein gigantisches, zuckriges Monster, das sich Habit City nähert!\"<br><br>\"Hmm\", sinniert der Scherzkeks. \"Ich habe auf der Suche nach mystischen Reagenzien für meinen letzten Event einige Höhlen geplündert. Vielleicht habe ich da unerwünschte Aufmerksamkeit erweckt. Ist es die Saccharose-Schlange? Die Torten-Kröte? Ein Tiramisu Rex?\"<br><br>\"Nein! Es ist eine Art… fürchterliche Waffel!\"<br><br>\"Häh. Die ist mir neu! Vielleicht entsprang die all der Umgebungs-Schabernack-Energie.\" Er wendet sich an Dich und @beffymaroo mit einem schiefen Lächeln. \"Ich nehme nicht an, ihr wärt zu einer Heldentat bereit?\"",
|
"questWaffleNotes": "\"April-Scherzkeks!\" entrüstet sich Lady Glaciate verunsichert. \"Du sagtest, Dein Wüsten-Scherz sei 'erledigt und komplett weggeräumt'!\"<br><br>\"Nun ja, das war er und ist er immer noch, meine Liebe\", antwortet der Scherzkeks verwirrt. \"Und ich bin der ehrlichste aller Scherzkekse. Ist etwas nicht in Ordnung?\"<br><br>\"Da ist ein gigantisches, zuckriges Monster, das sich Habit City nähert!\"<br><br>\"Hmm\", sinniert der Scherzkeks. \"Ich habe auf der Suche nach mystischen Reagenzien für meinen letzten Event einige Höhlen geplündert. Vielleicht habe ich da unerwünschte Aufmerksamkeit erweckt. Ist es die Saccharose-Schlange? Die Torten-Kröte? Ein Tiramisu Rex?\"<br><br>\"Nein! Es ist eine Art… fürchterliche Waffel!\"<br><br>\"Häh. Die ist mir neu! Vielleicht entsprang die all der Umgebungs-Schabernack-Energie.\" Er wendet sich an Dich und @beffymaroo mit einem schiefen Lächeln. \"Ich nehme nicht an, ihr wärt zu einer Heldentat bereit?\"",
|
||||||
"questWaffleText": "An die Waffe(l) gegen den Scherzkeks: Desaster-Frühstück!",
|
"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.",
|
"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?\"",
|
"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 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.",
|
"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",
|
"jungleBuddiesText": "\"Jungle Freunde\" Quest-Paket",
|
||||||
"questFluoriteUnlockText": "Schaltet den Kauf von Fluorit-Schlüpfelixieren auf dem Marktplatz frei",
|
"questFluoriteUnlockText": "Schaltet den Kauf von Fluorit-Schlüpfelixieren auf dem Marktplatz frei",
|
||||||
@@ -706,7 +706,7 @@
|
|||||||
"questWindupText": "Zähme die zankenden Zahnräder",
|
"questWindupText": "Zähme die zankenden Zahnräder",
|
||||||
"questWindupBoss": "Klangton",
|
"questWindupBoss": "Klangton",
|
||||||
"questWindupCompletion": "Während Du den Attacken ausweichst, fällt Dir etwas seltsames auf: ein gestreifter Messingschwanz ragt aus dem Fahrgestell des Roboters. Du greifst mit einer raschen Hand inmitten des laufenden Robotergetriebes und ziehst... ein zitterndes, aufziehbares Tiger-Junges heraus. Es schmiegt sich an deine Kleidung.<br><br>Der Uhrwerk-Roboter hört umgehend auf um sich zu schlagen und lächelt, seine Zahnräder klicken zurück an ihren Platz. \"Kä-Kä-Kätzchen! Kätzchen in meinem Getriebe!\"<br><br>\"Großartig\", sagt Großmächtig errötend. \"Ich habe hart an diesen Aufzieh-Haustier-Tränken gearbeitet. Ich habe wohl etwas die Übersicht über meine Neuerfindungen verloren. Wisst Ihr, ich habe mein tägliches \"Werkstatt aufräumen\" in letzter Zeit öfter verpasst...\"<br><br>Du folgst dem Bastler und Klangton nach drinnen. Teile, Werkzeug und Tränke bedecken jede Oberfläche. Großmächtig nimmt deine Uhr, doch gibt dir einige Tränke.<br><br>\"Hier, nimm diese. Offensichtlich werden sie bei Dir besser aufgehoben sein!\"",
|
"questWindupCompletion": "Während Du den Attacken ausweichst, fällt Dir etwas seltsames auf: ein gestreifter Messingschwanz ragt aus dem Fahrgestell des Roboters. Du greifst mit einer raschen Hand inmitten des laufenden Robotergetriebes und ziehst... ein zitterndes, aufziehbares Tiger-Junges heraus. Es schmiegt sich an deine Kleidung.<br><br>Der Uhrwerk-Roboter hört umgehend auf um sich zu schlagen und lächelt, seine Zahnräder klicken zurück an ihren Platz. \"Kä-Kä-Kätzchen! Kätzchen in meinem Getriebe!\"<br><br>\"Großartig\", sagt Großmächtig errötend. \"Ich habe hart an diesen Aufzieh-Haustier-Tränken gearbeitet. Ich habe wohl etwas die Übersicht über meine Neuerfindungen verloren. Wisst Ihr, ich habe mein tägliches \"Werkstatt aufräumen\" in letzter Zeit öfter verpasst...\"<br><br>Du folgst dem Bastler und Klangton nach drinnen. Teile, Werkzeug und Tränke bedecken jede Oberfläche. Großmächtig nimmt deine Uhr, doch gibt dir einige Tränke.<br><br>\"Hier, nimm diese. Offensichtlich werden sie bei Dir besser aufgehoben sein!\"",
|
||||||
"questWindupNotes": "*Habit City* ist selten ruhig, doch auf diese missgestimmte Katzenmusik warst Du nicht vorbereitet: Eine Kakophonie aus Knarzen, Quietschen und Kreischen, drang aus dem Laden *Good Timekeeping*, Habiticas bestem Uhrmacher. Du seufzt--Du wolltest doch nur Deine Uhr reparieren lassen. \"Great and Powerful\", oder \"Der Großmächtige\", wie der Uhrmacher genannt wird, kommt Dir bereits entgegen gestolpert, direkt gefolgt von einem klirrenden Kupfergiganten. <br><br> \"Ki-! Ki-! Ki!\" klingelt er, die Arme umher werfend. Sein Getriebe malt und quietscht unter Protest.<br><br>\"Mein Roboter \"Klangton\" ist verrückt geworden! Er will mich umbringen!\" kreischt der angeblich mächtige Uhrmacher.<br><br>Sogar mit einer kaputten Uhr weißt Du wann die Zeit reif ist, zu kämpfen. Du stürzt voran, um den panischen Uhrmacher zu beschützen. @Vikte und @a_diamond kommen ebenfalls zu Hilfe!<br><br>\"Ki-! Ki-! Ki!\", singt Klangton bei jedem Schlag. \"Miau!\"<br><br>Moment mal, war das ein mechanisches Miauen inmitten der mörderischen Monotonie?",
|
"questWindupNotes": "*Habit City* ist selten ruhig, doch auf diese missgestimmte Katzenmusik warst Du nicht vorbereitet: Eine Kakophonie aus Knarzen, Quietschen und Kreischen, drang aus dem Laden *Good Timekeeping*, Habiticas bestem Uhrmacher. Du seufzt—Du wolltest doch nur Deine Uhr reparieren lassen. \"Great and Powerful\", oder \"Der Großmächtige\", wie der Uhrmacher genannt wird, kommt Dir bereits entgegen gestolpert, direkt gefolgt von einem klirrenden Kupfergiganten. <br><br> \"Ki-! Ki-! Ki!\" klingelt er, die Arme umher werfend. Sein Getriebe malt und quietscht unter Protest.<br><br>\"Mein Roboter \"Klangton\" ist verrückt geworden! Er will mich umbringen!\" kreischt der angeblich mächtige Uhrmacher.<br><br>Sogar mit einer kaputten Uhr weißt Du wann die Zeit reif ist, zu kämpfen. Du stürzt voran, um den panischen Uhrmacher zu beschützen. @Vikte und @a_diamond kommen ebenfalls zu Hilfe!<br><br>\"Ki-! Ki-! Ki!\", singt Klangton bei jedem Schlag. \"Miau!\"<br><br>Moment mal, war das ein mechanisches Miauen inmitten der mörderischen Monotonie?",
|
||||||
"questTurquoiseText": "Türkisgrüne Schatzsuchtortur",
|
"questTurquoiseText": "Türkisgrüne Schatzsuchtortur",
|
||||||
"questTurquoiseUnlockText": "Schaltet den Kauf von Türkisen Schlüpfelixieren auf dem Marktplatz frei",
|
"questTurquoiseUnlockText": "Schaltet den Kauf von Türkisen Schlüpfelixieren auf dem Marktplatz frei",
|
||||||
"questTurquoiseDropTurquoisePotion": "Türkises Schlüpfelixier",
|
"questTurquoiseDropTurquoisePotion": "Türkises Schlüpfelixier",
|
||||||
|
|||||||
@@ -271,5 +271,7 @@
|
|||||||
"privacyOverview": "Heutzutage scheint jedes Unternehmen von deinen Daten profitieren zu wollen. Das kann es schwierig machen, die richtige App zur Verbesserung deiner Gewohnheiten zu finden. Habitica verwendet Cookies, die Daten nur zur Leistungsanalyse, zur Bearbeitung von Supportanfragen und zur Bereitstellung des bestmöglichen gamifizierten Erlebnisses speichern. Du kannst dies jederzeit in deinen Kontoeinstellungen ändern.",
|
"privacyOverview": "Heutzutage scheint jedes Unternehmen von deinen Daten profitieren zu wollen. Das kann es schwierig machen, die richtige App zur Verbesserung deiner Gewohnheiten zu finden. Habitica verwendet Cookies, die Daten nur zur Leistungsanalyse, zur Bearbeitung von Supportanfragen und zur Bereitstellung des bestmöglichen gamifizierten Erlebnisses speichern. Du kannst dies jederzeit in deinen Kontoeinstellungen ändern.",
|
||||||
"privacySettingsOverview": "Habitica verwendet Cookies zur Leistungsanalyse, Bearbeitung von Supportanfragen und Bereitstellung des bestmöglichen gamifizierten Erlebnisses. Hierfür benötigen wir die folgenden Berechtigungen. Du kannst dies jederzeit in deinen Kontoeinstellungen ändern.",
|
"privacySettingsOverview": "Habitica verwendet Cookies zur Leistungsanalyse, Bearbeitung von Supportanfragen und Bereitstellung des bestmöglichen gamifizierten Erlebnisses. Hierfür benötigen wir die folgenden Berechtigungen. Du kannst dies jederzeit in deinen Kontoeinstellungen ändern.",
|
||||||
"performanceAnalytics": "Leistung und Analyse",
|
"performanceAnalytics": "Leistung und Analyse",
|
||||||
"usedForSupport": "Diese werden verwendet, um Benutzererfahrung, Leistung und Dienste unserer Websites und Apps zu verbessern. Diese Daten werden von unserem Support-Team für die Bearbeitung von Anfragen und Fehlermeldungen verwendet."
|
"usedForSupport": "Diese werden verwendet, um Benutzererfahrung, Leistung und Dienste unserer Websites und Apps zu verbessern. Diese Daten werden von unserem Support-Team für die Bearbeitung von Anfragen und Fehlermeldungen verwendet.",
|
||||||
|
"gpcWarning": "<a href='<%= url %>' target='_blank'>GPC</a> ist aktiv. Wenn du unten Tracking aktivierst, überschreibt es dies und sendet Daten an unsere Analytics Partner.",
|
||||||
|
"gpcPlusAnalytics": "<a href='<%= url %>' target='_blank'>GPC</a> ist aktiv. Du hast Tracking und dem Senden von Daten an unsere Analytics Partner zugestimmt."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -269,5 +269,10 @@
|
|||||||
"mysterySet202508": "Strahlendes Klingen Set",
|
"mysterySet202508": "Strahlendes Klingen Set",
|
||||||
"mysterySet202510": "Gleitender Ghul Set",
|
"mysterySet202510": "Gleitender Ghul Set",
|
||||||
"mysterySet202511": "Frost Krieger Set",
|
"mysterySet202511": "Frost Krieger Set",
|
||||||
"mysterySet202509": "Windgepeitschter Wanderer Set"
|
"mysterySet202509": "Windgepeitschter Wanderer Set",
|
||||||
|
"mysterySet202512": "Plätzchen-Meister Set",
|
||||||
|
"mysterySet202601": "Winter-Ägide set",
|
||||||
|
"subscriptionBillingFYI": "Abos verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Du kannst dein Abo in den Einstellungen unter „Abonnement“ verwalten. Die Abbuchung von deinem Konto erfolgt innerhalb von 24 Stunden nach dem Verlängerungsdatum zum gleichen Preis wie bei der ersten Abbuchung.",
|
||||||
|
"subscriptionBillingFYIShort": "Abos verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Die Abbuchung von deinem Konto erfolgt innerhalb von 24 Stunden nach dem Verlängerungsdatum zum gleichen Preis wie bei der ersten Abbuchung.",
|
||||||
|
"mysterySet202602": "Sakura Fuchs Set"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1051,6 +1051,18 @@
|
|||||||
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
|
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
|
||||||
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners.",
|
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners.",
|
||||||
|
|
||||||
|
"backgrounds122025": "SET 139: Released December 2025",
|
||||||
|
"backgroundNighttimeStreetWithShopsText": "Nighttime Street with Shops",
|
||||||
|
"backgroundNighttimeStreetWithShopsNotes": "Enjoy the warm glow of a Nighttime Street with Shops.",
|
||||||
|
|
||||||
|
"backgrounds012026": "SET 140: Released January 2026",
|
||||||
|
"backgroundWinterDesertWithSaguarosText": "Winter Desert with Saguaros",
|
||||||
|
"backgroundWinterDesertWithSaguarosNotes": "Breathe the crisp air of a Winter Desert with Saguaros.",
|
||||||
|
|
||||||
|
"backgrounds022026": "SET 141: Released February 2026",
|
||||||
|
"backgroundElegantPalaceText": "Elegant Palace",
|
||||||
|
"backgroundElegantPalaceNotes": "Admire the colorful halls of an Elegant Palace.",
|
||||||
|
|
||||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||||
"backgroundAirshipText": "Airship",
|
"backgroundAirshipText": "Airship",
|
||||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||||
|
|||||||
@@ -2,12 +2,15 @@
|
|||||||
"challenge": "Challenge",
|
"challenge": "Challenge",
|
||||||
"challengeDetails": "Challenges are community events in which players compete and earn prizes by completing a group of related tasks.",
|
"challengeDetails": "Challenges are community events in which players compete and earn prizes by completing a group of related tasks.",
|
||||||
"brokenChaLink": "Broken Challenge Link",
|
"brokenChaLink": "Broken Challenge Link",
|
||||||
"brokenTask": "Broken Challenge Link: this task was part of a challenge, but has been removed from it. What would you like to do?",
|
"brokenTask": "Broken Challenge Link",
|
||||||
|
"brokenTaskDescription": "This task was part of a challenge, but has been removed from it. What would you like to do?",
|
||||||
"keepIt": "Keep It",
|
"keepIt": "Keep It",
|
||||||
"removeIt": "Remove It",
|
"removeIt": "Remove It",
|
||||||
"removeTasks": "Remove Tasks",
|
"removeTasks": "Remove Tasks",
|
||||||
"brokenChallenge": "Broken Challenge Link: this task was part of a challenge, but the challenge (or group) has been deleted. What to do with the orphan tasks?",
|
"brokenChallenge": "Broken Challenge Link",
|
||||||
"challengeCompleted": "This challenge has been completed, and the winner was <span class=\"badge\"><%- user %></span>! What to do with the orphan tasks?",
|
"brokenChallengeDescription": "This task was part of a challenge, but the challenge (or group) has been deleted. What to do with the orphan tasks?",
|
||||||
|
"challengeCompleted": "Challenge Completed!",
|
||||||
|
"challengeCompletedDescription": "The winner was <%- user %>! What to do with the orphan tasks?",
|
||||||
"unsubChallenge": "Broken Challenge Link: this task was part of a challenge, but you have unsubscribed from the challenge. What to do with the orphan tasks?",
|
"unsubChallenge": "Broken Challenge Link: this task was part of a challenge, but you have unsubscribed from the challenge. What to do with the orphan tasks?",
|
||||||
"challenges": "Challenges",
|
"challenges": "Challenges",
|
||||||
"endDate": "Ends",
|
"endDate": "Ends",
|
||||||
@@ -69,6 +72,7 @@
|
|||||||
"awardWinners": "Award Winner",
|
"awardWinners": "Award Winner",
|
||||||
"doYouWantedToDeleteChallenge": "Do you want to delete this Challenge?",
|
"doYouWantedToDeleteChallenge": "Do you want to delete this Challenge?",
|
||||||
"deleteChallenge": "Delete Challenge",
|
"deleteChallenge": "Delete Challenge",
|
||||||
|
"deleteChallengeRefundDescription": "If you delete this Challenge, you will be refunded the Gem prize and the Challenge tasks will remain on the participants' task boards.",
|
||||||
"challengeNamePlaceholder": "What is your Challenge name?",
|
"challengeNamePlaceholder": "What is your Challenge name?",
|
||||||
"challengeSummary": "Summary",
|
"challengeSummary": "Summary",
|
||||||
"challengeSummaryPlaceholder": "Write a short description advertising your Challenge to other Habiticans. What is the main purpose of your Challenge and why should people join it? Try to include useful keywords in the description so that Habiticans can easily find it when they search!",
|
"challengeSummaryPlaceholder": "Write a short description advertising your Challenge to other Habiticans. What is the main purpose of your Challenge and why should people join it? Try to include useful keywords in the description so that Habiticans can easily find it when they search!",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"dontDespair": "Don't despair!",
|
"dontDespair": "Don't despair!",
|
||||||
"deathPenaltyDetails": "You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you'll do great.",
|
"deathPenaltyDetails": "You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you'll do great.",
|
||||||
"refillHealthTryAgain": "Refill Health & Try Again",
|
"refillHealthTryAgain": "Refill Health & Try Again",
|
||||||
"dyingOftenTips": "Is this happening often? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Here are some tips!</a>",
|
"dyingOftenTips": "Is this happening often? <a href='/static/faq#prevent-damage' target='_blank'>Here are some tips!</a>",
|
||||||
"losingHealthWarning": "Careful - You're Losing Health!",
|
"losingHealthWarning": "Careful - You're Losing Health!",
|
||||||
"losingHealthWarning2": "Don't let your Health drop to zero! If you do, you'll lose a level, your Gold, and a piece of equipment.",
|
"losingHealthWarning2": "Don't let your Health drop to zero! If you do, you'll lose a level, your Gold, and a piece of equipment.",
|
||||||
"toRegainHealth": "To regain Health:",
|
"toRegainHealth": "To regain Health:",
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
"webFaqAnswer29": "You can recover 15 HP by purchasing a Health Potion from your Rewards column for 25 Gold. Additionally, you will always recover full HP when you level up!",
|
"webFaqAnswer29": "You can recover 15 HP by purchasing a Health Potion from your Rewards column for 25 Gold. Additionally, you will always recover full HP when you level up!",
|
||||||
|
|
||||||
"faqQuestion30": "What happens when I run out of HP?",
|
"faqQuestion30": "What happens when I run out of HP?",
|
||||||
"webFaqAnswer30": "If your HP reaches zero, you’ll lose one level, all of your Gold, and a piece of Equipment that can be repurchased.",
|
"webFaqAnswer30": "If your HP reaches zero, you'll lose one level, that level's stat point, all of your Gold, and a piece of equipment that can be repurchased. You can rebuild by completing tasks and leveling up again.",
|
||||||
|
|
||||||
"faqQuestion31": "Why did I lose HP when interacting with a non-negative task?",
|
"faqQuestion31": "Why did I lose HP when interacting with a non-negative task?",
|
||||||
"webFaqAnswer31": "If you complete a task and lose HP when you shouldn’t have, you encountered a delay while the server is syncing changes made on other platforms. For example, if you use Gold, Mana, or lose HP on the mobile app and then complete a task on the website, the server is simply confirming everything is in sync.",
|
"webFaqAnswer31": "If you complete a task and lose HP when you shouldn’t have, you encountered a delay while the server is syncing changes made on other platforms. For example, if you use Gold, Mana, or lose HP on the mobile app and then complete a task on the website, the server is simply confirming everything is in sync.",
|
||||||
@@ -135,6 +135,9 @@
|
|||||||
"faqQuestion67": "What are the classes in Habitica?",
|
"faqQuestion67": "What are the classes in Habitica?",
|
||||||
"webFaqAnswer67": "Classes are different roles that your character can play. Each class provides its own set of unique benefits and skills as you level up. These skills can complement the way you interact with your tasks or help you contribute to completing Quests in your Party.\n\nYour class also determines the Equipment that will be available to you for purchase in your Rewards, the Market, and the Seasonal Shop.\n\nHere’s a rundown of each class to help you choose which one is best suited to your playstyle:\n#### **Warrior**\n* Warriors deal high damage to bosses and have a high chance of critical hits when completing tasks, rewarding you extra Experience and Gold.\n* Strength is their primary stat, raising the damage they do.\n* Constitution is their secondary stat, lowering the damage they take.\n* Warriors' skills buff their Party mates' Constitution and Strength.\n* Consider playing as a Warrior if you love to fight bosses but also want some protection if you miss tasks occasionally.\n#### **Healer**\n* Healers have high defense and can heal themselves as well as their Party mates.\n* Constitution is their primary stat, increasing their heals and lowering the damage they take.\n* Intelligence is their secondary stat, increasing their Mana and Experience.\n* Healers' skills make their tasks less red and buff their Party mates' Constitution.\n* Consider playing as a Healer if you miss tasks often and need the ability to heal yourself or your Party members. Healers also level up quickly.\n#### **Mage**\n* Mages level up quickly, gain lots of Mana, and damage bosses in Quests.\n* Intelligence is their primary stat, increasing their Mana and Experience.\n* Perception is their secondary stat, increasing their Gold and item drops.\n* Mages' skills freeze their task streaks, restore their Party mates' Mana, and buff their Intelligence.\n* Consider playing as a Mage if you are motivated by progressing quickly through levels and contributing damage to boss Quests.\n#### **Rogue**\n* Rogues get the most item drops and Gold from completing tasks, and have a high chance of critical hits, getting even more Experience and Gold.\n* Perception is their primary stat, increasing their Gold and item drops.\n* Strength is their secondary stat, raising the damage they do.\n* Rogues' skills help them dodge missed Dailies, pilfer Gold, and buff their Party mates’ Perception.\n* Consider playing as a Rogue if you’re highly motivated by rewards.",
|
"webFaqAnswer67": "Classes are different roles that your character can play. Each class provides its own set of unique benefits and skills as you level up. These skills can complement the way you interact with your tasks or help you contribute to completing Quests in your Party.\n\nYour class also determines the Equipment that will be available to you for purchase in your Rewards, the Market, and the Seasonal Shop.\n\nHere’s a rundown of each class to help you choose which one is best suited to your playstyle:\n#### **Warrior**\n* Warriors deal high damage to bosses and have a high chance of critical hits when completing tasks, rewarding you extra Experience and Gold.\n* Strength is their primary stat, raising the damage they do.\n* Constitution is their secondary stat, lowering the damage they take.\n* Warriors' skills buff their Party mates' Constitution and Strength.\n* Consider playing as a Warrior if you love to fight bosses but also want some protection if you miss tasks occasionally.\n#### **Healer**\n* Healers have high defense and can heal themselves as well as their Party mates.\n* Constitution is their primary stat, increasing their heals and lowering the damage they take.\n* Intelligence is their secondary stat, increasing their Mana and Experience.\n* Healers' skills make their tasks less red and buff their Party mates' Constitution.\n* Consider playing as a Healer if you miss tasks often and need the ability to heal yourself or your Party members. Healers also level up quickly.\n#### **Mage**\n* Mages level up quickly, gain lots of Mana, and damage bosses in Quests.\n* Intelligence is their primary stat, increasing their Mana and Experience.\n* Perception is their secondary stat, increasing their Gold and item drops.\n* Mages' skills freeze their task streaks, restore their Party mates' Mana, and buff their Intelligence.\n* Consider playing as a Mage if you are motivated by progressing quickly through levels and contributing damage to boss Quests.\n#### **Rogue**\n* Rogues get the most item drops and Gold from completing tasks, and have a high chance of critical hits, getting even more Experience and Gold.\n* Perception is their primary stat, increasing their Gold and item drops.\n* Strength is their secondary stat, raising the damage they do.\n* Rogues' skills help them dodge missed Dailies, pilfer Gold, and buff their Party mates’ Perception.\n* Consider playing as a Rogue if you’re highly motivated by rewards.",
|
||||||
|
|
||||||
|
"faqQuestion68": "How do I prevent losing HP?",
|
||||||
|
"webFaqAnswer68": "If you find yourself losing HP often, try some of these tips:\n\n- Pause your Dailies. The \"Pause Damage\" button in Settings will prevent you from losing HP for missed Dailies.\n- Adjust the schedule of your Dailies. By setting them to never be due, you can still complete them for rewards without risking HP loss.\n- Try using class skills:\n\t- Rogues can cast Stealth to prevent damage from missed Dailies\n\t- Warriors can cast Brutal Smash to reduce a Daily's redness, lowering damage taken if missed\n\t- Healers can cast Searing Brightness to reduce Dailies' redness, lowering damage taken if missed",
|
||||||
|
|
||||||
"iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
|
"iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
|
||||||
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
|
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
|
||||||
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
|
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
|
||||||
|
|||||||
@@ -142,7 +142,7 @@
|
|||||||
"invalidReqParams": "Invalid request parameters.",
|
"invalidReqParams": "Invalid request parameters.",
|
||||||
"memberIdRequired": "\"member\" must be a valid UUID.",
|
"memberIdRequired": "\"member\" must be a valid UUID.",
|
||||||
"heroIdRequired": "\"heroId\" must be a valid UUID.",
|
"heroIdRequired": "\"heroId\" must be a valid UUID.",
|
||||||
"cannotFulfillReq": "Please enter a valid email address. Email admin@habitica.com if this error persists.",
|
"cannotFulfillReq": "This email address is already in use. You can try logging in or use a different email to register. If you need help, reach out to admin@habitica.com.",
|
||||||
"enterValidEmail": "Please enter a valid email address.",
|
"enterValidEmail": "Please enter a valid email address.",
|
||||||
"modelNotFound": "This model does not exist.",
|
"modelNotFound": "This model does not exist.",
|
||||||
"signUpWithSocial": "Continue with <%= social %>",
|
"signUpWithSocial": "Continue with <%= social %>",
|
||||||
|
|||||||
@@ -155,13 +155,13 @@
|
|||||||
"weaponSpecialSummerHealerNotes": "This wand, made of aquamarine and live coral, is very attractive to schools of fish. Increases Intelligence by <%= int %>. Limited Edition 2014 Summer Gear.",
|
"weaponSpecialSummerHealerNotes": "This wand, made of aquamarine and live coral, is very attractive to schools of fish. Increases Intelligence by <%= int %>. Limited Edition 2014 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFallRogueText": "Silver Stake",
|
"weaponSpecialFallRogueText": "Silver Stake",
|
||||||
"weaponSpecialFallRogueNotes": "Dispatches undead. Also grants a bonus against werewolves, because you can never be too careful. Increases Strength by <%= str %>. Limited Edition 2014 Autumn Gear.",
|
"weaponSpecialFallRogueNotes": "Dispatches undead. Also grants a bonus against werewolves, because you can never be too careful. Increases Strength by <%= str %>. Limited Edition 2014 Fall Gear.",
|
||||||
"weaponSpecialFallWarriorText": "Grabby Claw of Science",
|
"weaponSpecialFallWarriorText": "Grabby Claw of Science",
|
||||||
"weaponSpecialFallWarriorNotes": "This grabby claw is at the very cutting edge of technology. Increases Strength by <%= str %>. Limited Edition 2014 Autumn Gear.",
|
"weaponSpecialFallWarriorNotes": "This grabby claw is at the very cutting edge of technology. Increases Strength by <%= str %>. Limited Edition 2014 Fall Gear.",
|
||||||
"weaponSpecialFallMageText": "Magic Broom",
|
"weaponSpecialFallMageText": "Magic Broom",
|
||||||
"weaponSpecialFallMageNotes": "This enchanted broom flies faster than a dragon! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2014 Autumn Gear.",
|
"weaponSpecialFallMageNotes": "This enchanted broom flies faster than a dragon! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2014 Fall Gear.",
|
||||||
"weaponSpecialFallHealerText": "Scarab Wand",
|
"weaponSpecialFallHealerText": "Scarab Wand",
|
||||||
"weaponSpecialFallHealerNotes": "The scarab on this wand protects and heals its wielder. Increases Intelligence by <%= int %>. Limited Edition 2014 Autumn Gear.",
|
"weaponSpecialFallHealerNotes": "The scarab on this wand protects and heals its wielder. Increases Intelligence by <%= int %>. Limited Edition 2014 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2015RogueText": "Ice Spike",
|
"weaponSpecialWinter2015RogueText": "Ice Spike",
|
||||||
"weaponSpecialWinter2015RogueNotes": "You truly, definitely, absolutely just picked these up off of the ground. Increases Strength by <%= str %>. Limited Edition 2014-2015 Winter Gear.",
|
"weaponSpecialWinter2015RogueNotes": "You truly, definitely, absolutely just picked these up off of the ground. Increases Strength by <%= str %>. Limited Edition 2014-2015 Winter Gear.",
|
||||||
@@ -191,13 +191,13 @@
|
|||||||
"weaponSpecialSummer2015HealerNotes": "Cures seasickness and sea sickness! Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.",
|
"weaponSpecialSummer2015HealerNotes": "Cures seasickness and sea sickness! Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFall2015RogueText": "Bat-tle Ax",
|
"weaponSpecialFall2015RogueText": "Bat-tle Ax",
|
||||||
"weaponSpecialFall2015RogueNotes": "Fearsome To Do's cower before the flapping of this ax. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.",
|
"weaponSpecialFall2015RogueNotes": "Fearsome To Do's cower before the flapping of this ax. Increases Strength by <%= str %>. Limited Edition 2015 Fall Gear.",
|
||||||
"weaponSpecialFall2015WarriorText": "Wooden Plank",
|
"weaponSpecialFall2015WarriorText": "Wooden Plank",
|
||||||
"weaponSpecialFall2015WarriorNotes": "Great for elevating things in cornfields and/or smacking tasks. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.",
|
"weaponSpecialFall2015WarriorNotes": "Great for elevating things in cornfields and/or smacking tasks. Increases Strength by <%= str %>. Limited Edition 2015 Fall Gear.",
|
||||||
"weaponSpecialFall2015MageText": "Enchanted Thread",
|
"weaponSpecialFall2015MageText": "Enchanted Thread",
|
||||||
"weaponSpecialFall2015MageNotes": "A powerful Stitch Witch can control this enchanted thread without even touching it! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2015 Autumn Gear.",
|
"weaponSpecialFall2015MageNotes": "A powerful Stitch Witch can control this enchanted thread without even touching it! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2015 Fall Gear.",
|
||||||
"weaponSpecialFall2015HealerText": "Swamp-Slime Potion",
|
"weaponSpecialFall2015HealerText": "Swamp-Slime Potion",
|
||||||
"weaponSpecialFall2015HealerNotes": "Brewed to perfection! Now you just have to convince yourself to drink it. Increases Intelligence by <%= int %>. Limited Edition 2015 Autumn Gear.",
|
"weaponSpecialFall2015HealerNotes": "Brewed to perfection! Now you just have to convince yourself to drink it. Increases Intelligence by <%= int %>. Limited Edition 2015 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2016RogueText": "Cocoa Mug",
|
"weaponSpecialWinter2016RogueText": "Cocoa Mug",
|
||||||
"weaponSpecialWinter2016RogueNotes": "Warming drink, or boiling projectile? You decide... Increases Strength by <%= str %>. Limited Edition 2015-2016 Winter Gear.",
|
"weaponSpecialWinter2016RogueNotes": "Warming drink, or boiling projectile? You decide... Increases Strength by <%= str %>. Limited Edition 2015-2016 Winter Gear.",
|
||||||
@@ -227,13 +227,13 @@
|
|||||||
"weaponSpecialSummer2016HealerNotes": "One spike harms, the other heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.",
|
"weaponSpecialSummer2016HealerNotes": "One spike harms, the other heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFall2016RogueText": "Spiderbite Dagger",
|
"weaponSpecialFall2016RogueText": "Spiderbite Dagger",
|
||||||
"weaponSpecialFall2016RogueNotes": "Feel the sting of the spider's bite! Increases Strength by <%= str %>. Limited Edition 2016 Autumn Gear.",
|
"weaponSpecialFall2016RogueNotes": "Feel the sting of the spider's bite! Increases Strength by <%= str %>. Limited Edition 2016 Fall Gear.",
|
||||||
"weaponSpecialFall2016WarriorText": "Attacking Roots",
|
"weaponSpecialFall2016WarriorText": "Attacking Roots",
|
||||||
"weaponSpecialFall2016WarriorNotes": "Attack your tasks with these twisting roots! Increases Strength by <%= str %>. Limited Edition 2016 Autumn Gear.",
|
"weaponSpecialFall2016WarriorNotes": "Attack your tasks with these twisting roots! Increases Strength by <%= str %>. Limited Edition 2016 Fall Gear.",
|
||||||
"weaponSpecialFall2016MageText": "Ominous Orb",
|
"weaponSpecialFall2016MageText": "Ominous Orb",
|
||||||
"weaponSpecialFall2016MageNotes": "Don't ask this orb to tell your future... Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2016 Autumn Gear.",
|
"weaponSpecialFall2016MageNotes": "Don't ask this orb to tell your future... Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2016 Fall Gear.",
|
||||||
"weaponSpecialFall2016HealerText": "Venomous Serpent",
|
"weaponSpecialFall2016HealerText": "Venomous Serpent",
|
||||||
"weaponSpecialFall2016HealerNotes": "One bite harms, and another bite heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Autumn Gear.",
|
"weaponSpecialFall2016HealerNotes": "One bite harms, and another bite heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2017RogueText": "Ice Axe",
|
"weaponSpecialWinter2017RogueText": "Ice Axe",
|
||||||
"weaponSpecialWinter2017RogueNotes": "This axe is great for attack, defense, and ice-climbing! Increases Strength by <%= str %>. Limited Edition 2016-2017 Winter Gear.",
|
"weaponSpecialWinter2017RogueNotes": "This axe is great for attack, defense, and ice-climbing! Increases Strength by <%= str %>. Limited Edition 2016-2017 Winter Gear.",
|
||||||
@@ -263,20 +263,20 @@
|
|||||||
"weaponSpecialSummer2017HealerNotes": "A single touch from this pearl-tipped wand soothes away all wounds. Increases Intelligence by <%= int %>. Limited Edition 2017 Summer Gear.",
|
"weaponSpecialSummer2017HealerNotes": "A single touch from this pearl-tipped wand soothes away all wounds. Increases Intelligence by <%= int %>. Limited Edition 2017 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFall2017RogueText": "Candied Apple Mace",
|
"weaponSpecialFall2017RogueText": "Candied Apple Mace",
|
||||||
"weaponSpecialFall2017RogueNotes": "Defeat your foes with sweetness! Increases Strength by <%= str %>. Limited Edition 2017 Autumn Gear.",
|
"weaponSpecialFall2017RogueNotes": "Defeat your foes with sweetness! Increases Strength by <%= str %>. Limited Edition 2017 Fall Gear.",
|
||||||
"weaponSpecialFall2017WarriorText": "Candy Corn Lance",
|
"weaponSpecialFall2017WarriorText": "Candy Corn Lance",
|
||||||
"weaponSpecialFall2017WarriorNotes": "All your foes will cower before this tasty-looking lance, regardless of whether they're ghosts, monsters, or red To Do's. Increases Strength by <%= str %>. Limited Edition 2017 Autumn Gear.",
|
"weaponSpecialFall2017WarriorNotes": "All your foes will cower before this tasty-looking lance, regardless of whether they're ghosts, monsters, or red To Do's. Increases Strength by <%= str %>. Limited Edition 2017 Fall Gear.",
|
||||||
"weaponSpecialFall2017MageText": "Spooky Staff",
|
"weaponSpecialFall2017MageText": "Spooky Staff",
|
||||||
"weaponSpecialFall2017MageNotes": "The eyes of the glowing skull on this staff radiate magic and mystery. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017 Autumn Gear.",
|
"weaponSpecialFall2017MageNotes": "The eyes of the glowing skull on this staff radiate magic and mystery. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017 Fall Gear.",
|
||||||
"weaponSpecialFall2017HealerText": "Creepy Candelabra",
|
"weaponSpecialFall2017HealerText": "Creepy Candelabra",
|
||||||
"weaponSpecialFall2017HealerNotes": "This light dispels fear and lets others know you're here to help. Increases Intelligence by <%= int %>. Limited Edition 2017 Autumn Gear.",
|
"weaponSpecialFall2017HealerNotes": "This light dispels fear and lets others know you're here to help. Increases Intelligence by <%= int %>. Limited Edition 2017 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2018RogueText": "Peppermint Hook",
|
"weaponSpecialWinter2018RogueText": "Peppermint Hook",
|
||||||
"weaponSpecialWinter2018RogueNotes": "Perfect for climbing walls or distracting your foes with sweet, sweet candy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.",
|
"weaponSpecialWinter2018RogueNotes": "Perfect for climbing walls or distracting your foes with sweet, sweet candy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.",
|
||||||
"weaponSpecialWinter2018WarriorText": "Holiday Bow Hammer",
|
"weaponSpecialWinter2018WarriorText": "Holiday Bow Hammer",
|
||||||
"weaponSpecialWinter2018WarriorNotes": "The sparkly appearance of this bright weapon will dazzle your enemies as you swing it! Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.",
|
"weaponSpecialWinter2018WarriorNotes": "The sparkly appearance of this bright weapon will dazzle your enemies as you swing it! Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.",
|
||||||
"weaponSpecialWinter2018MageText": "Holiday Confetti",
|
"weaponSpecialWinter2018MageText": "Holiday Confetti",
|
||||||
"weaponSpecialWinter2018MageNotes": "Magic--and glitter--is in the air! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.",
|
"weaponSpecialWinter2018MageNotes": "Magic—and glitter—is in the air! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.",
|
||||||
"weaponSpecialWinter2018HealerText": "Mistletoe Wand",
|
"weaponSpecialWinter2018HealerText": "Mistletoe Wand",
|
||||||
"weaponSpecialWinter2018HealerNotes": "This mistletoe ball is sure to enchant and delight passersby! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.",
|
"weaponSpecialWinter2018HealerNotes": "This mistletoe ball is sure to enchant and delight passersby! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.",
|
||||||
|
|
||||||
@@ -299,13 +299,13 @@
|
|||||||
"weaponSpecialSummer2018HealerNotes": "With a benevolent gesture, you command healing water to flow through your dominions in waves. Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
|
"weaponSpecialSummer2018HealerNotes": "With a benevolent gesture, you command healing water to flow through your dominions in waves. Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFall2018RogueText": "Vial of Clarity",
|
"weaponSpecialFall2018RogueText": "Vial of Clarity",
|
||||||
"weaponSpecialFall2018RogueNotes": "When you need to come back to your senses, when you need a little boost to make the right decision, take a deep breath and a sip. It'll be OK! Increases Strength by <%= str %>. Limited Edition 2018 Autumn Gear.",
|
"weaponSpecialFall2018RogueNotes": "When you need to come back to your senses, when you need a little boost to make the right decision, take a deep breath and a sip. It'll be OK! Increases Strength by <%= str %>. Limited Edition 2018 Fall Gear.",
|
||||||
"weaponSpecialFall2018WarriorText": "Whip of Minos",
|
"weaponSpecialFall2018WarriorText": "Whip of Minos",
|
||||||
"weaponSpecialFall2018WarriorNotes": "Not quite long enough to unwind behind you for keeping your bearings in a maze. Well, maybe a very small maze. Increases Strength by <%= str %>. Limited Edition 2018 Autumn Gear.",
|
"weaponSpecialFall2018WarriorNotes": "Not quite long enough to unwind behind you for keeping your bearings in a maze. Well, maybe a very small maze. Increases Strength by <%= str %>. Limited Edition 2018 Fall Gear.",
|
||||||
"weaponSpecialFall2018MageText": "Staff of Sweetness",
|
"weaponSpecialFall2018MageText": "Staff of Sweetness",
|
||||||
"weaponSpecialFall2018MageNotes": "This is no ordinary lollipop! The glowing orb of magic sugar atop this staff has the power to make good habits stick to you. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2018 Autumn Gear.",
|
"weaponSpecialFall2018MageNotes": "This is no ordinary lollipop! The glowing orb of magic sugar atop this staff has the power to make good habits stick to you. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2018 Fall Gear.",
|
||||||
"weaponSpecialFall2018HealerText": "Starving Staff",
|
"weaponSpecialFall2018HealerText": "Starving Staff",
|
||||||
"weaponSpecialFall2018HealerNotes": "Just keep this staff fed, and it will bestow Blessings. If you forget to feed it, keep your fingers out of reach. Increases Intelligence by <%= int %>. Limited Edition 2018 Autumn Gear.",
|
"weaponSpecialFall2018HealerNotes": "Just keep this staff fed, and it will bestow Blessings. If you forget to feed it, keep your fingers out of reach. Increases Intelligence by <%= int %>. Limited Edition 2018 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2019RogueText": "Poinsettia Bouquet",
|
"weaponSpecialWinter2019RogueText": "Poinsettia Bouquet",
|
||||||
"weaponSpecialWinter2019RogueNotes": "Use this festive bouquet to further camouflage yourself, or generously gift it to brighten a friend's day! Increases Strength by <%= str %>. Limited Edition 2018-2019 Winter Gear.",
|
"weaponSpecialWinter2019RogueNotes": "Use this festive bouquet to further camouflage yourself, or generously gift it to brighten a friend's day! Increases Strength by <%= str %>. Limited Edition 2018-2019 Winter Gear.",
|
||||||
@@ -335,13 +335,13 @@
|
|||||||
"weaponSpecialSummer2019HealerNotes": "The bubbles from this wand capture healing energy and ancient oceanic magic. Increases Intelligence by <%= int %>. Limited Edition 2019 Summer Gear.",
|
"weaponSpecialSummer2019HealerNotes": "The bubbles from this wand capture healing energy and ancient oceanic magic. Increases Intelligence by <%= int %>. Limited Edition 2019 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFall2019RogueText": "Music Stand",
|
"weaponSpecialFall2019RogueText": "Music Stand",
|
||||||
"weaponSpecialFall2019RogueNotes": "Whether you're conducting the orchestra or singing an aria, this helpful device keeps your hands free for dramatic gestures! Increases Strength by <%= str %>. Limited Edition 2019 Autumn Gear.",
|
"weaponSpecialFall2019RogueNotes": "Whether you're conducting the orchestra or singing an aria, this helpful device keeps your hands free for dramatic gestures! Increases Strength by <%= str %>. Limited Edition 2019 Fall Gear.",
|
||||||
"weaponSpecialFall2019WarriorText": "Talon Trident",
|
"weaponSpecialFall2019WarriorText": "Talon Trident",
|
||||||
"weaponSpecialFall2019WarriorNotes": "Prepare to rend your foes with the talons of a raven! Increases Strength by <%= str %>. Limited Edition 2019 Autumn Gear.",
|
"weaponSpecialFall2019WarriorNotes": "Prepare to rend your foes with the talons of a raven! Increases Strength by <%= str %>. Limited Edition 2019 Fall Gear.",
|
||||||
"weaponSpecialFall2019MageText": "One-Eyed Staff",
|
"weaponSpecialFall2019MageText": "One-Eyed Staff",
|
||||||
"weaponSpecialFall2019MageNotes": "Be it forging thunderbolts, raising fortifications, or simply striking terror into the hearts of mortals, this staff lends the power of giants to work wonders. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2019 Autumn Gear.",
|
"weaponSpecialFall2019MageNotes": "Be it forging thunderbolts, raising fortifications, or simply striking terror into the hearts of mortals, this staff lends the power of giants to work wonders. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2019 Fall Gear.",
|
||||||
"weaponSpecialFall2019HealerText": "Fearsome Phylactery",
|
"weaponSpecialFall2019HealerText": "Fearsome Phylactery",
|
||||||
"weaponSpecialFall2019HealerNotes": "This phylactery can call on the spirits of tasks long slain and use their healing power. Increases Intelligence by <%= int %>. Limited Edition 2019 Autumn Gear.",
|
"weaponSpecialFall2019HealerNotes": "This phylactery can call on the spirits of tasks long slain and use their healing power. Increases Intelligence by <%= int %>. Limited Edition 2019 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2020RogueText": "Lantern Rod",
|
"weaponSpecialWinter2020RogueText": "Lantern Rod",
|
||||||
"weaponSpecialWinter2020RogueNotes": "Darkness is a Rogue's element. Who better, then, to light the way in the darkest time of year? Increases Strength by <%= str %>. Limited Edition 2019-2020 Winter Gear.",
|
"weaponSpecialWinter2020RogueNotes": "Darkness is a Rogue's element. Who better, then, to light the way in the darkest time of year? Increases Strength by <%= str %>. Limited Edition 2019-2020 Winter Gear.",
|
||||||
@@ -371,13 +371,13 @@
|
|||||||
"weaponSpecialSummer2020HealerNotes": "As the currents wear away sharp edges, so shall your magic soften your friends' pain. Increases Intelligence by <%= int %>. Limited Edition 2020 Summer Gear.",
|
"weaponSpecialSummer2020HealerNotes": "As the currents wear away sharp edges, so shall your magic soften your friends' pain. Increases Intelligence by <%= int %>. Limited Edition 2020 Summer Gear.",
|
||||||
|
|
||||||
"weaponSpecialFall2020RogueText": "Sharp Katar",
|
"weaponSpecialFall2020RogueText": "Sharp Katar",
|
||||||
"weaponSpecialFall2020RogueNotes": "Pierce your foe with one sharp strike! Even the thickest armor will give way to your blade. Increases Strength by <%= str %>. Limited Edition 2020 Autumn Gear.",
|
"weaponSpecialFall2020RogueNotes": "Pierce your foe with one sharp strike! Even the thickest armor will give way to your blade. Increases Strength by <%= str %>. Limited Edition 2020 Fall Gear.",
|
||||||
"weaponSpecialFall2020WarriorText": "Spectre's Sword",
|
"weaponSpecialFall2020WarriorText": "Spectre's Sword",
|
||||||
"weaponSpecialFall2020WarriorNotes": "This sword went into the afterlife with a powerful Warrior, and returns for you to wield! Increases Strength by <%= str %>. Limited Edition 2020 Autumn Gear.",
|
"weaponSpecialFall2020WarriorNotes": "This sword went into the afterlife with a powerful Warrior, and returns for you to wield! Increases Strength by <%= str %>. Limited Edition 2020 Fall Gear.",
|
||||||
"weaponSpecialFall2020MageText": "Three Visions",
|
"weaponSpecialFall2020MageText": "Three Visions",
|
||||||
"weaponSpecialFall2020MageNotes": "If aught should escape your mage sight, the brilliant crystals atop this staff shall illuminate what you overlooked. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2020 Autumn Gear.",
|
"weaponSpecialFall2020MageNotes": "If aught should escape your mage sight, the brilliant crystals atop this staff shall illuminate what you overlooked. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2020 Fall Gear.",
|
||||||
"weaponSpecialFall2020HealerText": "Cocoon Cane",
|
"weaponSpecialFall2020HealerText": "Cocoon Cane",
|
||||||
"weaponSpecialFall2020HealerNotes": "Now that your transformation is complete, this remnant of your life as a pupa now serves as the divining rod with which you measure destinies. Increases Intelligence by <%= int %>. Limited Edition 2020 Autumn Gear.",
|
"weaponSpecialFall2020HealerNotes": "Now that your transformation is complete, this remnant of your life as a pupa now serves as the divining rod with which you measure destinies. Increases Intelligence by <%= int %>. Limited Edition 2020 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2021RogueText": "Holly Berry Flail",
|
"weaponSpecialWinter2021RogueText": "Holly Berry Flail",
|
||||||
"weaponSpecialWinter2021RogueNotes": "Both disguise and weapon, this holly flail will help you handle the toughest tasks. Increases Strength by <%= str %>. Limited Edition 2020-2021 Winter Gear.",
|
"weaponSpecialWinter2021RogueNotes": "Both disguise and weapon, this holly flail will help you handle the toughest tasks. Increases Strength by <%= str %>. Limited Edition 2020-2021 Winter Gear.",
|
||||||
@@ -411,13 +411,13 @@
|
|||||||
|
|
||||||
|
|
||||||
"weaponSpecialFall2021RogueText": "Dripping Goo",
|
"weaponSpecialFall2021RogueText": "Dripping Goo",
|
||||||
"weaponSpecialFall2021RogueNotes": "What on Earth did you get into? When people say Rogues have sticky fingers, this is not what they mean! Increases Strength by <%= str %>. Limited Edition 2021 Autumn Gear.",
|
"weaponSpecialFall2021RogueNotes": "What on Earth did you get into? When people say Rogues have sticky fingers, this is not what they mean! Increases Strength by <%= str %>. Limited Edition 2021 Fall Gear.",
|
||||||
"weaponSpecialFall2021WarriorText": "Horse Rider's Axe",
|
"weaponSpecialFall2021WarriorText": "Horse Rider's Axe",
|
||||||
"weaponSpecialFall2021WarriorNotes": "This stylized, single-bladed axe is ideal for chopping... pumpkins! Increases Strength by <%= str %>. Limited Edition 2021 Autumn Gear.",
|
"weaponSpecialFall2021WarriorNotes": "This stylized, single-bladed axe is ideal for chopping... pumpkins! Increases Strength by <%= str %>. Limited Edition 2021 Fall Gear.",
|
||||||
"weaponSpecialFall2021MageText": "Staff of Pure Thought",
|
"weaponSpecialFall2021MageText": "Staff of Pure Thought",
|
||||||
"weaponSpecialFall2021MageNotes": "Knowledge seeks knowledge. Formed of memories and desires, this fearsome hand grasps for more. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2021 Autumn Gear.",
|
"weaponSpecialFall2021MageNotes": "Knowledge seeks knowledge. Formed of memories and desires, this fearsome hand grasps for more. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2021 Fall Gear.",
|
||||||
"weaponSpecialFall2021HealerText": "Summoning Wand",
|
"weaponSpecialFall2021HealerText": "Summoning Wand",
|
||||||
"weaponSpecialFall2021HealerNotes": "Use this wand to summon healing flames and a ghostly creature to help you. Increases Intelligence by <%= int %>. Limited Edition 2021 Autumn Gear.",
|
"weaponSpecialFall2021HealerNotes": "Use this wand to summon healing flames and a ghostly creature to help you. Increases Intelligence by <%= int %>. Limited Edition 2021 Fall Gear.",
|
||||||
|
|
||||||
"weaponSpecialWinter2022RogueText": "Shooting Star Firework",
|
"weaponSpecialWinter2022RogueText": "Shooting Star Firework",
|
||||||
"weaponSpecialWinter2022RogueNotes": "Silver and gold are beloved of Rogues, right? These are totally on theme. Increases Strength by <%= str %>. Limited Edition 2021-2022 Winter Gear.",
|
"weaponSpecialWinter2022RogueNotes": "Silver and gold are beloved of Rogues, right? These are totally on theme. Increases Strength by <%= str %>. Limited Edition 2021-2022 Winter Gear.",
|
||||||
@@ -569,6 +569,15 @@
|
|||||||
"weaponSpecialFall2025MageText": "Masked Ghost Axe",
|
"weaponSpecialFall2025MageText": "Masked Ghost Axe",
|
||||||
"weaponSpecialFall2025MageNotes": "A mighty weapon to cut a safe path through an autumn forest full of frights. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
|
"weaponSpecialFall2025MageNotes": "A mighty weapon to cut a safe path through an autumn forest full of frights. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
|
||||||
|
|
||||||
|
"weaponSpecialWinter2026WarriorText": "Rime Scythe",
|
||||||
|
"weaponSpecialWinter2026WarriorNotes": "Scythes help cut, reap, and cover large areas—all things you need when refining a task list. Increases Strength by <%= str %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"weaponSpecialWinter2026RogueText": "Ski Pole",
|
||||||
|
"weaponSpecialWinter2026RogueNotes": "Ski poles help you maintain balance, stability, and timing—all things you need to be truly productive. Increases Strength by <%= str %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"weaponSpecialWinter2026HealerText": "Polar Staff",
|
||||||
|
"weaponSpecialWinter2026HealerNotes": "Staffs help with support, stability, and direction—all things that help you truly conquer a task list. Increases Intelligence by <%= int %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"weaponSpecialWinter2026MageText": "Candelabra Staff",
|
||||||
|
"weaponSpecialWinter2026MageNotes": "Candelabras help by holding multiple candles at a time—follow its lead the next time you need to multitask. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
|
||||||
"weaponMystery201411Text": "Pitchfork of Feasting",
|
"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.",
|
"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",
|
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
|
||||||
@@ -613,6 +622,10 @@
|
|||||||
"weaponMystery202508Notes": "This spinning blade will terrify any monster or red Daily that crosses your path! Confers no benefit. August 2025 Subscriber Item.",
|
"weaponMystery202508Notes": "This spinning blade will terrify any monster or red Daily that crosses your path! Confers no benefit. August 2025 Subscriber Item.",
|
||||||
"weaponMystery202511Text": "Frost Sword",
|
"weaponMystery202511Text": "Frost Sword",
|
||||||
"weaponMystery202511Notes": "The icy glow of this sword will make quick work of even dark red tasks. Confers no benefit. November 2025 Subscriber Item.",
|
"weaponMystery202511Notes": "The icy glow of this sword will make quick work of even dark red tasks. Confers no benefit. November 2025 Subscriber Item.",
|
||||||
|
"weaponMystery202512Text": "Cookie Champion's Blade",
|
||||||
|
"weaponMystery202512Notes": "A shining sword cast from sugar, mint, and arcane enchantments. Confers no benefit. December 2025 Subscriber Item.",
|
||||||
|
"weaponMystery202601Text": "Winter's Aegis",
|
||||||
|
"weaponMystery202601Notes": "An icy bubble shield that grants magical protection from opposing elements. Confers no benefit. January 2026 Subscriber Item.",
|
||||||
|
|
||||||
"weaponMystery301404Text": "Steampunk Cane",
|
"weaponMystery301404Text": "Steampunk Cane",
|
||||||
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
|
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
|
||||||
@@ -648,7 +661,7 @@
|
|||||||
"weaponArmoireBasicLongbowText": "Basic Longbow",
|
"weaponArmoireBasicLongbowText": "Basic Longbow",
|
||||||
"weaponArmoireBasicLongbowNotes": "A serviceable hand-me-down bow. Increases Strength by <%= str %>. Enchanted Armoire: Basic Archer Set (Item 1 of 3).",
|
"weaponArmoireBasicLongbowNotes": "A serviceable hand-me-down bow. Increases Strength by <%= str %>. Enchanted Armoire: Basic Archer Set (Item 1 of 3).",
|
||||||
"weaponArmoireHabiticanDiplomaText": "Habitican Diploma",
|
"weaponArmoireHabiticanDiplomaText": "Habitican Diploma",
|
||||||
"weaponArmoireHabiticanDiplomaNotes": "A certificate of significant achievement -- well done! Increases Intelligence by <%= int %>. Enchanted Armoire: Graduate Set (Item 1 of 3).",
|
"weaponArmoireHabiticanDiplomaNotes": "A certificate of significant achievement—well done! Increases Intelligence by <%= int %>. Enchanted Armoire: Graduate Set (Item 1 of 3).",
|
||||||
"weaponArmoireSandySpadeText": "Sandy Spade",
|
"weaponArmoireSandySpadeText": "Sandy Spade",
|
||||||
"weaponArmoireSandySpadeNotes": "A tool for digging, as well as flicking sand into the eyes of enemy monsters. Increases Strength by <%= str %>. Enchanted Armoire: Seaside Set (Item 1 of 3).",
|
"weaponArmoireSandySpadeNotes": "A tool for digging, as well as flicking sand into the eyes of enemy monsters. Increases Strength by <%= str %>. Enchanted Armoire: Seaside Set (Item 1 of 3).",
|
||||||
"weaponArmoireCannonText": "Cannon",
|
"weaponArmoireCannonText": "Cannon",
|
||||||
@@ -808,7 +821,7 @@
|
|||||||
"weaponArmoireCleaningClothText": "Cleaning Cloth",
|
"weaponArmoireCleaningClothText": "Cleaning Cloth",
|
||||||
"weaponArmoireCleaningClothNotes": "Take this tidying tool on your adventures and always be able to polish a pretty plaque or wipe a wooden windowsill. Increases Strength and Constitution by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set Two (Item 3 of 3)",
|
"weaponArmoireCleaningClothNotes": "Take this tidying tool on your adventures and always be able to polish a pretty plaque or wipe a wooden windowsill. Increases Strength and Constitution by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set Two (Item 3 of 3)",
|
||||||
"weaponArmoireRidingBroomText": "Riding Broom",
|
"weaponArmoireRidingBroomText": "Riding Broom",
|
||||||
"weaponArmoireRidingBroomNotes": "Run all your most magical errands on this fine broom--or, just take it for a joyride around the neighborhood. Whee! Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Spooky Sorcery Set (Item 1 of 3)",
|
"weaponArmoireRidingBroomNotes": "Run all your most magical errands on this fine broom—or, just take it for a joyride around the neighborhood. Whee! Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Spooky Sorcery Set (Item 1 of 3)",
|
||||||
"weaponArmoireRollingPinText": "Rolling Pin",
|
"weaponArmoireRollingPinText": "Rolling Pin",
|
||||||
"weaponArmoireRollingPinNotes": "Roll your dough as thin as you like in-between bonking bad habits when they pop up around you like a certain rodent-bopping game. Increases Strength by <%= str %>. Enchanted Armoire: Cooking Implements Set 2 (Item 2 of 2).",
|
"weaponArmoireRollingPinNotes": "Roll your dough as thin as you like in-between bonking bad habits when they pop up around you like a certain rodent-bopping game. Increases Strength by <%= str %>. Enchanted Armoire: Cooking Implements Set 2 (Item 2 of 2).",
|
||||||
"weaponArmoireScholarlyTextbooksText": "Scholarly Textbooks",
|
"weaponArmoireScholarlyTextbooksText": "Scholarly Textbooks",
|
||||||
@@ -837,6 +850,10 @@
|
|||||||
"weaponArmoireBeekeepersSmokerNotes": "Use this to calm your bees so you can retrieve some honey. The bees won’t mind. Honestly, we could all use a few extra minutes of calm from time to time. Increases Intelligence by <%= int %>. Enchanted Armoire: Beekeeper Set (Item 3 of 4).",
|
"weaponArmoireBeekeepersSmokerNotes": "Use this to calm your bees so you can retrieve some honey. The bees won’t mind. Honestly, we could all use a few extra minutes of calm from time to time. Increases Intelligence by <%= int %>. Enchanted Armoire: Beekeeper Set (Item 3 of 4).",
|
||||||
"weaponArmoireBlacksmithsHammerText": "Blacksmith's Hammer",
|
"weaponArmoireBlacksmithsHammerText": "Blacksmith's Hammer",
|
||||||
"weaponArmoireBlacksmithsHammerNotes": "This hammer is for metalworking, but it is perfectly adept amidst hot red coals and hot red Daily tasks, as well. Increases Strength by <%= str %>. Enchanted Armoire: Blacksmith Set (Item 3 of 3).",
|
"weaponArmoireBlacksmithsHammerNotes": "This hammer is for metalworking, but it is perfectly adept amidst hot red coals and hot red Daily tasks, as well. Increases Strength by <%= str %>. Enchanted Armoire: Blacksmith Set (Item 3 of 3).",
|
||||||
|
"weaponArmoireBambooFluteText": "Bamboo Flute",
|
||||||
|
"weaponArmoireBambooFluteNotes": "Hwhoooo! Hu-whooooo! Gather your party for a meditation session or self-care nap while relaxing to tunes played on this bamboo flute. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 2 of 3)",
|
||||||
|
"weaponArmoirePrettyPinkParasolText": "Pretty Pink Parasol",
|
||||||
|
"weaponArmoirePrettyPinkParasolNotes": "Pretty and practical is the preeminent permutation. And for a particularly impressive presentation, give this parasol a spin! Increases all stats by <%= attrs %> each. Enchanted Armoire: Pretty in Pink Set (Item 1 of 2)",
|
||||||
|
|
||||||
"armor": "armor",
|
"armor": "armor",
|
||||||
"armorCapitalized": "Armor",
|
"armorCapitalized": "Armor",
|
||||||
@@ -982,13 +999,13 @@
|
|||||||
"armorSpecialSummerHealerNotes": "This garment of shimmering scales transforms its wearer into a real Seahealer! Increases Constitution by <%= con %>. Limited Edition 2014 Summer Gear.",
|
"armorSpecialSummerHealerNotes": "This garment of shimmering scales transforms its wearer into a real Seahealer! Increases Constitution by <%= con %>. Limited Edition 2014 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFallRogueText": "Bloodred Robes",
|
"armorSpecialFallRogueText": "Bloodred Robes",
|
||||||
"armorSpecialFallRogueNotes": "Vivid. Velvet. Vampiric. Increases Perception by <%= per %>. Limited Edition 2014 Autumn Gear.",
|
"armorSpecialFallRogueNotes": "Vivid. Velvet. Vampiric. Increases Perception by <%= per %>. Limited Edition 2014 Fall Gear.",
|
||||||
"armorSpecialFallWarriorText": "Lab-coat of Science",
|
"armorSpecialFallWarriorText": "Lab-coat of Science",
|
||||||
"armorSpecialFallWarriorNotes": "Protects you from mysterious potion spills. Increases Constitution by <%= con %>. Limited Edition 2014 Autumn Gear.",
|
"armorSpecialFallWarriorNotes": "Protects you from mysterious potion spills. Increases Constitution by <%= con %>. Limited Edition 2014 Fall Gear.",
|
||||||
"armorSpecialFallMageText": "Witchy Wizard Robes",
|
"armorSpecialFallMageText": "Witchy Wizard Robes",
|
||||||
"armorSpecialFallMageNotes": "This robe has plenty of pockets to hold extra helpings of eye of newt and tongue of frog. Increases Intelligence by <%= int %>. Limited Edition 2014 Autumn Gear.",
|
"armorSpecialFallMageNotes": "This robe has plenty of pockets to hold extra helpings of eye of newt and tongue of frog. Increases Intelligence by <%= int %>. Limited Edition 2014 Fall Gear.",
|
||||||
"armorSpecialFallHealerText": "Gauzy Gear",
|
"armorSpecialFallHealerText": "Gauzy Gear",
|
||||||
"armorSpecialFallHealerNotes": "Charge into battle pre-bandaged! Increases Constitution by <%= con %>. Limited Edition 2014 Autumn Gear.",
|
"armorSpecialFallHealerNotes": "Charge into battle pre-bandaged! Increases Constitution by <%= con %>. Limited Edition 2014 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2015RogueText": "Icicle Drake Armor",
|
"armorSpecialWinter2015RogueText": "Icicle Drake Armor",
|
||||||
"armorSpecialWinter2015RogueNotes": "This armor is freezing cold, but it will definitely be worth it when you uncover the untold riches at the center of the Icicle Drake hives. Not that you are looking for any such untold riches, because you are truly, definitely, absolutely a genuine Icicle Drake, okay?! Stop asking questions! Increases Perception by <%= per %>. Limited Edition 2014-2015 Winter Gear.",
|
"armorSpecialWinter2015RogueNotes": "This armor is freezing cold, but it will definitely be worth it when you uncover the untold riches at the center of the Icicle Drake hives. Not that you are looking for any such untold riches, because you are truly, definitely, absolutely a genuine Icicle Drake, okay?! Stop asking questions! Increases Perception by <%= per %>. Limited Edition 2014-2015 Winter Gear.",
|
||||||
@@ -1018,13 +1035,13 @@
|
|||||||
"armorSpecialSummer2015HealerNotes": "This armor lets everyone know that you are an honest merchant sailor who would never dream of behaving like a scalawag. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
|
"armorSpecialSummer2015HealerNotes": "This armor lets everyone know that you are an honest merchant sailor who would never dream of behaving like a scalawag. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2015RogueText": "Bat-tle Armor",
|
"armorSpecialFall2015RogueText": "Bat-tle Armor",
|
||||||
"armorSpecialFall2015RogueNotes": "Fly into bat-tle! Increases Perception by <%= per %>. Limited Edition 2015 Autumn Gear.",
|
"armorSpecialFall2015RogueNotes": "Fly into bat-tle! Increases Perception by <%= per %>. Limited Edition 2015 Fall Gear.",
|
||||||
"armorSpecialFall2015WarriorText": "Scarecrow Armor",
|
"armorSpecialFall2015WarriorText": "Scarecrow Armor",
|
||||||
"armorSpecialFall2015WarriorNotes": "Despite being stuffed with straw, this armor is extremely hefty! Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
|
"armorSpecialFall2015WarriorNotes": "Despite being stuffed with straw, this armor is extremely hefty! Increases Constitution by <%= con %>. Limited Edition 2015 Fall Gear.",
|
||||||
"armorSpecialFall2015MageText": "Stitched Robes",
|
"armorSpecialFall2015MageText": "Stitched Robes",
|
||||||
"armorSpecialFall2015MageNotes": "Every stitch in this armor shimmers with enchantment. Increases Intelligence by <%= int %>. Limited Edition 2015 Autumn Gear.",
|
"armorSpecialFall2015MageNotes": "Every stitch in this armor shimmers with enchantment. Increases Intelligence by <%= int %>. Limited Edition 2015 Fall Gear.",
|
||||||
"armorSpecialFall2015HealerText": "Potioner Robes",
|
"armorSpecialFall2015HealerText": "Potioner Robes",
|
||||||
"armorSpecialFall2015HealerNotes": "What? Of course that was a potion of constitution. No, you are definitely not turning into a frog! Don't be ribbiticulous. Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
|
"armorSpecialFall2015HealerNotes": "What? Of course that was a potion of constitution. No, you are definitely not turning into a frog! Don't be ribbiticulous. Increases Constitution by <%= con %>. Limited Edition 2015 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2016RogueText": "Cocoa Armor",
|
"armorSpecialWinter2016RogueText": "Cocoa Armor",
|
||||||
"armorSpecialWinter2016RogueNotes": "This leather armor keeps you nice and toasty. Is it actually made from cocoa? You'll never tell. Increases Perception by <%= per %>. Limited Edition 2015-2016 Winter Gear.",
|
"armorSpecialWinter2016RogueNotes": "This leather armor keeps you nice and toasty. Is it actually made from cocoa? You'll never tell. Increases Perception by <%= per %>. Limited Edition 2015-2016 Winter Gear.",
|
||||||
@@ -1054,13 +1071,13 @@
|
|||||||
"armorSpecialSummer2016HealerNotes": "This spiky garment transforms its wearer into a real Seahorse Healer! Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
|
"armorSpecialSummer2016HealerNotes": "This spiky garment transforms its wearer into a real Seahorse Healer! Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2016RogueText": "Black Widow Armor",
|
"armorSpecialFall2016RogueText": "Black Widow Armor",
|
||||||
"armorSpecialFall2016RogueNotes": "The eyes on this armor are constantly blinking. Increases Perception by <%= per %>. Limited Edition 2016 Autumn Gear.",
|
"armorSpecialFall2016RogueNotes": "The eyes on this armor are constantly blinking. Increases Perception by <%= per %>. Limited Edition 2016 Fall Gear.",
|
||||||
"armorSpecialFall2016WarriorText": "Slime-Streaked Armor",
|
"armorSpecialFall2016WarriorText": "Slime-Streaked Armor",
|
||||||
"armorSpecialFall2016WarriorNotes": "Mysteriously moist and mossy! Increases Constitution by <%= con %>. Limited Edition 2016 Autumn Gear.",
|
"armorSpecialFall2016WarriorNotes": "Mysteriously moist and mossy! Increases Constitution by <%= con %>. Limited Edition 2016 Fall Gear.",
|
||||||
"armorSpecialFall2016MageText": "Cloak of Wickedness",
|
"armorSpecialFall2016MageText": "Cloak of Wickedness",
|
||||||
"armorSpecialFall2016MageNotes": "When your cloak flaps, you hear the sound of cackling laughter. Increases Intelligence by <%= int %>. Limited Edition 2016 Autumn Gear.",
|
"armorSpecialFall2016MageNotes": "When your cloak flaps, you hear the sound of cackling laughter. Increases Intelligence by <%= int %>. Limited Edition 2016 Fall Gear.",
|
||||||
"armorSpecialFall2016HealerText": "Gorgon Robes",
|
"armorSpecialFall2016HealerText": "Gorgon Robes",
|
||||||
"armorSpecialFall2016HealerNotes": "These robes are actually made of stone. How are they so comfortable? Increases Constitution by <%= con %>. Limited Edition 2016 Autumn Gear.",
|
"armorSpecialFall2016HealerNotes": "These robes are actually made of stone. How are they so comfortable? Increases Constitution by <%= con %>. Limited Edition 2016 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2017RogueText": "Frosty Armor",
|
"armorSpecialWinter2017RogueText": "Frosty Armor",
|
||||||
"armorSpecialWinter2017RogueNotes": "This stealthy suit reflects light to dazzle unsuspecting tasks as you take your rewards from them! Increases Perception by <%= per %>. Limited Edition 2016-2017 Winter Gear.",
|
"armorSpecialWinter2017RogueNotes": "This stealthy suit reflects light to dazzle unsuspecting tasks as you take your rewards from them! Increases Perception by <%= per %>. Limited Edition 2016-2017 Winter Gear.",
|
||||||
@@ -1090,13 +1107,13 @@
|
|||||||
"armorSpecialSummer2017HealerNotes": "This garment of silvery scales transforms its wearer into a real Seahealer! Increases Constitution by <%= con %>. Limited Edition 2017 Summer Gear.",
|
"armorSpecialSummer2017HealerNotes": "This garment of silvery scales transforms its wearer into a real Seahealer! Increases Constitution by <%= con %>. Limited Edition 2017 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2017RogueText": "Pumpkin Patch Robes",
|
"armorSpecialFall2017RogueText": "Pumpkin Patch Robes",
|
||||||
"armorSpecialFall2017RogueNotes": "Need to hide out? Crouch among the Jack o' Lanterns and these robes will conceal you! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.",
|
"armorSpecialFall2017RogueNotes": "Need to hide out? Crouch among the Jack o' Lanterns and these robes will conceal you! Increases Perception by <%= per %>. Limited Edition 2017 Fall Gear.",
|
||||||
"armorSpecialFall2017WarriorText": "Strong and Sweet Armor",
|
"armorSpecialFall2017WarriorText": "Strong and Sweet Armor",
|
||||||
"armorSpecialFall2017WarriorNotes": "This armor will protect you like a delicious candy shell. Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.",
|
"armorSpecialFall2017WarriorNotes": "This armor will protect you like a delicious candy shell. Increases Constitution by <%= con %>. Limited Edition 2017 Fall Gear.",
|
||||||
"armorSpecialFall2017MageText": "Masquerade Robes",
|
"armorSpecialFall2017MageText": "Masquerade Robes",
|
||||||
"armorSpecialFall2017MageNotes": "What masquerade ensemble would be complete without dramatic and sweeping robes? Increases Intelligence by <%= int %>. Limited Edition 2017 Autumn Gear.",
|
"armorSpecialFall2017MageNotes": "What masquerade ensemble would be complete without dramatic and sweeping robes? Increases Intelligence by <%= int %>. Limited Edition 2017 Fall Gear.",
|
||||||
"armorSpecialFall2017HealerText": "Haunted House Armor",
|
"armorSpecialFall2017HealerText": "Haunted House Armor",
|
||||||
"armorSpecialFall2017HealerNotes": "Your heart is an open door. And your shoulders are roofing tiles! Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.",
|
"armorSpecialFall2017HealerNotes": "Your heart is an open door. And your shoulders are roofing tiles! Increases Constitution by <%= con %>. Limited Edition 2017 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2018RogueText": "Reindeer Costume",
|
"armorSpecialWinter2018RogueText": "Reindeer Costume",
|
||||||
"armorSpecialWinter2018RogueNotes": "You look so cute and fuzzy, who could suspect you are after holiday loot? Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.",
|
"armorSpecialWinter2018RogueNotes": "You look so cute and fuzzy, who could suspect you are after holiday loot? Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.",
|
||||||
@@ -1126,13 +1143,13 @@
|
|||||||
"armorSpecialSummer2018HealerNotes": "These cerulean vestments reveal that you have land-walking feet... well. Not even a monarch can be expected to be perfect. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
|
"armorSpecialSummer2018HealerNotes": "These cerulean vestments reveal that you have land-walking feet... well. Not even a monarch can be expected to be perfect. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2018RogueText": "Alter Ego Frock Coat",
|
"armorSpecialFall2018RogueText": "Alter Ego Frock Coat",
|
||||||
"armorSpecialFall2018RogueNotes": "Style for the day. Comfort and protection for the night. Increases Perception by <%= per %>. Limited Edition 2018 Autumn Gear.",
|
"armorSpecialFall2018RogueNotes": "Style for the day. Comfort and protection for the night. Increases Perception by <%= per %>. Limited Edition 2018 Fall Gear.",
|
||||||
"armorSpecialFall2018WarriorText": "Minotaur Platemail",
|
"armorSpecialFall2018WarriorText": "Minotaur Platemail",
|
||||||
"armorSpecialFall2018WarriorNotes": "Complete with hooves to drum a soothing cadence as you walk your meditative labyrinth. Increases Constitution by <%= con %>. Limited Edition 2018 Autumn Gear.",
|
"armorSpecialFall2018WarriorNotes": "Complete with hooves to drum a soothing cadence as you walk your meditative labyrinth. Increases Constitution by <%= con %>. Limited Edition 2018 Fall Gear.",
|
||||||
"armorSpecialFall2018MageText": "Candymancer's Robes",
|
"armorSpecialFall2018MageText": "Candymancer's Robes",
|
||||||
"armorSpecialFall2018MageNotes": "The fabric of these robes has magic candy woven right in! However, we recommend you not attempt to eat them. Increases Intelligence by <%= int %>. Limited Edition 2018 Autumn Gear.",
|
"armorSpecialFall2018MageNotes": "The fabric of these robes has magic candy woven right in! However, we recommend you not attempt to eat them. Increases Intelligence by <%= int %>. Limited Edition 2018 Fall Gear.",
|
||||||
"armorSpecialFall2018HealerText": "Robes of Carnivory",
|
"armorSpecialFall2018HealerText": "Robes of Carnivory",
|
||||||
"armorSpecialFall2018HealerNotes": "It's made from plants, but that doesn't mean it's vegetarian. Bad habits are afraid to come within miles of these robes. Increases Constitution by <%= con %>. Limited Edition 2018 Autumn Gear.",
|
"armorSpecialFall2018HealerNotes": "It's made from plants, but that doesn't mean it's vegetarian. Bad habits are afraid to come within miles of these robes. Increases Constitution by <%= con %>. Limited Edition 2018 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2019RogueText": "Poinsettia Armor",
|
"armorSpecialWinter2019RogueText": "Poinsettia Armor",
|
||||||
"armorSpecialWinter2019RogueNotes": "With holiday greenery all about, no one will notice an extra shrubbery! You can move through seasonal gatherings with ease and stealth. Increases Perception by <%= per %>. Limited Edition 2018-2019 Winter Gear.",
|
"armorSpecialWinter2019RogueNotes": "With holiday greenery all about, no one will notice an extra shrubbery! You can move through seasonal gatherings with ease and stealth. Increases Perception by <%= per %>. Limited Edition 2018-2019 Winter Gear.",
|
||||||
@@ -1162,13 +1179,13 @@
|
|||||||
"armorSpecialSummer2019HealerNotes": "Glide sleekly through warm coastal waters with this elegant tail. Increases Constitution by <%= con %>. Limited Edition 2019 Summer Gear.",
|
"armorSpecialSummer2019HealerNotes": "Glide sleekly through warm coastal waters with this elegant tail. Increases Constitution by <%= con %>. Limited Edition 2019 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2019RogueText": "Caped Opera Coat",
|
"armorSpecialFall2019RogueText": "Caped Opera Coat",
|
||||||
"armorSpecialFall2019RogueNotes": "This outfit comes complete with white gloves, and is ideal for brooding in your private box above the stage or making startling entrances down grand staircases. Increases Perception by <%= per %>. Limited Edition 2019 Autumn Gear.",
|
"armorSpecialFall2019RogueNotes": "This outfit comes complete with white gloves, and is ideal for brooding in your private box above the stage or making startling entrances down grand staircases. Increases Perception by <%= per %>. Limited Edition 2019 Fall Gear.",
|
||||||
"armorSpecialFall2019WarriorText": "Wings of Night",
|
"armorSpecialFall2019WarriorText": "Wings of Night",
|
||||||
"armorSpecialFall2019WarriorNotes": "These feathered robes grant the power of flight, allowing you to soar over any battle. Increases Constitution by <%= con %>. Limited Edition 2019 Autumn Gear.",
|
"armorSpecialFall2019WarriorNotes": "These feathered robes grant the power of flight, allowing you to soar over any battle. Increases Constitution by <%= con %>. Limited Edition 2019 Fall Gear.",
|
||||||
"armorSpecialFall2019MageText": "Smock of Polyphemus",
|
"armorSpecialFall2019MageText": "Smock of Polyphemus",
|
||||||
"armorSpecialFall2019MageNotes": "Its namesake met a terrible fate. But you will not be so easily tricked! Garb yourself in this mantle of legend and nobody will surpass you. Increases Intelligence by <%= int %>. Limited Edition 2019 Autumn Gear.",
|
"armorSpecialFall2019MageNotes": "Its namesake met a terrible fate. But you will not be so easily tricked! Garb yourself in this mantle of legend and nobody will surpass you. Increases Intelligence by <%= int %>. Limited Edition 2019 Fall Gear.",
|
||||||
"armorSpecialFall2019HealerText": "Robes of Darkness",
|
"armorSpecialFall2019HealerText": "Robes of Darkness",
|
||||||
"armorSpecialFall2019HealerNotes": "It's said these robes are made of pure night. Use the dark power wisely! Increases Constitution by <%= con %>. Limited Edition 2019 Autumn Gear.",
|
"armorSpecialFall2019HealerNotes": "It's said these robes are made of pure night. Use the dark power wisely! Increases Constitution by <%= con %>. Limited Edition 2019 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2020RogueText": "Poofy Parka",
|
"armorSpecialWinter2020RogueText": "Poofy Parka",
|
||||||
"armorSpecialWinter2020RogueNotes": "While no doubt you can brave storms with the inner warmth of your drive and devotion, it doesn't hurt to dress for the weather. Increases Perception by <%= per %>. Limited Edition 2019-2020 Winter Gear.",
|
"armorSpecialWinter2020RogueNotes": "While no doubt you can brave storms with the inner warmth of your drive and devotion, it doesn't hurt to dress for the weather. Increases Perception by <%= per %>. Limited Edition 2019-2020 Winter Gear.",
|
||||||
@@ -1189,7 +1206,7 @@
|
|||||||
"armorSpecialSpring2020HealerNotes": "Wrap yourself in soft iris leaves and petals to fool enemies into underestimating your healing power. Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
|
"armorSpecialSpring2020HealerNotes": "Wrap yourself in soft iris leaves and petals to fool enemies into underestimating your healing power. Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
|
||||||
|
|
||||||
"armorSpecialSummer2020RogueText": "Crocodile Disguise",
|
"armorSpecialSummer2020RogueText": "Crocodile Disguise",
|
||||||
"armorSpecialSummer2020RogueNotes": "A crocodile makes the perfect Rogue, waiting for the perfect moment to strike. Borrow their skills--and their explosive speed. Increases Perception by <%= per %>. Limited Edition 2020 Summer Gear.",
|
"armorSpecialSummer2020RogueNotes": "A crocodile makes the perfect Rogue, waiting for the perfect moment to strike. Borrow their skills—and their explosive speed. Increases Perception by <%= per %>. Limited Edition 2020 Summer Gear.",
|
||||||
"armorSpecialSummer2020WarriorText": "Rainbow Trout Tail",
|
"armorSpecialSummer2020WarriorText": "Rainbow Trout Tail",
|
||||||
"armorSpecialSummer2020WarriorNotes": "You'll be the bright fish in a dull stream, with these dazzling scales! Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
|
"armorSpecialSummer2020WarriorNotes": "You'll be the bright fish in a dull stream, with these dazzling scales! Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
|
||||||
"armorSpecialSummer2020MageText": "Oarfish Armor",
|
"armorSpecialSummer2020MageText": "Oarfish Armor",
|
||||||
@@ -1198,13 +1215,13 @@
|
|||||||
"armorSpecialSummer2020HealerNotes": "You are as patient as the ocean, as strong as the currents, as dependable as the tides. Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
|
"armorSpecialSummer2020HealerNotes": "You are as patient as the ocean, as strong as the currents, as dependable as the tides. Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2020RogueText": "Statuesque Armor",
|
"armorSpecialFall2020RogueText": "Statuesque Armor",
|
||||||
"armorSpecialFall2020RogueNotes": "Take on the strength of stone with this armor, guaranteed to repel the fiercest attacks. Increases Perception by <%= per %>. Limited Edition 2020 Autumn Gear.",
|
"armorSpecialFall2020RogueNotes": "Take on the strength of stone with this armor, guaranteed to repel the fiercest attacks. Increases Perception by <%= per %>. Limited Edition 2020 Fall Gear.",
|
||||||
"armorSpecialFall2020WarriorText": "Revenant's Robes",
|
"armorSpecialFall2020WarriorText": "Revenant's Robes",
|
||||||
"armorSpecialFall2020WarriorNotes": "These robes once guarded a powerful Warrior from harm. They say the Warrior's spirit lingers in the cloth to guard a worthy successor. Increases Constitution by <%= con %>. Limited Edition 2020 Autumn Gear.",
|
"armorSpecialFall2020WarriorNotes": "These robes once guarded a powerful Warrior from harm. They say the Warrior's spirit lingers in the cloth to guard a worthy successor. Increases Constitution by <%= con %>. Limited Edition 2020 Fall Gear.",
|
||||||
"armorSpecialFall2020MageText": "Aloft Upon Enlightenment",
|
"armorSpecialFall2020MageText": "Aloft Upon Enlightenment",
|
||||||
"armorSpecialFall2020MageNotes": "These wide-winged robes give the impression of hovering or flight, symbolizing the far-seeing perspective granted by vast knowledge. Increases Intelligence by <%= int %>. Limited Edition 2020 Autumn Gear.",
|
"armorSpecialFall2020MageNotes": "These wide-winged robes give the impression of hovering or flight, symbolizing the far-seeing perspective granted by vast knowledge. Increases Intelligence by <%= int %>. Limited Edition 2020 Fall Gear.",
|
||||||
"armorSpecialFall2020HealerText": "Hawkmoth Wings",
|
"armorSpecialFall2020HealerText": "Hawkmoth Wings",
|
||||||
"armorSpecialFall2020HealerNotes": "Your splendor unfurls by night, and those who witness you in flight wonder at what this omen could mean. Increases Constitution by <%= con %>. Limited Edition 2020 Autumn Gear.",
|
"armorSpecialFall2020HealerNotes": "Your splendor unfurls by night, and those who witness you in flight wonder at what this omen could mean. Increases Constitution by <%= con %>. Limited Edition 2020 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2021RogueText": "Ivy-Green Garb",
|
"armorSpecialWinter2021RogueText": "Ivy-Green Garb",
|
||||||
"armorSpecialWinter2021RogueNotes": "Melt into the shadows of the evergreen wood! Increases Perception by <%= per %>. Limited Edition 2020-2021 Winter Gear.",
|
"armorSpecialWinter2021RogueNotes": "Melt into the shadows of the evergreen wood! Increases Perception by <%= per %>. Limited Edition 2020-2021 Winter Gear.",
|
||||||
@@ -1234,13 +1251,13 @@
|
|||||||
"armorSpecialSummer2021HealerNotes": "Your enemies might suspect you're a featherweight, but this armor will keep you safe while you help your Party. Increases Constitution by <%= con %>. Limited Edition 2021 Summer Gear.",
|
"armorSpecialSummer2021HealerNotes": "Your enemies might suspect you're a featherweight, but this armor will keep you safe while you help your Party. Increases Constitution by <%= con %>. Limited Edition 2021 Summer Gear.",
|
||||||
|
|
||||||
"armorSpecialFall2021RogueText": "Unfortunately Not Slimeproof Armor",
|
"armorSpecialFall2021RogueText": "Unfortunately Not Slimeproof Armor",
|
||||||
"armorSpecialFall2021RogueNotes": "It's got a skullcap, leather tunic, and metal rivets! It's great! But it does not provide a hermetic seal against goop! Increases Perception by <%= per %>. Limited Edition 2021 Autumn Gear.",
|
"armorSpecialFall2021RogueNotes": "It's got a skullcap, leather tunic, and metal rivets! It's great! But it does not provide a hermetic seal against goop! Increases Perception by <%= per %>. Limited Edition 2021 Fall Gear.",
|
||||||
"armorSpecialFall2021WarriorText": "Formal Wool Suit",
|
"armorSpecialFall2021WarriorText": "Formal Wool Suit",
|
||||||
"armorSpecialFall2021WarriorNotes": "A stunning suit that’s perfect to wear when crossing bridges in the dead of night. Increases Constitution by <%= con %>. Limited Edition 2021 Autumn Gear.",
|
"armorSpecialFall2021WarriorNotes": "A stunning suit that’s perfect to wear when crossing bridges in the dead of night. Increases Constitution by <%= con %>. Limited Edition 2021 Fall Gear.",
|
||||||
"armorSpecialFall2021MageText": "Gown of the Darkness Beneath",
|
"armorSpecialFall2021MageText": "Gown of the Darkness Beneath",
|
||||||
"armorSpecialFall2021MageNotes": "Collars with many pointy protrusions are the high fashion of low villains. Increases Intelligence by <%= int %>. Limited Edition 2021 Autumn Gear.",
|
"armorSpecialFall2021MageNotes": "Collars with many pointy protrusions are the high fashion of low villains. Increases Intelligence by <%= int %>. Limited Edition 2021 Fall Gear.",
|
||||||
"armorSpecialFall2021HealerText": "Summoner's Robes",
|
"armorSpecialFall2021HealerText": "Summoner's Robes",
|
||||||
"armorSpecialFall2021HealerNotes": "Made of durable, flame-resistant fabric, these robes are perfect to wear when conjuring healing flames. Increases Constitution by <%= con %>. Limited Edition 2021 Autumn Gear.",
|
"armorSpecialFall2021HealerNotes": "Made of durable, flame-resistant fabric, these robes are perfect to wear when conjuring healing flames. Increases Constitution by <%= con %>. Limited Edition 2021 Fall Gear.",
|
||||||
|
|
||||||
"armorSpecialWinter2022RogueText": "Dazzling Explosion",
|
"armorSpecialWinter2022RogueText": "Dazzling Explosion",
|
||||||
"armorSpecialWinter2022RogueNotes": "If they're seeing stars, they're not seeing you! Yes, let's go with that. Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
"armorSpecialWinter2022RogueNotes": "If they're seeing stars, they're not seeing you! Yes, let's go with that. Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
||||||
@@ -1386,6 +1403,15 @@
|
|||||||
"armorSpecialFall2025MageText": "Masked Ghost Armor",
|
"armorSpecialFall2025MageText": "Masked Ghost Armor",
|
||||||
"armorSpecialFall2025MageNotes": "This seasonal armor becomes noncorporeal only after you put it on. Increases Intelligence by <%= int %>. Limited Edition Fall 2025 Gear.",
|
"armorSpecialFall2025MageNotes": "This seasonal armor becomes noncorporeal only after you put it on. Increases Intelligence by <%= int %>. Limited Edition Fall 2025 Gear.",
|
||||||
|
|
||||||
|
"armorSpecialWinter2026WarriorText": "Rime Reaper Suit",
|
||||||
|
"armorSpecialWinter2026WarriorNotes": "Icicles will snap and slide with every step on your way to completing your Dailies. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"armorSpecialWinter2026RogueText": "Ski Suit and Skis",
|
||||||
|
"armorSpecialWinter2026RogueNotes": "Go speedily swishing down the slopes on your way to completing your Dailies. Increases Perception by <%= per %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"armorSpecialWinter2026HealerText": "Polar Robe",
|
||||||
|
"armorSpecialWinter2026HealerNotes": "Like a natural light show, you will be stunning on your way to completing your Dailies. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"armorSpecialWinter2026MageText": "Midwinter Candle Robe",
|
||||||
|
"armorSpecialWinter2026MageNotes": "Glide smoothly along your path like wax on your way to completing your Dailies. Increases Intelligence by <%= int %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
|
||||||
"armorMystery201402Text": "Messenger Robes",
|
"armorMystery201402Text": "Messenger Robes",
|
||||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||||
"armorMystery201403Text": "Forest Walker Armor",
|
"armorMystery201403Text": "Forest Walker Armor",
|
||||||
@@ -1522,6 +1548,8 @@
|
|||||||
"armorMystery202504Notes": "Abominable? More like adorable! Confers no benefit. April 2025 Subscriber Item.",
|
"armorMystery202504Notes": "Abominable? More like adorable! Confers no benefit. April 2025 Subscriber Item.",
|
||||||
"armorMystery202509Text": "Windswept Wanderer's Robe",
|
"armorMystery202509Text": "Windswept Wanderer's Robe",
|
||||||
"armorMystery202509Notes": "Bright silks protect you from the weather, hot or cold. Confers no benefit. September 2025 Subscriber Item.",
|
"armorMystery202509Notes": "Bright silks protect you from the weather, hot or cold. Confers no benefit. September 2025 Subscriber Item.",
|
||||||
|
"armorMystery202512Text": "Cookie Champion Armor",
|
||||||
|
"armorMystery202512Notes": "Ready for battle in this plate that is both sweet and strong. Confers no benefit. December 2025 Subscriber Item.",
|
||||||
|
|
||||||
"armorMystery301404Text": "Steampunk Suit",
|
"armorMystery301404Text": "Steampunk Suit",
|
||||||
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
|
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
|
||||||
@@ -1621,7 +1649,7 @@
|
|||||||
"armorArmoireCoverallsOfBookbindingText": "Coveralls of Bookbinding",
|
"armorArmoireCoverallsOfBookbindingText": "Coveralls of Bookbinding",
|
||||||
"armorArmoireCoverallsOfBookbindingNotes": "Everything you need in a set of coveralls, including pockets for everything. A pair of goggles, loose change, a golden ring... Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Bookbinder Set (Item 2 of 4).",
|
"armorArmoireCoverallsOfBookbindingNotes": "Everything you need in a set of coveralls, including pockets for everything. A pair of goggles, loose change, a golden ring... Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Bookbinder Set (Item 2 of 4).",
|
||||||
"armorArmoireRobeOfSpadesText": "Robe of Spades",
|
"armorArmoireRobeOfSpadesText": "Robe of Spades",
|
||||||
"armorArmoireRobeOfSpadesNotes": "These luxuriant robes conceal hidden pockets for treasures or weapons--your choice! Increases Strength by <%= str %>. Enchanted Armoire: Ace of Spades Set (Item 2 of 3).",
|
"armorArmoireRobeOfSpadesNotes": "These luxuriant robes conceal hidden pockets for treasures or weapons—your choice! Increases Strength by <%= str %>. Enchanted Armoire: Ace of Spades Set (Item 2 of 3).",
|
||||||
"armorArmoireSoftBlueSuitText": "Soft Blue Suit",
|
"armorArmoireSoftBlueSuitText": "Soft Blue Suit",
|
||||||
"armorArmoireSoftBlueSuitNotes": "Blue is a calming colour. So calming, some even wear this soft outfit to sleep... zZz. Increases Intelligence by <%= int %> and Perception by <%= per %>. Enchanted Armoire: Blue Loungewear Set (Item 2 of 3).",
|
"armorArmoireSoftBlueSuitNotes": "Blue is a calming colour. So calming, some even wear this soft outfit to sleep... zZz. Increases Intelligence by <%= int %> and Perception by <%= per %>. Enchanted Armoire: Blue Loungewear Set (Item 2 of 3).",
|
||||||
"armorArmoireSoftGreenSuitText": "Soft Green Suit",
|
"armorArmoireSoftGreenSuitText": "Soft Green Suit",
|
||||||
@@ -1683,7 +1711,7 @@
|
|||||||
"armorArmoireMedievalLaundryDressText": "Laundry Dress",
|
"armorArmoireMedievalLaundryDressText": "Laundry Dress",
|
||||||
"armorArmoireMedievalLaundryDressNotes": "Put on your apron and roll up your sleeves: it's time to get the laundry done! Increases Constitution by <%= con %>. Enchanted Armoire: Medieval Launderers Set (Item 2 of 6).",
|
"armorArmoireMedievalLaundryDressNotes": "Put on your apron and roll up your sleeves: it's time to get the laundry done! Increases Constitution by <%= con %>. Enchanted Armoire: Medieval Launderers Set (Item 2 of 6).",
|
||||||
"armorArmoireBathtubText": "Bathtub",
|
"armorArmoireBathtubText": "Bathtub",
|
||||||
"armorArmoireBathtubNotes": "Time for a little R&R? Here's your own personal bathtub -- and a guarantee that the water is always the right temperature! Increases Constitution by <%= con %>. Enchanted Armoire: Bubble Bath Set (Item 2 of 4).",
|
"armorArmoireBathtubNotes": "Time for a little R&R? Here's your own personal bathtub—and a guarantee that the water is always the right temperature! Increases Constitution by <%= con %>. Enchanted Armoire: Bubble Bath Set (Item 2 of 4).",
|
||||||
"armorArmoireBagpipersKiltText": "Bagpiper's Kilt",
|
"armorArmoireBagpipersKiltText": "Bagpiper's Kilt",
|
||||||
"armorArmoireBagpipersKiltNotes": "A good sturdy kilt will serve you well. Increases Constitution by <%= con %>. Enchanted Armoire: Bagpiper Set (Item 2 of 3).",
|
"armorArmoireBagpipersKiltNotes": "A good sturdy kilt will serve you well. Increases Constitution by <%= con %>. Enchanted Armoire: Bagpiper Set (Item 2 of 3).",
|
||||||
"armorArmoireHeraldsTunicText": "Herald's Tunic",
|
"armorArmoireHeraldsTunicText": "Herald's Tunic",
|
||||||
@@ -1770,6 +1798,8 @@
|
|||||||
"armorArmoireBlacksmithsApronNotes": "This apron doesn’t feel as heavy as it looks once you’ve got it on. It will shield you from stray sparks while allowing you to maneuver freely. Increases Constitution by <%= con %>. Enchanted Armoire: Blacksmith Set (Item 2 of 3).",
|
"armorArmoireBlacksmithsApronNotes": "This apron doesn’t feel as heavy as it looks once you’ve got it on. It will shield you from stray sparks while allowing you to maneuver freely. Increases Constitution by <%= con %>. Enchanted Armoire: Blacksmith Set (Item 2 of 3).",
|
||||||
"armorArmoireBlackPartyDressText": "Black Party Dress",
|
"armorArmoireBlackPartyDressText": "Black Party Dress",
|
||||||
"armorArmoireBlackPartyDressNotes": "You’re strong, smart, hearty, and so fashionable! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 2 of 2).",
|
"armorArmoireBlackPartyDressNotes": "You’re strong, smart, hearty, and so fashionable! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 2 of 2).",
|
||||||
|
"armorArmoireLoneCowpokeOutfitText": "Lone Cowpoke Outfit",
|
||||||
|
"armorArmoireLoneCowpokeOutfitNotes": "Whoa, there! Want to make a statement when you ride into town as a mysterious stranger ready to be productive? Here’s the perfect outfit, complete with chaps and a shining, silver belt buckle. Increases Constitution by <%= con %>. Enchanted Armoire: Lone Cowpoke Set (Item 2 of 2)",
|
||||||
|
|
||||||
"headgear": "helm",
|
"headgear": "helm",
|
||||||
"headgearCapitalized": "Headgear",
|
"headgearCapitalized": "Headgear",
|
||||||
@@ -1838,7 +1868,7 @@
|
|||||||
"headSpecialLunarWarriorHelmText": "Lunar Warrior Helm",
|
"headSpecialLunarWarriorHelmText": "Lunar Warrior Helm",
|
||||||
"headSpecialLunarWarriorHelmNotes": "The power of the moon will strengthen you in battle! Increases Strength and Intelligence by <%= attrs %> each.",
|
"headSpecialLunarWarriorHelmNotes": "The power of the moon will strengthen you in battle! Increases Strength and Intelligence by <%= attrs %> each.",
|
||||||
"headSpecialMammothRiderHelmText": "Mammoth Rider Helm",
|
"headSpecialMammothRiderHelmText": "Mammoth Rider Helm",
|
||||||
"headSpecialMammothRiderHelmNotes": "Don't let its fluffiness fool you--this hat will grant you piercing powers of perception! Increases Perception by <%= per %>.",
|
"headSpecialMammothRiderHelmNotes": "Don't let its fluffiness fool you—this hat will grant you piercing powers of perception! Increases Perception by <%= per %>.",
|
||||||
"headSpecialPageHelmText": "Page Helm",
|
"headSpecialPageHelmText": "Page Helm",
|
||||||
"headSpecialPageHelmNotes": "Chainmail: for the stylish AND the practical. Increases Perception by <%= per %>.",
|
"headSpecialPageHelmNotes": "Chainmail: for the stylish AND the practical. Increases Perception by <%= per %>.",
|
||||||
"headSpecialRoguishRainbowMessengerHoodText": "Roguish Rainbow Messenger Hood",
|
"headSpecialRoguishRainbowMessengerHoodText": "Roguish Rainbow Messenger Hood",
|
||||||
@@ -1894,13 +1924,13 @@
|
|||||||
"headSpecialSummerHealerNotes": "Enables its wearer to heal damaged reefs. Increases Intelligence by <%= int %>. Limited Edition 2014 Summer Gear.",
|
"headSpecialSummerHealerNotes": "Enables its wearer to heal damaged reefs. Increases Intelligence by <%= int %>. Limited Edition 2014 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFallRogueText": "Bloodred Hood",
|
"headSpecialFallRogueText": "Bloodred Hood",
|
||||||
"headSpecialFallRogueNotes": "A Vampire Smiter's identity must always be hidden. Increases Perception by <%= per %>. Limited Edition 2014 Autumn Gear.",
|
"headSpecialFallRogueNotes": "A Vampire Smiter's identity must always be hidden. Increases Perception by <%= per %>. Limited Edition 2014 Fall Gear.",
|
||||||
"headSpecialFallWarriorText": "Monster Scalp of Science",
|
"headSpecialFallWarriorText": "Monster Scalp of Science",
|
||||||
"headSpecialFallWarriorNotes": "Graft on this helm! It's only SLIGHTLY used. Increases Strength by <%= str %>. Limited Edition 2014 Autumn Gear.",
|
"headSpecialFallWarriorNotes": "Graft on this helm! It's only SLIGHTLY used. Increases Strength by <%= str %>. Limited Edition 2014 Fall Gear.",
|
||||||
"headSpecialFallMageText": "Pointy Hat",
|
"headSpecialFallMageText": "Pointy Hat",
|
||||||
"headSpecialFallMageNotes": "Magic is woven into every thread of this hat. Increases Perception by <%= per %>. Limited Edition 2014 Autumn Gear.",
|
"headSpecialFallMageNotes": "Magic is woven into every thread of this hat. Increases Perception by <%= per %>. Limited Edition 2014 Fall Gear.",
|
||||||
"headSpecialFallHealerText": "Head Bandages",
|
"headSpecialFallHealerText": "Head Bandages",
|
||||||
"headSpecialFallHealerNotes": "Highly sanitary and very fashionable. Increases Intelligence by <%= int %>. Limited Edition 2014 Autumn Gear.",
|
"headSpecialFallHealerNotes": "Highly sanitary and very fashionable. Increases Intelligence by <%= int %>. Limited Edition 2014 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialNye2014Text": "Silly Party Hat",
|
"headSpecialNye2014Text": "Silly Party Hat",
|
||||||
"headSpecialNye2014Notes": "You've received a Silly Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
"headSpecialNye2014Notes": "You've received a Silly Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||||
@@ -1932,13 +1962,13 @@
|
|||||||
"headSpecialSummer2015HealerNotes": "With your sailor's cap set firmly on your head, you can navigate even the stormiest seas! Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.",
|
"headSpecialSummer2015HealerNotes": "With your sailor's cap set firmly on your head, you can navigate even the stormiest seas! Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2015RogueText": "Bat-tle Wings",
|
"headSpecialFall2015RogueText": "Bat-tle Wings",
|
||||||
"headSpecialFall2015RogueNotes": "Echolocate your enemies with this powerful helm! Increases Perception by <%= per %>. Limited Edition 2015 Autumn Gear.",
|
"headSpecialFall2015RogueNotes": "Echolocate your enemies with this powerful helm! Increases Perception by <%= per %>. Limited Edition 2015 Fall Gear.",
|
||||||
"headSpecialFall2015WarriorText": "Scarecrow Hat",
|
"headSpecialFall2015WarriorText": "Scarecrow Hat",
|
||||||
"headSpecialFall2015WarriorNotes": "Everyone would want this hat--if they only had a brain. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.",
|
"headSpecialFall2015WarriorNotes": "Everyone would want this hat—if they only had a brain. Increases Strength by <%= str %>. Limited Edition 2015 Fall Gear.",
|
||||||
"headSpecialFall2015MageText": "Stitched Hat",
|
"headSpecialFall2015MageText": "Stitched Hat",
|
||||||
"headSpecialFall2015MageNotes": "Every stitch in this hat augments its power. Increases Perception by <%= per %>. Limited Edition 2015 Autumn Gear.",
|
"headSpecialFall2015MageNotes": "Every stitch in this hat augments its power. Increases Perception by <%= per %>. Limited Edition 2015 Fall Gear.",
|
||||||
"headSpecialFall2015HealerText": "Hat of Frog",
|
"headSpecialFall2015HealerText": "Hat of Frog",
|
||||||
"headSpecialFall2015HealerNotes": "This is an extremely serious hat that is worthy of only the most advanced potioners. Increases Intelligence by <%= int %>. Limited Edition 2015 Autumn Gear.",
|
"headSpecialFall2015HealerNotes": "This is an extremely serious hat that is worthy of only the most advanced potioners. Increases Intelligence by <%= int %>. Limited Edition 2015 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialNye2015Text": "Ridiculous Party Hat",
|
"headSpecialNye2015Text": "Ridiculous Party Hat",
|
||||||
"headSpecialNye2015Notes": "You've received a Ridiculous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
"headSpecialNye2015Notes": "You've received a Ridiculous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||||
@@ -1970,13 +2000,13 @@
|
|||||||
"headSpecialSummer2016HealerNotes": "This helm indicates that the wearer was trained by the magical healing seahorses of Dilatory. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.",
|
"headSpecialSummer2016HealerNotes": "This helm indicates that the wearer was trained by the magical healing seahorses of Dilatory. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2016RogueText": "Black Widow Helm",
|
"headSpecialFall2016RogueText": "Black Widow Helm",
|
||||||
"headSpecialFall2016RogueNotes": "The legs on this helm are constantly twitching. Increases Perception by <%= per %>. Limited Edition 2016 Autumn Gear.",
|
"headSpecialFall2016RogueNotes": "The legs on this helm are constantly twitching. Increases Perception by <%= per %>. Limited Edition 2016 Fall Gear.",
|
||||||
"headSpecialFall2016WarriorText": "Gnarled Bark Helm",
|
"headSpecialFall2016WarriorText": "Gnarled Bark Helm",
|
||||||
"headSpecialFall2016WarriorNotes": "This swamp-sogged helm is covered with bits of bog. Increases Strength by <%= str %>. Limited Edition 2016 Autumn Gear.",
|
"headSpecialFall2016WarriorNotes": "This swamp-sogged helm is covered with bits of bog. Increases Strength by <%= str %>. Limited Edition 2016 Fall Gear.",
|
||||||
"headSpecialFall2016MageText": "Hood of Wickedness",
|
"headSpecialFall2016MageText": "Hood of Wickedness",
|
||||||
"headSpecialFall2016MageNotes": "Conceal your plotting beneath this shadowy hood. Increases Perception by <%= per %>. Limited Edition 2016 Autumn Gear.",
|
"headSpecialFall2016MageNotes": "Conceal your plotting beneath this shadowy hood. Increases Perception by <%= per %>. Limited Edition 2016 Fall Gear.",
|
||||||
"headSpecialFall2016HealerText": "Medusa's Crown",
|
"headSpecialFall2016HealerText": "Medusa's Crown",
|
||||||
"headSpecialFall2016HealerNotes": "Woe to anyone who looks you in the eyes... Increases Intelligence by <%= int %>. Limited Edition 2016 Autumn Gear.",
|
"headSpecialFall2016HealerNotes": "Woe to anyone who looks you in the eyes... Increases Intelligence by <%= int %>. Limited Edition 2016 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialNye2016Text": "Whimsical Party Hat",
|
"headSpecialNye2016Text": "Whimsical Party Hat",
|
||||||
"headSpecialNye2016Notes": "You've received a Whimsical Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
"headSpecialNye2016Notes": "You've received a Whimsical Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||||
@@ -2008,13 +2038,13 @@
|
|||||||
"headSpecialSummer2017HealerNotes": "This helm is made up of friendly sea creatures who are temporarily resting on your head, giving you sage advice. Increases Intelligence by <%= int %>. Limited Edition 2017 Summer Gear.",
|
"headSpecialSummer2017HealerNotes": "This helm is made up of friendly sea creatures who are temporarily resting on your head, giving you sage advice. Increases Intelligence by <%= int %>. Limited Edition 2017 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2017RogueText": "Jack-o-Lantern Helm",
|
"headSpecialFall2017RogueText": "Jack-o-Lantern Helm",
|
||||||
"headSpecialFall2017RogueNotes": "Ready for treats? Time to don this festive, glowing helm! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.",
|
"headSpecialFall2017RogueNotes": "Ready for treats? Time to don this festive, glowing helm! Increases Perception by <%= per %>. Limited Edition 2017 Fall Gear.",
|
||||||
"headSpecialFall2017WarriorText": "Candy Corn Helm",
|
"headSpecialFall2017WarriorText": "Candy Corn Helm",
|
||||||
"headSpecialFall2017WarriorNotes": "This helm might look like a treat, but wayward tasks won't find it so sweet! Increases Strength by <%= str %>. Limited Edition 2017 Autumn Gear.",
|
"headSpecialFall2017WarriorNotes": "This helm might look like a treat, but wayward tasks won't find it so sweet! Increases Strength by <%= str %>. Limited Edition 2017 Fall Gear.",
|
||||||
"headSpecialFall2017MageText": "Masquerade Helm",
|
"headSpecialFall2017MageText": "Masquerade Helm",
|
||||||
"headSpecialFall2017MageNotes": "When you appear in this feathery hat, everyone will be left guessing the identity of the magical stranger in the room! Increases Perception by <%= per %>. Limited Edition 2017 Autumn Gear.",
|
"headSpecialFall2017MageNotes": "When you appear in this feathery hat, everyone will be left guessing the identity of the magical stranger in the room! Increases Perception by <%= per %>. Limited Edition 2017 Fall Gear.",
|
||||||
"headSpecialFall2017HealerText": "Haunted House Helm",
|
"headSpecialFall2017HealerText": "Haunted House Helm",
|
||||||
"headSpecialFall2017HealerNotes": "Invite spooky spirits and friendly creatures to seek your healing powers in this helm! Increases Intelligence by <%= int %>. Limited Edition 2017 Autumn Gear.",
|
"headSpecialFall2017HealerNotes": "Invite spooky spirits and friendly creatures to seek your healing powers in this helm! Increases Intelligence by <%= int %>. Limited Edition 2017 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialNye2017Text": "Fanciful Party Hat",
|
"headSpecialNye2017Text": "Fanciful Party Hat",
|
||||||
"headSpecialNye2017Notes": "You've received a Fanciful Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
"headSpecialNye2017Notes": "You've received a Fanciful Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||||
@@ -2046,13 +2076,13 @@
|
|||||||
"headSpecialSummer2018HealerNotes": "Adorned with aquamarine, this finned diadem marks leadership of folk, fish, and those who are a bit of both! Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
|
"headSpecialSummer2018HealerNotes": "Adorned with aquamarine, this finned diadem marks leadership of folk, fish, and those who are a bit of both! Increases Intelligence by <%= int %>. Limited Edition 2018 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2018RogueText": "Alter Ego Face",
|
"headSpecialFall2018RogueText": "Alter Ego Face",
|
||||||
"headSpecialFall2018RogueNotes": "Most of us hide away our inward struggles. This mask shows that we all experience tension between our good and bad impulses. Plus it comes with a sweet hat! Increases Perception by <%= per %>. Limited Edition 2018 Autumn Gear.",
|
"headSpecialFall2018RogueNotes": "Most of us hide away our inward struggles. This mask shows that we all experience tension between our good and bad impulses. Plus it comes with a sweet hat! Increases Perception by <%= per %>. Limited Edition 2018 Fall Gear.",
|
||||||
"headSpecialFall2018WarriorText": "Minotaur Visage",
|
"headSpecialFall2018WarriorText": "Minotaur Visage",
|
||||||
"headSpecialFall2018WarriorNotes": "This fearsome mask shows you can really take your tasks by the horns! Increases Strength by <%= str %>. Limited Edition 2018 Autumn Gear.",
|
"headSpecialFall2018WarriorNotes": "This fearsome mask shows you can really take your tasks by the horns! Increases Strength by <%= str %>. Limited Edition 2018 Fall Gear.",
|
||||||
"headSpecialFall2018MageText": "Candymancer's Hat",
|
"headSpecialFall2018MageText": "Candymancer's Hat",
|
||||||
"headSpecialFall2018MageNotes": "This pointy hat is imbued with powerful spells of sweetness. Careful, if it gets wet it may become sticky! Increases Perception by <%= per %>. Limited Edition 2018 Autumn Gear.",
|
"headSpecialFall2018MageNotes": "This pointy hat is imbued with powerful spells of sweetness. Careful, if it gets wet it may become sticky! Increases Perception by <%= per %>. Limited Edition 2018 Fall Gear.",
|
||||||
"headSpecialFall2018HealerText": "Ravenous Helm",
|
"headSpecialFall2018HealerText": "Ravenous Helm",
|
||||||
"headSpecialFall2018HealerNotes": "This helm is fashioned from a carnivorous plant renowned for its ability to dispatch zombies and other inconveniences. Just watch out that it doesn't chew on your head. Increases Intelligence by <%= int %>. Limited Edition 2018 Autumn Gear.",
|
"headSpecialFall2018HealerNotes": "This helm is fashioned from a carnivorous plant renowned for its ability to dispatch zombies and other inconveniences. Just watch out that it doesn't chew on your head. Increases Intelligence by <%= int %>. Limited Edition 2018 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialNye2018Text": "Outlandish Party Hat",
|
"headSpecialNye2018Text": "Outlandish Party Hat",
|
||||||
"headSpecialNye2018Notes": "You've received an Outlandish Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
"headSpecialNye2018Notes": "You've received an Outlandish Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||||
@@ -2084,13 +2114,13 @@
|
|||||||
"headSpecialSummer2019HealerNotes": "The spiraling structure of this shell will help you hear any cry for help across the seven seas. Increases Intelligence by <%= int %>. Limited Edition 2019 Summer Gear.",
|
"headSpecialSummer2019HealerNotes": "The spiraling structure of this shell will help you hear any cry for help across the seven seas. Increases Intelligence by <%= int %>. Limited Edition 2019 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2019RogueText": "Antique Opera Hat",
|
"headSpecialFall2019RogueText": "Antique Opera Hat",
|
||||||
"headSpecialFall2019RogueNotes": "Did you find this headpiece at an auction of possibly-cursed costume pieces, or in the attic of an eccentric grandparent? Whatever its origin, its age and wear add to your air of mystery. Increases Perception by <%= per %>. Limited Edition 2019 Autumn Gear.",
|
"headSpecialFall2019RogueNotes": "Did you find this headpiece at an auction of possibly-cursed costume pieces, or in the attic of an eccentric grandparent? Whatever its origin, its age and wear add to your air of mystery. Increases Perception by <%= per %>. Limited Edition 2019 Fall Gear.",
|
||||||
"headSpecialFall2019WarriorText": "Obsidian Skull Helmet",
|
"headSpecialFall2019WarriorText": "Obsidian Skull Helmet",
|
||||||
"headSpecialFall2019WarriorNotes": "The dark eye-sockets of this skull helmet will daunt the bravest of your enemies. Increases Strength by <%= str %>. Limited Edition 2019 Autumn Gear.",
|
"headSpecialFall2019WarriorNotes": "The dark eye-sockets of this skull helmet will daunt the bravest of your enemies. Increases Strength by <%= str %>. Limited Edition 2019 Fall Gear.",
|
||||||
"headSpecialFall2019MageText": "Cyclops Mask",
|
"headSpecialFall2019MageText": "Cyclops Mask",
|
||||||
"headSpecialFall2019MageNotes": "Its single baleful eye does inhibit depth perception, but that is a small price to pay for the way it hones your focus to a single, intense point. Increases Perception by <%= per %>. Limited Edition 2019 Autumn Gear.",
|
"headSpecialFall2019MageNotes": "Its single baleful eye does inhibit depth perception, but that is a small price to pay for the way it hones your focus to a single, intense point. Increases Perception by <%= per %>. Limited Edition 2019 Fall Gear.",
|
||||||
"headSpecialFall2019HealerText": "Dark Miter",
|
"headSpecialFall2019HealerText": "Dark Miter",
|
||||||
"headSpecialFall2019HealerNotes": "Don this dark miter to harness the powers of the fearsome Lich. Increases Intelligence by <%= int %>. Limited Edition 2019 Autumn Gear.",
|
"headSpecialFall2019HealerNotes": "Don this dark miter to harness the powers of the fearsome Lich. Increases Intelligence by <%= int %>. Limited Edition 2019 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialNye2019Text": "Outrageous Party Hat",
|
"headSpecialNye2019Text": "Outrageous Party Hat",
|
||||||
"headSpecialNye2019Notes": "You've received an Outrageous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
"headSpecialNye2019Notes": "You've received an Outrageous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
|
||||||
@@ -2122,13 +2152,13 @@
|
|||||||
"headSpecialSummer2020HealerNotes": "Stand tall, that beachcombers may keep their hands out of your hair. Increases Intelligence by <%= int %>. Limited Edition 2020 Summer Gear.",
|
"headSpecialSummer2020HealerNotes": "Stand tall, that beachcombers may keep their hands out of your hair. Increases Intelligence by <%= int %>. Limited Edition 2020 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2020RogueText": "Two-Headed Stone Mask",
|
"headSpecialFall2020RogueText": "Two-Headed Stone Mask",
|
||||||
"headSpecialFall2020RogueNotes": "Look twice, act once: this mask makes it easy. Increases Perception by <%= per %>. Limited Edition 2020 Autumn Gear.",
|
"headSpecialFall2020RogueNotes": "Look twice, act once: this mask makes it easy. Increases Perception by <%= per %>. Limited Edition 2020 Fall Gear.",
|
||||||
"headSpecialFall2020WarriorText": "Creepy Cowl",
|
"headSpecialFall2020WarriorText": "Creepy Cowl",
|
||||||
"headSpecialFall2020WarriorNotes": "The Warrior who once wore this never flinched from the weightiest tasks! But others may flinch from you when you wear it... Increases Strength by <%= str %>. Limited Edition 2020 Autumn Gear.",
|
"headSpecialFall2020WarriorNotes": "The Warrior who once wore this never flinched from the weightiest tasks! But others may flinch from you when you wear it... Increases Strength by <%= str %>. Limited Edition 2020 Fall Gear.",
|
||||||
"headSpecialFall2020MageText": "Awakened Clarity",
|
"headSpecialFall2020MageText": "Awakened Clarity",
|
||||||
"headSpecialFall2020MageNotes": "With this cap seated perfectly on your brow, your third eye opens, allowing you to focus on what is otherwise invisible: mana flows, restless spirits, and forgotten To-Dos. Increases Perception by <%= per %>. Limited Edition 2020 Autumn Gear.",
|
"headSpecialFall2020MageNotes": "With this cap seated perfectly on your brow, your third eye opens, allowing you to focus on what is otherwise invisible: mana flows, restless spirits, and forgotten To-Dos. Increases Perception by <%= per %>. Limited Edition 2020 Fall Gear.",
|
||||||
"headSpecialFall2020HealerText": "Death's Head Mask",
|
"headSpecialFall2020HealerText": "Death's Head Mask",
|
||||||
"headSpecialFall2020HealerNotes": "The dreadful pallor of this skull-like visage shines as a warning to all mortals: Time is fleeting! Attend to thy deadlines, before it is too late! Increases Intelligence by <%= int %>. Limited Edition 2020 Autumn Gear.",
|
"headSpecialFall2020HealerNotes": "The dreadful pallor of this skull-like visage shines as a warning to all mortals: Time is fleeting! Attend to thy deadlines, before it is too late! Increases Intelligence by <%= int %>. Limited Edition 2020 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialWinter2021RogueText": "Ivy Mask",
|
"headSpecialWinter2021RogueText": "Ivy Mask",
|
||||||
"headSpecialWinter2021RogueNotes": "A rogue can go unseen in the woods with a mask like this. Increases Perception by <%= per %>. Limited Edition 2020-2021 Winter Gear.",
|
"headSpecialWinter2021RogueNotes": "A rogue can go unseen in the woods with a mask like this. Increases Perception by <%= per %>. Limited Edition 2020-2021 Winter Gear.",
|
||||||
@@ -2167,13 +2197,13 @@
|
|||||||
"headSpecialSummer2022HealerNotes": "Fish don't have ears, you say? Wait til you tell them the news. Increases Intelligence by <%= int %>. Limited Edition 2022 Summer Gear.",
|
"headSpecialSummer2022HealerNotes": "Fish don't have ears, you say? Wait til you tell them the news. Increases Intelligence by <%= int %>. Limited Edition 2022 Summer Gear.",
|
||||||
|
|
||||||
"headSpecialFall2021RogueText": "You Have Been Engulfed",
|
"headSpecialFall2021RogueText": "You Have Been Engulfed",
|
||||||
"headSpecialFall2021RogueNotes": "Welp, you're stuck. Now you are doomed to roam dungeon corridors, collecting debris. DOOOOMED! Increases Perception by <%= per %>. Limited Edition 2021 Autumn Gear.",
|
"headSpecialFall2021RogueNotes": "Welp, you're stuck. Now you are doomed to roam dungeon corridors, collecting debris. DOOOOMED! Increases Perception by <%= per %>. Limited Edition 2021 Fall Gear.",
|
||||||
"headSpecialFall2021WarriorText": "Headless Cravat",
|
"headSpecialFall2021WarriorText": "Headless Cravat",
|
||||||
"headSpecialFall2021WarriorNotes": "Lose your head over this formal collar and tie that complete your suit. Increases Strength by <%= str %>. Limited Edition 2021 Autumn Gear.",
|
"headSpecialFall2021WarriorNotes": "Lose your head over this formal collar and tie that complete your suit. Increases Strength by <%= str %>. Limited Edition 2021 Fall Gear.",
|
||||||
"headSpecialFall2021MageText": "Brain Eater Mask",
|
"headSpecialFall2021MageText": "Brain Eater Mask",
|
||||||
"headSpecialFall2021MageNotes": "The tentacles surrounding the mouth grab prey and hold its delicious thoughts close for you to savor. Increases Perception by <%= per %>. Limited Edition 2021 Autumn Gear.",
|
"headSpecialFall2021MageNotes": "The tentacles surrounding the mouth grab prey and hold its delicious thoughts close for you to savor. Increases Perception by <%= per %>. Limited Edition 2021 Fall Gear.",
|
||||||
"headSpecialFall2021HealerText": "Summoner's Mask",
|
"headSpecialFall2021HealerText": "Summoner's Mask",
|
||||||
"headSpecialFall2021HealerNotes": "Your own magic turns your hair into shocking, bright flames when you don this mask. Increases Intelligence by <%= int %>. Limited Edition 2021 Autumn Gear.",
|
"headSpecialFall2021HealerNotes": "Your own magic turns your hair into shocking, bright flames when you don this mask. Increases Intelligence by <%= int %>. Limited Edition 2021 Fall Gear.",
|
||||||
|
|
||||||
"headSpecialWinter2022RogueText": "Thundering Finale",
|
"headSpecialWinter2022RogueText": "Thundering Finale",
|
||||||
"headSpecialWinter2022RogueNotes": "What? Huh? There's a Rogue where? I'm sorry, I can't hear anything over these fireworks! Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
"headSpecialWinter2022RogueNotes": "What? Huh? There's a Rogue where? I'm sorry, I can't hear anything over these fireworks! Increases Perception by <%= per %>. Limited Edition 2021-2022 Winter Gear.",
|
||||||
@@ -2283,7 +2313,7 @@
|
|||||||
"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.",
|
"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",
|
"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.",
|
"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",
|
"headSpecialWinter2025MageText": "Aurora Headdress",
|
||||||
"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.",
|
"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.",
|
||||||
|
|
||||||
"headSpecialSpring2025WarriorText": "Sunshine Helmet",
|
"headSpecialSpring2025WarriorText": "Sunshine Helmet",
|
||||||
@@ -2313,6 +2343,15 @@
|
|||||||
"headSpecialFall2025MageText": "Masked Ghost Mask",
|
"headSpecialFall2025MageText": "Masked Ghost Mask",
|
||||||
"headSpecialFall2025MageNotes": "Ethereal and glowy, this mask covers your head while you cover all your important tasks. Increases Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
|
"headSpecialFall2025MageNotes": "Ethereal and glowy, this mask covers your head while you cover all your important tasks. Increases Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
|
||||||
|
|
||||||
|
"headSpecialWinter2026WarriorText": "Rime Reaper Helmet",
|
||||||
|
"headSpecialWinter2026WarriorNotes": "Maintain focus and concentration as you set your sights on greater goals this season. Increases Strength by <%= str %>. Limited Edition 2025-2026 Winter Gear.",
|
||||||
|
"headSpecialWinter2026RogueText": "Ski Mask and Goggles",
|
||||||
|
"headSpecialWinter2026RogueNotes": "Maintain focus and vision as you set your sights on greater goals this season. Increases Perception by <%= per %>. Limited Edition 2025-2026 Winter Gear.",
|
||||||
|
"headSpecialWinter2026HealerText": "Polar Bear Mask",
|
||||||
|
"headSpecialWinter2026HealerNotes": "Maintain focus and clarity as you set your sights on greater goals this season. Increases Intelligence by <%= int %>. Limited Edition 2025-2026 Winter Gear.",
|
||||||
|
"headSpecialWinter2026MageText": "Midwinter Candle Hat",
|
||||||
|
"headSpecialWinter2026MageNotes": "Maintain focus and illumination as you set your sights on greater goals this season. Increases Perception by <%= per %>. Limited Edition 2025-2026 Winter Gear.",
|
||||||
|
|
||||||
"headSpecialGaymerxText": "Rainbow Warrior Helm",
|
"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.",
|
"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.",
|
||||||
|
|
||||||
@@ -2496,6 +2535,10 @@
|
|||||||
"headMystery202504Notes": "Wear this mysterious visage to dwell undetected among the world’s most obscure cyptids. Confers no benefit. April 2025 Subscriber Item.",
|
"headMystery202504Notes": "Wear this mysterious visage to dwell undetected among the world’s most obscure cyptids. Confers no benefit. April 2025 Subscriber Item.",
|
||||||
"headMystery202507Text": "Spunky Skater Cap",
|
"headMystery202507Text": "Spunky Skater Cap",
|
||||||
"headMystery202507Notes": "Backwards hats are still cool, right? Confers no benefit. July 2025 Subscriber Item.",
|
"headMystery202507Notes": "Backwards hats are still cool, right? Confers no benefit. July 2025 Subscriber Item.",
|
||||||
|
"headMystery202512Text": "Cookie Champion Helm",
|
||||||
|
"headMystery202512Notes": "Gingerbread forged with ancient magic will protect you as long as you can hold off your urge to try a bite! Confers no benefit. December 2025 Subscriber Item.",
|
||||||
|
"headMystery202602Text": "Sakura Fox Ears",
|
||||||
|
"headMystery202602Notes": " Your hearing will be sharpened by these ears such that you can hear the buds of blossoms growing on tree branches as spring approaches. Confers no benefit. February 2026 Subscriber Item.",
|
||||||
|
|
||||||
"headMystery301404Text": "Fancy Top Hat",
|
"headMystery301404Text": "Fancy Top Hat",
|
||||||
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
|
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
|
||||||
@@ -2724,6 +2767,8 @@
|
|||||||
"headArmoireBlackHairbowNotes": "Become strong, smart, and hearty while wearing this beautiful Black Hairbow! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 1 of 2).",
|
"headArmoireBlackHairbowNotes": "Become strong, smart, and hearty while wearing this beautiful Black Hairbow! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 1 of 2).",
|
||||||
"headArmoireBlacksmithsGogglesText": "Blacksmith's Goggles",
|
"headArmoireBlacksmithsGogglesText": "Blacksmith's Goggles",
|
||||||
"headArmoireBlacksmithsGogglesNotes": "Shatter and heat-resistant ocular protection is yours when you’re working in a forge. Increases Perception by <%= per %>. Enchanted Armoire: Blacksmith Set (Item 1 of 3).",
|
"headArmoireBlacksmithsGogglesNotes": "Shatter and heat-resistant ocular protection is yours when you’re working in a forge. Increases Perception by <%= per %>. Enchanted Armoire: Blacksmith Set (Item 1 of 3).",
|
||||||
|
"headArmoireLoneCowpokeHatText": "Lone Cowpoke Hat",
|
||||||
|
"headArmoireLoneCowpokeHatNotes": "Howdy there, pardner! D’you hate when you’re out on the range, workin’ on tasks, and sun gets in your eyes? Well, good thing you’ve got a hat for that now. Increases Perception by <%= per %>. Enchanted Armoire: Lone Cowpoke Set (Item 1 of 2)",
|
||||||
|
|
||||||
"offhand": "off-hand item",
|
"offhand": "off-hand item",
|
||||||
"offHandCapitalized": "Off-Hand Item",
|
"offHandCapitalized": "Off-Hand Item",
|
||||||
@@ -2796,9 +2841,9 @@
|
|||||||
"shieldSpecialSummerHealerNotes": "No one will dare to attack the coral reef when faced with this shiny shield! Increases Constitution by <%= con %>. Limited Edition 2014 Summer Gear.",
|
"shieldSpecialSummerHealerNotes": "No one will dare to attack the coral reef when faced with this shiny shield! Increases Constitution by <%= con %>. Limited Edition 2014 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFallWarriorText": "Potent Potion of Science",
|
"shieldSpecialFallWarriorText": "Potent Potion of Science",
|
||||||
"shieldSpecialFallWarriorNotes": "Spills mysteriously on lab coats. Increases Constitution by <%= con %>. Limited Edition 2014 Autumn Gear.",
|
"shieldSpecialFallWarriorNotes": "Spills mysteriously on lab coats. Increases Constitution by <%= con %>. Limited Edition 2014 Fall Gear.",
|
||||||
"shieldSpecialFallHealerText": "Jeweled Shield",
|
"shieldSpecialFallHealerText": "Jeweled Shield",
|
||||||
"shieldSpecialFallHealerNotes": "This glittery shield was found in an ancient tomb. Increases Constitution by <%= con %>. Limited Edition 2014 Autumn Gear.",
|
"shieldSpecialFallHealerNotes": "This glittery shield was found in an ancient tomb. Increases Constitution by <%= con %>. Limited Edition 2014 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2015WarriorText": "Gumdrop Shield",
|
"shieldSpecialWinter2015WarriorText": "Gumdrop Shield",
|
||||||
"shieldSpecialWinter2015WarriorNotes": "This seemingly-sugary shield is actually made of nutritious, gelatinous vegetables. Increases Constitution by <%= con %>. Limited Edition 2014-2015 Winter Gear.",
|
"shieldSpecialWinter2015WarriorNotes": "This seemingly-sugary shield is actually made of nutritious, gelatinous vegetables. Increases Constitution by <%= con %>. Limited Edition 2014-2015 Winter Gear.",
|
||||||
@@ -2816,9 +2861,9 @@
|
|||||||
"shieldSpecialSummer2015HealerNotes": "Use this shield to bash away bilge rats. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
|
"shieldSpecialSummer2015HealerNotes": "Use this shield to bash away bilge rats. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2015WarriorText": "Birdseed Bag",
|
"shieldSpecialFall2015WarriorText": "Birdseed Bag",
|
||||||
"shieldSpecialFall2015WarriorNotes": "It's true that you're supposed to be SCARING the crows, but there's nothing wrong with making friends! Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
|
"shieldSpecialFall2015WarriorNotes": "It's true that you're supposed to be SCARING the crows, but there's nothing wrong with making friends! Increases Constitution by <%= con %>. Limited Edition 2015 Fall Gear.",
|
||||||
"shieldSpecialFall2015HealerText": "Stirring Stick",
|
"shieldSpecialFall2015HealerText": "Stirring Stick",
|
||||||
"shieldSpecialFall2015HealerNotes": "This stick can stir anything without melting, dissolving, or bursting into flame! It can also be used to fiercely poke enemy tasks. Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
|
"shieldSpecialFall2015HealerNotes": "This stick can stir anything without melting, dissolving, or bursting into flame! It can also be used to fiercely poke enemy tasks. Increases Constitution by <%= con %>. Limited Edition 2015 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2016WarriorText": "Sled Shield",
|
"shieldSpecialWinter2016WarriorText": "Sled Shield",
|
||||||
"shieldSpecialWinter2016WarriorNotes": "Use this sled to block attacks, or ride it triumphantly into battle! Increases Constitution by <%= con %>. Limited Edition 2015-2016 Winter Gear.",
|
"shieldSpecialWinter2016WarriorNotes": "Use this sled to block attacks, or ride it triumphantly into battle! Increases Constitution by <%= con %>. Limited Edition 2015-2016 Winter Gear.",
|
||||||
@@ -2836,9 +2881,9 @@
|
|||||||
"shieldSpecialSummer2016HealerNotes": "Sometimes mistakenly called a Starfish Shield. Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
|
"shieldSpecialSummer2016HealerNotes": "Sometimes mistakenly called a Starfish Shield. Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2016WarriorText": "Defensive Roots",
|
"shieldSpecialFall2016WarriorText": "Defensive Roots",
|
||||||
"shieldSpecialFall2016WarriorNotes": "Defend against Dailies with these writhing roots! Increases Constitution by <%= con %>. Limited Edition 2016 Autumn Gear.",
|
"shieldSpecialFall2016WarriorNotes": "Defend against Dailies with these writhing roots! Increases Constitution by <%= con %>. Limited Edition 2016 Fall Gear.",
|
||||||
"shieldSpecialFall2016HealerText": "Gorgon Shield",
|
"shieldSpecialFall2016HealerText": "Gorgon Shield",
|
||||||
"shieldSpecialFall2016HealerNotes": "Don't admire your own reflection in this. Increases Constitution by <%= con %>. Limited Edition 2016 Autumn Gear.",
|
"shieldSpecialFall2016HealerNotes": "Don't admire your own reflection in this. Increases Constitution by <%= con %>. Limited Edition 2016 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2017WarriorText": "Puck Shield",
|
"shieldSpecialWinter2017WarriorText": "Puck Shield",
|
||||||
"shieldSpecialWinter2017WarriorNotes": "Made from a giant hockey puck, this shield can stand up to quite a beating. Increases Constitution by <%= con %>. Limited Edition 2016-2017 Winter Gear.",
|
"shieldSpecialWinter2017WarriorNotes": "Made from a giant hockey puck, this shield can stand up to quite a beating. Increases Constitution by <%= con %>. Limited Edition 2016-2017 Winter Gear.",
|
||||||
@@ -2856,9 +2901,9 @@
|
|||||||
"shieldSpecialSummer2017HealerNotes": "This magical oyster constantly generates pearls as well as protection. Increases Constitution by <%= con %>. Limited Edition 2017 Summer Gear.",
|
"shieldSpecialSummer2017HealerNotes": "This magical oyster constantly generates pearls as well as protection. Increases Constitution by <%= con %>. Limited Edition 2017 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2017WarriorText": "Candy Corn Shield",
|
"shieldSpecialFall2017WarriorText": "Candy Corn Shield",
|
||||||
"shieldSpecialFall2017WarriorNotes": "This candy shield has mighty protective powers, so try not to nibble on it! Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.",
|
"shieldSpecialFall2017WarriorNotes": "This candy shield has mighty protective powers, so try not to nibble on it! Increases Constitution by <%= con %>. Limited Edition 2017 Fall Gear.",
|
||||||
"shieldSpecialFall2017HealerText": "Haunted Orb",
|
"shieldSpecialFall2017HealerText": "Haunted Orb",
|
||||||
"shieldSpecialFall2017HealerNotes": "This orb occasionally screeches. We're sorry, we're not sure why. But it sure looks nifty! Increases Constitution by <%= con %>. Limited Edition 2017 Autumn Gear.",
|
"shieldSpecialFall2017HealerNotes": "This orb occasionally screeches. We're sorry, we're not sure why. But it sure looks nifty! Increases Constitution by <%= con %>. Limited Edition 2017 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2018WarriorText": "Magic Gift Bag",
|
"shieldSpecialWinter2018WarriorText": "Magic Gift Bag",
|
||||||
"shieldSpecialWinter2018WarriorNotes": "Just about any useful thing you need can be found in this sack, if you know the right magic words to whisper. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.",
|
"shieldSpecialWinter2018WarriorNotes": "Just about any useful thing you need can be found in this sack, if you know the right magic words to whisper. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.",
|
||||||
@@ -2876,11 +2921,11 @@
|
|||||||
"shieldSpecialSummer2018HealerNotes": "This shield can produce a dome of air for the benefit of land-dwelling visitors to your watery realm. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
|
"shieldSpecialSummer2018HealerNotes": "This shield can produce a dome of air for the benefit of land-dwelling visitors to your watery realm. Increases Constitution by <%= con %>. Limited Edition 2018 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2018RogueText": "Vial of Temptation",
|
"shieldSpecialFall2018RogueText": "Vial of Temptation",
|
||||||
"shieldSpecialFall2018RogueNotes": "This bottle represents all the distractions and troubles that keep you from being your best self. Resist! We're cheering for you! Increases Strength by <%= str %>. Limited Edition 2018 Autumn Gear.",
|
"shieldSpecialFall2018RogueNotes": "This bottle represents all the distractions and troubles that keep you from being your best self. Resist! We're cheering for you! Increases Strength by <%= str %>. Limited Edition 2018 Fall Gear.",
|
||||||
"shieldSpecialFall2018WarriorText": "Brilliant Shield",
|
"shieldSpecialFall2018WarriorText": "Brilliant Shield",
|
||||||
"shieldSpecialFall2018WarriorNotes": "Super shiny to dissuade any troublesome Gorgons from playing peek-a-boo around the corners! Increases Constitution by <%= con %>. Limited Edition 2018 Autumn Gear.",
|
"shieldSpecialFall2018WarriorNotes": "Super shiny to dissuade any troublesome Gorgons from playing peek-a-boo around the corners! Increases Constitution by <%= con %>. Limited Edition 2018 Fall Gear.",
|
||||||
"shieldSpecialFall2018HealerText": "Hungry Shield",
|
"shieldSpecialFall2018HealerText": "Hungry Shield",
|
||||||
"shieldSpecialFall2018HealerNotes": "With its wide-open maw, this shield will absorb all your enemies' blows. Increases Constitution by <%= con %>. Limited Edition 2018 Autumn Gear.",
|
"shieldSpecialFall2018HealerNotes": "With its wide-open maw, this shield will absorb all your enemies' blows. Increases Constitution by <%= con %>. Limited Edition 2018 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2019WarriorText": "Frozen Shield",
|
"shieldSpecialWinter2019WarriorText": "Frozen Shield",
|
||||||
"shieldSpecialWinter2019WarriorNotes": "This shield was fashioned using the thickest sheets of ice from the oldest glacier in the Stoïkalm Steppes. Increases Constitution by <%= con %>. Limited Edition 2018-2019 Winter Gear.",
|
"shieldSpecialWinter2019WarriorNotes": "This shield was fashioned using the thickest sheets of ice from the oldest glacier in the Stoïkalm Steppes. Increases Constitution by <%= con %>. Limited Edition 2018-2019 Winter Gear.",
|
||||||
@@ -2900,9 +2945,9 @@
|
|||||||
"shieldSpecialSummer2019MageNotes": "Sweating in the summer sun? No! Performing a simple elemental conjuration to fill the lily pond. Increases Perception by <%= per %>. Limited Edition 2019 Summer Gear.",
|
"shieldSpecialSummer2019MageNotes": "Sweating in the summer sun? No! Performing a simple elemental conjuration to fill the lily pond. Increases Perception by <%= per %>. Limited Edition 2019 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2019WarriorText": "Raven-Dark Shield",
|
"shieldSpecialFall2019WarriorText": "Raven-Dark Shield",
|
||||||
"shieldSpecialFall2019WarriorNotes": "The dark sheen of a raven's feather made solid, this shield will frustrate all attacks. Increases Constitution by <%= con %>. Limited Edition 2019 Autumn Gear.",
|
"shieldSpecialFall2019WarriorNotes": "The dark sheen of a raven's feather made solid, this shield will frustrate all attacks. Increases Constitution by <%= con %>. Limited Edition 2019 Fall Gear.",
|
||||||
"shieldSpecialFall2019HealerText": "Grotesque Grimoire",
|
"shieldSpecialFall2019HealerText": "Grotesque Grimoire",
|
||||||
"shieldSpecialFall2019HealerNotes": "Harness the dark side of the Healer's arts with this Grimoire! Increases Constitution by <%= con %>. Limited Edition 2019 Autumn Gear.",
|
"shieldSpecialFall2019HealerNotes": "Harness the dark side of the Healer's arts with this Grimoire! Increases Constitution by <%= con %>. Limited Edition 2019 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2020WarriorText": "Round Conifer Cone",
|
"shieldSpecialWinter2020WarriorText": "Round Conifer Cone",
|
||||||
"shieldSpecialWinter2020WarriorNotes": "Use it as a shield until the seeds drop, and then you can put it on a wreath! Increases Constitution by <%= con %>. Limited Edition 2019-2020 Winter Gear.",
|
"shieldSpecialWinter2020WarriorNotes": "Use it as a shield until the seeds drop, and then you can put it on a wreath! Increases Constitution by <%= con %>. Limited Edition 2019-2020 Winter Gear.",
|
||||||
@@ -2920,11 +2965,11 @@
|
|||||||
"shieldSpecialSummer2020HealerNotes": "As the motion of sand and water turns trash to treasure, so shall your magic turn wounds to strength. Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
|
"shieldSpecialSummer2020HealerNotes": "As the motion of sand and water turns trash to treasure, so shall your magic turn wounds to strength. Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2020RogueText": "Swift Katar",
|
"shieldSpecialFall2020RogueText": "Swift Katar",
|
||||||
"shieldSpecialFall2020RogueNotes": "Wielding a katar, you'd better be quick on your feet... This blade will serve you well if you strike fast, but don't over-commit! Increases Strength by <%= str %>. Limited Edition 2020 Autumn Gear.",
|
"shieldSpecialFall2020RogueNotes": "Wielding a katar, you'd better be quick on your feet... This blade will serve you well if you strike fast, but don't over-commit! Increases Strength by <%= str %>. Limited Edition 2020 Fall Gear.",
|
||||||
"shieldSpecialFall2020WarriorText": "Spirit's Shield",
|
"shieldSpecialFall2020WarriorText": "Spirit's Shield",
|
||||||
"shieldSpecialFall2020WarriorNotes": "It may look insubstantial, but this spectral shield can keep you safe from all kinds of harm. Increases Constitution by <%= con %>. Limited Edition 2020 Autumn Gear.",
|
"shieldSpecialFall2020WarriorNotes": "It may look insubstantial, but this spectral shield can keep you safe from all kinds of harm. Increases Constitution by <%= con %>. Limited Edition 2020 Fall Gear.",
|
||||||
"shieldSpecialFall2020HealerText": "Cocoon Carryall",
|
"shieldSpecialFall2020HealerText": "Cocoon Carryall",
|
||||||
"shieldSpecialFall2020HealerNotes": "Is it another moth you carry, still undergoing metamorphosis? Or simply a silken handbag, containing your tools of healing and prophecy? Increases Constitution by <%= con %>. Limited Edition 2020 Autumn Gear.",
|
"shieldSpecialFall2020HealerNotes": "Is it another moth you carry, still undergoing metamorphosis? Or simply a silken handbag, containing your tools of healing and prophecy? Increases Constitution by <%= con %>. Limited Edition 2020 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2021WarriorText": "Big Fish",
|
"shieldSpecialWinter2021WarriorText": "Big Fish",
|
||||||
"shieldSpecialWinter2021WarriorNotes": "Tell all your friends about the REALLY big fish you've caught! But whether you tell them he's made of plastic and sings songs is up to you. Increases Constitution by <%= con %>. Limited Edition 2020-2021 Winter Gear.",
|
"shieldSpecialWinter2021WarriorNotes": "Tell all your friends about the REALLY big fish you've caught! But whether you tell them he's made of plastic and sings songs is up to you. Increases Constitution by <%= con %>. Limited Edition 2020-2021 Winter Gear.",
|
||||||
@@ -2942,9 +2987,9 @@
|
|||||||
"shieldSpecialSummer2021HealerNotes": "So much potential in this shield! But for now you can use it to protect your friends. Increases Constitution by <%= con %>. Limited Edition 2021 Summer Gear.",
|
"shieldSpecialSummer2021HealerNotes": "So much potential in this shield! But for now you can use it to protect your friends. Increases Constitution by <%= con %>. Limited Edition 2021 Summer Gear.",
|
||||||
|
|
||||||
"shieldSpecialFall2021WarriorText": "Jack-o-Lantern Shield",
|
"shieldSpecialFall2021WarriorText": "Jack-o-Lantern Shield",
|
||||||
"shieldSpecialFall2021WarriorNotes": "This festive shield with its crooked smile will both protect you and light your way on a dark night. It nicely doubles for a head, should you need one! Increases Constitution by <%= con %>. Limited Edition 2021 Autumn Gear.",
|
"shieldSpecialFall2021WarriorNotes": "This festive shield with its crooked smile will both protect you and light your way on a dark night. It nicely doubles for a head, should you need one! Increases Constitution by <%= con %>. Limited Edition 2021 Fall Gear.",
|
||||||
"shieldSpecialFall2021HealerText": "Summoned Creature",
|
"shieldSpecialFall2021HealerText": "Summoned Creature",
|
||||||
"shieldSpecialFall2021HealerNotes": "An ethereal being rises from your magical flames to grant you extra protection. Increases Constitution by <%= con %>. Limited Edition 2021 Autumn Gear.",
|
"shieldSpecialFall2021HealerNotes": "An ethereal being rises from your magical flames to grant you extra protection. Increases Constitution by <%= con %>. Limited Edition 2021 Fall Gear.",
|
||||||
|
|
||||||
"shieldSpecialWinter2022WarriorText": "Jingle Bell Shield",
|
"shieldSpecialWinter2022WarriorText": "Jingle Bell Shield",
|
||||||
"shieldSpecialWinter2022WarriorNotes": "This is a jingle bell, jingle bell, jingle bell shield. Jingle bell protect and jingle bell deflect. Increases Constitution by <%= con %>. Limited Edition 2021-2022 Winter Gear.",
|
"shieldSpecialWinter2022WarriorNotes": "This is a jingle bell, jingle bell, jingle bell shield. Jingle bell protect and jingle bell deflect. Increases Constitution by <%= con %>. Limited Edition 2021-2022 Winter Gear.",
|
||||||
@@ -3036,6 +3081,11 @@
|
|||||||
"shieldSpecialFall2025HealerText": "Kobold Shield",
|
"shieldSpecialFall2025HealerText": "Kobold Shield",
|
||||||
"shieldSpecialFall2025HealerNotes": "Buy yourself some extra time to gather supplies by shielding yourself from your chores. Increases Constitution by <%= con %>. Limited Edition Fall 2025 Gear.",
|
"shieldSpecialFall2025HealerNotes": "Buy yourself some extra time to gather supplies by shielding yourself from your chores. Increases Constitution by <%= con %>. Limited Edition Fall 2025 Gear.",
|
||||||
|
|
||||||
|
"shieldSpecialWinter2026WarriorText": "Rime Shield",
|
||||||
|
"shieldSpecialWinter2026WarriorNotes": "Stop obstacles cold with this handy, spikey shield. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
"shieldSpecialWinter2026HealerText": "Starburst",
|
||||||
|
"shieldSpecialWinter2026HealerNotes": "Stars help with wayfinding, energy, and illumination—all things that help you better conquer a task list. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
|
||||||
|
|
||||||
"shieldMystery201601Text": "Resolution Slayer",
|
"shieldMystery201601Text": "Resolution Slayer",
|
||||||
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
|
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
|
||||||
"shieldMystery201701Text": "Time-Freezer Shield",
|
"shieldMystery201701Text": "Time-Freezer Shield",
|
||||||
@@ -3095,7 +3145,7 @@
|
|||||||
"shieldArmoireMushroomDruidShieldText": "Mushroom Druid Shield",
|
"shieldArmoireMushroomDruidShieldText": "Mushroom Druid Shield",
|
||||||
"shieldArmoireMushroomDruidShieldNotes": "Though made from a mushroom, there's nothing mushy about this tough shield! Increases Constitution by <%= con %> and Strength by <%= str %>. Enchanted Armoire: Mushroom Druid Set (Item 3 of 3).",
|
"shieldArmoireMushroomDruidShieldNotes": "Though made from a mushroom, there's nothing mushy about this tough shield! Increases Constitution by <%= con %> and Strength by <%= str %>. Enchanted Armoire: Mushroom Druid Set (Item 3 of 3).",
|
||||||
"shieldArmoireFestivalParasolText": "Festival Parasol",
|
"shieldArmoireFestivalParasolText": "Festival Parasol",
|
||||||
"shieldArmoireFestivalParasolNotes": "This lightweight parasol will shield you from the glare--whether it's from the sun or from dark red Dailies! Increases Constitution by <%= con %>. Enchanted Armoire: Festival Attire Set (Item 2 of 3).",
|
"shieldArmoireFestivalParasolNotes": "This lightweight parasol will shield you from the glare—whether it's from the sun or from dark red Dailies! Increases Constitution by <%= con %>. Enchanted Armoire: Festival Attire Set (Item 2 of 3).",
|
||||||
"shieldArmoireVikingShieldText": "Viking Shield",
|
"shieldArmoireVikingShieldText": "Viking Shield",
|
||||||
"shieldArmoireVikingShieldNotes": "This sturdy shield of wood and hide can stand up to the most daunting of foes. Increases Perception by <%= per %> and Intelligence by <%= int %>. Enchanted Armoire: Viking Set (Item 3 of 3).",
|
"shieldArmoireVikingShieldNotes": "This sturdy shield of wood and hide can stand up to the most daunting of foes. Increases Perception by <%= per %> and Intelligence by <%= int %>. Enchanted Armoire: Viking Set (Item 3 of 3).",
|
||||||
"shieldArmoireSwanFeatherFanText": "Swan Feather Fan",
|
"shieldArmoireSwanFeatherFanText": "Swan Feather Fan",
|
||||||
@@ -3189,7 +3239,7 @@
|
|||||||
"shieldArmoireBouncyBubblesText": "Bouncy Bubbles",
|
"shieldArmoireBouncyBubblesText": "Bouncy Bubbles",
|
||||||
"shieldArmoireBouncyBubblesNotes": "Complete your relaxing bath with these exuberant bubbles! Increases Strength by <%= str %>. Enchanted Armoire: Bubble Bath Set (Item 4 of 4).",
|
"shieldArmoireBouncyBubblesNotes": "Complete your relaxing bath with these exuberant bubbles! Increases Strength by <%= str %>. Enchanted Armoire: Bubble Bath Set (Item 4 of 4).",
|
||||||
"shieldArmoireBagpipesText": "Bagpipes",
|
"shieldArmoireBagpipesText": "Bagpipes",
|
||||||
"shieldArmoireBagpipesNotes": "The uncharitable might say you're planning to wake the dead with these bagpipes -- but you know you're just motivating your Party to success! Increases Strength by <%= str %>. Enchanted Armoire: Bagpiper Set (Item 3 of 3).",
|
"shieldArmoireBagpipesNotes": "The uncharitable might say you're planning to wake the dead with these bagpipes—but you know you're just motivating your Party to success! Increases Strength by <%= str %>. Enchanted Armoire: Bagpiper Set (Item 3 of 3).",
|
||||||
"shieldArmoireHeraldsMessageScrollText": "Herald's Message Scroll",
|
"shieldArmoireHeraldsMessageScrollText": "Herald's Message Scroll",
|
||||||
"shieldArmoireHeraldsMessageScrollNotes": "What exciting news does this scroll contain? Could it be about a new pet or a long habit streak? Increases Perception by <%= per %>. Enchanted Armoire: Herald Set (Item 4 of 4)",
|
"shieldArmoireHeraldsMessageScrollNotes": "What exciting news does this scroll contain? Could it be about a new pet or a long habit streak? Increases Perception by <%= per %>. Enchanted Armoire: Herald Set (Item 4 of 4)",
|
||||||
"shieldArmoireSoftBlackPillowText": "Soft Black Pillow",
|
"shieldArmoireSoftBlackPillowText": "Soft Black Pillow",
|
||||||
@@ -3244,6 +3294,10 @@
|
|||||||
"shieldArmoireFlyFishingRodNotes": "Put a lure on this long and flexible rod and fish will mistake it for an insect every single time. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fly Fishing Set (Item 3 of 3)",
|
"shieldArmoireFlyFishingRodNotes": "Put a lure on this long and flexible rod and fish will mistake it for an insect every single time. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fly Fishing Set (Item 3 of 3)",
|
||||||
"shieldArmoireSoftOrangePillowText": "Soft Orange Pillow",
|
"shieldArmoireSoftOrangePillowText": "Soft Orange Pillow",
|
||||||
"shieldArmoireSoftOrangePillowNotes": "The ready warrior packs a pillow for any expedition. Get ready to take on new obligations… even while you nap. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Orange Loungewear Set (Item 3 of 3).",
|
"shieldArmoireSoftOrangePillowNotes": "The ready warrior packs a pillow for any expedition. Get ready to take on new obligations… even while you nap. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Orange Loungewear Set (Item 3 of 3).",
|
||||||
|
"shieldArmoireDoubleBassText": "Double Bass",
|
||||||
|
"shieldArmoireDoubleBassNotes": "Bom doo bom brrrr brr brr brrrr! Gather your party for some grounding or dancing as you listen to music on this deep double bass. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 3 of 3)",
|
||||||
|
"shieldArmoirePrettyPinkGiftBoxText": "Pretty Pink Present",
|
||||||
|
"shieldArmoirePrettyPinkGiftBoxNotes": "Is this gift from a dear friend? A caring relative? A true love? A secret admirer? Whoever sent it knows you’ll be pleased with what’s inside. Increases all stats by <%= attrs %> each. Enchanted Armoire: Pretty in Pink Set (Item 2 of 2)",
|
||||||
|
|
||||||
"back": "Back Accessory",
|
"back": "Back Accessory",
|
||||||
"backBase0Text": "No Back Accessory",
|
"backBase0Text": "No Back Accessory",
|
||||||
@@ -3334,6 +3388,13 @@
|
|||||||
"backMystery202507Notes": "Your steed for the sidewalks and halfpipes. Confers no benefit. July 2025 Subscriber Item.",
|
"backMystery202507Notes": "Your steed for the sidewalks and halfpipes. Confers no benefit. July 2025 Subscriber Item.",
|
||||||
"backMystery202510Text": "Gliding Ghoul Wings",
|
"backMystery202510Text": "Gliding Ghoul Wings",
|
||||||
"backMystery202510Notes": "Fly silently across the haunted skies with these giant wings. Confers no benefit. October 2025 Subscriber Item.",
|
"backMystery202510Notes": "Fly silently across the haunted skies with these giant wings. Confers no benefit. October 2025 Subscriber Item.",
|
||||||
|
"backMystery202601Text": "Winter's Sigil",
|
||||||
|
"backMystery202601Notes": "This mark grants the user control over the elements of the season of cold and frost. Confers no benefit. January 2026 Subscriber Item.",
|
||||||
|
"backMystery202602Text": "Five Tails of Sakura",
|
||||||
|
"backMystery202602Notes": "These fluffy tails are the color of cherry blossoms, a reminder that spring is on the way! Confers no benefit. February 2026 Subscriber Item.",
|
||||||
|
|
||||||
|
"backArmoireHarpsichordText": "Harpsichord",
|
||||||
|
"backArmoireHarpsichordNotes": "Pting! Ptiiing! Gather your party for a dinner or picnic and listen to a tinny melody on this harpsichord. Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 1 of 3)",
|
||||||
|
|
||||||
"backSpecialWonderconRedText": "Mighty Cape",
|
"backSpecialWonderconRedText": "Mighty Cape",
|
||||||
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
|
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
|
||||||
@@ -3552,7 +3613,7 @@
|
|||||||
"headAccessoryMystery201908Text": "Footloose Faun Horns",
|
"headAccessoryMystery201908Text": "Footloose Faun Horns",
|
||||||
"headAccessoryMystery201908Notes": "If wearing horns floats your goat, you're in luck! Confers no benefit. August 2019 Subscriber Item.",
|
"headAccessoryMystery201908Notes": "If wearing horns floats your goat, you're in luck! Confers no benefit. August 2019 Subscriber Item.",
|
||||||
"headAccessoryMystery202004Text": "Mighty Monarch Antennae",
|
"headAccessoryMystery202004Text": "Mighty Monarch Antennae",
|
||||||
"headAccessoryMystery202004Notes": "They twitch just a bit if the scent of flowers drifts by--use them to find a pretty garden! Confers no benefit. April 2020 Subscriber Item.",
|
"headAccessoryMystery202004Notes": "They twitch just a bit if the scent of flowers drifts by—use them to find a pretty garden! Confers no benefit. April 2020 Subscriber Item.",
|
||||||
"headAccessoryMystery202005Text": "Wondrous Wyvern Horns",
|
"headAccessoryMystery202005Text": "Wondrous Wyvern Horns",
|
||||||
"headAccessoryMystery202005Notes": "With such mighty horns, what creature dares challenge you? Confers no benefit. May 2020 Subscriber Item.",
|
"headAccessoryMystery202005Notes": "With such mighty horns, what creature dares challenge you? Confers no benefit. May 2020 Subscriber Item.",
|
||||||
"headAccessoryMystery202009Text": "Marvelous Moth Antennae",
|
"headAccessoryMystery202009Text": "Marvelous Moth Antennae",
|
||||||
@@ -3646,9 +3707,9 @@
|
|||||||
"eyewearSpecialWonderconBlackNotes": "Your motives are definitely legitimate. Confers no benefit. Special Edition Convention Item.",
|
"eyewearSpecialWonderconBlackNotes": "Your motives are definitely legitimate. Confers no benefit. Special Edition Convention Item.",
|
||||||
|
|
||||||
"eyewearSpecialFall2019RogueText": "Bone-White Half Mask",
|
"eyewearSpecialFall2019RogueText": "Bone-White Half Mask",
|
||||||
"eyewearSpecialFall2019RogueNotes": "You'd think a full mask would protect your identity better, but people tend to be too awestruck by its stark design to take note of any identifying features left revealed. Confers no benefit. Limited Edition 2019 Autumn Gear.",
|
"eyewearSpecialFall2019RogueNotes": "You'd think a full mask would protect your identity better, but people tend to be too awestruck by its stark design to take note of any identifying features left revealed. Confers no benefit. Limited Edition 2019 Fall Gear.",
|
||||||
"eyewearSpecialFall2019HealerText": "Dark Visage",
|
"eyewearSpecialFall2019HealerText": "Dark Visage",
|
||||||
"eyewearSpecialFall2019HealerNotes": "Steel yourself against the toughest foes with this inscrutable mask. Confers no benefit. Limited Edition 2019 Autumn Gear.",
|
"eyewearSpecialFall2019HealerNotes": "Steel yourself against the toughest foes with this inscrutable mask. Confers no benefit. Limited Edition 2019 Fall Gear.",
|
||||||
|
|
||||||
"eyewearMystery201503Text": "Aquamarine Eyewear",
|
"eyewearMystery201503Text": "Aquamarine Eyewear",
|
||||||
"eyewearMystery201503Notes": "Don't get poked in the eye by these shimmering gems! Confers no benefit. March 2015 Subscriber Item.",
|
"eyewearMystery201503Notes": "Don't get poked in the eye by these shimmering gems! Confers no benefit. March 2015 Subscriber Item.",
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
"notEnoughGems": "Not enough Gems",
|
"notEnoughGems": "Not enough Gems",
|
||||||
"alreadyHave": "Whoops! You already have this item. No need to buy it again!",
|
"alreadyHave": "Whoops! You already have this item. No need to buy it again!",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
|
"gem": "Gem",
|
||||||
"gems": "Gems",
|
"gems": "Gems",
|
||||||
"needMoreGems": "Need More Gems?",
|
"needMoreGems": "Need More Gems?",
|
||||||
"needMoreGemsInfo": "Purchase Gems now, or become a subscriber to buy Gems with Gold, get monthly mystery items, enjoy increased drop caps and more!",
|
"needMoreGemsInfo": "Purchase Gems now, or become a subscriber to buy Gems with Gold, get monthly mystery items, enjoy increased drop caps and more!",
|
||||||
@@ -241,5 +242,6 @@
|
|||||||
"whyReportingPlayerPlaceholder": "Reason for report",
|
"whyReportingPlayerPlaceholder": "Reason for report",
|
||||||
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habitica’s Community Guidelines.",
|
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habitica’s Community Guidelines.",
|
||||||
"targetUserNotExist": "Target User: '<%= userName %>' does not exist.",
|
"targetUserNotExist": "Target User: '<%= userName %>' does not exist.",
|
||||||
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>."
|
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>.",
|
||||||
|
"confirmPurchase": "Confirm Purchase"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@
|
|||||||
"needsTextPlaceholder": "Type your message here.",
|
"needsTextPlaceholder": "Type your message here.",
|
||||||
"messageCopiedToClipboard": "Message copied to clipboard.",
|
"messageCopiedToClipboard": "Message copied to clipboard.",
|
||||||
"leaderOnlyChallenges": "Only group leader can create challenges",
|
"leaderOnlyChallenges": "Only group leader can create challenges",
|
||||||
"sendGift": "Send a Gift",
|
"sendGift": "Send Gift",
|
||||||
"selectGift": "Select Gift",
|
"selectGift": "Select Gift",
|
||||||
"selectSubscription": "Select Subscription",
|
"selectSubscription": "Select Subscription",
|
||||||
"sendGiftToWhom": "Who would you like to send a gift to?",
|
"sendGiftToWhom": "Who would you like to send a gift to?",
|
||||||
@@ -358,12 +358,10 @@
|
|||||||
"createGroup": "Create a Group",
|
"createGroup": "Create a Group",
|
||||||
"groupUse": "Which best describes the use of your Group?*",
|
"groupUse": "Which best describes the use of your Group?*",
|
||||||
"groupUseDefault": "Choose an answer",
|
"groupUseDefault": "Choose an answer",
|
||||||
"groupParentChildren": "Parent(s) setting up tasks for children",
|
"groupParentChildren": "Using with my household",
|
||||||
"groupCouple": "Couple sharing tasks",
|
"groupFriends": "Using with friends",
|
||||||
"groupFriends": "Friends sharing tasks",
|
"groupManager": "Using for work",
|
||||||
"groupCoworkers": "Coworkers sharing tasks",
|
"groupTeacher": "Using for education",
|
||||||
"groupManager": "Manager setting up tasks for employees",
|
|
||||||
"groupTeacher": "Teacher setting up tasks for students",
|
|
||||||
"gettingStarted": "Getting Started",
|
"gettingStarted": "Getting Started",
|
||||||
"nameStar": "Name*",
|
"nameStar": "Name*",
|
||||||
"nameStarText": "Add a title",
|
"nameStarText": "Add a title",
|
||||||
@@ -428,5 +426,7 @@
|
|||||||
"tavernDiscontinuedLinks": "Read more about the <a href='/static/faq/tavern-and-guilds'>Tavern and Guild Service Discontinuation</a> or head back to the <a href='/'>homepage</a>.",
|
"tavernDiscontinuedLinks": "Read more about the <a href='/static/faq/tavern-and-guilds'>Tavern and Guild Service Discontinuation</a> or head back to the <a href='/'>homepage</a>.",
|
||||||
"chatSunsetWarning": "⚠️ <strong>Habitica Guilds and Tavern chat will be discontinued on 8/8/2023.</strong> <a href='/static/faq/tavern-and-guilds'>Click here</a> to read more about this change.",
|
"chatSunsetWarning": "⚠️ <strong>Habitica Guilds and Tavern chat will be discontinued on 8/8/2023.</strong> <a href='/static/faq/tavern-and-guilds'>Click here</a> to read more about this change.",
|
||||||
"interestedLearningMore": "Interested in Learning More?",
|
"interestedLearningMore": "Interested in Learning More?",
|
||||||
"checkGroupPlanFAQ": "Check out the <a href='/static/faq#what-is-group-plan'>Group Plans FAQ</a> to learn how to get the most out of your shared task experience."
|
"checkGroupPlanFAQ": "Check out the <a href='/static/faq#what-is-group-plan'>Group Plans FAQ</a> to learn how to get the most out of your shared task experience.",
|
||||||
|
"groupPlanBillingFYI": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You can cancel from the Group Billing tab of your Group Plan. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
|
||||||
|
"groupPlanBillingFYIShort": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -239,6 +239,10 @@
|
|||||||
"fall2025SkeletonRogueSet": "Skeleton Rogue Set",
|
"fall2025SkeletonRogueSet": "Skeleton Rogue Set",
|
||||||
"fall2025KoboldHealerSet": "Kobold Healer Set",
|
"fall2025KoboldHealerSet": "Kobold Healer Set",
|
||||||
"fall2025MaskedGhostMageSet": "Masked Ghost Mage Set",
|
"fall2025MaskedGhostMageSet": "Masked Ghost Mage Set",
|
||||||
|
"winter2026RimeReaperWarriorSet": "Rime Reaper Warrior Set",
|
||||||
|
"winter2026SkiRogueSet": "Ski Rogue Set",
|
||||||
|
"winter2026PolarBearHealerSet": "Polar Bear Healer Set",
|
||||||
|
"winter2026MidwinterCandleMageSet": "Midwinter Candle Mage Set",
|
||||||
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
|
"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!",
|
"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",
|
"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",
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
|
|
||||||
"questSpiderText": "The Icy Arachnid",
|
"questSpiderText": "The Icy Arachnid",
|
||||||
"questSpiderNotes": "As the weather starts cooling down, delicate frost begins appearing on Habiticans' windowpanes in lacy webs... except for @Arcosine, whose windows are frozen completely shut by the Frost Spider currently taking up residence in his home. Oh dear.",
|
"questSpiderNotes": "As the weather starts cooling down, delicate frost begins appearing on Habiticans' windowpanes in lacy webs... except for @Arcosine, whose windows are frozen completely shut by the Frost Spider currently taking up residence in his home. Oh dear.",
|
||||||
"questSpiderCompletion": "The Frost Spider collapses, leaving behind a small pile of frost and a few of her enchanted egg sacs. @Arcosine rather hurriedly offers them to you as a reward--perhaps you could raise some non-threatening spiders as pets of your own?",
|
"questSpiderCompletion": "The Frost Spider collapses, leaving behind a small pile of frost and a few of her enchanted egg sacs. @Arcosine rather hurriedly offers them to you as a reward—perhaps you could raise some non-threatening spiders as pets of your own?",
|
||||||
"questSpiderBoss": "Spider",
|
"questSpiderBoss": "Spider",
|
||||||
"questSpiderDropSpiderEgg": "Spider (Egg)",
|
"questSpiderDropSpiderEgg": "Spider (Egg)",
|
||||||
"questSpiderUnlockText": "Unlocks Spider Eggs for purchase in the Market",
|
"questSpiderUnlockText": "Unlocks Spider Eggs for purchase in the Market",
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
|
|
||||||
"questGroupEarnable": "Earnable Quests",
|
"questGroupEarnable": "Earnable Quests",
|
||||||
"questBasilistText": "The Basi-List",
|
"questBasilistText": "The Basi-List",
|
||||||
"questBasilistNotes": "There's a commotion in the marketplace--the kind that should make you run away. Being a courageous adventurer, you run towards it instead, and discover a Basi-list, coalescing from a clump of incomplete To Do's! Nearby Habiticans are paralyzed with fear at the length of the Basi-list, unable to start working. From somewhere in the vicinity, you hear @Arcosine shout: \"Quick! Complete your To Do's and Dailies to defang the monster, before someone gets a paper cut!\" Strike fast, adventurer, and check something off - but beware! If you leave any Dailies undone, the Basi-list will attack you and your party!",
|
"questBasilistNotes": "There's a commotion in the marketplace—the kind that should make you run away. Being a courageous adventurer, you run towards it instead, and discover a Basi-list, coalescing from a clump of incomplete To Do's! Nearby Habiticans are paralyzed with fear at the length of the Basi-list, unable to start working. From somewhere in the vicinity, you hear @Arcosine shout: \"Quick! Complete your To Do's and Dailies to defang the monster, before someone gets a paper cut!\" Strike fast, adventurer, and check something off - but beware! If you leave any Dailies undone, the Basi-list will attack you and your party!",
|
||||||
"questBasilistCompletion": "The Basi-list has scattered into paper scraps, which shimmer gently in rainbow colors. \"Whew!\" says @Arcosine. \"Good thing you guys were here!\" Feeling more experienced than before, you gather up some fallen gold from among the papers.",
|
"questBasilistCompletion": "The Basi-list has scattered into paper scraps, which shimmer gently in rainbow colors. \"Whew!\" says @Arcosine. \"Good thing you guys were here!\" Feeling more experienced than before, you gather up some fallen gold from among the papers.",
|
||||||
"questBasilistBoss": "The Basi-List",
|
"questBasilistBoss": "The Basi-List",
|
||||||
|
|
||||||
@@ -296,7 +296,7 @@
|
|||||||
"questDilatoryDistress3DropShield": "Moonpearl Shield (Off-Hand Item)",
|
"questDilatoryDistress3DropShield": "Moonpearl Shield (Off-Hand Item)",
|
||||||
|
|
||||||
"questCheetahText": "Such a Cheetah",
|
"questCheetahText": "Such a Cheetah",
|
||||||
"questCheetahNotes": "As you hike across the Sloensteadi Savannah with your friends @PainterProphet, @tivaquinn, @Unruly Hyena, and @Crawford, you're startled to see a Cheetah screeching past with a new Habitican clamped in its jaws. Under the Cheetah's scorching paws, tasks burn away as though complete -- before anyone has the chance to actually finish them! The Habitican sees you and yells, \"Please help me! This Cheetah is making me level too quickly, but I'm not getting anything done. I want to slow down and enjoy the game. Make it stop!\" You fondly remember your own fledgling days, and know that you have to help the newbie by stopping the Cheetah!",
|
"questCheetahNotes": "As you hike across the Sloensteadi Savannah with your friends @PainterProphet, @tivaquinn, @Unruly Hyena, and @Crawford, you're startled to see a Cheetah screeching past with a new Habitican clamped in its jaws. Under the Cheetah's scorching paws, tasks burn away as though complete—before anyone has the chance to actually finish them! The Habitican sees you and yells, \"Please help me! This Cheetah is making me level too quickly, but I'm not getting anything done. I want to slow down and enjoy the game. Make it stop!\" You fondly remember your own fledgling days, and know that you have to help the newbie by stopping the Cheetah!",
|
||||||
"questCheetahCompletion": "The new Habitican is breathing heavily after the wild ride, but thanks you and your friends for your help. \"I'm glad that Cheetah won't be able to grab anyone else. It did leave some Cheetah eggs for us, so maybe we can raise them into more trustworthy pets!\"",
|
"questCheetahCompletion": "The new Habitican is breathing heavily after the wild ride, but thanks you and your friends for your help. \"I'm glad that Cheetah won't be able to grab anyone else. It did leave some Cheetah eggs for us, so maybe we can raise them into more trustworthy pets!\"",
|
||||||
"questCheetahBoss": "Cheetah",
|
"questCheetahBoss": "Cheetah",
|
||||||
"questCheetahDropCheetahEgg": "Cheetah (Egg)",
|
"questCheetahDropCheetahEgg": "Cheetah (Egg)",
|
||||||
@@ -323,7 +323,7 @@
|
|||||||
"questBurnoutBossRageTavern": "`Burnout uses EXHAUST STRIKE!`\n\nMany Habiticans have been hiding from Burnout in the Tavern, but no longer! With a screeching howl, Burnout rakes the Tavern with its white-hot hands. As the Tavern patrons flee, Daniel is caught in Burnout's grip, and transforms into an Exhaust Spirit right in front of you!\n\nThis hot-headed horror has gone on for too long. Don't give up... we're so close to vanquishing Burnout for once and for all!",
|
"questBurnoutBossRageTavern": "`Burnout uses EXHAUST STRIKE!`\n\nMany Habiticans have been hiding from Burnout in the Tavern, but no longer! With a screeching howl, Burnout rakes the Tavern with its white-hot hands. As the Tavern patrons flee, Daniel is caught in Burnout's grip, and transforms into an Exhaust Spirit right in front of you!\n\nThis hot-headed horror has gone on for too long. Don't give up... we're so close to vanquishing Burnout for once and for all!",
|
||||||
|
|
||||||
"questFrogText": "Swamp of the Clutter Frog",
|
"questFrogText": "Swamp of the Clutter Frog",
|
||||||
"questFrogNotes": "As you and your friends are slogging through the Swamps of Stagnation, @starsystemic points at a large sign. \"Stay on the path -- if you can.\"<br><br>\"Surely that isn't hard!\" @RosemonkeyCT says. \"It's broad and clear.\"<br><br>But as you continue, you notice that path is gradually overtaken by the muck of the swamp, laced with bits of strange blue debris and clutter, until it's impossible to proceed.<br><br>As you look around, wondering how it got this messy, @Jon Arjinborn shouts, \"Look out!\" An angry frog leaps from the sludge, clad in dirty laundry and lit by blue fire. You will have to overcome this poisonous Clutter Frog to progress!",
|
"questFrogNotes": "As you and your friends are slogging through the Swamps of Stagnation, @starsystemic points at a large sign. \"Stay on the path—if you can.\"<br><br>\"Surely that isn't hard!\" @RosemonkeyCT says. \"It's broad and clear.\"<br><br>But as you continue, you notice that path is gradually overtaken by the muck of the swamp, laced with bits of strange blue debris and clutter, until it's impossible to proceed.<br><br>As you look around, wondering how it got this messy, @Jon Arjinborn shouts, \"Look out!\" An angry frog leaps from the sludge, clad in dirty laundry and lit by blue fire. You will have to overcome this poisonous Clutter Frog to progress!",
|
||||||
"questFrogCompletion": "The frog cowers back into the muck, defeated. As it slinks away, the blue slime fades, leaving the way ahead clear.<br><br>Sitting in the middle of the path are three pristine eggs. \"You can even see the tiny tadpoles through the clear casing!\" @Breadstrings says. \"Here, you should take them.\"",
|
"questFrogCompletion": "The frog cowers back into the muck, defeated. As it slinks away, the blue slime fades, leaving the way ahead clear.<br><br>Sitting in the middle of the path are three pristine eggs. \"You can even see the tiny tadpoles through the clear casing!\" @Breadstrings says. \"Here, you should take them.\"",
|
||||||
"questFrogBoss": "Clutter Frog",
|
"questFrogBoss": "Clutter Frog",
|
||||||
"questFrogDropFrogEgg": "Frog (Egg)",
|
"questFrogDropFrogEgg": "Frog (Egg)",
|
||||||
@@ -365,7 +365,7 @@
|
|||||||
"questSnailUnlockText": "Unlocks Snail Eggs for purchase in the Market",
|
"questSnailUnlockText": "Unlocks Snail Eggs for purchase in the Market",
|
||||||
|
|
||||||
"questBewilderText": "The Be-Wilder",
|
"questBewilderText": "The Be-Wilder",
|
||||||
"questBewilderNotes": "The party begins like any other.<br><br>The appetizers are excellent, the music is swinging, and even the dancing elephants have become routine. Habiticans laugh and frolic amid the overflowing floral centerpieces, happy to have a distraction from their least-favorite tasks, and the April Fool whirls among them, eagerly providing an amusing trick here and a witty twist there.<br><br>As the Mistiflying clock tower strikes midnight, the April Fool leaps onto the stage to give a speech.<br><br>“Friends! Enemies! Tolerant acquaintances! Lend me your ears.” The crowd chuckles as animal ears sprout from their heads, and they pose with their new accessories.<br><br>“As you know,” the Fool continues, “my confusing illusions usually only last a single day. But I’m pleased to announce that I’ve discovered a shortcut that will guarantee us non-stop fun, without having to deal with the pesky weight of our responsibilities. Charming Habiticans, meet my magical new friend... the Be-Wilder!”<br><br>Lemoness pales suddenly, dropping her hors d'oeuvres. “Wait! Don’t trust--”<br><br>But suddenly mists are pouring into the room, glittering and thick, and they swirl around the April Fool, coalescing into cloudy feathers and a stretching neck. The crowd is speechless as a monstrous bird unfolds before them, its wings shimmering with illusions. It lets out a horrible screeching laugh.<br><br>“Oh, it has been ages since a Habitican has been foolish enough to summon me! How wonderful it feels, to have a tangible form at last.”<br><br>Buzzing in terror, the magic bees of Mistiflying flee the floating city, which sags from the sky. One by one, the brilliant spring flowers wither up and wisp away.<br><br>“My dearest friends, why so alarmed?” crows the Be-Wilder, beating its wings. “There’s no need to toil for your rewards any more. I’ll just give you all the things that you desire!”<br><br>A rain of coins pours from the sky, hammering into the ground with brutal force, and the crowd screams and flees for cover. “Is this a joke?” Baconsaur shouts, as the gold smashes through windows and shatters roof shingles.<br><br>PainterProphet ducks as lightning bolts crackle overhead, and fog blots out the sun. “No! This time, I don’t think it is!”<br><br>Quickly, Habiticans, don’t let this World Boss distract us from our goals! Stay focused on the tasks that you need to complete so we can rescue Mistiflying -- and hopefully, ourselves.",
|
"questBewilderNotes": "The party begins like any other.<br><br>The appetizers are excellent, the music is swinging, and even the dancing elephants have become routine. Habiticans laugh and frolic amid the overflowing floral centerpieces, happy to have a distraction from their least-favorite tasks, and the April Fool whirls among them, eagerly providing an amusing trick here and a witty twist there.<br><br>As the Mistiflying clock tower strikes midnight, the April Fool leaps onto the stage to give a speech.<br><br>“Friends! Enemies! Tolerant acquaintances! Lend me your ears.” The crowd chuckles as animal ears sprout from their heads, and they pose with their new accessories.<br><br>“As you know,” the Fool continues, “my confusing illusions usually only last a single day. But I’m pleased to announce that I’ve discovered a shortcut that will guarantee us non-stop fun, without having to deal with the pesky weight of our responsibilities. Charming Habiticans, meet my magical new friend... the Be-Wilder!”<br><br>Lemoness pales suddenly, dropping her hors d'oeuvres. “Wait! Don’t trust—”<br><br>But suddenly mists are pouring into the room, glittering and thick, and they swirl around the April Fool, coalescing into cloudy feathers and a stretching neck. The crowd is speechless as a monstrous bird unfolds before them, its wings shimmering with illusions. It lets out a horrible screeching laugh.<br><br>“Oh, it has been ages since a Habitican has been foolish enough to summon me! How wonderful it feels, to have a tangible form at last.”<br><br>Buzzing in terror, the magic bees of Mistiflying flee the floating city, which sags from the sky. One by one, the brilliant spring flowers wither up and wisp away.<br><br>“My dearest friends, why so alarmed?” crows the Be-Wilder, beating its wings. “There’s no need to toil for your rewards any more. I’ll just give you all the things that you desire!”<br><br>A rain of coins pours from the sky, hammering into the ground with brutal force, and the crowd screams and flees for cover. “Is this a joke?” Baconsaur shouts, as the gold smashes through windows and shatters roof shingles.<br><br>PainterProphet ducks as lightning bolts crackle overhead, and fog blots out the sun. “No! This time, I don’t think it is!”<br><br>Quickly, Habiticans, don’t let this World Boss distract us from our goals! Stay focused on the tasks that you need to complete so we can rescue Mistiflying—and hopefully, ourselves.",
|
||||||
"questBewilderCompletion": "<strong>The Be-Wilder is DEFEATED!</strong><br><br>We've done it! The Be-Wilder lets out a ululating cry as it twists in the air, shedding feathers like falling rain. Slowly, gradually, it coils into a cloud of sparkling mist. As the newly-revealed sun pierces the fog, it burns away, revealing the coughing, mercifully human forms of Bailey, Matt, Alex.... and the April Fool himself.<br><br><strong>Mistiflying is saved!</strong><br><br>The April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”<br><br>The crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.<br><br>“Er, yes,” the April Fool says. “That is. What I meant to say was, I’m dreadfully sorry.” He heaves a sigh. “I suppose it can’t all be fun and games, after all. It might not hurt to focus occasionally. Maybe I’ll get a head start on next year’s pranking.”<br><br>Redphoenix coughs meaningfully.<br><br>“I mean, get a head start on this year’s spring cleaning!” the April Fool says. “Nothing to fear, I’ll have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”<br><br>Encouraged, the marching band starts up.<br><br>It isn’t long before all is back to normal in Habit City. Plus, now that the Be-Wilder has evaporated, the magical bees of Mistiflying bustle back to work, and soon the flowers are blooming and the city is floating once more.<br><br>As Habiticans cuddle the magical fuzzy bees, the April Fool’s eyes light up. “Oho, I’ve had a thought! Why don’t you all keep some of these fuzzy Bee Pets and Mounts? It’s a gift that perfectly symbolizes the balance between hard work and sweet rewards, if I’m going to get all boring and allegorical on you.” He winks. “Besides, they don’t have stingers! Fool’s honor.”",
|
"questBewilderCompletion": "<strong>The Be-Wilder is DEFEATED!</strong><br><br>We've done it! The Be-Wilder lets out a ululating cry as it twists in the air, shedding feathers like falling rain. Slowly, gradually, it coils into a cloud of sparkling mist. As the newly-revealed sun pierces the fog, it burns away, revealing the coughing, mercifully human forms of Bailey, Matt, Alex.... and the April Fool himself.<br><br><strong>Mistiflying is saved!</strong><br><br>The April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”<br><br>The crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.<br><br>“Er, yes,” the April Fool says. “That is. What I meant to say was, I’m dreadfully sorry.” He heaves a sigh. “I suppose it can’t all be fun and games, after all. It might not hurt to focus occasionally. Maybe I’ll get a head start on next year’s pranking.”<br><br>Redphoenix coughs meaningfully.<br><br>“I mean, get a head start on this year’s spring cleaning!” the April Fool says. “Nothing to fear, I’ll have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”<br><br>Encouraged, the marching band starts up.<br><br>It isn’t long before all is back to normal in Habit City. Plus, now that the Be-Wilder has evaporated, the magical bees of Mistiflying bustle back to work, and soon the flowers are blooming and the city is floating once more.<br><br>As Habiticans cuddle the magical fuzzy bees, the April Fool’s eyes light up. “Oho, I’ve had a thought! Why don’t you all keep some of these fuzzy Bee Pets and Mounts? It’s a gift that perfectly symbolizes the balance between hard work and sweet rewards, if I’m going to get all boring and allegorical on you.” He winks. “Besides, they don’t have stingers! Fool’s honor.”",
|
||||||
"questBewilderCompletionChat": "`The Be-Wilder is DEFEATED!`\n\nWe've done it! The Be-Wilder lets out a ululating cry as it twists in the air, shedding feathers like falling rain. Slowly, gradually, it coils into a cloud of sparkling mist. As the newly-revealed sun pierces the fog, it burns away, revealing the coughing, mercifully human forms of Bailey, Matt, Alex.... and the April Fool himself.\n\n`Mistiflying is saved!`\n\nThe April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”\n\nThe crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.\n\n“Er, yes,” the April Fool says. “That is. What I meant to say was, I’m dreadfully sorry.” He heaves a sigh. “I suppose it can’t all be fun and games, after all. It might not hurt to focus occasionally. Maybe I’ll get a head start on next year’s pranking.”\n\nRedphoenix coughs meaningfully.\n\n“I mean, get a head start on this year’s spring cleaning!” the April Fool says. “Nothing to fear, I’ll have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”\n\nEncouraged, the marching band starts up.\n\nIt isn’t long before all is back to normal in Habit City. Plus, now that the Be-Wilder has evaporated, the magical bees of Mistiflying bustle back to work, and soon the flowers are blooming and the city is floating once more.\n\nAs Habiticans cuddle the magical fuzzy bees, the April Fool’s eyes light up. “Oho, I’ve had a thought! Why don’t you all keep some of these fuzzy Bee Pets and Mounts? It’s a gift that perfectly symbolizes the balance between hard work and sweet rewards, if I’m going to get all boring and allegorical on you.” He winks. “Besides, they don’t have stingers! Fool’s honor.”",
|
"questBewilderCompletionChat": "`The Be-Wilder is DEFEATED!`\n\nWe've done it! The Be-Wilder lets out a ululating cry as it twists in the air, shedding feathers like falling rain. Slowly, gradually, it coils into a cloud of sparkling mist. As the newly-revealed sun pierces the fog, it burns away, revealing the coughing, mercifully human forms of Bailey, Matt, Alex.... and the April Fool himself.\n\n`Mistiflying is saved!`\n\nThe April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”\n\nThe crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.\n\n“Er, yes,” the April Fool says. “That is. What I meant to say was, I’m dreadfully sorry.” He heaves a sigh. “I suppose it can’t all be fun and games, after all. It might not hurt to focus occasionally. Maybe I’ll get a head start on next year’s pranking.”\n\nRedphoenix coughs meaningfully.\n\n“I mean, get a head start on this year’s spring cleaning!” the April Fool says. “Nothing to fear, I’ll have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”\n\nEncouraged, the marching band starts up.\n\nIt isn’t long before all is back to normal in Habit City. Plus, now that the Be-Wilder has evaporated, the magical bees of Mistiflying bustle back to work, and soon the flowers are blooming and the city is floating once more.\n\nAs Habiticans cuddle the magical fuzzy bees, the April Fool’s eyes light up. “Oho, I’ve had a thought! Why don’t you all keep some of these fuzzy Bee Pets and Mounts? It’s a gift that perfectly symbolizes the balance between hard work and sweet rewards, if I’m going to get all boring and allegorical on you.” He winks. “Besides, they don’t have stingers! Fool’s honor.”",
|
||||||
"questBewilderBossRageTitle": "Beguilement Strike",
|
"questBewilderBossRageTitle": "Beguilement Strike",
|
||||||
@@ -415,7 +415,7 @@
|
|||||||
"questArmadilloUnlockText": "Unlocks Armadillo Eggs for purchase in the Market",
|
"questArmadilloUnlockText": "Unlocks Armadillo Eggs for purchase in the Market",
|
||||||
|
|
||||||
"questCowText": "The Mootant Cow",
|
"questCowText": "The Mootant Cow",
|
||||||
"questCowNotes": "It’s been a long, hot day at Sparring Farms, and there is nothing more you want than a long sip of water and some sleep. You're standing there daydreaming when @Soloana suddenly screams, \"Everyone run! The prize cow has mootated!\"<br><br>@eevachu gulps. \"It must be our bad habits that infected it.\"<br><br>\"Quick!\" @Feralem Tau says. \"Let’s do something before the udder cows mootate, too.\"<br><br>You’ve herd enough. No more daydreaming -- it's time to get those bad habits under control!",
|
"questCowNotes": "It’s been a long, hot day at Sparring Farms, and there is nothing more you want than a long sip of water and some sleep. You're standing there daydreaming when @Soloana suddenly screams, \"Everyone run! The prize cow has mootated!\"<br><br>@eevachu gulps. \"It must be our bad habits that infected it.\"<br><br>\"Quick!\" @Feralem Tau says. \"Let’s do something before the udder cows mootate, too.\"<br><br>You’ve herd enough. No more daydreaming—it's time to get those bad habits under control!",
|
||||||
"questCowCompletion": "You milk your good habits for all they are worth until the cow reverts to its original form. The cow looks over at you with her pretty brown eyes and nudges over three eggs.<br><br>@fuzzytrees laughs and hands you the eggs, \"Maybe it still is mootated if there are baby cows in these eggs. But I trust you to stick to your good habits when you raise them!\"",
|
"questCowCompletion": "You milk your good habits for all they are worth until the cow reverts to its original form. The cow looks over at you with her pretty brown eyes and nudges over three eggs.<br><br>@fuzzytrees laughs and hands you the eggs, \"Maybe it still is mootated if there are baby cows in these eggs. But I trust you to stick to your good habits when you raise them!\"",
|
||||||
"questCowBoss": "Mootant Cow",
|
"questCowBoss": "Mootant Cow",
|
||||||
"questCowDropCowEgg": "Cow (Egg)",
|
"questCowDropCowEgg": "Cow (Egg)",
|
||||||
@@ -449,7 +449,7 @@
|
|||||||
"questTaskwoodsTerror2DropArmor": "Pyromancer's Robes (Armor)",
|
"questTaskwoodsTerror2DropArmor": "Pyromancer's Robes (Armor)",
|
||||||
|
|
||||||
"questTaskwoodsTerror3Text": "Terror in the Taskwoods, Part 3: Jacko of the Lantern",
|
"questTaskwoodsTerror3Text": "Terror in the Taskwoods, Part 3: Jacko of the Lantern",
|
||||||
"questTaskwoodsTerror3Notes": "Ready for battle, your group marches to the heart of the forest, where the renegade spirit is trying to destroy an ancient apple tree surrounded by fruitful berry bushes. His pumpkin-like head radiates a terrible light wherever it turns, and in his left hand he holds a long rod, with a lantern hanging from its tip. Instead of fire or flame, however, the lantern contains a dark crystal that chills you to the very bone.<br><br>The Joyful Reaper raises a bony hand to her mouth. \"That's -- that's Jacko, the Lantern Spirit! But he's a helpful harvest ghost who guides our farmers. What could possibly drive the dear soul to act this way?\"<br><br>\"I don't know,\" says @bridgetteempress. \"But it looks like that 'dear soul' is about to attack us!\"",
|
"questTaskwoodsTerror3Notes": "Ready for battle, your group marches to the heart of the forest, where the renegade spirit is trying to destroy an ancient apple tree surrounded by fruitful berry bushes. His pumpkin-like head radiates a terrible light wherever it turns, and in his left hand he holds a long rod, with a lantern hanging from its tip. Instead of fire or flame, however, the lantern contains a dark crystal that chills you to the very bone.<br><br>The Joyful Reaper raises a bony hand to her mouth. \"That's—that's Jacko, the Lantern Spirit! But he's a helpful harvest ghost who guides our farmers. What could possibly drive the dear soul to act this way?\"<br><br>\"I don't know,\" says @bridgetteempress. \"But it looks like that 'dear soul' is about to attack us!\"",
|
||||||
"questTaskwoodsTerror3Completion": "After a long battle, you manage to land a well-aimed blow at the lantern that Jacko carries, and the crystal within shatters. Jacko suddenly snaps back to his senses and bursts into glowing tears. \"Oh, my beautiful forest! What have I done?!\" he wails. His tears extinguish the remaining fires, and the apple tree and wild berries are saved.<br><br>After you help him relax, he explains, \"I met this charming lady named Tzina, and she gave me this glowing crystal as a gift. At her urging, I put it in my lantern... but that's the last thing I recall.\" He turns to you with a golden smile. \"Perhaps you should take it for safekeeping while I help the wild orchards to regrow.\"",
|
"questTaskwoodsTerror3Completion": "After a long battle, you manage to land a well-aimed blow at the lantern that Jacko carries, and the crystal within shatters. Jacko suddenly snaps back to his senses and bursts into glowing tears. \"Oh, my beautiful forest! What have I done?!\" he wails. His tears extinguish the remaining fires, and the apple tree and wild berries are saved.<br><br>After you help him relax, he explains, \"I met this charming lady named Tzina, and she gave me this glowing crystal as a gift. At her urging, I put it in my lantern... but that's the last thing I recall.\" He turns to you with a golden smile. \"Perhaps you should take it for safekeeping while I help the wild orchards to regrow.\"",
|
||||||
"questTaskwoodsTerror3Boss": "Jacko of the Lantern",
|
"questTaskwoodsTerror3Boss": "Jacko of the Lantern",
|
||||||
"questTaskwoodsTerror3DropStrawberry": "Strawberry (Food)",
|
"questTaskwoodsTerror3DropStrawberry": "Strawberry (Food)",
|
||||||
@@ -494,7 +494,7 @@
|
|||||||
"questSlothUnlockText": "Unlocks Sloth Eggs for purchase in the Market",
|
"questSlothUnlockText": "Unlocks Sloth Eggs for purchase in the Market",
|
||||||
|
|
||||||
"questTriceratopsText": "The Trampling Triceratops",
|
"questTriceratopsText": "The Trampling Triceratops",
|
||||||
"questTriceratopsNotes": "The snow-capped Stoïkalm Volcanoes are always bustling with hikers and sight-seers. One tourist, @plumilla, calls over a crowd. \"Look! I enchanted the ground to glow so that we can play field games on it for our outdoor activity Dailies!\" Sure enough, the ground is swirling with glowing red patterns. Even some of the prehistoric pets from the area come over to play.<br><br>Suddenly, there's a loud snap -- a curious Triceratops has stepped on @plumilla's wand! It's engulfed in a burst of magic energy, and the ground starts shaking and growing hot. The Triceratops' eyes shine red, and it roars and begins to stampede!<br><br>\"That's not good,\" calls @McCoyly, pointing in the distance. Each magic-fueled stomp is causing the volcanoes to erupt, and the glowing ground is turning to lava beneath the dinosaur's feet! Quickly, you must hold off the Trampling Triceratops until someone can reverse the spell!",
|
"questTriceratopsNotes": "The snow-capped Stoïkalm Volcanoes are always bustling with hikers and sight-seers. One tourist, @plumilla, calls over a crowd. \"Look! I enchanted the ground to glow so that we can play field games on it for our outdoor activity Dailies!\" Sure enough, the ground is swirling with glowing red patterns. Even some of the prehistoric pets from the area come over to play.<br><br>Suddenly, there's a loud snap—a curious Triceratops has stepped on @plumilla's wand! It's engulfed in a burst of magic energy, and the ground starts shaking and growing hot. The Triceratops' eyes shine red, and it roars and begins to stampede!<br><br>\"That's not good,\" calls @McCoyly, pointing in the distance. Each magic-fueled stomp is causing the volcanoes to erupt, and the glowing ground is turning to lava beneath the dinosaur's feet! Quickly, you must hold off the Trampling Triceratops until someone can reverse the spell!",
|
||||||
"questTriceratopsCompletion": "With quick thinking, you herd the creature towards the soothing Stoïkalm Steppes so that @*~Seraphina~* and @PainterProphet can reverse the lava spell without distraction. The calming aura of the Steppes takes effect, and the Triceratops curls up as the volcanoes go dormant once more. @PainterProphet passes you some eggs that were rescued from the lava. \"Without you, we wouldn't have been able to concentrate to stop the eruptions. Give these pets a good home.\"",
|
"questTriceratopsCompletion": "With quick thinking, you herd the creature towards the soothing Stoïkalm Steppes so that @*~Seraphina~* and @PainterProphet can reverse the lava spell without distraction. The calming aura of the Steppes takes effect, and the Triceratops curls up as the volcanoes go dormant once more. @PainterProphet passes you some eggs that were rescued from the lava. \"Without you, we wouldn't have been able to concentrate to stop the eruptions. Give these pets a good home.\"",
|
||||||
"questTriceratopsBoss": "Trampling Triceratops",
|
"questTriceratopsBoss": "Trampling Triceratops",
|
||||||
"questTriceratopsDropTriceratopsEgg": "Triceratops (Egg)",
|
"questTriceratopsDropTriceratopsEgg": "Triceratops (Egg)",
|
||||||
@@ -502,7 +502,7 @@
|
|||||||
|
|
||||||
"questGroupStoikalmCalamity": "Stoïkalm Calamity",
|
"questGroupStoikalmCalamity": "Stoïkalm Calamity",
|
||||||
"questStoikalmCalamity1Text": "Stoïkalm Calamity, Part 1: Earthen Enemies",
|
"questStoikalmCalamity1Text": "Stoïkalm Calamity, Part 1: Earthen Enemies",
|
||||||
"questStoikalmCalamity1Notes": "A terse missive arrives from @Kiwibot, and the frost-crusted scroll chills your heart as well as your fingertips. \"Visiting Stoïkalm Steppes -- monsters bursting from earth -- send help!\" You gather your party and ride north, but as soon as you venture down from the mountains, the snow beneath your feet explodes and gruesomely grinning skulls surround you!<br><br>Suddenly, a spear sails past, burying itself in a skull that was burrowing through the snow in an attempt to catch you unawares. A tall woman in finely-crafted armor gallops into the fray on the back of a mastodon, her long braid swinging as she yanks the spear unceremoniously from the crushed beast. It's time to fight off these foes with the help of Lady Glaciate, the leader of the Mammoth Riders!",
|
"questStoikalmCalamity1Notes": "A terse missive arrives from @Kiwibot, and the frost-crusted scroll chills your heart as well as your fingertips. \"Visiting Stoïkalm Steppes—monsters bursting from earth—send help!\" You gather your party and ride north, but as soon as you venture down from the mountains, the snow beneath your feet explodes and gruesomely grinning skulls surround you!<br><br>Suddenly, a spear sails past, burying itself in a skull that was burrowing through the snow in an attempt to catch you unawares. A tall woman in finely-crafted armor gallops into the fray on the back of a mastodon, her long braid swinging as she yanks the spear unceremoniously from the crushed beast. It's time to fight off these foes with the help of Lady Glaciate, the leader of the Mammoth Riders!",
|
||||||
"questStoikalmCalamity1Completion": "As you deliver a final blow to the skulls, they dissipate in a puff of magic. \"The dratted swarm may be gone,\" Lady Glaciate says, \"but we have bigger problems. Follow me.\" She tosses you a cloak to protect you from the chill air, and you ride off after her.",
|
"questStoikalmCalamity1Completion": "As you deliver a final blow to the skulls, they dissipate in a puff of magic. \"The dratted swarm may be gone,\" Lady Glaciate says, \"but we have bigger problems. Follow me.\" She tosses you a cloak to protect you from the chill air, and you ride off after her.",
|
||||||
"questStoikalmCalamity1Boss": "Earth Skull Swarm",
|
"questStoikalmCalamity1Boss": "Earth Skull Swarm",
|
||||||
"questStoikalmCalamity1RageTitle": "Swarm Respawn",
|
"questStoikalmCalamity1RageTitle": "Swarm Respawn",
|
||||||
@@ -513,7 +513,7 @@
|
|||||||
"questStoikalmCalamity1DropArmor": "Mammoth Rider Armor",
|
"questStoikalmCalamity1DropArmor": "Mammoth Rider Armor",
|
||||||
|
|
||||||
"questStoikalmCalamity2Text": "Stoïkalm Calamity, Part 2: Seek the Icicle Caverns",
|
"questStoikalmCalamity2Text": "Stoïkalm Calamity, Part 2: Seek the Icicle Caverns",
|
||||||
"questStoikalmCalamity2Notes": "The stately hall of the Mammoth Riders is an austere masterpiece of architecture, but it is also entirely empty. There's no furniture, the weapons are missing, and even the columns were picked clean of their inlays.<br><br>\"Those skulls scoured the place,\" Lady Glaciate says, and there is a blizzard brewing in her tone. \"Humiliating. Not a soul is to mention this to the April Fool, or I will never hear the end of it.\"<br><br>\"How mysterious!\" says @Beffymaroo. \"But where did they--\"<br><br>\"The icicle drake caverns.\" Lady Glaciate gestures at shining coins spilled in the snow outside. \"Sloppy.\"<br><br>\"But aren't icicle drakes honorable creatures with their own treasure hoards?\" @Beffymaroo asks. \"Why would they possibly--\"<br><br>\"Mind control,\" says Lady Glaciate, utterly unfazed. \"Or something equally melodramatic and inconvenient.\" She begins to stride from the hall. \"Why are you just standing there?\"<br><br>Quickly, go follow the trail of Icicle Coins!",
|
"questStoikalmCalamity2Notes": "The stately hall of the Mammoth Riders is an austere masterpiece of architecture, but it is also entirely empty. There's no furniture, the weapons are missing, and even the columns were picked clean of their inlays.<br><br>\"Those skulls scoured the place,\" Lady Glaciate says, and there is a blizzard brewing in her tone. \"Humiliating. Not a soul is to mention this to the April Fool, or I will never hear the end of it.\"<br><br>\"How mysterious!\" says @Beffymaroo. \"But where did they—\"<br><br>\"The icicle drake caverns.\" Lady Glaciate gestures at shining coins spilled in the snow outside. \"Sloppy.\"<br><br>\"But aren't icicle drakes honorable creatures with their own treasure hoards?\" @Beffymaroo asks. \"Why would they possibly—\"<br><br>\"Mind control,\" says Lady Glaciate, utterly unfazed. \"Or something equally melodramatic and inconvenient.\" She begins to stride from the hall. \"Why are you just standing there?\"<br><br>Quickly, go follow the trail of Icicle Coins!",
|
||||||
"questStoikalmCalamity2Completion": "The Icicle Coins lead you straight to the buried entrance of a cleverly hidden cavern. Though the weather outside is calm and lovely, with the sunlight sparkling across the expanse of snow, there is a howling within like a fierce winter wind. Lady Glaciate grimaces and hands you a Mammoth Rider helm. \"Wear this,\" she says. \"You'll need it.\"",
|
"questStoikalmCalamity2Completion": "The Icicle Coins lead you straight to the buried entrance of a cleverly hidden cavern. Though the weather outside is calm and lovely, with the sunlight sparkling across the expanse of snow, there is a howling within like a fierce winter wind. Lady Glaciate grimaces and hands you a Mammoth Rider helm. \"Wear this,\" she says. \"You'll need it.\"",
|
||||||
"questStoikalmCalamity2CollectIcicleCoins": "Icicle Coins",
|
"questStoikalmCalamity2CollectIcicleCoins": "Icicle Coins",
|
||||||
"questStoikalmCalamity2DropHeadgear": "Mammoth Rider Helm (Headgear)",
|
"questStoikalmCalamity2DropHeadgear": "Mammoth Rider Helm (Headgear)",
|
||||||
@@ -527,21 +527,21 @@
|
|||||||
"questStoikalmCalamity3DropWeapon": "Mammoth Rider Spear (Weapon)",
|
"questStoikalmCalamity3DropWeapon": "Mammoth Rider Spear (Weapon)",
|
||||||
|
|
||||||
"questGuineaPigText": "The Guinea Pig Gang",
|
"questGuineaPigText": "The Guinea Pig Gang",
|
||||||
"questGuineaPigNotes": "You're casually strolling through Habit City's famous Market when @Pandah waves you down. \"Hey, check these out!\" They're holding up a brown and beige egg you don't recognize.<br><br>Alexander the Merchant frowns at it. \"I don't remember putting that out. I wonder where it came--\" A small paw cuts him off.<br><br>\"Guinea all your gold, merchant!\" squeaks a tiny voice brimming with evil.<br><br>\"Oh no, the egg was a distraction!\" @mewrose exclaims. \"It's the gritty, greedy Guinea Pig Gang! They never do their Dailies, so they constantly steal gold to buy health potions.\"<br><br>\"Robbing the Market?\" says @emmavig. \"Not on our watch!\" Without further prompting, you leap to Alexander's aid.",
|
"questGuineaPigNotes": "You're casually strolling through Habit City's famous Market when @Pandah waves you down. \"Hey, check these out!\" They're holding up a brown and beige egg you don't recognize.<br><br>Alexander the Merchant frowns at it. \"I don't remember putting that out. I wonder where it came—\" A small paw cuts him off.<br><br>\"Guinea all your gold, merchant!\" squeaks a tiny voice brimming with evil.<br><br>\"Oh no, the egg was a distraction!\" @mewrose exclaims. \"It's the gritty, greedy Guinea Pig Gang! They never do their Dailies, so they constantly steal gold to buy health potions.\"<br><br>\"Robbing the Market?\" says @emmavig. \"Not on our watch!\" Without further prompting, you leap to Alexander's aid.",
|
||||||
"questGuineaPigCompletion": "\"We submit!\" The Guinea Pig Gang Boss waves his paws at you, fluffy head hanging in shame. From underneath his hat falls a list, and @snazzyorange quickly swipes it for evidence. \"Wait a minute,\" you say. \"It's no wonder you've been getting hurt! You've got way too many Dailies. You don't need health potions -- you just need help organizing.\"<br><br>\"Really?\" squeaks the Guinea Pig Gang Boss. \"We've robbed so many people because of this! Please take our eggs as an apology for our crooked ways.\"",
|
"questGuineaPigCompletion": "\"We submit!\" The Guinea Pig Gang Boss waves his paws at you, fluffy head hanging in shame. From underneath his hat falls a list, and @snazzyorange quickly swipes it for evidence. \"Wait a minute,\" you say. \"It's no wonder you've been getting hurt! You've got way too many Dailies. You don't need health potions—you just need help organizing.\"<br><br>\"Really?\" squeaks the Guinea Pig Gang Boss. \"We've robbed so many people because of this! Please take our eggs as an apology for our crooked ways.\"",
|
||||||
"questGuineaPigBoss": "Guinea Pig Gang",
|
"questGuineaPigBoss": "Guinea Pig Gang",
|
||||||
"questGuineaPigDropGuineaPigEgg": "Guinea Pig (Egg)",
|
"questGuineaPigDropGuineaPigEgg": "Guinea Pig (Egg)",
|
||||||
"questGuineaPigUnlockText": "Unlocks Guinea Pig Eggs for purchase in the Market",
|
"questGuineaPigUnlockText": "Unlocks Guinea Pig Eggs for purchase in the Market",
|
||||||
|
|
||||||
"questPeacockText": "The Push-and-Pull Peacock",
|
"questPeacockText": "The Push-and-Pull Peacock",
|
||||||
"questPeacockNotes": "You trek through the Taskwoods, wondering which of the enticing new goals you should pick. As you go deeper into the forest, you realize that you're not alone in your indecision. \"I could learn a new language, or go to the gym...\" @Cecily Perez mutters. \"I could sleep more,\" muses @Lilith of Alfheim, \"or spend time with my friends...\" It looks like @PainterProphet, @Pfeffernusse, and @Draayder are equally paralyzed by the overwhelming options.<br><br>You realize that these ever-more-demanding feelings aren't really your own... you've stumbled straight into the trap of the pernicious Push-and-Pull Peacock! Before you can run, it leaps from the bushes. With each head pulling you in conflicting directions, you start to feel burnout overcoming you. You can't defeat both foes at once, so you only have one option -- concentrate on the nearest task to fight back!",
|
"questPeacockNotes": "You trek through the Taskwoods, wondering which of the enticing new goals you should pick. As you go deeper into the forest, you realize that you're not alone in your indecision. \"I could learn a new language, or go to the gym...\" @Cecily Perez mutters. \"I could sleep more,\" muses @Lilith of Alfheim, \"or spend time with my friends...\" It looks like @PainterProphet, @Pfeffernusse, and @Draayder are equally paralyzed by the overwhelming options.<br><br>You realize that these ever-more-demanding feelings aren't really your own... you've stumbled straight into the trap of the pernicious Push-and-Pull Peacock! Before you can run, it leaps from the bushes. With each head pulling you in conflicting directions, you start to feel burnout overcoming you. You can't defeat both foes at once, so you only have one option—concentrate on the nearest task to fight back!",
|
||||||
"questPeacockCompletion": "The Push-and-Pull Peacock is caught off guard by your sudden conviction. Defeated by your single-minded drive, its heads merge back into one, revealing the most beautiful creature you've ever seen. \"Thank you,\" the peacock says. \"I’ve spent so long pulling myself in different directions that I lost sight of what I truly wanted. Please accept these eggs as a token of my gratitude.\"",
|
"questPeacockCompletion": "The Push-and-Pull Peacock is caught off guard by your sudden conviction. Defeated by your single-minded drive, its heads merge back into one, revealing the most beautiful creature you've ever seen. \"Thank you,\" the peacock says. \"I’ve spent so long pulling myself in different directions that I lost sight of what I truly wanted. Please accept these eggs as a token of my gratitude.\"",
|
||||||
"questPeacockBoss": "Push-and-Pull Peacock",
|
"questPeacockBoss": "Push-and-Pull Peacock",
|
||||||
"questPeacockDropPeacockEgg": "Peacock (Egg)",
|
"questPeacockDropPeacockEgg": "Peacock (Egg)",
|
||||||
"questPeacockUnlockText": "Unlocks Peacock Eggs for purchase in the Market",
|
"questPeacockUnlockText": "Unlocks Peacock Eggs for purchase in the Market",
|
||||||
|
|
||||||
"questButterflyText": "Bye, Bye, Butterfry",
|
"questButterflyText": "Bye, Bye, Butterfry",
|
||||||
"questButterflyNotes": "Your gardener friend @Megan sends you an invitation: “These warm days are the perfect time to visit Habitica’s butterfly garden in the Taskan countryside. Come see the butterflies migrate!” When you arrive, however, the garden is in shambles -- little more than scorched grass and dried-out weeds. It’s been so hot that the Habiticans haven’t come out to water the flowers, and the dark-red Dailies have turned it into a dry, sun-baked, fire-hazard. There's only one butterfly there, and there's something odd about it...<br><br>“Oh no! This is the perfect hatching ground for the Flaming Butterfry,” cries @Leephon.<br><br>“If we don’t catch it, it’ll destroy everything!” gasps @Eevachu.<br><br>Time to say bye, bye to Butterfry!",
|
"questButterflyNotes": "Your gardener friend @Megan sends you an invitation: “These warm days are the perfect time to visit Habitica’s butterfly garden in the Taskan countryside. Come see the butterflies migrate!” When you arrive, however, the garden is in shambles—little more than scorched grass and dried-out weeds. It’s been so hot that the Habiticans haven’t come out to water the flowers, and the dark-red Dailies have turned it into a dry, sun-baked, fire-hazard. There's only one butterfly there, and there's something odd about it...<br><br>“Oh no! This is the perfect hatching ground for the Flaming Butterfry,” cries @Leephon.<br><br>“If we don’t catch it, it’ll destroy everything!” gasps @Eevachu.<br><br>Time to say bye, bye to Butterfry!",
|
||||||
"questButterflyCompletion": "After a blazing battle, the Flaming Butterfry is captured. “Great job catching that would-be arsonist,” says @Megan with a sigh of relief. “Still, it’s hard to vilify even the vilest butterfly. We’d better free this Butterfry someplace safe…like the desert.”<br><br>One of the other gardeners, @Beffymaroo, comes up to you, singed but smiling. “Will you help raise these foundling chrysalises we found? Perhaps next year we’ll have a greener garden for them.”",
|
"questButterflyCompletion": "After a blazing battle, the Flaming Butterfry is captured. “Great job catching that would-be arsonist,” says @Megan with a sigh of relief. “Still, it’s hard to vilify even the vilest butterfly. We’d better free this Butterfry someplace safe…like the desert.”<br><br>One of the other gardeners, @Beffymaroo, comes up to you, singed but smiling. “Will you help raise these foundling chrysalises we found? Perhaps next year we’ll have a greener garden for them.”",
|
||||||
"questButterflyBoss": "Flaming Butterfry",
|
"questButterflyBoss": "Flaming Butterfry",
|
||||||
"questButterflyDropButterflyEgg": "Caterpillar (Egg)",
|
"questButterflyDropButterflyEgg": "Caterpillar (Egg)",
|
||||||
@@ -712,7 +712,7 @@
|
|||||||
"questSeaSerpentUnlockText": "Unlocks Sea Serpent Eggs for purchase in the Market",
|
"questSeaSerpentUnlockText": "Unlocks Sea Serpent Eggs for purchase in the Market",
|
||||||
|
|
||||||
"questKangarooText": "Kangaroo Catastrophe",
|
"questKangarooText": "Kangaroo Catastrophe",
|
||||||
"questKangarooNotes": "Maybe you should have finished that last task… you know, the one you keep avoiding, even though it always comes back around? But @Mewrose and @LilithofAlfheim invited you and @stefalupagus to see a rare kangaroo troop hopping through the Sloensteadi Savannah; how could you say no?! As the troop comes into view, something hits you on the back of the head with a mighty <em>whack!</em><br><br>Shaking the stars from your vision, you pick up the responsible object--a dark red boomerang, with the very task you continually push back etched into its surface. A quick glance around confirms the rest of your party met a similar fate. One larger kangaroo looks at you with a smug grin, like she’s daring you to face her and that dreaded task once and for all!",
|
"questKangarooNotes": "Maybe you should have finished that last task… you know, the one you keep avoiding, even though it always comes back around? But @Mewrose and @LilithofAlfheim invited you and @stefalupagus to see a rare kangaroo troop hopping through the Sloensteadi Savannah; how could you say no?! As the troop comes into view, something hits you on the back of the head with a mighty <em>whack!</em><br><br>Shaking the stars from your vision, you pick up the responsible object—a dark red boomerang, with the very task you continually push back etched into its surface. A quick glance around confirms the rest of your party met a similar fate. One larger kangaroo looks at you with a smug grin, like she’s daring you to face her and that dreaded task once and for all!",
|
||||||
"questKangarooCompletion": "“NOW!” You signal your party to throw the boomerangs back at the kangaroo. The beast hops further away with each hit until she flees, leaving nothing more than a dark red cloud of dust, a few eggs, and some gold coins.<br><br>@Mewrose walks forward to where the kangaroo once stood. “Hey, where did the boomerangs go?”<br><br>“They probably dissolved into dust, making that dark red cloud, when we finished our respective tasks,” @stefalupagus speculates.<br><br>@LilithofAlfheim squints at the horizon. “Is that another kangaroo troop heading our way?”<br><br>You all break into a run back to Habit City. Better to face your difficult tasks than take another lump to the back of the head!",
|
"questKangarooCompletion": "“NOW!” You signal your party to throw the boomerangs back at the kangaroo. The beast hops further away with each hit until she flees, leaving nothing more than a dark red cloud of dust, a few eggs, and some gold coins.<br><br>@Mewrose walks forward to where the kangaroo once stood. “Hey, where did the boomerangs go?”<br><br>“They probably dissolved into dust, making that dark red cloud, when we finished our respective tasks,” @stefalupagus speculates.<br><br>@LilithofAlfheim squints at the horizon. “Is that another kangaroo troop heading our way?”<br><br>You all break into a run back to Habit City. Better to face your difficult tasks than take another lump to the back of the head!",
|
||||||
"questKangarooBoss": "Catastrophic Kangaroo",
|
"questKangarooBoss": "Catastrophic Kangaroo",
|
||||||
"questKangarooDropKangarooEgg": "Kangaroo (Egg)",
|
"questKangarooDropKangarooEgg": "Kangaroo (Egg)",
|
||||||
@@ -784,7 +784,7 @@
|
|||||||
|
|
||||||
"questAmberText": "The Amber Alliance",
|
"questAmberText": "The Amber Alliance",
|
||||||
"questAmberNotes": "You’re sitting in the Tavern with @beffymaroo and @-Tyr- when @Vikte bursts through the door and excitedly tells you about the rumors of another type of Magic Hatching Potion hidden in the Taskwoods. Having completed your Dailies, the three of you immediately agree to help @Vikte on their search. After all, what’s the harm in a little adventure?<br><br>After walking through the Taskwoods for hours, you’re beginning to regret joining such a wild chase. You’re about to head home, when you hear a surprised yelp and turn to see a huge lizard with shiny amber scales coiled around a tree, clutching @Vikte in her claws. @beffymaroo reaches for her sword.<br><br>“Wait!” cries @-Tyr-. “It’s the Trerezin! She’s not dangerous, just dangerously clingy!”",
|
"questAmberNotes": "You’re sitting in the Tavern with @beffymaroo and @-Tyr- when @Vikte bursts through the door and excitedly tells you about the rumors of another type of Magic Hatching Potion hidden in the Taskwoods. Having completed your Dailies, the three of you immediately agree to help @Vikte on their search. After all, what’s the harm in a little adventure?<br><br>After walking through the Taskwoods for hours, you’re beginning to regret joining such a wild chase. You’re about to head home, when you hear a surprised yelp and turn to see a huge lizard with shiny amber scales coiled around a tree, clutching @Vikte in her claws. @beffymaroo reaches for her sword.<br><br>“Wait!” cries @-Tyr-. “It’s the Trerezin! She’s not dangerous, just dangerously clingy!”",
|
||||||
"questAmberCompletion": "“Trerezin?” @-Tyr- says calmly. “Could you let @Vikte go? I don’t think they’re enjoying being so high up.”<br><br>The Trerezin’s amber skin blushes crimson and she gently lowers @Vikte to the ground. “My apologies! It’s been so long since I’ve had any guests that I’ve forgotten my manners!” She slithers forward to greet you properly before disappearing into her treehouse, and returning with an armful of Amber Hatching Potions as thank-you gifts!<br><br>“Magic Potions!” @Vikte gasps.<br><br>“Oh, these old things?” The Trerezin's tongue flickers as she thinks. “How about this? I’ll give you this whole stack if you promise to visit me every so often...”<br><br>And so you leave the Taskwoods, excited to tell everyone about the new potions--and your new friend!",
|
"questAmberCompletion": "“Trerezin?” @-Tyr- says calmly. “Could you let @Vikte go? I don’t think they’re enjoying being so high up.”<br><br>The Trerezin’s amber skin blushes crimson and she gently lowers @Vikte to the ground. “My apologies! It’s been so long since I’ve had any guests that I’ve forgotten my manners!” She slithers forward to greet you properly before disappearing into her treehouse, and returning with an armful of Amber Hatching Potions as thank-you gifts!<br><br>“Magic Potions!” @Vikte gasps.<br><br>“Oh, these old things?” The Trerezin's tongue flickers as she thinks. “How about this? I’ll give you this whole stack if you promise to visit me every so often...”<br><br>And so you leave the Taskwoods, excited to tell everyone about the new potions—and your new friend!",
|
||||||
"questAmberBoss": "Trerezin",
|
"questAmberBoss": "Trerezin",
|
||||||
"questAmberDropAmberPotion": "Amber Hatching Potion",
|
"questAmberDropAmberPotion": "Amber Hatching Potion",
|
||||||
"questAmberUnlockText": "Unlocks Amber Hatching Potions for purchase in the Market",
|
"questAmberUnlockText": "Unlocks Amber Hatching Potions for purchase in the Market",
|
||||||
@@ -800,7 +800,7 @@
|
|||||||
|
|
||||||
"questWaffleText": "Waffling with the Fool: Disaster Breakfast!",
|
"questWaffleText": "Waffling with the Fool: Disaster Breakfast!",
|
||||||
"questWaffleNotes": "“April Fool!” storms a flustered Lady Glaciate. “You said your dessert-themed prank was ‘over with and completely cleaned up’!”<br><br>“Why, it was and is, my dear,” replies the Fool, puzzled. “And I am the most honest of Fools. What's wrong?”<br><br>“There's a giant sugary monster approaching Habit City!”<br><br>“Hmm,” muses the Fool. “I did raid a few lairs for the mystic reagents for my last event. Maybe I attracted some unwanted attention. Is it the Saccharine Serpent? The Torte-oise? Tiramisu Rex?”<br><br>“No! It's some sort of... Awful Waffle!”<br><br>“Huh. That's a new one! Perhaps it spawned from all the ambient shenanigan energy.” He turns to you and @beffymaroo with a lopsided smile. “I don't suppose you'd be available for some heroics?”",
|
"questWaffleNotes": "“April Fool!” storms a flustered Lady Glaciate. “You said your dessert-themed prank was ‘over with and completely cleaned up’!”<br><br>“Why, it was and is, my dear,” replies the Fool, puzzled. “And I am the most honest of Fools. What's wrong?”<br><br>“There's a giant sugary monster approaching Habit City!”<br><br>“Hmm,” muses the Fool. “I did raid a few lairs for the mystic reagents for my last event. Maybe I attracted some unwanted attention. Is it the Saccharine Serpent? The Torte-oise? Tiramisu Rex?”<br><br>“No! It's some sort of... Awful Waffle!”<br><br>“Huh. That's a new one! Perhaps it spawned from all the ambient shenanigan energy.” He turns to you and @beffymaroo with a lopsided smile. “I don't suppose you'd be available for some heroics?”",
|
||||||
"questWaffleCompletion": "Battered and buttered but triumphant, you savor sweet victory as the Awful Waffle collapses into a pool of sticky goo.<br><br>“Wow, you really creamed that monster,” says Lady Glaciate, impressed.<br><br>“A piece of cake!” beams the April Fool.<br><br>“Kind of a shame, though,” says @beffymaroo. “It looked good enough to eat.”<br><br>The Fool takes a set of potion bottles from somewhere in his cape, fills them with the syrupy leavings of the Waffle, and mixes in a pinch of sparkling dust. The liquid swirls with color--new Hatching Potions! He tosses them into your arms. “All that adventure has given me an appetite. Who wants to join me for breakfast?”",
|
"questWaffleCompletion": "Battered and buttered but triumphant, you savor sweet victory as the Awful Waffle collapses into a pool of sticky goo.<br><br>“Wow, you really creamed that monster,” says Lady Glaciate, impressed.<br><br>“A piece of cake!” beams the April Fool.<br><br>“Kind of a shame, though,” says @beffymaroo. “It looked good enough to eat.”<br><br>The Fool takes a set of potion bottles from somewhere in his cape, fills them with the syrupy leavings of the Waffle, and mixes in a pinch of sparkling dust. The liquid swirls with color—new Hatching Potions! He tosses them into your arms. “All that adventure has given me an appetite. Who wants to join me for breakfast?”",
|
||||||
"questWaffleBoss": "Awful Waffle",
|
"questWaffleBoss": "Awful Waffle",
|
||||||
"questWaffleRageTitle": "Maple Mire",
|
"questWaffleRageTitle": "Maple Mire",
|
||||||
"questWaffleRageDescription": "Maple Mire: This bar fills when you don't complete your Dailies. When it is full, the Awful Waffle will subtract from the pending damage that party members have built up!",
|
"questWaffleRageDescription": "Maple Mire: This bar fills when you don't complete your Dailies. When it is full, the Awful Waffle will subtract from the pending damage that party members have built up!",
|
||||||
@@ -819,7 +819,7 @@
|
|||||||
"questFluoriteUnlockText": "Unlocks Fluorite Hatching Potions for purchase in the Market",
|
"questFluoriteUnlockText": "Unlocks Fluorite Hatching Potions for purchase in the Market",
|
||||||
|
|
||||||
"questWindupText": "A Whirl with a Wind-Up Warrior",
|
"questWindupText": "A Whirl with a Wind-Up Warrior",
|
||||||
"questWindupNotes": "Habit City is seldom quiet, but you weren’t prepared for the cacophony of creaks, squeaks and screams escaping Good Timekeeping, Habitica’s finest clockwork emporium. You sigh--you just wanted your watch fixed. The proprietor, known only as “Great and Powerful”, tumbles out the door, pursued by a clanking copper colossus!<br><br>“Ki-! Ki-! Ki!” it clangs, arms smashing up and down. Its gears grind and screech in protest.<br><br>“My robot Clankton has gone mad! It’s trying to kill me!” the supposedly Powerful one shrieks.<br><br>Even with a broken watch, you can tell when it’s time to fight. You leap forward to defend the panicking watchmaker. @Vikte and @a_diamond also step up to help!<br><br>“Ki-! Ki-! Ki-!” Clankton chants with each blow. “Mew!”<br><br>Wait, was that mechanical mewling amidst the murderous monotone?",
|
"questWindupNotes": "Habit City is seldom quiet, but you weren’t prepared for the cacophony of creaks, squeaks and screams escaping Good Timekeeping, Habitica’s finest clockwork emporium. You sigh—you just wanted your watch fixed. The proprietor, known only as “Great and Powerful”, tumbles out the door, pursued by a clanking copper colossus!<br><br>“Ki-! Ki-! Ki!” it clangs, arms smashing up and down. Its gears grind and screech in protest.<br><br>“My robot Clankton has gone mad! It’s trying to kill me!” the supposedly Powerful one shrieks.<br><br>Even with a broken watch, you can tell when it’s time to fight. You leap forward to defend the panicking watchmaker. @Vikte and @a_diamond also step up to help!<br><br>“Ki-! Ki-! Ki-!” Clankton chants with each blow. “Mew!”<br><br>Wait, was that mechanical mewling amidst the murderous monotone?",
|
||||||
"questWindupCompletion": "As you dodge the attacks, you notice something odd: a stripy brass tail sticking out of the robot’s chassis. You plunge a hand amid the grinding gears and pull out… a trembling wind-up tiger cub. It snuggles against your shirt.<br><br>The clockwork robot immediately stops flailing and smiles, its cogs clicking back into place. “Ki-Ki-Kitty! Kitty got in me!”<br><br>“Great!” the Powerful says, blushing. “I’ve been working hard on these wind-up pet potions. I guess I lost track of my new creations. I’ve been missing my ‘Tidy the workshop’ daily a lot lately…”<br><br>You follow the tinkerer and Clankton inside. Parts, tools and potions cover every surface. “Powerful” takes your watch, but hands you a few potions.<br><br>“Take these. Clearly they’ll be safer with you!”",
|
"questWindupCompletion": "As you dodge the attacks, you notice something odd: a stripy brass tail sticking out of the robot’s chassis. You plunge a hand amid the grinding gears and pull out… a trembling wind-up tiger cub. It snuggles against your shirt.<br><br>The clockwork robot immediately stops flailing and smiles, its cogs clicking back into place. “Ki-Ki-Kitty! Kitty got in me!”<br><br>“Great!” the Powerful says, blushing. “I’ve been working hard on these wind-up pet potions. I guess I lost track of my new creations. I’ve been missing my ‘Tidy the workshop’ daily a lot lately…”<br><br>You follow the tinkerer and Clankton inside. Parts, tools and potions cover every surface. “Powerful” takes your watch, but hands you a few potions.<br><br>“Take these. Clearly they’ll be safer with you!”",
|
||||||
"questWindupBoss": "Clankton",
|
"questWindupBoss": "Clankton",
|
||||||
"questWindupDropWindupPotion": "Wind-Up Hatching Potion",
|
"questWindupDropWindupPotion": "Wind-Up Hatching Potion",
|
||||||
|
|||||||
@@ -180,6 +180,9 @@
|
|||||||
"mysterySet202509": "Windswept Wanderer Set",
|
"mysterySet202509": "Windswept Wanderer Set",
|
||||||
"mysterySet202510": "Gliding Ghoul Set",
|
"mysterySet202510": "Gliding Ghoul Set",
|
||||||
"mysterySet202511": "Frost Warrior Set",
|
"mysterySet202511": "Frost Warrior Set",
|
||||||
|
"mysterySet202512": "Cookie Champion Set",
|
||||||
|
"mysterySet202601": "Winter's Aegis Set",
|
||||||
|
"mysterySet202602": "Sakura Fox Set",
|
||||||
"mysterySet301404": "Steampunk Standard Set",
|
"mysterySet301404": "Steampunk Standard Set",
|
||||||
"mysterySet301405": "Steampunk Accessories Set",
|
"mysterySet301405": "Steampunk Accessories Set",
|
||||||
"mysterySet301703": "Peacock Steampunk Set",
|
"mysterySet301703": "Peacock Steampunk Set",
|
||||||
@@ -269,5 +272,7 @@
|
|||||||
"unlockNGemsGift": "They'll unlock <strong><%= count %> Gems</strong> per month in the Market",
|
"unlockNGemsGift": "They'll unlock <strong><%= count %> Gems</strong> per month in the Market",
|
||||||
"earn2GemsGift": "They'll earn <strong>+2 Gems</strong> every month they're subscribed",
|
"earn2GemsGift": "They'll earn <strong>+2 Gems</strong> every month they're subscribed",
|
||||||
"maxGemCapGift": "They'll have the max <strong>Gem Cap</strong>",
|
"maxGemCapGift": "They'll have the max <strong>Gem Cap</strong>",
|
||||||
"subscribeAgainContinueHourglasses": "Subscribe again to continue receiving Mystic Hourglasses"
|
"subscribeAgainContinueHourglasses": "Subscribe again to continue receiving Mystic Hourglasses",
|
||||||
|
"subscriptionBillingFYI": "Subscriptions automatically renew unless you cancel at least 24 hours before the end of the current period. You can manage your subscription from the Subscription tab in settings. Your account will be charged within 24 hours of your renewal date, at the same price you initially paid.",
|
||||||
|
"subscriptionBillingFYIShort": "Subscriptions automatically renew unless you cancel at least 24 hours before the end of the current period. Your account will be charged within 24 hours of your renewal date, at the same price you initially paid."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@
|
|||||||
"fortify": "Fortify",
|
"fortify": "Fortify",
|
||||||
"fortifyComplete": "Fortify complete!",
|
"fortifyComplete": "Fortify complete!",
|
||||||
"deleteTaskType": "Delete this <%= type %>",
|
"deleteTaskType": "Delete this <%= type %>",
|
||||||
"sureDeleteType": "Are you sure you want to delete this <%= type %>?",
|
"sureDeleteType": "Are you sure you want to delete this task?",
|
||||||
"streakCoins": "Streak Bonus!",
|
"streakCoins": "Streak Bonus!",
|
||||||
"taskToTop": "To top",
|
"taskToTop": "To top",
|
||||||
"taskToBottom": "To bottom",
|
"taskToBottom": "To bottom",
|
||||||
@@ -138,5 +138,10 @@
|
|||||||
"pressEnterToAddTag": "Press Enter to add tag: '<%= tagName %>'",
|
"pressEnterToAddTag": "Press Enter to add tag: '<%= tagName %>'",
|
||||||
"taskSummary": "<%= type %> Summary",
|
"taskSummary": "<%= type %> Summary",
|
||||||
"scoreUp": "Score up",
|
"scoreUp": "Score up",
|
||||||
"scoreDown": "Score down"
|
"scoreDown": "Score down",
|
||||||
|
"deleteType": "Delete <%= type %>",
|
||||||
|
"deleteTask": "Delete Task",
|
||||||
|
"deleteXTasks": "Delete <%= count %> Tasks",
|
||||||
|
"brokenChallengeTaskCount": "This is one of <%= count %> tasks that are part of a Challenge that no longer exists.",
|
||||||
|
"confirmDeleteTasks": "Would you like to delete the tasks?"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"achievement": "Achievement",
|
"achievement": "Achievement",
|
||||||
"onwards": "Onwards!",
|
"onwards": "Onwards!",
|
||||||
"levelup": "By accomplishing your real life goals, you leveled up and are now fully healed!",
|
"levelup": "By accomplishing your real life goals, you levelled up and are now fully healed!",
|
||||||
"reachedLevel": "You Reached Level <%= level %>",
|
"reachedLevel": "You Reached Level <%= level %>",
|
||||||
"achievementLostMasterclasser": "Quest Completionist: Masterclasser Series",
|
"achievementLostMasterclasser": "Quest Completionist: Masterclasser Series",
|
||||||
"achievementLostMasterclasserText": "Completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!",
|
"achievementLostMasterclasserText": "Completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!",
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
"achievementPrimedForPaintingModalText": "You collected all the White Pets!",
|
"achievementPrimedForPaintingModalText": "You collected all the White Pets!",
|
||||||
"achievementPrimedForPaintingText": "Has collected all White Pets.",
|
"achievementPrimedForPaintingText": "Has collected all White Pets.",
|
||||||
"achievementPrimedForPainting": "Primed for Painting",
|
"achievementPrimedForPainting": "Primed for Painting",
|
||||||
"achievementPurchasedEquipmentModalText": "Equipment is a way to customize your avatar and improve your Stats",
|
"achievementPurchasedEquipmentModalText": "Equipment is a way to customise your avatar and improve your Stats",
|
||||||
"achievementPurchasedEquipmentText": "Purchased their first piece of equipment.",
|
"achievementPurchasedEquipmentText": "Purchased their first piece of equipment.",
|
||||||
"achievementPurchasedEquipment": "Purchase a piece of Equipment",
|
"achievementPurchasedEquipment": "Purchase a piece of Equipment",
|
||||||
"achievementFedPetModalText": "There are many different types of food, but Pets can be picky",
|
"achievementFedPetModalText": "There are many different types of food, but Pets can be picky",
|
||||||
@@ -152,17 +152,17 @@
|
|||||||
"achievementPlantParentText": "Has hatched all standard colours of Plant pets: Cactus and Treeling!",
|
"achievementPlantParentText": "Has hatched all standard colours of Plant pets: Cactus and Treeling!",
|
||||||
"achievementDinosaurDynastyText": "Has hatched all standard colours of bird and dinosaur pets: Falcon, Owl, Parrot, Peacock, Penguin, Rooster, Pterodactyl, T-Rex, Triceratops, and Velociraptor!",
|
"achievementDinosaurDynastyText": "Has hatched all standard colours of bird and dinosaur pets: Falcon, Owl, Parrot, Peacock, Penguin, Rooster, Pterodactyl, T-Rex, Triceratops, and Velociraptor!",
|
||||||
"achievementDuneBuddyModalText": "You collected all the desert dwelling pets!",
|
"achievementDuneBuddyModalText": "You collected all the desert dwelling pets!",
|
||||||
"achievementRoughRiderModalText": "You collected all the basic colors of the uncomfortable pets and mounts!",
|
"achievementRoughRiderModalText": "You collected all the basic colours of the uncomfortable pets and mounts!",
|
||||||
"achievementRodentRuler": "Rodent Ruler",
|
"achievementRodentRuler": "Rodent Ruler",
|
||||||
"achievementRodentRulerText": "Has hatched all standard colors of rodent pets: Guinea Pig, Rat, and Squirrel!",
|
"achievementRodentRulerText": "Has hatched all standard colours of rodent pets: Guinea Pig, Rat, and Squirrel!",
|
||||||
"achievementRodentRulerModalText": "You collected all the rodent pets!",
|
"achievementRodentRulerModalText": "You collected all the rodent pets!",
|
||||||
"achievementRoughRider": "Rough Rider",
|
"achievementRoughRider": "Rough Rider",
|
||||||
"achievementRoughRiderText": "Has hatched all basic colours of the uncomfortable pets and mounts: Cactus, Hedgehog, and Rock!",
|
"achievementRoughRiderText": "Has hatched all basic colours of the uncomfortable pets and mounts: Cactus, Hedgehog, and Rock!",
|
||||||
"achievementCats": "Cat Herder",
|
"achievementCats": "Cat Herder",
|
||||||
"achievementCatsText": "Has hatched all the standard colors of cat pets: Cheetah, Lion, Sabretooth, and Tiger!",
|
"achievementCatsText": "Has hatched all the standard colours of cat pets: Cheetah, Lion, Sabretooth, and Tiger!",
|
||||||
"achievementCatsModalText": "You collected all the cat pets!",
|
"achievementCatsModalText": "You collected all the cat pets!",
|
||||||
"achievementBonelessBoss": "Boneless Boss",
|
"achievementBonelessBoss": "Boneless Boss",
|
||||||
"achievementBonelessBossText": "Has hatched all standard colors of invertebrate pets: Beetle, Butterfly, Cuttlefish, Nudibranch, Octopus, Snail, and Spider!",
|
"achievementBonelessBossText": "Has hatched all standard colours of invertebrate pets: Beetle, Butterfly, Cuttlefish, Nudibranch, Octopus, Snail, and Spider!",
|
||||||
"achievementBonelessBossModalText": "You collected all the invertebrate pets!",
|
"achievementBonelessBossModalText": "You collected all the invertebrate pets!",
|
||||||
"achievementDuneBuddy": "Dune Buddy",
|
"achievementDuneBuddy": "Dune Buddy",
|
||||||
"achievementDuneBuddyText": "Has hatched all standard colours of desert dwelling pets: Armadillo, Cactus, Fox, Frog, Snake, and Spider!"
|
"achievementDuneBuddyText": "Has hatched all standard colours of desert dwelling pets: Armadillo, Cactus, Fox, Frog, Snake, and Spider!"
|
||||||
|
|||||||
@@ -706,8 +706,8 @@
|
|||||||
"backgroundDogParkText": "Dog Park",
|
"backgroundDogParkText": "Dog Park",
|
||||||
"backgroundDogParkNotes": "Frolic at the Dog Park.",
|
"backgroundDogParkNotes": "Frolic at the Dog Park.",
|
||||||
"backgrounds022024": "SET 117: Released February 2024",
|
"backgrounds022024": "SET 117: Released February 2024",
|
||||||
"backgroundColorfulStreetText": "Colorful Street",
|
"backgroundColorfulStreetText": "Colourful Street",
|
||||||
"backgroundColorfulStreetNotes": "Viewing a Colorful Street.",
|
"backgroundColorfulStreetNotes": "Viewing a Colourful Street.",
|
||||||
"backgroundSwanBoatText": "Swan Boat",
|
"backgroundSwanBoatText": "Swan Boat",
|
||||||
"backgroundSwanBoatNotes": "Take a ride in a Swan Boat.",
|
"backgroundSwanBoatNotes": "Take a ride in a Swan Boat.",
|
||||||
"backgroundHeartTreeTunnelText": "Heart Tree Tunnel",
|
"backgroundHeartTreeTunnelText": "Heart Tree Tunnel",
|
||||||
@@ -856,8 +856,8 @@
|
|||||||
"backgrounds072023": "SET 110: Released July 2023",
|
"backgrounds072023": "SET 110: Released July 2023",
|
||||||
"backgroundOnAPaddlewheelBoatText": "On a Paddlewheel Boat",
|
"backgroundOnAPaddlewheelBoatText": "On a Paddlewheel Boat",
|
||||||
"backgroundOnAPaddlewheelBoatNotes": "Ride on a Paddlewheel Boat.",
|
"backgroundOnAPaddlewheelBoatNotes": "Ride on a Paddlewheel Boat.",
|
||||||
"backgroundColorfulCoralText": "Colorful Coral",
|
"backgroundColorfulCoralText": "Colourful Coral",
|
||||||
"backgroundColorfulCoralNotes": "Dive among Colorful Coral.",
|
"backgroundColorfulCoralNotes": "Dive among Colourful Coral.",
|
||||||
"backgroundBoardwalkIntoSunsetText": "Boardwalk into the Sunset",
|
"backgroundBoardwalkIntoSunsetText": "Boardwalk into the Sunset",
|
||||||
"backgroundBoardwalkIntoSunsetNotes": "Stroll on a Boardwalk into the Sunset.",
|
"backgroundBoardwalkIntoSunsetNotes": "Stroll on a Boardwalk into the Sunset.",
|
||||||
"backgrounds102023": "SET 113: Released October 2023",
|
"backgrounds102023": "SET 113: Released October 2023",
|
||||||
@@ -905,8 +905,8 @@
|
|||||||
"backgroundSummerSeashoreText": "Summer Seashore",
|
"backgroundSummerSeashoreText": "Summer Seashore",
|
||||||
"backgroundSummerSeashoreNotes": "Catch a wave at a Summer Seashore.",
|
"backgroundSummerSeashoreNotes": "Catch a wave at a Summer Seashore.",
|
||||||
"backgrounds052025": "SET 132: Released May 2025",
|
"backgrounds052025": "SET 132: Released May 2025",
|
||||||
"backgroundTrailThroughAForestText": "Trail Through a Forest",
|
"backgroundTrailThroughAForestText": "Trail Through the Woods",
|
||||||
"backgroundTrailThroughAForestNotes": "Wander down a Trail Through a Forest.",
|
"backgroundTrailThroughAForestNotes": "Wander down a Trail Through the Woods.",
|
||||||
"backgrounds072025": "SET 134: Released July 2025",
|
"backgrounds072025": "SET 134: Released July 2025",
|
||||||
"backgroundSirensLairText": "Siren's Lair",
|
"backgroundSirensLairText": "Siren's Lair",
|
||||||
"backgroundSirensLairNotes": "Dare to dive into a Siren’s Lair.",
|
"backgroundSirensLairNotes": "Dare to dive into a Siren’s Lair.",
|
||||||
@@ -921,5 +921,14 @@
|
|||||||
"backgroundInsideForestWitchsCottageNotes": "Weave spells inside a Forest Witch's Cottage.",
|
"backgroundInsideForestWitchsCottageNotes": "Weave spells inside a Forest Witch's Cottage.",
|
||||||
"backgrounds112025": "SET 138: Released November 2025",
|
"backgrounds112025": "SET 138: Released November 2025",
|
||||||
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
|
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
|
||||||
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners."
|
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners.",
|
||||||
|
"backgroundNighttimeStreetWithShopsText": "Night-time Street with Shops",
|
||||||
|
"backgroundElegantPalaceNotes": "Admire the colourful halls of an Elegant Palace.",
|
||||||
|
"backgroundNighttimeStreetWithShopsNotes": "Enjoy the warm glow of a Night-time Street with Shops.",
|
||||||
|
"backgrounds122025": "SET 139: Released December 2025",
|
||||||
|
"backgrounds012026": "SET 140: Released January 2026",
|
||||||
|
"backgroundWinterDesertWithSaguarosText": "Winter Desert with Saguaros",
|
||||||
|
"backgroundWinterDesertWithSaguarosNotes": "Breathe the crisp air of a Winter Desert with Saguaros.",
|
||||||
|
"backgrounds022026": "SET 141: Released February 2026",
|
||||||
|
"backgroundElegantPalaceText": "Elegant Palace"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,5 +108,6 @@
|
|||||||
"resetFlags": "Reset Flags",
|
"resetFlags": "Reset Flags",
|
||||||
"cannotClose": "This Challenge cannot be closed because one or more players have reported it as inappropriate. A staff members will contact you shortly with instructions. If over 48 hours have passed and you have not heard from them, please email admin@habitica.com for assistance.",
|
"cannotClose": "This Challenge cannot be closed because one or more players have reported it as inappropriate. A staff members will contact you shortly with instructions. If over 48 hours have passed and you have not heard from them, please email admin@habitica.com for assistance.",
|
||||||
"abuseFlagModalBodyChallenge": "You should only report a Challenge that violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habitica's Community Guidelines.",
|
"abuseFlagModalBodyChallenge": "You should only report a Challenge that violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habitica's Community Guidelines.",
|
||||||
"cannotMakeChallenge": "You are unable to create public Challenges as your account currently does not have chat privileges. Please contact admin@habitica.com for more information."
|
"cannotMakeChallenge": "You are unable to create public Challenges as your account currently does not have chat privileges. Please contact admin@habitica.com for more information.",
|
||||||
|
"deleteChallengeRefundDescription": "If you delete this Challenge, you will be refunded the Gem prize and the Challenge tasks will remain on the participants' task boards."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
"skin": "Skin",
|
"skin": "Skin",
|
||||||
"color": "Colour",
|
"color": "Colour",
|
||||||
"hair": "Hair",
|
"hair": "Hair",
|
||||||
"bangs": "Bangs",
|
"bangs": "Fringe",
|
||||||
"glasses": "Glasses",
|
"glasses": "Glasses",
|
||||||
"hairSet1": "Hairstyle Set 1",
|
"hairSet1": "Hairstyle Set 1",
|
||||||
"hairSet2": "Hairstyle Set 2",
|
"hairSet2": "Hairstyle Set 2",
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
"commGuidePara015": "Habitica has a few spaces where you may interact with other players. These include private chat contexts (private messages and Party chat) as well as the Looking for Party feature and Challenges.",
|
"commGuidePara015": "Habitica has a few spaces where you may interact with other players. These include private chat contexts (private messages and Party chat) as well as the Looking for Party feature and Challenges.",
|
||||||
"commGuidePara016": "When navigating the social components of Habitica, there are some general rules to keep everyone safe and happy.",
|
"commGuidePara016": "When navigating the social components of Habitica, there are some general rules to keep everyone safe and happy.",
|
||||||
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences.",
|
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences.",
|
||||||
"commGuideList02C": "<strong>Do not post images or text that are violent, threatening, or sexually explicit/suggestive, or that promote discrimination, bigotry, racism, sexism, hatred, harassment or harm against any individual or group</strong>. Not even as a joke or meme. This includes slurs as well as statements. Not everyone has the same sense of humor, and so something that you consider a joke may be hurtful to another.",
|
"commGuideList02C": "<strong>Do not post images or text that are violent, threatening, or sexually explicit/suggestive, or that promote discrimination, bigotry, racism, sexism, hatred, harassment or harm against any individual or group</strong>. Not even as a joke or meme. This includes slurs as well as statements. Not everyone has the same sense of humour, and so something that you consider a joke may be hurtful to another.",
|
||||||
"commGuideList02D": "<strong>Be mindful that Habiticans are of all ages and backgrounds</strong>. Challenges and player profiles should not mention adult topics, use profanity, or promote contention or conflict.",
|
"commGuideList02D": "<strong>Be mindful that Habiticans are of all ages and backgrounds</strong>. Challenges and player profiles should not mention adult topics, use profanity, or promote contention or conflict.",
|
||||||
"commGuideList02E": "<strong>If a staff member tells you that a term is disallowed on Habitica, even if it is a term that you did not realize was problematic, that decision is final.</strong> Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.",
|
"commGuideList02E": "<strong>If a staff member tells you that a term is disallowed on Habitica, even if it is a term that you did not realise was problematic, that decision is final.</strong> Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.",
|
||||||
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> to contact our community manager.",
|
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> to contact our community manager.",
|
||||||
"commGuideList02J": "<strong>Do not spam</strong>. Spamming may include, but is not limited to: sending multiple unsolicited private messages, sending nonsensical messages, sending multiple promotional messages about a Party or Challenge, or creating multiple similar or low quality Challenges in a row. Staff has discretion to determine what messages are considered spamming.",
|
"commGuideList02J": "<strong>Do not spam</strong>. Spamming may include, but is not limited to: sending multiple unsolicited private messages, sending nonsensical messages, sending multiple promotional messages about a Party or Challenge, or creating multiple similar or low quality Challenges in a row. Staff has discretion to determine what messages are considered spamming.",
|
||||||
"commGuideList02K": "<strong>Do not send links without explanation or context</strong>. If players clicking on a link will result in any benefit to you, you need to disclose that. This applies in messages as well as Challenges.",
|
"commGuideList02K": "<strong>Do not send links without explanation or context</strong>. If players clicking on a link will result in any benefit to you, you need to disclose that. This applies in messages as well as Challenges.",
|
||||||
|
|||||||
@@ -233,12 +233,12 @@
|
|||||||
"foodRottenMeat": "Rotten Meat",
|
"foodRottenMeat": "Rotten Meat",
|
||||||
"foodRottenMeatThe": "the Rotten Meat",
|
"foodRottenMeatThe": "the Rotten Meat",
|
||||||
"foodRottenMeatA": "Rotten Meat",
|
"foodRottenMeatA": "Rotten Meat",
|
||||||
"foodCottonCandyPink": "Pink Cotton Candy",
|
"foodCottonCandyPink": "Pink Candyfloss",
|
||||||
"foodCottonCandyPinkThe": "the Pink Cotton Candy",
|
"foodCottonCandyPinkThe": "the Pink Candyfloss",
|
||||||
"foodCottonCandyPinkA": "Pink Cotton Candy",
|
"foodCottonCandyPinkA": "Pink Candyfloss",
|
||||||
"foodCottonCandyBlue": "Blue Cotton Candy",
|
"foodCottonCandyBlue": "Blue Candyfloss",
|
||||||
"foodCottonCandyBlueThe": "the Blue Cotton Candy",
|
"foodCottonCandyBlueThe": "the Blue Candyfloss",
|
||||||
"foodCottonCandyBlueA": "Blue Cotton Candy",
|
"foodCottonCandyBlueA": "Blue Candyfloss",
|
||||||
"foodHoney": "Honey",
|
"foodHoney": "Honey",
|
||||||
"foodHoneyThe": "the Honey",
|
"foodHoneyThe": "the Honey",
|
||||||
"foodHoneyA": "Honey",
|
"foodHoneyA": "Honey",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"playerTiersDesc": "The coloured usernames you see in chat represent a person's contributor tier. The higher the tier, the more the person has contributed to habitica through art, code, the community, or more!",
|
"playerTiersDesc": "The coloured usernames you see in chat represent a person's contributor tier. The higher the tier, the more the person has contributed to Habitica through art, code, the community, or more!",
|
||||||
"tier1": "Tier 1 (Friend)",
|
"tier1": "Tier 1 (Friend)",
|
||||||
"tier2": "Tier 2 (Friend)",
|
"tier2": "Tier 2 (Friend)",
|
||||||
"tier3": "Tier 3 (Elite)",
|
"tier3": "Tier 3 (Elite)",
|
||||||
|
|||||||