/* Task is a base class combining core functionality used in jobs and skills. A task object stores: name, level, max level ever achieved, current experience (e.g. experience accumulated inside the current task level), and an array of experience multipliplying effects from items and skills. */ class Task { constructor(baseData) { this.baseData = baseData this.name = baseData.name this.level = 0 this.maxLevel = 0 this.xp = 0 this.xpMultipliers = [ ] } getMaxXp() { var maxXp = Math.round(this.baseData.maxXp * (this.level + 1) * Math.pow(1.01, this.level)) return maxXp } getXpLeft() { return Math.round(this.getMaxXp() - this.xp) } getMaxLevelMultiplier() { var maxLevelMultiplier = 1 + this.maxLevel / 10 return maxLevelMultiplier } getXpGain() { return applyMultipliers(10, this.xpMultipliers) } increaseXp() { this.xp += applySpeed(this.getXpGain()) if (this.xp >= this.getMaxXp()) { var excess = this.xp - this.getMaxXp() while (excess >= 0) { this.level += 1 excess -= this.getMaxXp() } this.xp = this.getMaxXp() + excess } } } class Job extends Task { constructor(baseData) { super(baseData) this.incomeMultipliers = [ ] } getLevelMultiplier() { var levelMultiplier = 1 + Math.log10(this.level + 1) return levelMultiplier } getIncome() { return applyMultipliers(this.baseData.income, this.incomeMultipliers) } } class Skill extends Task { constructor(baseData) { super(baseData) } getEffect() { var effect = 1 + this.baseData.effect * this.level return effect } getEffectDescription() { var description = this.baseData.description var text = "x" + String(this.getEffect().toFixed(2)) + " " + description return text } } class Item { constructor(baseData) { this.baseData = baseData this.name = baseData.name this.expenseMultipliers = [ ] } getEffect() { if (gameData.currentProperty != this && !gameData.currentMisc.includes(this)) return 1 var effect = this.baseData.effect return effect } getEffectDescription() { var description = this.baseData.description if (itemCategories["Properties"].includes(this.name)) description = "Happiness" var text = "x" + this.baseData.effect.toFixed(1) + " " + description return text } getExpense() { return applyMultipliers(this.baseData.expense, this.expenseMultipliers) } } class Requirement { constructor(elements, requirements) { this.elements = elements this.requirements = requirements this.completed = false } isCompleted() { if (this.completed) {return true} for (var requirement of this.requirements) { if (!this.getCondition(requirement)) { return false } } this.completed = true return true } } class TaskRequirement extends Requirement { constructor(elements, requirements) { super(elements, requirements) this.type = "task" } getCondition(requirement) { return gameData.taskData[requirement.task].level >= requirement.requirement } } class CoinRequirement extends Requirement { constructor(elements, requirements) { super(elements, requirements) this.type = "coins" } getCondition(requirement) { return gameData.coins >= requirement.requirement } } class AgeRequirement extends Requirement { constructor(elements, requirements) { super(elements, requirements) this.type = "age" } getCondition(requirement) { return daysToYears(gameData.days) >= requirement.requirement } } class EvilRequirement extends Requirement { constructor(elements, requirements) { super(elements, requirements) this.type = "evil" } getCondition(requirement) { return gameData.evil >= requirement.requirement } }