mirror of
https://github.com/YouHaveTrouble/GuildMaster.git
synced 2026-05-12 06:26:59 +00:00
adventurer limit, base classes for guild upgrades
This commit is contained in:
+11
-40
@@ -9,7 +9,6 @@ import {RouterLink, RouterView} from 'vue-router'</script>
|
|||||||
<RouterLink to="/adventurers">Adventurers</RouterLink>
|
<RouterLink to="/adventurers">Adventurers</RouterLink>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<RouterView
|
<RouterView
|
||||||
:guild="guild"
|
:guild="guild"
|
||||||
:adventurers="adventurers"
|
:adventurers="adventurers"
|
||||||
@@ -28,6 +27,8 @@ import {getQuestWithRewards, Quest} from "@/classes/Quest";
|
|||||||
import {Guild} from "@/classes/Guild";
|
import {Guild} from "@/classes/Guild";
|
||||||
import {getFromString, QuestRank} from "@/classes/QuestRank";
|
import {getFromString, QuestRank} from "@/classes/QuestRank";
|
||||||
import {GameData, loadAvailableQuests, loadGame, saveGame} from "@/GameData";
|
import {GameData, loadAvailableQuests, loadGame, saveGame} from "@/GameData";
|
||||||
|
import type {GuildUpgrade} from "@/classes/GuildUpgrade";
|
||||||
|
import {AdventurerCapacityUpgrade} from "@/classes/guildUpgrades/AdventurerCapacityUpgrade";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "GuildView",
|
name: "GuildView",
|
||||||
@@ -44,44 +45,7 @@ export default defineComponent({
|
|||||||
} as { [key: string]: null|number },
|
} as { [key: string]: null|number },
|
||||||
lastRecruitHandled: null as null|number,
|
lastRecruitHandled: null as null|number,
|
||||||
adventurers: {} as { [key: string]: Adventurer },
|
adventurers: {} as { [key: string]: Adventurer },
|
||||||
quests: {
|
quests: {} as { [key: string]: { [key: string]: Quest } },
|
||||||
F: {
|
|
||||||
"1": new Quest("1", QuestRank.F, "Frog Frenzy", "Kill 10 demon frogs.", 120, 1, 25),
|
|
||||||
"2": new Quest("2", QuestRank.F, "Rats!", "Get rid of the rats in someone's basement.", 120, 1, 15),
|
|
||||||
"3": new Quest("3", QuestRank.F, "Herb gethering", "Colect medicinal herbs.", 120, 1, 19),
|
|
||||||
"4": new Quest("4", QuestRank.F, "Big pile of rubble", "Tavern collapsed. Again. Help clean up the debris.", 120, 1, 10),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
E: {
|
|
||||||
"1": new Quest("1", QuestRank.E, "Gnoblin subjegation", "Kill 3 gnoblins.", 500, 2, 30),
|
|
||||||
"2": new Quest("2", QuestRank.E, "Phantom menace", "Exorcise ghosts out of someone's apartment.", 510, 2, 28),
|
|
||||||
"3": new Quest("3", QuestRank.E, "Scratchy in peril", "Get Scratchy the cat from the tree safe to the ground.", 550, 2, 32),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
D: {
|
|
||||||
"1": new Quest("1", QuestRank.D, "Caravan escort", "Escort a merchant caravan.", 2000, 3, 47),
|
|
||||||
"2": new Quest("2", QuestRank.D, "Rare ore", "Obtain laudanium ore for town's blacksmith.", 2200, 3, 54),
|
|
||||||
"3": new Quest("3", QuestRank.D, "Demonic pests!", "Clear the fields from cabbage imps.", 2149, 3, 49),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
C: {
|
|
||||||
"1": new Quest("1", QuestRank.C, "Scratchy, the butcher", "Scratchy turned evil and is terrorizing its victims. Put a stop to it!", 7500, 5, 150),
|
|
||||||
"2": new Quest("2", QuestRank.C, "Hobgnoblin subjegation", "Gnoblins evolved and are back for vengance.", 7600, 5, 150),
|
|
||||||
"3": new Quest("3", QuestRank.C, "Holy", "Gnoblins summoned their machine god and it started going haywire on everything around it. Destroy it!", 7777, 5, 49),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
B: {
|
|
||||||
"1": new Quest("1", QuestRank.B, "Undead horde", "Due to the spillage of necromancy potion at nearby graveyard we now have an undead army on our doorstep.", 25000, 8, 200),
|
|
||||||
"2": new Quest("2", QuestRank.B, "Runaway prisoner", "During the last prison guard strike a prisoner managed to escape. Bring them back to their cell.", 26000, 8, 210),
|
|
||||||
"3": new Quest("3", QuestRank.B, "The aristocrats", "Royalty wants an escort for one of their carriages.", 25000, 8, 200),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
A: {
|
|
||||||
"1": new Quest("1", QuestRank.A, "Ogre king", "Ogres have chosen a new king through democratic vote. They all voted for the strongest ogre.", 100000, 12, 200),
|
|
||||||
"2": new Quest("2", QuestRank.A, "Devilish dungeon", "New dungeon was discovered. It needs to be mapped and explored so lower rank adventurers can enter.", 100000, 12, 210),
|
|
||||||
"3": new Quest("3", QuestRank.A, "Eater of Worlds", "A giant worm emerged from the ground and appears to be consuming the ground itself.", 100000, 12, 200),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
S: {
|
|
||||||
"1": new Quest("1", QuestRank.S, "The Demon King", "Demon King has awoken and is a threat to whole existence. Heroes needed.", 1000000, 20, 200),
|
|
||||||
"2": new Quest("2", QuestRank.S, "Scratchy, Destruction Incarnate", "Scratchy was reborn as a machine of pure destruction and needs to be stopped.", 1000000, 20, 210),
|
|
||||||
"3": new Quest("3", QuestRank.S, "Jiggly Jungle", "A jungle south began rapidly expanding and experts think arson is our only option.", 1000000, 20, 200),
|
|
||||||
} as { [key: string]: Quest },
|
|
||||||
} as { [key: string]: { [key: string]: Quest } },
|
|
||||||
missives: {
|
missives: {
|
||||||
F: {} as { [key: string]: Quest },
|
F: {} as { [key: string]: Quest },
|
||||||
E: {} as { [key: string]: Quest },
|
E: {} as { [key: string]: Quest },
|
||||||
@@ -102,6 +66,7 @@ export default defineComponent({
|
|||||||
missive.progressPoints = 0;
|
missive.progressPoints = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (missive.progressPoints >= missive.maxProgress) continue;
|
||||||
for (const adventurerId in missive.adventurers) {
|
for (const adventurerId in missive.adventurers) {
|
||||||
const adventurer = missive.adventurers[adventurerId];
|
const adventurer = missive.adventurers[adventurerId];
|
||||||
const attack = adventurer.getAttack();
|
const attack = adventurer.getAttack();
|
||||||
@@ -142,7 +107,13 @@ export default defineComponent({
|
|||||||
|
|
||||||
this.lastQuestGot = saveData.lastQuestGot;
|
this.lastQuestGot = saveData.lastQuestGot;
|
||||||
|
|
||||||
this.guild = new Guild(saveData.guild.level, saveData.guild.gold);
|
const guildUpgrades = {} as { [key: string]: GuildUpgrade };
|
||||||
|
if (saveData.guild.adventurerCapacity) {
|
||||||
|
console.log(saveData.guild.adventurerCapacity);
|
||||||
|
guildUpgrades.adventurerCapacity = new AdventurerCapacityUpgrade(saveData.guild.adventurerCapacity.level);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.guild = new Guild(saveData.guild.level, saveData.guild.gold, guildUpgrades);
|
||||||
|
|
||||||
const adventurers = {} as { [key: string]: Adventurer };
|
const adventurers = {} as { [key: string]: Adventurer };
|
||||||
|
|
||||||
|
|||||||
@@ -84,9 +84,6 @@ export async function loadAvailableQuests(): Promise<{ [key: string]: { [key: st
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(quests);
|
|
||||||
|
|
||||||
return quests;
|
return quests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-2
@@ -1,15 +1,23 @@
|
|||||||
|
import type {GuildUpgrade} from "@/classes/GuildUpgrade";
|
||||||
|
import {AdventurerCapacityUpgrade} from "@/classes/guildUpgrades/AdventurerCapacityUpgrade";
|
||||||
|
|
||||||
export class Guild {
|
export class Guild {
|
||||||
gold: number;
|
gold: number;
|
||||||
level: number;
|
level: number;
|
||||||
displayUpgradeCost: number|string;
|
displayUpgradeCost: number|string;
|
||||||
|
|
||||||
upgradeCost: number|null = null;
|
upgradeCost: number|null = null;
|
||||||
|
adventurerCapacity: AdventurerCapacityUpgrade;
|
||||||
|
|
||||||
constructor(level: number, gold: number) {
|
constructor(level: number, gold: number, upgrades: {[index:string]: GuildUpgrade} = {}) {
|
||||||
this.gold = gold;
|
this.gold = gold;
|
||||||
this.level = level;
|
this.level = level;
|
||||||
this.displayUpgradeCost = this.getUpgradeCost() ?? "Max level";
|
this.displayUpgradeCost = this.getUpgradeCost() ?? "Max level";
|
||||||
this.upgradeCost = this.getUpgradeCost();
|
this.upgradeCost = this.getUpgradeCost();
|
||||||
|
|
||||||
|
console.log(upgrades)
|
||||||
|
|
||||||
|
this.adventurerCapacity = upgrades.adventurerCapacity as AdventurerCapacityUpgrade ?? new AdventurerCapacityUpgrade();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
upgrade(): void {
|
upgrade(): void {
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export class GuildUpgrade {
|
||||||
|
|
||||||
|
level: number = 1;
|
||||||
|
nextLevelCost: number | null = null;
|
||||||
|
guildLevelRequirement: number = 1;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import {GuildUpgrade} from "@/classes/GuildUpgrade";
|
||||||
|
|
||||||
|
export class AdventurerCapacityUpgrade extends GuildUpgrade {
|
||||||
|
constructor(level: number = 1) {
|
||||||
|
super();
|
||||||
|
this.level = level;
|
||||||
|
this.nextLevelCost = this.getCostForLevel(this.level);
|
||||||
|
this.guildLevelRequirement = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
upgrade(): void {
|
||||||
|
this.level += 1;
|
||||||
|
this.nextLevelCost = this.getCostForLevel(this.level);
|
||||||
|
}
|
||||||
|
|
||||||
|
getCostForLevel(level: number): number {
|
||||||
|
return 1500 + ((level - 1) * 1.15 * 1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of adventurers the guild can have
|
||||||
|
*/
|
||||||
|
getAdventurerCapacity(): number {
|
||||||
|
return 2 + this.level ;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,11 +9,12 @@
|
|||||||
<span
|
<span
|
||||||
title="Hire"
|
title="Hire"
|
||||||
@click="hireAdventurer(currentlyForHire)"
|
@click="hireAdventurer(currentlyForHire)"
|
||||||
|
:class="{disabled: Object.keys(adventurers).length >= guild.adventurerCapacity.getAdventurerCapacity()}"
|
||||||
>
|
>
|
||||||
✔
|
✔
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
title="Dismiss"
|
:title="Object.keys(adventurers).length > 0 ? 'Dismiss' : ''"
|
||||||
:class="{disabled: Object.keys(adventurers).length <= 0}"
|
:class="{disabled: Object.keys(adventurers).length <= 0}"
|
||||||
@click="dismissAdventurer()"
|
@click="dismissAdventurer()"
|
||||||
>
|
>
|
||||||
@@ -28,7 +29,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<section class="collection">
|
<section class="collection">
|
||||||
<h1>Recruited adventurers</h1>
|
<h1>Recruited adventurers ({{ Object.keys(adventurers).length }} / {{ guild.adventurerCapacity.getAdventurerCapacity() }})</h1>
|
||||||
<div class="adventurers">
|
<div class="adventurers">
|
||||||
<div class="adventurer-tile" v-for="adventurer in adventurers" :key="adventurer.id">
|
<div class="adventurer-tile" v-for="adventurer in adventurers" :key="adventurer.id">
|
||||||
<AdventurerTile class="entry" :adventurer="adventurer" />
|
<AdventurerTile class="entry" :adventurer="adventurer" />
|
||||||
@@ -45,6 +46,7 @@ import {defineComponent} from "vue";
|
|||||||
import AdventurerTile from "@/components/AdventurerTile.vue";
|
import AdventurerTile from "@/components/AdventurerTile.vue";
|
||||||
import type {Adventurer} from "@/classes/Adventurer";
|
import type {Adventurer} from "@/classes/Adventurer";
|
||||||
import { loadAdventurersForHire } from "@/GameData";
|
import { loadAdventurersForHire } from "@/GameData";
|
||||||
|
import type {Guild} from "@/classes/Guild";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "RecruitView",
|
name: "RecruitView",
|
||||||
@@ -56,6 +58,12 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
|
guild: {
|
||||||
|
type: Object as PropType<Guild>,
|
||||||
|
default() {
|
||||||
|
return {} as Guild
|
||||||
|
},
|
||||||
|
},
|
||||||
adventurers: {
|
adventurers: {
|
||||||
type: Object as PropType<{ [key: string]: Adventurer }>,
|
type: Object as PropType<{ [key: string]: Adventurer }>,
|
||||||
default() {
|
default() {
|
||||||
@@ -92,6 +100,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
},
|
},
|
||||||
hireAdventurer(adventurer: Adventurer|any): void {
|
hireAdventurer(adventurer: Adventurer|any): void {
|
||||||
|
if (Object.keys(this.adventurers).length >= this.guild.adventurerCapacity.getAdventurerCapacity()) return;
|
||||||
this.adventurers[adventurer.id] = adventurer;
|
this.adventurers[adventurer.id] = adventurer;
|
||||||
this.currentlyForHire = null;
|
this.currentlyForHire = null;
|
||||||
window.localStorage.removeItem("currentlyForHire");
|
window.localStorage.removeItem("currentlyForHire");
|
||||||
@@ -196,7 +205,8 @@ export default defineComponent({
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
&.disabled {
|
&.disabled {
|
||||||
color: rgba(0,0,0, 0.5)
|
color: rgba(0,0,0, 0.5);
|
||||||
|
cursor: default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.missives {
|
.missives {
|
||||||
|
|||||||
Reference in New Issue
Block a user