175 lines
4.2 KiB
JavaScript
175 lines
4.2 KiB
JavaScript
/*
|
|
|
|
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
|
|
}
|
|
} |