Initial commit: 3D Hommie RPG game
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
78
js/game/Skills.js
Normal file
78
js/game/Skills.js
Normal file
@@ -0,0 +1,78 @@
|
||||
export class Skills {
|
||||
constructor(game) {
|
||||
this.game = game;
|
||||
|
||||
this.skills = {
|
||||
scavenging: { name: 'Поиск', level: 1, xp: 0, xpNeeded: 10, desc: 'Шанс найти лучший лут' },
|
||||
begging: { name: 'Убеждение', level: 1, xp: 0, xpNeeded: 8, desc: 'Шанс получить больше при попрошайничестве' },
|
||||
survival: { name: 'Выживание', level: 1, xp: 0, xpNeeded: 15, desc: 'Медленнее теряете статы' },
|
||||
trading: { name: 'Торговля', level: 1, xp: 0, xpNeeded: 12, desc: 'Лучшие цены в магазине' },
|
||||
};
|
||||
|
||||
this.maxLevel = 10;
|
||||
}
|
||||
|
||||
addXP(skillKey, amount) {
|
||||
const skill = this.skills[skillKey];
|
||||
if (!skill || skill.level >= this.maxLevel) return;
|
||||
|
||||
skill.xp += amount;
|
||||
if (skill.xp >= skill.xpNeeded) {
|
||||
skill.xp -= skill.xpNeeded;
|
||||
skill.level++;
|
||||
skill.xpNeeded = Math.floor(skill.xpNeeded * 1.5);
|
||||
this.game.notify(`${skill.name} повышен до уровня ${skill.level}!`, 'good');
|
||||
this.game.sound.playQuestComplete();
|
||||
}
|
||||
}
|
||||
|
||||
getLevel(skillKey) {
|
||||
return this.skills[skillKey]?.level || 1;
|
||||
}
|
||||
|
||||
// Модификаторы
|
||||
getScavengeBonus() {
|
||||
return 1 + (this.getLevel('scavenging') - 1) * 0.1;
|
||||
}
|
||||
|
||||
getBegBonus() {
|
||||
return 1 + (this.getLevel('begging') - 1) * 0.15;
|
||||
}
|
||||
|
||||
getSurvivalModifier() {
|
||||
return 1 - (this.getLevel('survival') - 1) * 0.05;
|
||||
}
|
||||
|
||||
getTradeDiscount() {
|
||||
return Math.max(0.6, 1 - (this.getLevel('trading') - 1) * 0.05);
|
||||
}
|
||||
|
||||
getSaveData() {
|
||||
const data = {};
|
||||
for (const [key, skill] of Object.entries(this.skills)) {
|
||||
data[key] = { level: skill.level, xp: skill.xp, xpNeeded: skill.xpNeeded };
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
loadSaveData(data) {
|
||||
if (!data) return;
|
||||
for (const [key, saved] of Object.entries(data)) {
|
||||
if (this.skills[key]) {
|
||||
this.skills[key].level = saved.level;
|
||||
this.skills[key].xp = saved.xp;
|
||||
this.skills[key].xpNeeded = saved.xpNeeded;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reset() {
|
||||
for (const skill of Object.values(this.skills)) {
|
||||
skill.level = 1;
|
||||
skill.xp = 0;
|
||||
skill.xpNeeded = skill === this.skills.scavenging ? 10 :
|
||||
skill === this.skills.begging ? 8 :
|
||||
skill === this.skills.survival ? 15 : 12;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user