From b6e2a7e813b08d8a702d77db2b4c7dc947852f7e Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Sat, 25 Mar 2023 16:32:14 +0100 Subject: [PATCH] more balanced math, adventurer max levels, recruits duplicate protection --- src/App.vue | 15 +----------- src/classes/Adventurer.ts | 40 +++++++++++++++++++++++++++++-- src/classes/Quest.ts | 26 ++++++++++---------- src/components/AdventurerTile.vue | 2 +- src/views/AdventurerView.vue | 4 ++-- 5 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/App.vue b/src/App.vue index 393b93d..d638585 100644 --- a/src/App.vue +++ b/src/App.vue @@ -31,19 +31,6 @@ import {GameData, loadAvailableQuests, loadGame, saveGame} from "@/GameData"; export default defineComponent({ name: "GuildView", - watch: { - adventurers: { - deep: true, - handler(newAdventurers) { - for (const adventurerId in newAdventurers) { - const adventurer = newAdventurers[adventurerId] as Adventurer; - if (adventurer.canLevelUp()) { - adventurer.levelUp(); - } - } - } - } - }, data: () => ({ guild: new Guild(1, 500), lastQuestGot: { @@ -129,7 +116,7 @@ export default defineComponent({ this.guild.gold += missive.goldReward; for (const adventurerId in missive.adventurers) { const adventurer = missive.adventurers[adventurerId]; - adventurer.exp += (missive.expReward / missive.adventurers.length); + adventurer.addExp(missive.expReward / missive.adventurers.length); adventurer.busy = false; } missive.adventurers = []; diff --git a/src/classes/Adventurer.ts b/src/classes/Adventurer.ts index aec026f..b57a6a1 100644 --- a/src/classes/Adventurer.ts +++ b/src/classes/Adventurer.ts @@ -5,6 +5,7 @@ export class Adventurer { level: number; exp: number; attackExponent: number; + prestige: number; busy: boolean; constructor( @@ -13,7 +14,8 @@ export class Adventurer { portrait: string, attackExponent: number, level: number = 1, - exp: number = 0 + exp: number = 0, + prestige: number = 0 ) { this.id = id; this.name = name; @@ -21,6 +23,7 @@ export class Adventurer { this.attackExponent = attackExponent; this.level = level; this.exp = exp; + this.prestige = prestige; this.busy = false; } @@ -29,10 +32,22 @@ export class Adventurer { this.level += 1; } + prestigeUp(): void { + this.level = 1; + this.exp = 0; + this.prestige += 1; + } + canLevelUp(): boolean { + if (this.level >= this.getMaxLevel()) return false; return this.exp >= this.getNextLevelExpRequirement(); } + canPrestigeUp(): boolean { + if (this.level < getMaxLevelForPrestige(this.prestige)) return false; + return this.prestige < 5 + } + getNextLevelExpRequirement(): number { return this.level * 3; } @@ -44,12 +59,33 @@ export class Adventurer { return (this.exp / this.getNextLevelExpRequirement()) * 100; } + addExp(exp: number): void { + if (this.isMaxLevel()) return; + this.exp += exp; + if (this.canLevelUp()) { + this.levelUp(); + } + } + getAttack(): number { - return Math.floor(2 * this.level ^ this.attackExponent); + const scalingFactor = Math.pow(1.05, this.level - 1); + return (2 * scalingFactor) * Math.pow(this.attackExponent, this.level - 1); } getDPS(): number { return this.getAttack() * 4; } + getMaxLevel(): number { + return getMaxLevelForPrestige(this.prestige); + } + + isMaxLevel(): boolean { + return this.level >= this.getMaxLevel(); + } + +} + +function getMaxLevelForPrestige(prestige: number): number { + return 25 + (prestige * 5); } diff --git a/src/classes/Quest.ts b/src/classes/Quest.ts index e37c2c4..5d7efcc 100644 --- a/src/classes/Quest.ts +++ b/src/classes/Quest.ts @@ -40,28 +40,28 @@ export function getQuestWithRewards(quest: Quest) { switch (quest.rank) { case QuestRank.S: - // at level 30 adventurers have ~2353 dps, this will take 30 seconds on level 30 - maxProgress = 70590 + // at level 30 adventurers have ~6513 dps, this will take 30 seconds on level 30 + maxProgress = 195390; break; case QuestRank.A: - // at level 25 adventurers have ~1122 dps, this will take 15 seconds on level 25 - maxProgress = 16800 + // at level 25 adventurers have ~2051 dps, this will take 15 seconds on level 25 + maxProgress = 30770; break; case QuestRank.B: - // at level 20 adventurers have ~564 dps, this will take 15 seconds on level 20 - maxProgress = 8460; + // at level 20 adventurers have ~645 dps, this will take 15 seconds on level 20 + maxProgress = 9690; break; case QuestRank.C: - // at level 15 adventurers have ~256 dps, this will take 15 seconds on level 15 - maxProgress = 3840; + // at level 15 adventurers have ~203 dps, this will take 15 seconds on level 15 + maxProgress = 3045; break; case QuestRank.D: - // at level 10 adventurers have ~103 dps, this will take 15 seconds on level 10 - maxProgress = 1545; + // at level 10 adventurers have ~64 dps, this will take 15 seconds on level 10 + maxProgress = 960; break; case QuestRank.E: - // at level 5 adventurers have ~45 dps, this will take 15 seconds on level 5 - maxProgress = 675; + // at level 5 adventurers have ~20 dps, this will take 15 seconds on level 5 + maxProgress = 300; break; case QuestRank.F: // at level 1 adventurers have ~8 dps, this will take 15 seconds on level 1 @@ -74,7 +74,7 @@ export function getQuestWithRewards(quest: Quest) { // add some randomness to the rewards goldReward = Math.floor(randomNumberBetween(goldReward * 0.95, goldReward * 1.1)); - expReward = Math.max(1, Math.floor(randomNumberBetween(expReward * 0.95, expReward * 1.1))); + expReward = Math.max(1, Math.floor(randomNumberBetween(expReward * 0.95, expReward * 1.2))); return new Quest(quest.id, quest.rank, quest.title, quest.text, maxProgress, expReward, goldReward); } diff --git a/src/components/AdventurerTile.vue b/src/components/AdventurerTile.vue index cc97586..baf33c3 100644 --- a/src/components/AdventurerTile.vue +++ b/src/components/AdventurerTile.vue @@ -4,7 +4,7 @@ :title="adventurer.name + (adventurer.busy ? ' (busy)' : '')" > -
{{adventurer.level}}
+
{{adventurer.level}}
diff --git a/src/views/AdventurerView.vue b/src/views/AdventurerView.vue index 4fbc085..8938d7c 100644 --- a/src/views/AdventurerView.vue +++ b/src/views/AdventurerView.vue @@ -43,7 +43,7 @@ import type {PropType} from "vue"; import {defineComponent} from "vue"; import AdventurerTile from "@/components/AdventurerTile.vue"; -import {Adventurer} from "@/classes/Adventurer"; +import type {Adventurer} from "@/classes/Adventurer"; import { loadAdventurersForHire } from "@/GameData"; export default defineComponent({ @@ -106,7 +106,7 @@ export default defineComponent({ }, async mounted() { - this.adventurersForHire = await loadAdventurersForHire(); + this.adventurersForHire = await loadAdventurersForHire(Object.keys(this.adventurers)); if (Object.keys(this.adventurers).length <= 0) { this.currentlyForHire = this.adventurersForHire[0];