mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-10-26 02:32:26 +01:00
Compare commits
7 Commits
20437c4188
...
21fd83695a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21fd83695a | ||
|
|
2c44c37a96 | ||
|
|
f0adb85660 | ||
|
|
c80b94178b | ||
|
|
c85018a721 | ||
|
|
26a65d778b | ||
|
|
5bc4d7e99d |
@@ -3,6 +3,218 @@
|
||||
id="stats"
|
||||
class="standard-page"
|
||||
>
|
||||
<div
|
||||
id="attributes"
|
||||
class="row"
|
||||
>
|
||||
<hr class="col-12">
|
||||
<h2 class="col-12">
|
||||
{{ $t('attributes') }}
|
||||
</h2>
|
||||
<div
|
||||
v-for="(statInfo, stat) in stats"
|
||||
:key="stat"
|
||||
class="col-12 col-md-6"
|
||||
>
|
||||
<div class="row col-12 stats-column">
|
||||
<div class="col-12 col-md-6 attribute-label">
|
||||
<span
|
||||
class="hint"
|
||||
:popover-title="$t(statInfo.title)"
|
||||
popover-placement="right"
|
||||
:popover="$t(statInfo.popover)"
|
||||
popover-trigger="mouseenter"
|
||||
></span>
|
||||
<div
|
||||
class="stat-title"
|
||||
:class="stat"
|
||||
>
|
||||
{{ $t(statInfo.title) }}
|
||||
</div>
|
||||
<strong class="number">{{ totalStatPoints(stat) | floorWholeNumber }}</strong>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ul class="bonus-stats">
|
||||
<li>
|
||||
<strong>{{ $t('level') }}:</strong>
|
||||
<span>{{ statsComputed.levelBonus[stat] }}</span>
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('equipment') }}:</strong>
|
||||
<span>{{ statsComputed.gearBonus[stat] }}</span>
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('class') }}:</strong>
|
||||
<span>{{ statsComputed.classBonus[stat] }}</span>
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('allocated') }}:</strong>
|
||||
<span>{{ totalAllocatedStats(stat) }}</span>
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('buffs') }}:</strong>
|
||||
<span>{{ user.stats.buffs[stat] }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="showAllocation"
|
||||
class="stat-allocation-info"
|
||||
>
|
||||
<p>{{ $t('statAllocationInfo') }}</p>
|
||||
</div>
|
||||
<div
|
||||
v-if="showAllocation"
|
||||
id="allocation"
|
||||
>
|
||||
<div class="row title-row">
|
||||
<div :class="user.preferences.automaticAllocation ? 'col-12 col-md-6' : 'col-12'">
|
||||
<h3
|
||||
v-if="userLevel100Plus"
|
||||
v-once
|
||||
v-html="$t('noMoreAllocate')"
|
||||
></h3>
|
||||
<div
|
||||
class="points-allocation-header"
|
||||
:class="{'auto-off': !user.preferences.automaticAllocation}"
|
||||
>
|
||||
<h3>
|
||||
{{ $t('pointsAvailable') }}
|
||||
<div
|
||||
v-if="user.stats.points || userLevel100Plus"
|
||||
class="counter badge badge-pill"
|
||||
>
|
||||
{{ pointsRemaining }}
|
||||
</div>
|
||||
</h3>
|
||||
<div class="auto-allocate-toggle">
|
||||
<toggle-switch
|
||||
v-model="user.preferences.automaticAllocation"
|
||||
:label="$t('autoAllocate')"
|
||||
@change="setAutoAllocate()"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="user.preferences.automaticAllocation"
|
||||
class="col-12 col-md-6 allocation-dropdown-container"
|
||||
>
|
||||
<div class="task-allocation-box" @click="toggleAllocationDropdown">
|
||||
<span class="task-allocation-text">{{ allocationModeLabel }}</span>
|
||||
<information-icon
|
||||
tooltip-id="task-allocation-info"
|
||||
:tooltip="allocationModeTooltip"
|
||||
/>
|
||||
<div
|
||||
class="dropdown-chevron"
|
||||
:class="{rotated: showAllocationDropdown}"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 14 9"
|
||||
width="14"
|
||||
height="9"
|
||||
>
|
||||
<path
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
stroke="#A5A1AC"
|
||||
stroke-width="2.5"
|
||||
d="M13 1L7 7 1 1"
|
||||
></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="showAllocationDropdown" class="allocation-dropdown">
|
||||
<div class="allocation-option">
|
||||
<label>
|
||||
<input
|
||||
v-model="user.preferences.allocationMode"
|
||||
type="radio"
|
||||
name="allocationMode"
|
||||
value="flat"
|
||||
@change="setAllocationMode('flat')"
|
||||
>
|
||||
<span class="option-text">{{ $t('evenAllocation') }}</span>
|
||||
</label>
|
||||
<information-icon
|
||||
tooltip-id="even-allocation-info"
|
||||
:tooltip="$t('evenAllocationPop')"
|
||||
/>
|
||||
</div>
|
||||
<div class="allocation-option">
|
||||
<label>
|
||||
<input
|
||||
v-model="user.preferences.allocationMode"
|
||||
type="radio"
|
||||
name="allocationMode"
|
||||
value="classbased"
|
||||
@change="setAllocationMode('classbased')"
|
||||
>
|
||||
<span class="option-text">{{ $t('classAllocation') }}</span>
|
||||
</label>
|
||||
<information-icon
|
||||
tooltip-id="class-allocation-info"
|
||||
:tooltip="$t('classAllocationPop')"
|
||||
/>
|
||||
</div>
|
||||
<div class="allocation-option">
|
||||
<label>
|
||||
<input
|
||||
v-model="user.preferences.allocationMode"
|
||||
type="radio"
|
||||
name="allocationMode"
|
||||
value="taskbased"
|
||||
@change="setAllocationMode('taskbased')"
|
||||
>
|
||||
<span class="option-text">{{ $t('taskAllocation') }}</span>
|
||||
</label>
|
||||
<information-icon
|
||||
tooltip-id="task-allocation-dropdown-info"
|
||||
:tooltip="$t('taskAllocationPop')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div
|
||||
v-for="(statInfo, stat) in allocateStatsList"
|
||||
:key="stat"
|
||||
class="col-12 col-md-3"
|
||||
>
|
||||
<div class="box white row col-12">
|
||||
<div class="col-9 text-nowrap">
|
||||
<div :class="stat">
|
||||
{{ $t(stats[stat].title) }}
|
||||
</div>
|
||||
<div class="number">
|
||||
{{ totalAllocatedStats(stat) }}
|
||||
</div>
|
||||
<div class="points">
|
||||
{{ $t('pts') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 arrow-container">
|
||||
<div
|
||||
v-if="user.stats.points > 0"
|
||||
class="triangle-up"
|
||||
@click="allocate(stat)"
|
||||
>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 12">
|
||||
<path fill="#A5A1AC" d="M10 0l10 12H0z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="allocation-divider"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="stats-section-equipment col-12 col-md-6">
|
||||
<h2 class="text-center">
|
||||
@@ -182,144 +394,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
id="attributes"
|
||||
class="row"
|
||||
>
|
||||
<hr class="col-12">
|
||||
<h2 class="col-12">
|
||||
{{ $t('attributes') }}
|
||||
</h2>
|
||||
<div
|
||||
v-for="(statInfo, stat) in stats"
|
||||
:key="stat"
|
||||
class="col-12 col-md-6"
|
||||
>
|
||||
<div class="row col-12 stats-column">
|
||||
<div class="col-12 col-md-4 attribute-label">
|
||||
<span
|
||||
class="hint"
|
||||
:popover-title="$t(statInfo.title)"
|
||||
popover-placement="right"
|
||||
:popover="$t(statInfo.popover)"
|
||||
popover-trigger="mouseenter"
|
||||
></span>
|
||||
<div
|
||||
class="stat-title"
|
||||
:class="stat"
|
||||
>
|
||||
{{ $t(statInfo.title) }}
|
||||
</div>
|
||||
<strong class="number">{{ totalStatPoints(stat) | floorWholeNumber }}</strong>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ul class="bonus-stats">
|
||||
<li>
|
||||
<strong>{{ $t('level') }}:</strong>
|
||||
{{ statsComputed.levelBonus[stat] }}
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('equipment') }}:</strong>
|
||||
{{ statsComputed.gearBonus[stat] }}
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('class') }}:</strong>
|
||||
{{ statsComputed.classBonus[stat] }}
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('allocated') }}:</strong>
|
||||
{{ totalAllocatedStats(stat) }}
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{ $t('buffs') }}:</strong>
|
||||
{{ user.stats.buffs[stat] }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="showAllocation"
|
||||
id="allocation"
|
||||
>
|
||||
<div class="row title-row">
|
||||
<div class="col-12 col-md-6">
|
||||
<h3
|
||||
v-if="userLevel100Plus"
|
||||
v-once
|
||||
v-html="$t('noMoreAllocate')"
|
||||
></h3>
|
||||
<h3>
|
||||
{{ $t('statPoints') }}
|
||||
<div
|
||||
v-if="user.stats.points || userLevel100Plus"
|
||||
class="counter badge badge-pill"
|
||||
>
|
||||
{{ pointsRemaining }}
|
||||
</div>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="float-right">
|
||||
<toggle-switch
|
||||
v-model="user.preferences.automaticAllocation"
|
||||
:label="$t('autoAllocation')"
|
||||
@change="setAutoAllocate()"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div
|
||||
v-for="(statInfo, stat) in allocateStatsList"
|
||||
:key="stat"
|
||||
class="col-12 col-md-3"
|
||||
>
|
||||
<div class="box white row col-12">
|
||||
<div class="col-9 text-nowrap">
|
||||
<div :class="stat">
|
||||
{{ $t(stats[stat].title) }}
|
||||
</div>
|
||||
<div class="number">
|
||||
{{ totalAllocatedStats(stat) }}
|
||||
</div>
|
||||
<div class="points">
|
||||
{{ $t('pts') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<div>
|
||||
<div
|
||||
v-if="showStatsSave"
|
||||
class="up"
|
||||
@click="allocate(stat)"
|
||||
></div>
|
||||
</div>
|
||||
<div>
|
||||
<div
|
||||
v-if="showStatsSave"
|
||||
class="down"
|
||||
@click="deallocate(stat)"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="showStatsSave"
|
||||
class="row save-row"
|
||||
>
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
:disabled="loading"
|
||||
@click="saveAttributes()"
|
||||
>
|
||||
{{ loading ? $t('loading') : $t('save') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -331,12 +405,12 @@ import keys from 'lodash/keys';
|
||||
import Content from '@/../../common/script/content';
|
||||
import { beastMasterProgress, mountMasterProgress } from '@/../../common/script/count';
|
||||
import autoAllocate from '@/../../common/script/fns/autoAllocate';
|
||||
import allocateBulk from '@/../../common/script/ops/stats/allocateBulk';
|
||||
import statsComputed from '@/../../common/script/libs/statsComputed';
|
||||
import { mapState } from '@/libs/store';
|
||||
import attributesGrid from '@/components/inventory/equipment/attributesGrid';
|
||||
import toggleSwitch from '@/components/ui/toggleSwitch';
|
||||
import Sprite from '@/components/ui/sprite';
|
||||
import InformationIcon from '@/components/ui/informationIcon';
|
||||
|
||||
const DROP_ANIMALS = keys(Content.pets);
|
||||
const TOTAL_NUMBER_OF_DROP_ANIMALS = DROP_ANIMALS.length;
|
||||
@@ -345,11 +419,12 @@ export default {
|
||||
toggleSwitch,
|
||||
attributesGrid,
|
||||
Sprite,
|
||||
InformationIcon,
|
||||
},
|
||||
props: ['user', 'showAllocation'],
|
||||
data () {
|
||||
return {
|
||||
loading: false,
|
||||
showAllocationDropdown: false,
|
||||
equipTypes: {
|
||||
eyewear: this.$t('eyewear'),
|
||||
head: this.$t('headgearCapitalized'),
|
||||
@@ -387,12 +462,6 @@ export default {
|
||||
popover: 'perText',
|
||||
},
|
||||
},
|
||||
statUpdates: {
|
||||
str: 0,
|
||||
int: 0,
|
||||
con: 0,
|
||||
per: 0,
|
||||
},
|
||||
content: Content,
|
||||
};
|
||||
},
|
||||
@@ -412,15 +481,22 @@ export default {
|
||||
userLevel100Plus () {
|
||||
return this.user.stats.lvl >= 100;
|
||||
},
|
||||
showStatsSave () {
|
||||
return Boolean(this.user.stats.points);
|
||||
},
|
||||
pointsRemaining () {
|
||||
let { points } = this.user.stats;
|
||||
Object.values(this.statUpdates).forEach(value => {
|
||||
points -= value;
|
||||
});
|
||||
return points;
|
||||
return this.user.stats.points;
|
||||
},
|
||||
allocationModeLabel () {
|
||||
const mode = this.user.preferences.allocationMode || 'flat';
|
||||
if (mode === 'flat') return this.$t('evenAllocation');
|
||||
if (mode === 'classbased') return this.$t('classAllocation');
|
||||
if (mode === 'taskbased') return this.$t('taskAllocation');
|
||||
return this.$t('evenAllocation');
|
||||
},
|
||||
allocationModeTooltip () {
|
||||
const mode = this.user.preferences.allocationMode || 'flat';
|
||||
if (mode === 'flat') return this.$t('evenAllocationPop');
|
||||
if (mode === 'classbased') return this.$t('classAllocationPop');
|
||||
if (mode === 'taskbased') return this.$t('taskAllocationPop');
|
||||
return this.$t('evenAllocationPop');
|
||||
},
|
||||
|
||||
},
|
||||
@@ -432,10 +508,10 @@ export default {
|
||||
return this.flatGear[key].text();
|
||||
},
|
||||
totalAllocatedStats (stat) {
|
||||
return this.user.stats[stat] + this.statUpdates[stat];
|
||||
return this.user.stats[stat];
|
||||
},
|
||||
totalStatPoints (stat) {
|
||||
return this.statsComputed[stat] + this.statUpdates[stat];
|
||||
return this.statsComputed[stat];
|
||||
},
|
||||
totalCount (objectToCount) {
|
||||
const total = size(objectToCount);
|
||||
@@ -481,37 +557,17 @@ export default {
|
||||
const display = `${stat}/${totalStat}`;
|
||||
return display;
|
||||
},
|
||||
allocate (stat) {
|
||||
if (this.pointsRemaining === 0) return;
|
||||
this.statUpdates[stat] += 1;
|
||||
},
|
||||
deallocate (stat) {
|
||||
if (this.statUpdates[stat] === 0) return;
|
||||
this.statUpdates[stat] -= 1;
|
||||
},
|
||||
async saveAttributes () {
|
||||
this.loading = true;
|
||||
async allocate (stat) {
|
||||
if (this.user.stats.points === 0) return;
|
||||
|
||||
const statUpdates = {};
|
||||
['str', 'int', 'per', 'con'].forEach(stat => {
|
||||
if (this.statUpdates[stat] > 0) statUpdates[stat] = this.statUpdates[stat];
|
||||
});
|
||||
|
||||
// reset statUpdates to zero before request to avoid display errors while waiting for server
|
||||
this.statUpdates = {
|
||||
str: 0,
|
||||
int: 0,
|
||||
con: 0,
|
||||
per: 0,
|
||||
};
|
||||
|
||||
allocateBulk(this.user, { body: { stats: statUpdates } });
|
||||
|
||||
await axios.post('/api/v4/user/allocate-bulk', {
|
||||
stats: statUpdates,
|
||||
});
|
||||
|
||||
this.loading = false;
|
||||
try {
|
||||
const response = await axios.post(`/api/v4/user/allocate?stat=${stat}`);
|
||||
if (response.data && response.data.data) {
|
||||
this.$store.state.user.data.stats = response.data.data;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error allocating stat point:', error);
|
||||
}
|
||||
},
|
||||
allocateNow () {
|
||||
autoAllocate(this.user);
|
||||
@@ -519,11 +575,21 @@ export default {
|
||||
setAutoAllocate () {
|
||||
const settings = {
|
||||
'preferences.automaticAllocation': Boolean(this.user.preferences.automaticAllocation),
|
||||
'preferences.allocationMode': 'taskbased',
|
||||
'preferences.allocationMode': this.user.preferences.allocationMode || 'flat',
|
||||
};
|
||||
|
||||
this.$store.dispatch('user:set', settings);
|
||||
},
|
||||
toggleAllocationDropdown () {
|
||||
this.showAllocationDropdown = !this.showAllocationDropdown;
|
||||
},
|
||||
setAllocationMode (mode) {
|
||||
const settings = {
|
||||
'preferences.allocationMode': mode,
|
||||
};
|
||||
this.$store.dispatch('user:set', settings);
|
||||
this.showAllocationDropdown = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -555,6 +621,15 @@ export default {
|
||||
|
||||
.stat-title {
|
||||
text-transform: uppercase;
|
||||
font-family: Roboto;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
letter-spacing: 0px;
|
||||
margin-top: 26px;
|
||||
padding-bottom: 4px;
|
||||
border-bottom: 1px dashed;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.str {
|
||||
@@ -577,6 +652,80 @@ export default {
|
||||
.title-row {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
|
||||
h3 {
|
||||
font-family: Roboto;
|
||||
font-weight: 700;
|
||||
font-size: 16px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0px;
|
||||
color: $gray-10;
|
||||
margin: 0;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.points-allocation-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1em;
|
||||
height: 40px;
|
||||
transition: all 0.3s ease-in-out;
|
||||
|
||||
&.auto-off {
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.auto-allocate-toggle {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
transition: all 0.3s ease-in-out;
|
||||
|
||||
::v-deep .toggle-switch-outer {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
::v-deep .toggle-switch-description {
|
||||
font-family: Roboto;
|
||||
font-weight: 700;
|
||||
font-size: 16px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0px;
|
||||
color: $gray-10;
|
||||
margin: 0;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
::v-deep .toggle-switch-label {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
::v-deep .toggle-switch-switch {
|
||||
margin: auto;
|
||||
margin-left: -2px;
|
||||
margin-right: -2px;
|
||||
}
|
||||
|
||||
::v-deep .toggle-switch-inner:before {
|
||||
background-color: #9A62FF;
|
||||
}
|
||||
}
|
||||
|
||||
.allocation-dropdown-container {
|
||||
animation: slideInFromRight 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
@keyframes slideInFromRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(20px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
.counter.badge {
|
||||
@@ -584,10 +733,108 @@ export default {
|
||||
top: -0.25em;
|
||||
left: 0.5em;
|
||||
color: #fff;
|
||||
background-color: #ff944c;
|
||||
background-color: $orange-50;
|
||||
box-shadow: 0 1px 1px 0 rgba(26, 24, 29, 0.12);
|
||||
}
|
||||
|
||||
.task-allocation-box {
|
||||
height: 40px;
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.15), 0 1px 4px 0 rgba(26, 24, 29, 0.1);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.task-allocation-text {
|
||||
font-family: Roboto;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0px;
|
||||
color: $gray-50;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.dropdown-chevron {
|
||||
margin-left: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
transition: transform 0.2s;
|
||||
|
||||
&.rotated {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
}
|
||||
|
||||
.allocation-dropdown {
|
||||
position: absolute;
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 8px 0 rgba(26, 24, 29, 0.2);
|
||||
margin-top: 4px;
|
||||
padding: 8px 0;
|
||||
z-index: 10;
|
||||
min-width: 100%;
|
||||
}
|
||||
|
||||
.allocation-option {
|
||||
padding: 8px 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background-color: #F9F9F9;
|
||||
}
|
||||
|
||||
label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
flex: 1;
|
||||
|
||||
input[type="radio"] {
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.option-text {
|
||||
font-family: Roboto;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0px;
|
||||
color: $gray-50;
|
||||
}
|
||||
}
|
||||
|
||||
.allocation-divider {
|
||||
height: 1px;
|
||||
background-color: $gray-500;
|
||||
margin: 2em 0;
|
||||
}
|
||||
|
||||
.str, .int, .con, .per {
|
||||
font-family: Roboto;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
letter-spacing: 0px;
|
||||
text-transform: uppercase;
|
||||
margin-top: 26px;
|
||||
padding-bottom: 4px;
|
||||
border-bottom: 1px dashed;
|
||||
display: block;
|
||||
width: fit-content;
|
||||
width: -moz-fit-content;
|
||||
}
|
||||
|
||||
.box {
|
||||
width: 148px;
|
||||
height: 84px;
|
||||
@@ -599,41 +846,57 @@ export default {
|
||||
}
|
||||
|
||||
.number {
|
||||
font-family: Roboto;
|
||||
font-weight: 400;
|
||||
font-size: 40px;
|
||||
line-height: 48px;
|
||||
letter-spacing: 0px;
|
||||
text-align: left;
|
||||
color: #686274;
|
||||
color: $gray-100;
|
||||
display: inline-block;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
.points {
|
||||
display: inline-block;
|
||||
font-weight: bold;
|
||||
line-height: 1.67;
|
||||
font-family: Roboto;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0px;
|
||||
text-align: left;
|
||||
color: #878190;
|
||||
margin-left: .5em;
|
||||
color: $gray-200;
|
||||
margin-left: 0.5em;
|
||||
vertical-align: baseline;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.up, .down {
|
||||
border: solid #a5a1ac;
|
||||
border-width: 0 3px 3px 0;
|
||||
display: inline-block;
|
||||
padding: 3px;
|
||||
.arrow-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.up:hover, .down:hover {
|
||||
.triangle-up {
|
||||
width: 21px !important;
|
||||
height: 13px !important;
|
||||
min-width: 21px !important;
|
||||
min-height: 13px !important;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
svg {
|
||||
width: 21px !important;
|
||||
height: 13px !important;
|
||||
min-width: 21px !important;
|
||||
min-height: 13px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.up {
|
||||
transform: rotate(-135deg);
|
||||
-webkit-transform: rotate(-135deg);
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.down {
|
||||
transform: rotate(45deg);
|
||||
-webkit-transform: rotate(45deg);
|
||||
.triangle-up:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -643,11 +906,60 @@ export default {
|
||||
font-size: 64px;
|
||||
font-weight: bold;
|
||||
color: #686274;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.attribute-label {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.stat-title {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.bonus-stats {
|
||||
border-left: 1px solid $gray-500;
|
||||
margin-top: 8px;
|
||||
margin-bottom: 8px;
|
||||
padding-left: 1em;
|
||||
padding-top: 10px;
|
||||
|
||||
li {
|
||||
font-family: Roboto;
|
||||
font-weight: 400;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0px;
|
||||
color: $gray-300;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding-right: 1em;
|
||||
|
||||
strong {
|
||||
font-weight: 700;
|
||||
color: $gray-200;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.stat-allocation-info {
|
||||
margin-top: 3em;
|
||||
margin-bottom: 0.5em;
|
||||
padding-top: 2em;
|
||||
padding-bottom: 0.25em;
|
||||
text-align: center;
|
||||
|
||||
p {
|
||||
font-family: Roboto;
|
||||
font-weight: 400;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
letter-spacing: 0px;
|
||||
color: $gray-100;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.well {
|
||||
@@ -759,7 +1071,7 @@ export default {
|
||||
margin: 0;
|
||||
}
|
||||
.col-9 div:first-child {
|
||||
font-size: 13px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,195 +1,198 @@
|
||||
{
|
||||
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <a href='https://habitica.com/static/community-guidelines' target='_blank'>Community Guidelines</a> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"profile": "Profile",
|
||||
"avatar": "Customize Avatar",
|
||||
"editAvatar": "Customize Avatar",
|
||||
"noDescription": "This Habitican hasn't added a description.",
|
||||
"noPhoto": "This Habitican hasn't added a photo.",
|
||||
"other": "Other",
|
||||
"fullName": "Full Name",
|
||||
"displayName": "Display name",
|
||||
"changeDisplayName": "Change Display Name",
|
||||
"newDisplayName": "New Display Name",
|
||||
"displayBlurbPlaceholder": "Please introduce yourself",
|
||||
"photoUrl": "Photo Url",
|
||||
"imageUrl": "Image Url",
|
||||
"inventory": "Inventory",
|
||||
"social": "Social",
|
||||
"lvl": "Lvl",
|
||||
"buffed": "Buffed",
|
||||
"bodyBody": "Body",
|
||||
"size": "Size",
|
||||
"locked": "locked",
|
||||
"shirts": "Shirts",
|
||||
"shirt": "Shirt",
|
||||
"specialShirts": "Special Shirts",
|
||||
"skin": "Skin",
|
||||
"skins": "Skins",
|
||||
"color": "Color",
|
||||
"hair": "Hair",
|
||||
"bangs": "Bangs",
|
||||
"glasses": "Glasses",
|
||||
"hairSet1": "Hairstyle Set 1",
|
||||
"hairSet2": "Hairstyle Set 2",
|
||||
"hairSet3": "Hairstyle Set 3",
|
||||
"beard": "Beard",
|
||||
"mustache": "Mustache",
|
||||
"titleFacialHair": "Facial Hair",
|
||||
"titleHaircolor": "Hair Colors",
|
||||
"titleHairbase": "Hair Styles",
|
||||
"flower": "Flower",
|
||||
"accent": "Accent",
|
||||
"headband": "Headband",
|
||||
"wheelchair": "Wheelchair",
|
||||
"extra": "Extra",
|
||||
"rainbowSkins": "Rainbow Skins",
|
||||
"pastelSkins": "Pastel Skins",
|
||||
"spookySkins": "Spooky Skins",
|
||||
"supernaturalSkins": "Supernatural Skins",
|
||||
"splashySkins": "Splashy Skins",
|
||||
"winterySkins": "Wintery Skins",
|
||||
"rainbowColors": "Rainbow Colors",
|
||||
"shimmerColors": "Shimmer Colors",
|
||||
"hauntedColors": "Haunted Colors",
|
||||
"winteryColors": "Wintery Colors",
|
||||
"equipment": "Equipment",
|
||||
"equipmentBonus": "Equipment",
|
||||
"classEquipBonus": "Class Bonus",
|
||||
"battleGear": "Battle Gear",
|
||||
"gear": "Gear",
|
||||
"autoEquipBattleGear": "Auto-equip new gear",
|
||||
"costume": "Costume",
|
||||
"useCostume": "Use Costume",
|
||||
"costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.",
|
||||
"autoEquipPopoverText": "Select this option to automatically equip gear as soon as you purchase it.",
|
||||
"costumeDisabled": "You have disabled your costume.",
|
||||
"gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:",
|
||||
"gearAchievementNotification": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class!",
|
||||
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <a href='/user/settings/site' target='_blank'>the Settings > Site page</a> and buy your new class's gear!",
|
||||
"armoireUnlocked": "For more equipment, check out the <strong>Enchanted Armoire!</strong> Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.",
|
||||
"ultimGearName": "Ultimate Gear - <%= ultClass %>",
|
||||
"ultimGearText": "Has upgraded to the maximum weapon and armor set for the <%= ultClass %> class.",
|
||||
"level": "Level",
|
||||
"levelUp": "Level Up!",
|
||||
"gainedLevel": "You gained a level!",
|
||||
"leveledUp": "By accomplishing your real-life goals, you've grown to <strong>Level <%= level %>!</strong>",
|
||||
"huzzah": "Huzzah!",
|
||||
"mana": "Mana",
|
||||
"hp": "HP",
|
||||
"mp": "MP",
|
||||
"xp": "XP",
|
||||
"health": "Health",
|
||||
"allocateStr": "Points allocated to Strength:",
|
||||
"allocateStrPop": "Add a Point to Strength",
|
||||
"allocateCon": "Points allocated to Constitution:",
|
||||
"allocateConPop": "Add a Point to Constitution",
|
||||
"allocatePer": "Points allocated to Perception:",
|
||||
"allocatePerPop": "Add a Point to Perception",
|
||||
"allocateInt": "Points allocated to Intelligence:",
|
||||
"allocateIntPop": "Add a Point to Intelligence",
|
||||
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='/shops/market'>Orb of Rebirth</a>!",
|
||||
"stats": "Stats",
|
||||
"strength": "Strength",
|
||||
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
|
||||
"constitution": "Constitution",
|
||||
"conText": "Constitution reduces the damage you take from negative Habits and missed Dailies.",
|
||||
"perception": "Perception",
|
||||
"perText": "Perception increases how much Gold you earn, and once you've unlocked the Market, increases the chance of finding items when scoring tasks.",
|
||||
"intelligence": "Intelligence",
|
||||
"intText": "Intelligence increases how much Experience you earn, and once you've unlocked Classes, determines your maximum Mana available for class abilities.",
|
||||
"levelBonus": "Level Bonus",
|
||||
"allocatedPoints": "Allocated Points",
|
||||
"allocated": "Allocated",
|
||||
"buffs": "Buffs",
|
||||
"characterBuild": "Character Build",
|
||||
"class": "Class",
|
||||
"experience": "Experience",
|
||||
"warrior": "Warrior",
|
||||
"healer": "Healer",
|
||||
"rogue": "Rogue",
|
||||
"mage": "Mage",
|
||||
"wizard": "Mage",
|
||||
"mystery": "Mystery",
|
||||
"changeClass": "Change Class, Refund Stat Points",
|
||||
"lvl10ChangeClass": "To change class you must be at least level 10.",
|
||||
"changeClassConfirmCost": "Are you sure you want to change your class for 3 Gems?",
|
||||
"invalidClass": "Invalid class. Please specify 'warrior', 'rogue', 'wizard', or 'healer'.",
|
||||
"levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.",
|
||||
"unallocated": "Unallocated Stat Points",
|
||||
"autoAllocation": "Automatic Allocation",
|
||||
"autoAllocationPop": "Places Points into Stats according to your preferences, when you level up.",
|
||||
"evenAllocation": "Distribute Stat Points evenly",
|
||||
"evenAllocationPop": "Assigns the same number of Points to each Stat.",
|
||||
"classAllocation": "Distribute Points based on Class",
|
||||
"classAllocationPop": "Assigns more Points to the Stats important to your Class.",
|
||||
"taskAllocation": "Distribute Points based on task activity",
|
||||
"taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.",
|
||||
"distributePoints": "Distribute Unallocated Points",
|
||||
"distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.",
|
||||
"warriorText": "Warriors score more and better \"critical hits\", which randomly give bonus Gold, Experience, and drop chance for scoring a task. They also deal heavy damage to boss monsters. Play a Warrior if you find motivation from unpredictable jackpot-style rewards, or want to dish out the hurt in boss Quests!",
|
||||
"wizardText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habitica, or if you are strongly motivated by leveling up and unlocking advanced features!",
|
||||
"mageText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habitica, or if you are strongly motivated by leveling up and unlocking advanced features!",
|
||||
"rogueText": "Rogues love to accumulate wealth, gaining more Gold than anyone else, and are adept at finding random items. Their iconic Stealth ability lets them duck the consequences of missed Dailies. Play a Rogue if you find strong motivation from Rewards and Achievements, striving for loot and badges!",
|
||||
"healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!",
|
||||
"optOutOfClasses": "Opt Out",
|
||||
"chooseClass": "Choose your Class",
|
||||
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
|
||||
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
|
||||
"selectClass": "Select <%= heroClass %>",
|
||||
"select": "Select",
|
||||
"stealth": "Stealth",
|
||||
"stealthNewDay": "When a new day begins, you will avoid damage from this many missed Dailies.",
|
||||
"streaksFrozen": "Streaks Frozen",
|
||||
"streaksFrozenText": "Streaks on missed Dailies will not reset at the end of the day.",
|
||||
"purchaseFor": "Purchase for <%= cost %> Gems?",
|
||||
"purchaseForGold": "Purchase for <%= cost %> Gold?",
|
||||
"purchaseForHourglasses": "Purchase for <%= cost %> Hourglasses?",
|
||||
"purchasePetItemConfirm": "This purchase would exceed the number of items you need to hatch all possible <%= itemText %> pets. Are you sure?",
|
||||
"notEnoughMana": "Not enough mana.",
|
||||
"notEnoughGold": "Not enough gold.",
|
||||
"invalidTarget": "You can't cast a skill on that.",
|
||||
"youCast": "You cast <%= spell %>.",
|
||||
"youCastTarget": "You cast <%= spell %> on <%= target %>.",
|
||||
"youCastParty": "You cast <%= spell %> for the party.",
|
||||
"chatCastSpellParty": "<%= username %> casts <%= spell %> for the party.",
|
||||
"chatCastSpellUser": "<%= username %> casts <%= spell %> on <%= target %>.",
|
||||
"chatCastSpellPartyTimes": "<%= username %> casts <%= spell %> for the party <%= times %> times.",
|
||||
"chatCastSpellUserTimes": "<%= username %> casts <%= spell %> on <%= target %> <%= times %> times.",
|
||||
"critBonus": "Critical Hit! Bonus: ",
|
||||
"gainedGold": "You gained some Gold",
|
||||
"gainedMana": "You gained some Mana",
|
||||
"gainedHealth": "You gained some Health",
|
||||
"gainedExperience": "You gained some Experience",
|
||||
"lostGold": "You spent some Gold",
|
||||
"lostMana": "You used some Mana",
|
||||
"lostHealth": "You lost some Health",
|
||||
"lostExperience": "You lost some Experience",
|
||||
"equip": "Equip",
|
||||
"unequip": "Unequip",
|
||||
"animalSkins": "Animal Skins",
|
||||
"str": "STR",
|
||||
"con": "CON",
|
||||
"per": "PER",
|
||||
"int": "INT",
|
||||
"notEnoughAttrPoints": "You don't have enough Stat Points.",
|
||||
"classNotSelected": "You must select Class before you can assign Stat Points.",
|
||||
"style": "Style",
|
||||
"facialhair": "Facial",
|
||||
"photo": "Photo",
|
||||
"info": "Info",
|
||||
"joined": "Joined",
|
||||
"totalLogins": "Total Log Ins",
|
||||
"latestCheckin": "Latest Log In",
|
||||
"nextReward": "Next Log In Reward",
|
||||
"editProfile": "Edit Profile",
|
||||
"challengesWon": "Challenges Won",
|
||||
"questsCompleted": "Quests Completed",
|
||||
"headAccess": "Head Access.",
|
||||
"backAccess": "Back Access.",
|
||||
"bodyAccess": "Body Access.",
|
||||
"mainHand": "Main-Hand",
|
||||
"offHand": "Off-Hand",
|
||||
"statPoints": "Stat Points",
|
||||
"pts": "pts",
|
||||
"customizations": "Customizations"
|
||||
}
|
||||
{
|
||||
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <a href='https://habitica.com/static/community-guidelines' target='_blank'>Community Guidelines</a> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"profile": "Profile",
|
||||
"avatar": "Customize Avatar",
|
||||
"editAvatar": "Customize Avatar",
|
||||
"noDescription": "This Habitican hasn't added a description.",
|
||||
"noPhoto": "This Habitican hasn't added a photo.",
|
||||
"other": "Other",
|
||||
"fullName": "Full Name",
|
||||
"displayName": "Display name",
|
||||
"changeDisplayName": "Change Display Name",
|
||||
"newDisplayName": "New Display Name",
|
||||
"displayBlurbPlaceholder": "Please introduce yourself",
|
||||
"photoUrl": "Photo Url",
|
||||
"imageUrl": "Image Url",
|
||||
"inventory": "Inventory",
|
||||
"social": "Social",
|
||||
"lvl": "Lvl",
|
||||
"buffed": "Buffed",
|
||||
"bodyBody": "Body",
|
||||
"size": "Size",
|
||||
"locked": "locked",
|
||||
"shirts": "Shirts",
|
||||
"shirt": "Shirt",
|
||||
"specialShirts": "Special Shirts",
|
||||
"skin": "Skin",
|
||||
"skins": "Skins",
|
||||
"color": "Color",
|
||||
"hair": "Hair",
|
||||
"bangs": "Bangs",
|
||||
"glasses": "Glasses",
|
||||
"hairSet1": "Hairstyle Set 1",
|
||||
"hairSet2": "Hairstyle Set 2",
|
||||
"hairSet3": "Hairstyle Set 3",
|
||||
"beard": "Beard",
|
||||
"mustache": "Mustache",
|
||||
"titleFacialHair": "Facial Hair",
|
||||
"titleHaircolor": "Hair Colors",
|
||||
"titleHairbase": "Hair Styles",
|
||||
"flower": "Flower",
|
||||
"accent": "Accent",
|
||||
"headband": "Headband",
|
||||
"wheelchair": "Wheelchair",
|
||||
"extra": "Extra",
|
||||
"rainbowSkins": "Rainbow Skins",
|
||||
"pastelSkins": "Pastel Skins",
|
||||
"spookySkins": "Spooky Skins",
|
||||
"supernaturalSkins": "Supernatural Skins",
|
||||
"splashySkins": "Splashy Skins",
|
||||
"winterySkins": "Wintery Skins",
|
||||
"rainbowColors": "Rainbow Colors",
|
||||
"shimmerColors": "Shimmer Colors",
|
||||
"hauntedColors": "Haunted Colors",
|
||||
"winteryColors": "Wintery Colors",
|
||||
"equipment": "Equipment",
|
||||
"equipmentBonus": "Equipment",
|
||||
"classEquipBonus": "Class Bonus",
|
||||
"battleGear": "Battle Gear",
|
||||
"gear": "Gear",
|
||||
"autoEquipBattleGear": "Auto-equip new gear",
|
||||
"costume": "Costume",
|
||||
"useCostume": "Use Costume",
|
||||
"costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.",
|
||||
"autoEquipPopoverText": "Select this option to automatically equip gear as soon as you purchase it.",
|
||||
"costumeDisabled": "You have disabled your costume.",
|
||||
"gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:",
|
||||
"gearAchievementNotification": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class!",
|
||||
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <a href='/user/settings/site' target='_blank'>the Settings > Site page</a> and buy your new class's gear!",
|
||||
"armoireUnlocked": "For more equipment, check out the <strong>Enchanted Armoire!</strong> Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.",
|
||||
"ultimGearName": "Ultimate Gear - <%= ultClass %>",
|
||||
"ultimGearText": "Has upgraded to the maximum weapon and armor set for the <%= ultClass %> class.",
|
||||
"level": "Level",
|
||||
"levelUp": "Level Up!",
|
||||
"gainedLevel": "You gained a level!",
|
||||
"leveledUp": "By accomplishing your real-life goals, you've grown to <strong>Level <%= level %>!</strong>",
|
||||
"huzzah": "Huzzah!",
|
||||
"mana": "Mana",
|
||||
"hp": "HP",
|
||||
"mp": "MP",
|
||||
"xp": "XP",
|
||||
"health": "Health",
|
||||
"allocateStr": "Points allocated to Strength:",
|
||||
"allocateStrPop": "Add a Point to Strength",
|
||||
"allocateCon": "Points allocated to Constitution:",
|
||||
"allocateConPop": "Add a Point to Constitution",
|
||||
"allocatePer": "Points allocated to Perception:",
|
||||
"allocatePerPop": "Add a Point to Perception",
|
||||
"allocateInt": "Points allocated to Intelligence:",
|
||||
"allocateIntPop": "Add a Point to Intelligence",
|
||||
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='/shops/market'>Orb of Rebirth</a>!",
|
||||
"stats": "Stats",
|
||||
"strength": "Strength",
|
||||
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
|
||||
"constitution": "Constitution",
|
||||
"conText": "Constitution reduces the damage you take from negative Habits and missed Dailies.",
|
||||
"perception": "Perception",
|
||||
"perText": "Perception increases how much Gold you earn, and once you've unlocked the Market, increases the chance of finding items when scoring tasks.",
|
||||
"intelligence": "Intelligence",
|
||||
"intText": "Intelligence increases how much Experience you earn, and once you've unlocked Classes, determines your maximum Mana available for class abilities.",
|
||||
"levelBonus": "Level Bonus",
|
||||
"allocatedPoints": "Allocated Points",
|
||||
"allocated": "Allocated",
|
||||
"buffs": "Buffs",
|
||||
"characterBuild": "Character Build",
|
||||
"class": "Class",
|
||||
"experience": "Experience",
|
||||
"warrior": "Warrior",
|
||||
"healer": "Healer",
|
||||
"rogue": "Rogue",
|
||||
"mage": "Mage",
|
||||
"wizard": "Mage",
|
||||
"mystery": "Mystery",
|
||||
"changeClass": "Change Class, Refund Stat Points",
|
||||
"lvl10ChangeClass": "To change class you must be at least level 10.",
|
||||
"changeClassConfirmCost": "Are you sure you want to change your class for 3 Gems?",
|
||||
"invalidClass": "Invalid class. Please specify 'warrior', 'rogue', 'wizard', or 'healer'.",
|
||||
"levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.",
|
||||
"unallocated": "Unallocated Stat Points",
|
||||
"autoAllocation": "Automatic Allocation",
|
||||
"autoAllocate": "Auto Allocate",
|
||||
"autoAllocationPop": "Places Points into Stats according to your preferences, when you level up.",
|
||||
"evenAllocation": "Distribute Evenly",
|
||||
"evenAllocationPop": "Assigns the same number of points to each attribute.",
|
||||
"classAllocation": "Distribute based on Class",
|
||||
"classAllocationPop": "Assigns more points to the attributes important to your Class.",
|
||||
"taskAllocation": "Distribute Points based on task activity",
|
||||
"taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.",
|
||||
"distributePoints": "Distribute Unallocated Points",
|
||||
"distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.",
|
||||
"warriorText": "Warriors score more and better \"critical hits\", which randomly give bonus Gold, Experience, and drop chance for scoring a task. They also deal heavy damage to boss monsters. Play a Warrior if you find motivation from unpredictable jackpot-style rewards, or want to dish out the hurt in boss Quests!",
|
||||
"wizardText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habitica, or if you are strongly motivated by leveling up and unlocking advanced features!",
|
||||
"mageText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habitica, or if you are strongly motivated by leveling up and unlocking advanced features!",
|
||||
"rogueText": "Rogues love to accumulate wealth, gaining more Gold than anyone else, and are adept at finding random items. Their iconic Stealth ability lets them duck the consequences of missed Dailies. Play a Rogue if you find strong motivation from Rewards and Achievements, striving for loot and badges!",
|
||||
"healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!",
|
||||
"optOutOfClasses": "Opt Out",
|
||||
"chooseClass": "Choose your Class",
|
||||
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
|
||||
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
|
||||
"selectClass": "Select <%= heroClass %>",
|
||||
"select": "Select",
|
||||
"stealth": "Stealth",
|
||||
"stealthNewDay": "When a new day begins, you will avoid damage from this many missed Dailies.",
|
||||
"streaksFrozen": "Streaks Frozen",
|
||||
"streaksFrozenText": "Streaks on missed Dailies will not reset at the end of the day.",
|
||||
"purchaseFor": "Purchase for <%= cost %> Gems?",
|
||||
"purchaseForGold": "Purchase for <%= cost %> Gold?",
|
||||
"purchaseForHourglasses": "Purchase for <%= cost %> Hourglasses?",
|
||||
"purchasePetItemConfirm": "This purchase would exceed the number of items you need to hatch all possible <%= itemText %> pets. Are you sure?",
|
||||
"notEnoughMana": "Not enough mana.",
|
||||
"notEnoughGold": "Not enough gold.",
|
||||
"invalidTarget": "You can't cast a skill on that.",
|
||||
"youCast": "You cast <%= spell %>.",
|
||||
"youCastTarget": "You cast <%= spell %> on <%= target %>.",
|
||||
"youCastParty": "You cast <%= spell %> for the party.",
|
||||
"chatCastSpellParty": "<%= username %> casts <%= spell %> for the party.",
|
||||
"chatCastSpellUser": "<%= username %> casts <%= spell %> on <%= target %>.",
|
||||
"chatCastSpellPartyTimes": "<%= username %> casts <%= spell %> for the party <%= times %> times.",
|
||||
"chatCastSpellUserTimes": "<%= username %> casts <%= spell %> on <%= target %> <%= times %> times.",
|
||||
"critBonus": "Critical Hit! Bonus: ",
|
||||
"gainedGold": "You gained some Gold",
|
||||
"gainedMana": "You gained some Mana",
|
||||
"gainedHealth": "You gained some Health",
|
||||
"gainedExperience": "You gained some Experience",
|
||||
"lostGold": "You spent some Gold",
|
||||
"lostMana": "You used some Mana",
|
||||
"lostHealth": "You lost some Health",
|
||||
"lostExperience": "You lost some Experience",
|
||||
"equip": "Equip",
|
||||
"unequip": "Unequip",
|
||||
"animalSkins": "Animal Skins",
|
||||
"str": "STR",
|
||||
"con": "CON",
|
||||
"per": "PER",
|
||||
"int": "INT",
|
||||
"notEnoughAttrPoints": "You don't have enough Stat Points.",
|
||||
"classNotSelected": "You must select Class before you can assign Stat Points.",
|
||||
"style": "Style",
|
||||
"facialhair": "Facial",
|
||||
"photo": "Photo",
|
||||
"info": "Info",
|
||||
"joined": "Joined",
|
||||
"totalLogins": "Total Log Ins",
|
||||
"latestCheckin": "Latest Log In",
|
||||
"nextReward": "Next Log In Reward",
|
||||
"editProfile": "Edit Profile",
|
||||
"challengesWon": "Challenges Won",
|
||||
"questsCompleted": "Quests Completed",
|
||||
"headAccess": "Head Access.",
|
||||
"backAccess": "Back Access.",
|
||||
"bodyAccess": "Body Access.",
|
||||
"mainHand": "Main-Hand",
|
||||
"offHand": "Off-Hand",
|
||||
"statPoints": "Stat Points",
|
||||
"pointsAvailable": "Points Available",
|
||||
"statAllocationInfo": "Each level earns you one point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.",
|
||||
"pts": "PTS",
|
||||
"customizations": "Customizations"
|
||||
}
|
||||
|
||||
@@ -104,7 +104,6 @@
|
||||
"success": "Success!",
|
||||
"classGear": "Class Gear",
|
||||
"classGearText": "Congratulations on choosing a class! I've added your new basic weapon to your inventory. Take a look below to equip it!",
|
||||
"autoAllocate": "Auto Allocate",
|
||||
"spells": "Skills",
|
||||
"skillsTitle": "<%= classStr %> Skills",
|
||||
"toDo": "To Do",
|
||||
|
||||
Reference in New Issue
Block a user