Skip to content

🧩 Procedural generation of 2D maps with distinct biomes

License

Notifications You must be signed in to change notification settings

neki-dev/gen-biome

Repository files navigation

Gen Biome

Version Small size Build

Procedural generation of 2D maps with distinct biomes

.

Demo

Documentation

.

Install

npm i gen-biome

.

Generator

Create world generator

new WorldGenerator<T>(config: WorldConfig)

[config] - World config

Prop Description Default Range
width Map width
height Map height
frequencyChange Frequency of biomes change 0.3 0.0 - 1.0
borderSmoothness Smoothness of biomes borders 0.5 0.0 - 1.0
heightRedistribution Redistribution of biomes height 1.0 0.5 - 1.5
heightAveraging Averaging of biomes height true
falloff Scale of falloff area 0.0

.

Biomes

Add biome

generator.addBiome(
  config: WorldBiomeConfig, 
  data: T,
): WorldBiome<T>

[config] - Biome config

Prop Description Default
lowerBound Lower biome bound 0.0
upperBound Upper biome bound 1.0

[data] - Biome data that will be stored in the world matrix

Get current biomes

generator.getBiomes(): WorldBiome<T>[]

Clear all biomes

generator.clearBiomes()

.

Generation

Generate world

generator.generate(
  params?: WorldGenerationParams,
): World<T>

[params] - Generation params (optional)

Prop Description Default
seed Generation seed (autogenerated)
seedSize Size of seed array 512
offsetX Generation offset X 0
offsetY Generation offset Y 0

.

World

Get matrix of biomes data

world.getMatrix(): T[][]

Each all positions

world.each(
  callback: (position: WorldPoint, data: T) => void,
): void

[callback] - Callback with position and biome stored data

Get biome data at position

world.getAt(
  position: WorldPoint,
): T | null

[position] - Position at matrix

Replace biome data at position

world.replaceAt(
  position: WorldPoint, 
  data: T,
): void

[position] - Position at matrix

[data] - New biome stored data

Get current world generation seed

world.seed: number[]

Get world width

world.width: number

Get world height

world.height: number

.

Example

const TILE_SIZE = 2;
const BIOMES = [
  { // WATER
    params: { lowerBound: 0.0, upperBound: 0.2 },
    data: { color: 'blue' },
  },
  { // GRASS
    params: { lowerBound: 0.2, upperBound: 0.7 },
    data: { color: 'green' },
  },
  { // MOUNTS
    params: { lowerBound: 0.7 },
    data: { color: 'gray' },
  },
];

const generator = new WorldGenerator({
  width: 100,
  height: 100,
});

for (const { params, data } of BIOMES) {
  generator.addBiome(params, data);
}

const world = generator.generate();

world.each((position, biome) => {
  const tileX = position.x * TILE_SIZE;
  const tileY = position.y * TILE_SIZE;

  ctx.fillStyle = biome.color;
  ctx.fillRect(tileX, tileY, TILE_SIZE, TILE_SIZE);
});