Compare commits
3 Commits
ff7458757a
...
a21585280a
Author | SHA1 | Date | |
---|---|---|---|
a21585280a | |||
620bfb7581 | |||
901d56ffa7 |
BIN
public/img/buildings/barracks.png
Normal file
After Width: | Height: | Size: 213 KiB |
BIN
public/img/buildings/field.png
Normal file
After Width: | Height: | Size: 232 KiB |
BIN
public/img/buildings/granary.png
Normal file
After Width: | Height: | Size: 224 KiB |
BIN
public/img/buildings/mine.png
Normal file
After Width: | Height: | Size: 303 KiB |
BIN
public/img/buildings/palace.png
Normal file
After Width: | Height: | Size: 200 KiB |
BIN
public/img/buildings/pit.png
Normal file
After Width: | Height: | Size: 147 KiB |
BIN
public/img/buildings/townhall.png
Normal file
After Width: | Height: | Size: 258 KiB |
BIN
public/img/buildings/university.png
Normal file
After Width: | Height: | Size: 235 KiB |
BIN
public/img/buildings/warehouse.png
Normal file
After Width: | Height: | Size: 149 KiB |
BIN
public/img/buildings/woodcutter.png
Normal file
After Width: | Height: | Size: 196 KiB |
@ -18,11 +18,14 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div class="building">
|
||||||
<p>{ building.name }</p>
|
<div class="illustration">
|
||||||
<p>
|
<img src="/img/buildings/{ building.type }.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<!-- <p>{ building.name }</p> -->
|
||||||
|
<div class="level">
|
||||||
<button
|
<button
|
||||||
class="level"
|
|
||||||
class:can-upgrade={ canUpgrade }
|
class:can-upgrade={ canUpgrade }
|
||||||
class:is-upgrading={ isUpgrading }
|
class:is-upgrading={ isUpgrading }
|
||||||
class:max-level={ maxLevelReached }
|
class:max-level={ maxLevelReached }
|
||||||
@ -35,11 +38,37 @@
|
|||||||
</span>
|
</span>
|
||||||
{ /if }
|
{ /if }
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
.building {
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.building .illustration,
|
||||||
|
.building .illustration img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.building .content {
|
||||||
|
left: 0;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.level {
|
.level {
|
||||||
|
bottom: -0.4em;
|
||||||
|
left: 50%;
|
||||||
|
position: absolute;
|
||||||
|
translate: -50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.level button {
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
background-color: hsl(208, 100%, 97%);
|
background-color: hsl(208, 100%, 97%);
|
||||||
border: 0.4em solid hsl(0, 0%, 45%);
|
border: 0.4em solid hsl(0, 0%, 45%);
|
||||||
@ -48,21 +77,26 @@
|
|||||||
box-shadow: 0 0 0.2em black;
|
box-shadow: 0 0 0.2em black;
|
||||||
color: hsl(0, 0%, 10%);
|
color: hsl(0, 0%, 10%);
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
|
transition: all 100ms ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.level span {
|
.level button span {
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.level.can-upgrade {
|
.level button.can-upgrade {
|
||||||
border-color: hsl(90, 99%, 36%);
|
border-color: hsl(90, 99%, 36%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.level.is-upgrading {
|
.level button.is-upgrading {
|
||||||
border-color: hsl(56, 99%, 43%);
|
border-color: hsl(56, 99%, 43%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.level.max-level {
|
.level button.max-level {
|
||||||
border-color: hsl(209, 70%, 52%);
|
border-color: hsl(209, 70%, 52%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.level button:hover {
|
||||||
|
scale: 1.1;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -16,8 +16,10 @@
|
|||||||
<style>
|
<style>
|
||||||
.hexagon {
|
.hexagon {
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
background-color: hsl(220, 75%, 75%);
|
border: 0.2em solid;
|
||||||
|
border-color: hsl(220, 75%, 75%);
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 1.2vmin;
|
font-size: 1.2vmin;
|
||||||
height: 12em;
|
height: 12em;
|
||||||
@ -27,11 +29,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.hexagon:hover {
|
.hexagon:hover {
|
||||||
background-color: hsl(60, 75%, 75%);
|
border-color: hsl(60, 75%, 75%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hexagon:active {
|
.hexagon:active {
|
||||||
background-color: hsl(60, 75%, 50%);
|
border-color: hsl(60, 75%, 50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hexagon .content {
|
.hexagon .content {
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import buildings from "./data/buildings";
|
import buildings from "./data/buildings";
|
||||||
|
import { NAMES } from "./data/heroes";
|
||||||
import { Hex } from "./hexgrid";
|
import { Hex } from "./hexgrid";
|
||||||
import type { BuildingSource, BuildingType } from "./types";
|
import type { BuildingSource, BuildingType, HeroType, QuestType, ResourcesType } from "./types";
|
||||||
|
import { getEmptyResources, random, shuffle } from "./utils";
|
||||||
|
|
||||||
|
|
||||||
let uid = 0;
|
let uid = 0;
|
||||||
@ -33,3 +35,37 @@ export function createBuilding(buildingType: string): BuildingType {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function createQuest(level: number): QuestType {
|
||||||
|
const reward = getEmptyResources();
|
||||||
|
const adjustedLevel = level * level + 3;
|
||||||
|
const duration = random(adjustedLevel - 2, adjustedLevel + 2);
|
||||||
|
Object.keys(reward).forEach(r => {
|
||||||
|
const resource = r as keyof ResourcesType;
|
||||||
|
reward[resource] = random(
|
||||||
|
Math.round((duration * 5 - level * 10) * (1 + level / 3)),
|
||||||
|
Math.round((duration * 5 + level * 10) * (1 + level / 3)),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (resource === 'culture') {
|
||||||
|
reward[resource] = Math.round(reward[resource] / 20);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: uid++,
|
||||||
|
duration,
|
||||||
|
reward,
|
||||||
|
level,
|
||||||
|
started: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function createHero(): HeroType {
|
||||||
|
return {
|
||||||
|
id: uid++,
|
||||||
|
name: shuffle(NAMES)[0],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { createHero } from "../create";
|
||||||
import type { BuildingType } from "../types";
|
import type { BuildingType } from "../types";
|
||||||
import { getEmptyResources } from "../utils";
|
import { getEmptyResources } from "../utils";
|
||||||
import type { VillageState } from "../village";
|
import type { VillageState } from "../village";
|
||||||
@ -31,10 +32,10 @@ export default [
|
|||||||
maxLevel: 20,
|
maxLevel: 20,
|
||||||
cost: (level: number) => {
|
cost: (level: number) => {
|
||||||
return {
|
return {
|
||||||
wood: level * 10,
|
wood: getResourceBuildingCost(level, 10),
|
||||||
stone: level * 10,
|
stone: getResourceBuildingCost(level, 15),
|
||||||
iron: level * 10,
|
iron: getResourceBuildingCost(level, 20),
|
||||||
food: 0,
|
food: getResourceBuildingCost(level, 5),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
timeToBuild: getStandardTimeToBuild,
|
timeToBuild: getStandardTimeToBuild,
|
||||||
@ -47,6 +48,7 @@ export default [
|
|||||||
'food': 100,
|
'food': 100,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
constructionTimeReductionPerLevel: 0.025,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -257,4 +259,34 @@ export default [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: 'palace',
|
||||||
|
name: 'Palace',
|
||||||
|
maxLevel: 20,
|
||||||
|
unique: true,
|
||||||
|
cost: (level: number) => {
|
||||||
|
return {
|
||||||
|
wood: getStorageBuildingCost(level, 200),
|
||||||
|
stone: getStorageBuildingCost(level, 240),
|
||||||
|
iron: getStorageBuildingCost(level, 110),
|
||||||
|
food: getStorageBuildingCost(level, 70),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
timeToBuild: getStandardTimeToBuild,
|
||||||
|
behavior: {
|
||||||
|
production: (V: VillageState, self: BuildingType) => {
|
||||||
|
const prod = getEmptyResources();
|
||||||
|
prod.food = self.level * -30;
|
||||||
|
return prod;
|
||||||
|
},
|
||||||
|
triggers: {
|
||||||
|
onLevelUp: (V: VillageState, self: BuildingType) => {
|
||||||
|
if (self.level === 10 || self.level === 20) {
|
||||||
|
// Create a new hero.
|
||||||
|
V.heroes.push(createHero());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
12
src/data/heroes.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
export const NAMES = [
|
||||||
|
'Adosinda',
|
||||||
|
'Garsendis',
|
||||||
|
'Amalfriede',
|
||||||
|
'Seda',
|
||||||
|
'Amalgard',
|
||||||
|
'Samocenus',
|
||||||
|
'Licno',
|
||||||
|
'Vercombogious',
|
||||||
|
'Elusconos',
|
||||||
|
'Excingullus',
|
||||||
|
];
|
@ -4,7 +4,7 @@
|
|||||||
import moves from "../moves";
|
import moves from "../moves";
|
||||||
import showBuildingCreator from "../stores/showBuildingCreator";
|
import showBuildingCreator from "../stores/showBuildingCreator";
|
||||||
import { canPayBuildingCost } from "../utils";
|
import { canPayBuildingCost } from "../utils";
|
||||||
import village from "../village";
|
import village, { type VillageState } from "../village";
|
||||||
import Cost from "./Cost.svelte";
|
import Cost from "./Cost.svelte";
|
||||||
|
|
||||||
function close() {
|
function close() {
|
||||||
@ -22,7 +22,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const constructible = buildings.filter(b => !b.autoBuilt).map(b =>{
|
$: constructible = buildings
|
||||||
|
.filter(b => !b.autoBuilt)
|
||||||
|
.filter(b => !(b.unique && $village.buildings.some(b2 => b2.type === b.type)))
|
||||||
|
.map(b =>{
|
||||||
const building = createBuilding(b.type);
|
const building = createBuilding(b.type);
|
||||||
building.level = 0;
|
building.level = 0;
|
||||||
return building;
|
return building;
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
import { flip } from "svelte/animate";
|
import { flip } from "svelte/animate";
|
||||||
|
|
||||||
|
|
||||||
$: isQuestStarted = $village.quests.some(q => q.started);
|
$: availableHeroes = $village.heroes.filter(h => !$village.quests.some(q => q.hero === h.id));
|
||||||
|
|
||||||
function startQuest(id: number) {
|
function startQuest(id: number, heroId: number) {
|
||||||
moves.startQuest(id);
|
moves.startQuest(id, heroId);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -31,12 +31,15 @@
|
|||||||
{ Math.ceil((quest.remainingTime || 0) / 1000) }
|
{ Math.ceil((quest.remainingTime || 0) / 1000) }
|
||||||
{ :else }
|
{ :else }
|
||||||
{ quest.duration }
|
{ quest.duration }
|
||||||
|
{ #each availableHeroes as hero }
|
||||||
<button
|
<button
|
||||||
on:click={ () => startQuest(quest.id) }
|
on:click={ () => startQuest(quest.id, hero.id) }
|
||||||
disabled={ isQuestStarted }
|
|
||||||
>
|
>
|
||||||
Start quest
|
Send { hero.name }
|
||||||
</button>
|
</button>
|
||||||
|
{ :else }
|
||||||
|
<span>No heroes available</span>
|
||||||
|
{ /each }
|
||||||
{ /if }
|
{ /if }
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
|
{ #each $village.heroes as hero }
|
||||||
|
<p>{ hero.name }</p>
|
||||||
|
{ /each }
|
||||||
{ #each currentUnits as unit }
|
{ #each currentUnits as unit }
|
||||||
<p>{ unit.name }: { getRemainingUnitCount($village, unit.type) } / { unit.count }</p>
|
<p>{ unit.name }: { getRemainingUnitCount($village, unit.type) } / { unit.count }</p>
|
||||||
{ /each }
|
{ /each }
|
||||||
|
14
src/logic.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import type { BuildingSource } from "./types";
|
||||||
|
import type { VillageState } from "./village";
|
||||||
|
|
||||||
|
|
||||||
|
export function getTimeToBuild(V: VillageState, building: BuildingSource, level: number): number {
|
||||||
|
const townhall = V.buildings.find(b => b.type === 'townhall');
|
||||||
|
if (!townhall) {
|
||||||
|
throw new Error("Unable to find the Town hall");
|
||||||
|
}
|
||||||
|
|
||||||
|
const reduction = townhall.level * (townhall.behavior.constructionTimeReductionPerLevel || 0);
|
||||||
|
const baseBuildingTime = building.timeToBuild(level) * 1000;
|
||||||
|
return baseBuildingTime - (baseBuildingTime * reduction);
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
import { createBuilding, getBuildingSource } from "../create";
|
import { createBuilding, getBuildingSource } from "../create";
|
||||||
import type { Hex } from "../hexgrid";
|
import type { Hex } from "../hexgrid";
|
||||||
|
import { getTimeToBuild } from "../logic";
|
||||||
import { DEFAULT_TILE, type VillageState } from "../village";
|
import { DEFAULT_TILE, type VillageState } from "../village";
|
||||||
|
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ export default function build(V: VillageState, buildingType: string, tile: Hex)
|
|||||||
newBuilding.tile = tile;
|
newBuilding.tile = tile;
|
||||||
newBuilding.level = 0;
|
newBuilding.level = 0;
|
||||||
newBuilding.state.upgrade.isUpgrading = true;
|
newBuilding.state.upgrade.isUpgrading = true;
|
||||||
newBuilding.state.upgrade.remainingTime = 1000 * newBuilding.timeToBuild(newBuilding.level + 1);
|
newBuilding.state.upgrade.remainingTime = getTimeToBuild(V, building, 1);
|
||||||
|
|
||||||
V.buildings.push(newBuilding);
|
V.buildings.push(newBuilding);
|
||||||
V.villageTiles[tile.y][tile.x] = newBuilding.id;
|
V.villageTiles[tile.y][tile.x] = newBuilding.id;
|
||||||
|
@ -1,12 +1,23 @@
|
|||||||
import type { VillageState } from "../village";
|
import type { VillageState } from "../village";
|
||||||
|
|
||||||
export default function startQuest(V: VillageState, questId: number) {
|
export default function startQuest(V: VillageState, questId: number, heroId: number) {
|
||||||
const quest = V.quests.find(q => q.id === questId);
|
const quest = V.quests.find(q => q.id === questId);
|
||||||
if (!quest) {
|
if (!quest) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hero = V.heroes.find(h => h.id === heroId);
|
||||||
|
if (!hero) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the hero is not already on a quest.
|
||||||
|
if (V.quests.some(q => q.hero === heroId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
quest.started = true;
|
quest.started = true;
|
||||||
|
quest.hero = heroId;
|
||||||
quest.remainingTime = quest.duration * 1000;
|
quest.remainingTime = quest.duration * 1000;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { getTimeToBuild } from "../logic";
|
||||||
import { canPayBuildingCost, getBuildingUpgradeCost } from "../utils";
|
import { canPayBuildingCost, getBuildingUpgradeCost } from "../utils";
|
||||||
import type { VillageState } from "../village";
|
import type { VillageState } from "../village";
|
||||||
|
|
||||||
@ -28,7 +29,7 @@ export default function upgradeBuilding(V: VillageState, buildingId: number) {
|
|||||||
V.resources.food -= cost.food;
|
V.resources.food -= cost.food;
|
||||||
|
|
||||||
building.state.upgrade.isUpgrading = true;
|
building.state.upgrade.isUpgrading = true;
|
||||||
building.state.upgrade.remainingTime = 1000 * building.timeToBuild(building.level + 1);
|
building.state.upgrade.remainingTime = getTimeToBuild(V, building, building.level + 1);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ export interface BuildingSource {
|
|||||||
name: string;
|
name: string;
|
||||||
type: string;
|
type: string;
|
||||||
autoBuilt?: boolean;
|
autoBuilt?: boolean;
|
||||||
|
unique?: boolean;
|
||||||
maxLevel: number;
|
maxLevel: number;
|
||||||
cost: (level: number) => CostType;
|
cost: (level: number) => CostType;
|
||||||
timeToBuild: (level: number) => number;
|
timeToBuild: (level: number) => number;
|
||||||
@ -34,6 +35,10 @@ export interface BuildingSource {
|
|||||||
type: string;
|
type: string;
|
||||||
recruitmentTime: Function;
|
recruitmentTime: Function;
|
||||||
};
|
};
|
||||||
|
constructionTimeReductionPerLevel?: number;
|
||||||
|
triggers?: {
|
||||||
|
onLevelUp?: Function;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,6 +105,7 @@ export type RegionType = OasisType | BourgadeType;
|
|||||||
|
|
||||||
export interface HeroType {
|
export interface HeroType {
|
||||||
id: number;
|
id: number;
|
||||||
|
name: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -109,5 +115,6 @@ export interface QuestType {
|
|||||||
reward: ResourcesType;
|
reward: ResourcesType;
|
||||||
level: number;
|
level: number;
|
||||||
started: boolean;
|
started: boolean;
|
||||||
|
hero?: number;
|
||||||
remainingTime?: number;
|
remainingTime?: number;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ export default function update(timestamp: number) {
|
|||||||
if (b.state.upgrade.remainingTime <= 0) {
|
if (b.state.upgrade.remainingTime <= 0) {
|
||||||
b.level++;
|
b.level++;
|
||||||
b.state.upgrade.isUpgrading = false;
|
b.state.upgrade.isUpgrading = false;
|
||||||
|
b.behavior.triggers?.onLevelUp?.(V, b);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
import { writable } from "svelte/store";
|
import { writable } from "svelte/store";
|
||||||
|
|
||||||
import { createBuilding } from "./create";
|
import { createBuilding, createHero, createQuest } from "./create";
|
||||||
import worldmap from "./data/worldmap";
|
import worldmap from "./data/worldmap";
|
||||||
import { getTilesAtDistance, Hex } from "./hexgrid";
|
import { getTilesAtDistance, Hex } from "./hexgrid";
|
||||||
import type { BuildingType, QuestType, RegionType, ResourcesType } from "./types";
|
import type { BuildingType, HeroType, QuestType, RegionType, ResourcesType } from "./types";
|
||||||
import { getKeysAsNumbers, shuffle } from "./utils";
|
import { getKeysAsNumbers, shuffle } from "./utils";
|
||||||
import { createQuest } from "./quests";
|
|
||||||
|
|
||||||
|
|
||||||
type Board = {
|
type Board = {
|
||||||
@ -24,6 +23,7 @@ export interface VillageState {
|
|||||||
villageTiles: Board;
|
villageTiles: Board;
|
||||||
outsideTiles: Board;
|
outsideTiles: Board;
|
||||||
worldmap: RegionType[];
|
worldmap: RegionType[];
|
||||||
|
heroes: HeroType[];
|
||||||
quests: QuestType[];
|
quests: QuestType[];
|
||||||
victory: boolean;
|
victory: boolean;
|
||||||
}
|
}
|
||||||
@ -103,6 +103,9 @@ function getInitialState() {
|
|||||||
villageTiles: getInitialVillageBoard(),
|
villageTiles: getInitialVillageBoard(),
|
||||||
outsideTiles: getInitialOutsideBoard(),
|
outsideTiles: getInitialOutsideBoard(),
|
||||||
worldmap: getInitialWorldmap(),
|
worldmap: getInitialWorldmap(),
|
||||||
|
heroes: [
|
||||||
|
createHero(),
|
||||||
|
],
|
||||||
quests: getInitialQuests(),
|
quests: getInitialQuests(),
|
||||||
victory: false,
|
victory: false,
|
||||||
};
|
};
|
||||||
@ -131,7 +134,7 @@ function getInitialState() {
|
|||||||
}
|
}
|
||||||
const newBuilding = createBuilding(type);
|
const newBuilding = createBuilding(type);
|
||||||
newBuilding.tile = new Hex(x, y);
|
newBuilding.tile = new Hex(x, y);
|
||||||
newBuilding.level = 1; //newBuilding.type === 'field' ? 1 : 10;
|
newBuilding.level = 20; //newBuilding.type === 'field' ? 1 : 10;
|
||||||
state.outsideTiles[y][x] = newBuilding.id;
|
state.outsideTiles[y][x] = newBuilding.id;
|
||||||
state.buildings.push(newBuilding);
|
state.buildings.push(newBuilding);
|
||||||
});
|
});
|
||||||
|