diff --git a/src/App.vue b/src/App.vue index a7aff93..2df9708 100644 --- a/src/App.vue +++ b/src/App.vue @@ -14,10 +14,10 @@ import {RouterLink, RouterView} from 'vue-router' :guild="guild" :adventurers="adventurers" :quests="missives" - :lastRecruitTime="lastRecruitHandled" + :adventurerForHire="adventurerForHire" @finalizeQuest="finalizeQuest($event)" @wipeSave="resetSave()" - @recruitActionTaken="lastRecruitHandled = Number(new Date())" + @recruitActionTaken="recruitAction($event)" /> @@ -27,9 +27,10 @@ import {Adventurer} from "@/classes/Adventurer"; import {getQuestWithRewards, Quest} from "@/classes/Quest"; import {Guild} from "@/classes/Guild"; import {getFromString, QuestRank} from "@/classes/QuestRank"; -import {GameData, loadAvailableQuests, loadGame, saveGame} from "@/GameData"; +import {GameData, loadAdventurersForHire, loadAvailableQuests, loadGame, saveGame} from "@/GameData"; import type {GuildUpgrade} from "@/classes/GuildUpgrade"; import {AdventurerCapacityUpgrade} from "@/classes/guildUpgrades/AdventurerCapacityUpgrade"; +import {getNewAdventurerForHire} from "@/classes/Recruitment"; export default defineComponent({ name: "GuildView", @@ -45,6 +46,8 @@ export default defineComponent({ F: null as null|number, } as { [key: string]: null|number }, lastRecruitHandled: null as null|number, + adventurerForHire: null as Adventurer|null, + adventurersDatabase: {} as Array, adventurers: {} as { [key: string]: Adventurer }, quests: {} as { [key: string]: { [key: string]: Quest } }, missives: { @@ -77,6 +80,28 @@ export default defineComponent({ } }, + async checkForNewRecruit(currentTimestamp: number) { + if (this.lastRecruitHandled === null) { + this.lastRecruitHandled = 0; + } + if (currentTimestamp - this.lastRecruitHandled >= 1000 * 60 * 30 && this.adventurerForHire === null) { + this.adventurerForHire = getNewAdventurerForHire(this.adventurersDatabase); + } + }, + recruitAction(adventurer: Adventurer|null): void { + this.lastRecruitHandled = Number(new Date()); + this.adventurerForHire = null; + if (adventurer === null) return; + + this.adventurers[adventurer.id] = adventurer; + for (const id in this.adventurersDatabase) { + const databaseAdventurer = this.adventurersDatabase[id]; + if (databaseAdventurer.id === adventurer.id) { + this.adventurersDatabase.splice(Number(id), 1); + break; + } + } + }, finalizeQuest(missive: Quest) { missive.progressPoints = 0; this.guild.gold += missive.goldReward; @@ -134,6 +159,8 @@ export default defineComponent({ } this.adventurers = adventurers; + + const missives = {} as { [key: string]: { [key: string]: Quest } }; for (const id in saveData.missives) { @@ -153,6 +180,21 @@ export default defineComponent({ this.missives = missives; this.lastRecruitHandled = saveData.lastRecruitAction ?? 0; + + if (Object.keys(this.adventurers).length <= 0) { + this.adventurerForHire = this.adventurersDatabase[0]; + return; + } + + if (saveData.currentlyForHireId !== null) { + for (const id in this.adventurersDatabase) { + const adventurer = this.adventurersDatabase[id]; + if (adventurer.id === saveData.currentlyForHireId) { + this.adventurerForHire = adventurer; + return; + } + } + } }, resetSave() { if (!confirm("You are about to wipe your save file. Are you sure?")) return; @@ -163,6 +205,7 @@ export default defineComponent({ async mounted() { this.loadGame(); this.quests = await loadAvailableQuests(); + this.adventurersDatabase = await loadAdventurersForHire(Object.keys(this.adventurers)); setInterval(() => { saveGame(new GameData( @@ -170,7 +213,8 @@ export default defineComponent({ this.adventurers, this.missives, this.lastQuestGot, - this.lastRecruitHandled + this.lastRecruitHandled, + this.adventurerForHire?.id ?? null ) ); }, 10*1000) @@ -180,6 +224,8 @@ export default defineComponent({ const now = Number(new Date()); + this.checkForNewRecruit(now); + for (const id in this.lastQuestGot) { const lastTime = this.lastQuestGot[getFromString(id as QuestRank)]; if (lastTime === null) this.lastQuestGot[getFromString(id as QuestRank)] = 0; diff --git a/src/GameData.ts b/src/GameData.ts index af92b9c..d325940 100644 --- a/src/GameData.ts +++ b/src/GameData.ts @@ -9,13 +9,21 @@ export class GameData { missives: { [key: string]: { [key: string]: Quest } }; lastQuestGot: { [key: string]: null | number }; lastRecruitAction: null | number; + currentlyForHireId: string|null; - constructor(guild: Guild, adventurers: { [key: string]: Adventurer }, missives: { [key: string]: { [key: string]: Quest } }, lastQuestGot: { [key: string]: null | number }, lastRecruitAction: null | number) { + constructor( + guild: Guild, adventurers: { [key: string]: Adventurer }, + missives: { [key: string]: { [key: string]: Quest } }, + lastQuestGot: { [key: string]: null | number }, + lastRecruitAction: null | number, + currentlyForHireId: string|null = null + ) { this.guild = guild; this.adventurers = adventurers; this.missives = missives; this.lastQuestGot = lastQuestGot; this.lastRecruitAction = lastRecruitAction; + this.currentlyForHireId = currentlyForHireId; } } @@ -33,6 +41,7 @@ export function saveGame( missives: data.missives, lastQuestGot: data.lastQuestGot, lastRecruitAction: data.lastRecruitAction, + adventurerForHireId: data.currentlyForHireId, })); } diff --git a/src/classes/Recruitment.ts b/src/classes/Recruitment.ts new file mode 100644 index 0000000..dbe8363 --- /dev/null +++ b/src/classes/Recruitment.ts @@ -0,0 +1,13 @@ +import type {Adventurer} from "@/classes/Adventurer"; + + +/** + * Get a random adventurer from the pool + * @param adventurerPool + * @returns {Adventurer|null} null if the pool is empty + */ +export function getNewAdventurerForHire(adventurerPool: Array): Adventurer|null { + if (adventurerPool.length <= 0) return null; + const randomId = adventurerPool.length * Math.random() << 0; + return adventurerPool[randomId]; +} \ No newline at end of file diff --git a/src/views/AdventurerView.vue b/src/views/AdventurerView.vue index 9794ca6..b4add58 100644 --- a/src/views/AdventurerView.vue +++ b/src/views/AdventurerView.vue @@ -3,12 +3,12 @@

Applying adventurers

-
- +
+
✔ @@ -45,18 +45,11 @@ import type {PropType} from "vue"; import {defineComponent} from "vue"; import AdventurerTile from "@/components/AdventurerTile.vue"; import type {Adventurer} from "@/classes/Adventurer"; -import { loadAdventurersForHire } from "@/GameData"; import type {Guild} from "@/classes/Guild"; export default defineComponent({ name: "RecruitView", components: {AdventurerTile}, - data: () => { - return { - currentlyForHire: null as Adventurer|null, - adventurersForHire: [] as Array, - } - }, props: { guild: { type: Object as PropType, @@ -70,76 +63,25 @@ export default defineComponent({ return {} as { [key: string]: Adventurer }; }, }, - lastRecruitTime: { - type: Number as PropType, + adventurerForHire: { + type: Object as PropType, default() { - return 0; + return null; } }, }, methods: { - getRandomAdventurer(): Adventurer|null { - if (this.adventurersForHire.length <= 0) return null; - const randomId = this.adventurersForHire.length * Math.random() << 0; - return this.adventurersForHire[randomId]; - }, - getNewAdventurerForHire(): void { - const adventurer = this.getRandomAdventurer(); - if (adventurer === null) { - this.currentlyForHire = null; - return; - } - - if (this.adventurers[adventurer.id] != null) { - this.currentlyForHire = null; - return; - } - - this.currentlyForHire = adventurer; - window.localStorage.setItem("currentlyForHire", adventurer.id); - - }, - hireAdventurer(adventurer: Adventurer|any): void { + hireAdventurer(): void { if (Object.keys(this.adventurers).length >= this.guild.adventurerCapacity.getAdventurerCapacity()) return; - this.adventurers[adventurer.id] = adventurer; - this.currentlyForHire = null; - window.localStorage.removeItem("currentlyForHire"); - this.$emit("recruitActionTaken", adventurer); + this.$emit("recruitActionTaken", this.adventurerForHire); }, dismissAdventurer() { if (Object.keys(this.adventurers).length <= 0) return; - this.currentlyForHire = null; this.$emit("recruitActionTaken", null); - window.localStorage.removeItem("currentlyForHire"); } }, async mounted() { - this.adventurersForHire = await loadAdventurersForHire(Object.keys(this.adventurers)); - - if (Object.keys(this.adventurers).length <= 0) { - this.currentlyForHire = this.adventurersForHire[0]; - window.localStorage.setItem("currentlyForHire", this.adventurersForHire[0].id); - return; - } - - const savedCurrentForHire = window.localStorage.getItem("currentlyForHire"); - if (savedCurrentForHire !== null) { - for (const id in this.adventurersForHire) { - const adventurer = this.adventurersForHire[id]; - if (adventurer.id === savedCurrentForHire) { - this.currentlyForHire = adventurer; - return; - } - } - } - - const now = Number(new Date()); - - if (now - this.lastRecruitTime >= 1000 * 60 * 30 && this.currentlyForHire === null) { - this.getNewAdventurerForHire(); - } - }, emits: ["recruitActionTaken"] diff --git a/src/views/QuestView.vue b/src/views/QuestView.vue index 55fe014..b99d433 100644 --- a/src/views/QuestView.vue +++ b/src/views/QuestView.vue @@ -1,89 +1,90 @@