Add a button to upgrade a building from the village map.
This commit is contained in:
parent
dd50d9b80d
commit
fbe48f925d
@ -1,8 +1,57 @@
|
||||
<script lang="ts">
|
||||
import moves from "../moves";
|
||||
import type { BuildingType } from "../types";
|
||||
import { canPayBuildingCost } from "../utils";
|
||||
import village from "../village";
|
||||
|
||||
export let building: BuildingType;
|
||||
|
||||
|
||||
$: isUpgrading = $village.queue.find(q => q.id === building.id);
|
||||
$: canUpgrade = canPayBuildingCost($village, building);
|
||||
|
||||
|
||||
function upgradeBuilding() {
|
||||
moves.upgradeBuilding(building.id);
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<p>{ building.name }</p>
|
||||
<p>{ building.level }</p>
|
||||
<p>
|
||||
<button
|
||||
class="level"
|
||||
class:can-upgrade={ canUpgrade }
|
||||
class:is-upgrading={ isUpgrading }
|
||||
on:click|stopPropagation={ upgradeBuilding }
|
||||
>
|
||||
{ building.level }
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.level {
|
||||
aspect-ratio: 1;
|
||||
background-color: hsl(208, 100%, 97%);
|
||||
border: 0.4em solid hsl(0, 0%, 45%);
|
||||
border-radius: 100%;
|
||||
box-sizing: border-box;
|
||||
box-shadow: 0 0 0.2em black;
|
||||
color: hsl(0, 0%, 10%);
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.level.can-upgrade {
|
||||
border-color: hsl(90, 99%, 36%);
|
||||
}
|
||||
|
||||
.level.is-upgrading {
|
||||
border-color: hsl(56, 99%, 43%);
|
||||
}
|
||||
|
||||
.level:hover.can-upgrade {
|
||||
border-color: hsl(90, 99%, 36%);
|
||||
}
|
||||
</style>
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { enqueueBuilding } from "../utils";
|
||||
import { canPayBuildingCost, enqueueBuilding, getBuildingUpgradeCost } from "../utils";
|
||||
import type { VillageState } from "../village";
|
||||
|
||||
|
||||
@ -8,20 +8,12 @@ export default function upgradeBuilding(V: VillageState, buildingId: number) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const ongoingUpgrades = V.queue.filter(q => q.id === building.id);
|
||||
const level = building.level + 1 + ongoingUpgrades.length;
|
||||
|
||||
const cost = building.cost(level);
|
||||
|
||||
if (
|
||||
cost.wood > V.resources.wood
|
||||
|| cost.stone > V.resources.stone
|
||||
|| cost.iron > V.resources.iron
|
||||
|| cost.food > V.resources.food
|
||||
) {
|
||||
if (!canPayBuildingCost(V, building)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const cost = getBuildingUpgradeCost(V, building);
|
||||
|
||||
V.resources.wood -= cost.wood;
|
||||
V.resources.stone -= cost.stone;
|
||||
V.resources.iron -= cost.iron;
|
||||
|
21
src/utils.ts
21
src/utils.ts
@ -1,5 +1,5 @@
|
||||
import units from "./data/units";
|
||||
import type { BuildingType, ProductionType } from "./types";
|
||||
import type { BuildingType, CostType, ProductionType } from "./types";
|
||||
import type { VillageState } from "./village";
|
||||
|
||||
|
||||
@ -109,3 +109,22 @@ export function enqueueBuilding(V: VillageState, building: BuildingType) {
|
||||
remainingTime,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
export function getBuildingUpgradeCost(V: VillageState, building: BuildingType): CostType {
|
||||
const ongoingUpgrades = V.queue.filter(q => q.id === building.id);
|
||||
const level = building.level + ongoingUpgrades.length + 1;
|
||||
return building.cost(level);
|
||||
}
|
||||
|
||||
|
||||
export function canPayBuildingCost(V: VillageState, building: BuildingType): boolean {
|
||||
const cost = getBuildingUpgradeCost(V, building);
|
||||
|
||||
return !(
|
||||
cost.wood > V.resources.wood
|
||||
|| cost.stone > V.resources.stone
|
||||
|| cost.iron > V.resources.iron
|
||||
|| cost.food > V.resources.food
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user