♻️ resource-based passability: FOREST/ROCK walkable without a resource (Issue #22)
Previously FOREST and ROCK tile types were always impassable, making 30 % of forest floor and 50 % of rocky terrain permanently blocked even with no object on them. - Remove FOREST + ROCK from IMPASSABLE in types.ts - Add RESOURCE_TERRAIN set (FOREST, ROCK) for tiles that need resource check - WorldSystem: add resourceTiles Set<number> as O(1) spatial index - initResourceTiles() builds index from state on create() - addResourceTile() / removeResourceTile() keep it in sync at runtime - isPassable() now: impassable tiles → false | RESOURCE_TERRAIN → check index | else → true - GameScene: call addResourceTile() when SPAWN_RESOURCE fires (seedling matures) - VillagerSystem: call removeResourceTile() after chop / mine completes Side effect: trees fully enclosed by other trees are now reachable once an adjacent tree is cleared; the hasAdjacentPassable() guard in pickJob still correctly skips resources with zero passable neighbours. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
11
src/types.ts
11
src/types.ts
@@ -12,14 +12,21 @@ export enum TileType {
|
||||
WATERED_SOIL = 10,
|
||||
}
|
||||
|
||||
/** Tiles that are always impassable regardless of what is on them. */
|
||||
export const IMPASSABLE = new Set<number>([
|
||||
TileType.DEEP_WATER,
|
||||
TileType.SHALLOW_WATER,
|
||||
TileType.FOREST,
|
||||
TileType.ROCK,
|
||||
TileType.WALL,
|
||||
])
|
||||
|
||||
/**
|
||||
* Terrain tiles whose passability depends on whether a resource
|
||||
* (tree or rock) is currently placed on them.
|
||||
* An empty FOREST tile is walkable forest floor; a ROCK tile without a
|
||||
* rock resource is just rocky ground.
|
||||
*/
|
||||
export const RESOURCE_TERRAIN = new Set<number>([TileType.FOREST, TileType.ROCK])
|
||||
|
||||
/** Tiles on which tree seedlings may be planted. */
|
||||
export const PLANTABLE_TILES = new Set<TileType>([TileType.GRASS, TileType.DARK_GRASS])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user