Populate the world map with more oasis and give them a maximum number of ressources that can be pillaged.
This commit is contained in:
parent
04b7ab7339
commit
0caa40bdca
@ -2,21 +2,81 @@ export default [
|
|||||||
{
|
{
|
||||||
type: 'oasis',
|
type: 'oasis',
|
||||||
resource: 'food',
|
resource: 'food',
|
||||||
distance: 1,
|
distance: [1, 2],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'oasis',
|
type: 'oasis',
|
||||||
resource: 'wood',
|
resource: 'wood',
|
||||||
distance: 1,
|
distance: [1, 2],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'oasis',
|
type: 'oasis',
|
||||||
resource: 'stone',
|
resource: 'stone',
|
||||||
distance: 1,
|
distance: [1, 2],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'oasis',
|
type: 'oasis',
|
||||||
resource: 'iron',
|
resource: 'iron',
|
||||||
distance: 1,
|
distance: [1, 2],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'food',
|
||||||
|
distance: [2, 3],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'wood',
|
||||||
|
distance: [2, 3],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'stone',
|
||||||
|
distance: [2, 3],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'iron',
|
||||||
|
distance: [2, 3],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'food',
|
||||||
|
distance: [3, 4],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'wood',
|
||||||
|
distance: [3, 4],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'stone',
|
||||||
|
distance: [3, 4],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'iron',
|
||||||
|
distance: [3, 4],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'food',
|
||||||
|
distance: [4, 5],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'wood',
|
||||||
|
distance: [4, 5],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'stone',
|
||||||
|
distance: [4, 5],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'oasis',
|
||||||
|
resource: 'iron',
|
||||||
|
distance: [4, 5],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -37,6 +37,10 @@ function resolvePillageOasis(V: VillageState, region: OasisType) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const unit = getUnitSource('soldier');
|
const unit = getUnitSource('soldier');
|
||||||
|
const maxResources = region.distance * region.distance * 100;
|
||||||
|
|
||||||
V.resources[region.resource] += mission.unitCount * unit.behavior.caryingCapacity;
|
V.resources[region.resource] += Math.min(
|
||||||
|
mission.unitCount * unit.behavior.caryingCapacity,
|
||||||
|
maxResources
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
import type { Hex } from "./hexgrid";
|
import type { Hex } from "./hexgrid";
|
||||||
|
|
||||||
|
|
||||||
|
export interface Point {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export type GameTab = 'village' | 'resources' | 'world';
|
export type GameTab = 'village' | 'resources' | 'world';
|
||||||
|
|
||||||
|
|
||||||
@ -92,6 +98,7 @@ export enum WORLDMAP_TYPES {
|
|||||||
interface BaseRegionType {
|
interface BaseRegionType {
|
||||||
id: number;
|
id: number;
|
||||||
type: WORLDMAP_TYPES;
|
type: WORLDMAP_TYPES;
|
||||||
|
distance: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
18
src/utils.ts
18
src/utils.ts
@ -1,6 +1,6 @@
|
|||||||
import { WORLD_MAP_HEIGHT, WORLD_MAP_WIDTH } from "./constants";
|
import { WORLD_MAP_HEIGHT, WORLD_MAP_WIDTH } from "./constants";
|
||||||
import units from "./data/units";
|
import units from "./data/units";
|
||||||
import { WORLDMAP_TYPES, type BuildingType, type CostType, type OasisType, type ProductionType, type ResourcesType } from "./types";
|
import { WORLDMAP_TYPES, type BuildingType, type CostType, type OasisType, type Point, type ProductionType, type ResourcesType } from "./types";
|
||||||
import type { VillageState } from "./village";
|
import type { VillageState } from "./village";
|
||||||
|
|
||||||
|
|
||||||
@ -200,3 +200,19 @@ export function getAdjacentWorldmapCells(cellIndex: number) {
|
|||||||
|
|
||||||
return cells.filter(c => c >= 0 && c < WORLD_MAP_WIDTH * WORLD_MAP_HEIGHT);
|
return cells.filter(c => c >= 0 && c < WORLD_MAP_WIDTH * WORLD_MAP_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function distanceBetweenCells(a: Point, b: Point) {
|
||||||
|
return Math.sqrt(
|
||||||
|
Math.pow(b.x - a.x, 2)
|
||||||
|
+ Math.pow(b.y - a.y, 2)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function indexToPoint(index: number): Point {
|
||||||
|
return {
|
||||||
|
x: index % WORLD_MAP_WIDTH,
|
||||||
|
y: index / WORLD_MAP_WIDTH,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -4,7 +4,7 @@ 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 { WORLDMAP_TYPES, type BuildingType, type CostType, type HeroType, type QuestType, type RegionType, type ResourcesType } from "./types";
|
import { WORLDMAP_TYPES, type BuildingType, type CostType, type HeroType, type QuestType, type RegionType, type ResourcesType } from "./types";
|
||||||
import { getAdjacentWorldmapCells, getKeysAsNumbers, shuffle } from "./utils";
|
import { distanceBetweenCells, getAdjacentWorldmapCells, getKeysAsNumbers, indexToPoint, shuffle } from "./utils";
|
||||||
import { WORLD_MAP_HEIGHT, WORLD_MAP_WIDTH } from "./constants";
|
import { WORLD_MAP_HEIGHT, WORLD_MAP_WIDTH } from "./constants";
|
||||||
|
|
||||||
|
|
||||||
@ -69,23 +69,32 @@ function getInitialOutsideBoard() {
|
|||||||
|
|
||||||
|
|
||||||
function getInitialWorldmap(): RegionType[] {
|
function getInitialWorldmap(): RegionType[] {
|
||||||
const board: RegionType[] = []
|
const board: RegionType[] = [];
|
||||||
|
const centerIndex = Math.floor((WORLD_MAP_WIDTH * WORLD_MAP_HEIGHT) / 2);
|
||||||
|
const centerPoint = indexToPoint(centerIndex);
|
||||||
|
|
||||||
for (let i = 0; i < WORLD_MAP_WIDTH * WORLD_MAP_HEIGHT; i++) {
|
for (let i = 0; i < WORLD_MAP_WIDTH * WORLD_MAP_HEIGHT; i++) {
|
||||||
board[i] = {
|
board[i] = {
|
||||||
id: i,
|
id: i,
|
||||||
type: WORLDMAP_TYPES.EMPTY,
|
type: WORLDMAP_TYPES.EMPTY,
|
||||||
|
distance: distanceBetweenCells(indexToPoint(i), centerPoint),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const centerIndex = Math.floor((WORLD_MAP_WIDTH * WORLD_MAP_HEIGHT) / 2);
|
|
||||||
board[centerIndex].type = WORLDMAP_TYPES.BOURGADE;
|
board[centerIndex].type = WORLDMAP_TYPES.BOURGADE;
|
||||||
|
|
||||||
const adj = shuffle(getAdjacentWorldmapCells(centerIndex));
|
const adj = shuffle(getAdjacentWorldmapCells(centerIndex));
|
||||||
worldmap.forEach(c => {
|
worldmap.forEach(region => {
|
||||||
const cellIndex = adj.pop() || 0;
|
const candidates = board.filter(c =>
|
||||||
board[cellIndex] = {
|
c.type !== WORLDMAP_TYPES.EMPTY
|
||||||
|
&& c.distance >= region.distance[0]
|
||||||
|
&& c.distance < region.distance[1]
|
||||||
|
);
|
||||||
|
const cell = shuffle(candidates)[0];
|
||||||
|
board[cell.id] = {
|
||||||
type: WORLDMAP_TYPES.OASIS,
|
type: WORLDMAP_TYPES.OASIS,
|
||||||
id: cellIndex,
|
id: cell.id,
|
||||||
resource: c.resource as keyof CostType,
|
resource: region.resource as keyof CostType,
|
||||||
|
distance: cell.distance,
|
||||||
state: {},
|
state: {},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user