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

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Gen Biome

Npm package version Small size Building

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);
});