diff --git a/src/App.vue b/src/App.vue index 6717ecf..e09f4ba 100644 --- a/src/App.vue +++ b/src/App.vue @@ -200,7 +200,7 @@ export default defineComponent({ return getQuestWithRewards(questsForRank[randomIdString], this.guild.expModifier.getModifier(), this.guild.goldModifier.getModifier()); }, createMissive(questToAdd: Quest) { - const quest = JSON.parse(JSON.stringify(questToAdd)); + const quest = Quest.deserialize(questToAdd.serialize()); quest.id = Math.random().toString(16).slice(2).toString(); this.missives.push(quest); }, diff --git a/src/classes/quests/Quest.ts b/src/classes/quests/Quest.ts index d18d5e8..1274bc5 100644 --- a/src/classes/quests/Quest.ts +++ b/src/classes/quests/Quest.ts @@ -69,6 +69,38 @@ export class Quest { return progressPoints; } + serialize(): {[key: string]: any} { + return { + id: this.id, + rank: this.rank, + title: this.title, + text: this.text, + phases: this.phases.map(phase => phase.serialize()), + expReward: this.expReward, + goldReward: this.goldReward, + maxAdventurers: this.maxAdventurers, + }; + } + + static deserialize(data: {[key: string]: any}): Quest { + if (!data || typeof data !== 'object') { + throw new Error("Invalid data for Quest deserialization"); + } + + const phases = (data.phases || []).map((phaseData: any) => QuestPhase.deserialize(phaseData)); + + return new Quest( + data.id, + data.rank, + data.title, + data.text, + phases, + data.expReward || 0, + data.goldReward || 0, + data.maxAdventurers || 1 + ); + } + } /**