diff --git a/src/App.vue b/src/App.vue index 29c1978..190b5a7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -48,10 +48,11 @@ import {version} from "@/../package.json"; :guild="guild" :adventurers="adventurers" :quests="missives" - :adventurerForHire="adventurerForHire" + :adventurersForHire="adventurersForHire" :news="news" @finalizeQuest="finalizeQuest($event)" - @recruitActionTaken="recruitAction($event)" + @recruitAdventurer="recruitAdventurer($event)" + @dismissRecruit="dismissRecruit($event)" /> @@ -94,9 +95,8 @@ export default defineComponent({ E: null as null | number, F: null as null | number, } as { [key: string]: null | number }, - lastRecruitHandled: null as null | number, - adventurerForHire: null as Adventurer | null, - adventurersDatabase: {} as Array, + adventurersForHire: {} as { [key: string]: Adventurer }, + adventurersDatabase: {} as { [key: string]: Adventurer }, allAdventurers: {} as { [key: string]: Adventurer }, adventurers: {} as { [key: string]: Adventurer }, quests: {} as { [key: string]: { [key: string]: Quest } }, @@ -127,31 +127,26 @@ export default defineComponent({ }, async checkForNewRecruit(currentTimestamp: number) { - if (this.lastRecruitHandled == null) { - this.lastRecruitHandled = 0; - } - if (Object.keys(this.adventurers).length <= 0) { - this.adventurerForHire = this.adventurersDatabase[0]; + const firstAdventurer = this.adventurersDatabase[0] + this.adventurersForHire[firstAdventurer.id] = firstAdventurer; } - if (currentTimestamp - this.lastRecruitHandled >= 1000 * 60 * 30 && this.adventurerForHire == null) { - this.adventurerForHire = getNewAdventurerForHire(this.adventurersDatabase); + // TODO hiring capacity upgrade + if (Object.keys(this.adventurersForHire).length < 2) { + const newAdventurerForHire = getNewAdventurerForHire(Object.values(this.adventurersDatabase)); + if (newAdventurerForHire === null) return; + this.adventurersForHire[newAdventurerForHire.id] = newAdventurerForHire; } }, - recruitAction(adventurer: Adventurer | null): void { - this.lastRecruitHandled = Number(new Date()); - this.adventurerForHire = null; - if (adventurer === null) return; - + recruitAdventurer(adventurer: Adventurer): void { 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; - } - } + delete this.adventurersDatabase[adventurer.id]; + }, + dismissRecruit(adventurer: Adventurer): void { + if (adventurer == null) return; + if (this.adventurersForHire[adventurer.id] == null) return; + delete this.adventurersForHire[adventurer.id]; }, finalizeQuest(missive: Quest) { missive.progressPoints = 0; @@ -243,17 +238,31 @@ export default defineComponent({ } } - this.lastRecruitHandled = saveData.lastRecruitAction ?? 0; + const recruits = {} as { [key: string]: Adventurer }; - if (saveData.adventurerForHireId != null) { - for (const id in this.adventurersDatabase) { - const adventurer = this.adventurersDatabase[id]; - if (adventurer.id === saveData.adventurerForHireId) { - this.adventurerForHire = adventurer; - return; - } + for (const id in saveData.adventurersForHire) { + const data = saveData.adventurersForHire[id]; + let portrait: string = ""; + + const adventurer = this.allAdventurers[data.id]; + if (adventurer) { + portrait = adventurer.portrait; + } + + try { + recruits[data.id] = new Adventurer( + data.id, + data.name, + portrait, + data.attackExponent ?? 1.1, + data.level ?? 1, + data.exp ?? 0, + data.prestige ?? 0, + ); + } catch (e) { } } + this.adventurersForHire = recruits; }, async updateNews() { const result = await fetch("https://raw.githubusercontent.com/YouHaveTrouble/GuildMaster/master/news.txt").catch(() => { @@ -287,7 +296,7 @@ export default defineComponent({ }); this.quests = promises[0] as { [key: string]: { [key: string]: Quest } }; - this.adventurersDatabase = promises[1] as Array; + this.adventurersDatabase = promises[1] as {[key: string]: Adventurer}; for (const adventurerId in this.adventurersDatabase) { const adventurer = this.adventurersDatabase[adventurerId]; this.allAdventurers[adventurer.id] = new Adventurer(adventurer.id, adventurer.name, adventurer.portrait, adventurer.attackExponent, adventurer.level, adventurer.exp, adventurer.prestige); @@ -308,8 +317,7 @@ export default defineComponent({ guild: this.guild, missives: this.missives, lastQuestGot: this.lastQuestGot, - lastRecruitAction: this.lastRecruitHandled, - adventurerForHireId: this.adventurerForHire?.id ?? null, + adventurersForHire: this.adventurersForHire ?? null, })); }, 10 * 1000)); diff --git a/src/GameData.ts b/src/GameData.ts index 05aa62a..b1d537e 100644 --- a/src/GameData.ts +++ b/src/GameData.ts @@ -8,8 +8,7 @@ export class GameData { adventurers: { [key: string]: Adventurer }; missives: Array; lastQuestGot: { [key: string]: null | number }; - lastRecruitAction: null | number; - adventurerForHireId: string | null; + adventurersForHire: {[key: string]: Adventurer} | null; constructor( data: any, @@ -18,8 +17,7 @@ export class GameData { this.adventurers = data.adventurers ?? {} as { [key: string]: Adventurer }; this.missives = data.missives ?? [] as Array; this.lastQuestGot = data.lastQuestGot ?? {} as { [key: string]: null | number }; - this.lastRecruitAction = data.lastRecruitAction ?? null; - this.adventurerForHireId = data.adventurerForHireId ?? null; + this.adventurersForHire = data.adventurersForHire ?? null; } } @@ -39,13 +37,19 @@ export function saveGame( adventurers[adventurerId] = adventurer; } + const adventurersForHire = {} as { [key: string]: any }; + for (const adventurerId in data.adventurersForHire) { + const adventurer: {[key: string]: any} = JSON.parse(JSON.stringify(data.adventurersForHire[adventurerId])); + delete adventurer.portrait; + adventurersForHire[adventurerId] = adventurer; + } + window.localStorage.setItem("savedGame", JSON.stringify({ guild: data.guild, adventurers: adventurers, missives: data.missives, lastQuestGot: data.lastQuestGot, - lastRecruitAction: data.lastRecruitAction, - adventurerForHireId: data.adventurerForHireId, + adventurersForHire: adventurersForHire })); } @@ -99,38 +103,38 @@ export async function loadAvailableQuests(): Promise<{ [key: string]: { [key: st return quests; } -export async function loadAdventurersForHire(): Promise> { +export async function loadAdventurersForHire(): Promise<{[key: string]: Adventurer}> { const response = await fetch("data/adventurers.json"); if (response.status !== 200) { console.error("Failed to load adventurers"); alert("Failed to load adventurers. Please try refreshing the page."); - return []; + return {}; } const adventurerData = await response.json(); - const adventurers: Array = []; + const adventurers: {[key: string]: Adventurer} = {}; for (const adventurer of adventurerData) { - adventurers.push(new Adventurer( + const loadedAdventurer = new Adventurer( adventurer.id, adventurer.name, adventurer.portrait, adventurer.attackExponent, adventurer.level, adventurer.exp, - )); + ) + adventurers[loadedAdventurer.id] = loadedAdventurer; } - return adventurers; } export function removeAlreadyHiredAdventurers( - adventurers: Array, + adventurers: { [key: string]: Adventurer }, adventurersHired: { [key: string]: Adventurer } -): Array { - const adventurersForHire: Array = []; - for (const adventurer of adventurers) { +): { [key: string]: Adventurer } { + const adventurersForHire: { [key: string]: Adventurer } = {}; + for (const adventurer of Object.values(adventurers)) { if (adventurersHired[adventurer.id]) continue; - adventurersForHire.push(adventurer); + adventurersForHire[adventurer.id] = adventurer; } return adventurersForHire; } diff --git a/src/components/AdventurerRecruitment.vue b/src/components/AdventurerRecruitment.vue new file mode 100644 index 0000000..5dba156 --- /dev/null +++ b/src/components/AdventurerRecruitment.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/views/AdventurerView.vue b/src/views/AdventurerView.vue index 2a9d30e..506ac9e 100644 --- a/src/views/AdventurerView.vue +++ b/src/views/AdventurerView.vue @@ -1,50 +1,29 @@