2D multiplayer platformer using Godot Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

240 lines
4.9 KiB

class_name GeneratorSimple
extends RefCounted
const NAME := "simple"
var noise := FastNoiseLite.new()
var array := PackedByteArray()
var bias_air := 0.0 # Above this, always air
var bias_solid := 64.0 # Below this, always solid
func _init() -> void:
noise.seed = randi()
noise.noise_type = FastNoiseLite.TYPE_SIMPLEX
noise.fractal_gain = 0.75
noise.fractal_lacunarity = 2.5
noise.fractal_octaves = 3
array.resize((Chunk.SIZE + 4) * (Chunk.SIZE + 4))
func generate(world: World, chunk: Chunk) -> void:
const THRESHOLD := 0.5
var region := chunk.region.extend(2)
var i := 0
for pos in region:
var bias := (pos.y - bias_air) / (bias_solid - bias_air)
array[i] = int((noise.get_noise_2dv(Vector2(pos)) + bias) >= THRESHOLD)
i += 1
var matter: Matter.Layer = chunk.get_or_create_layer(Matter)
var shapes: Shape.Layer = chunk.get_or_create_layer(Shape)
for pos in BlockRegion.LOCAL_CHUNK:
var shape: Shape
var a := array
const W := (Chunk.SIZE + 4)
i = (pos.x + 2) + (pos.y + 2) * W
var values: Array[int] = [
a[i-2-W*2], a[i-1-W*2], a[i-W*2], a[i+1-W*2], a[i+2-W*2],
a[i-2-W ], a[i-1-W ], a[i-W ], a[i+1-W ], a[i+2-W ],
a[i-2 ], a[i-1 ], a[i ], a[i+1 ], a[i+2 ],
a[i-2+W ], a[i-1+W ], a[i+W ], a[i+1+W ], a[i+2+W ],
a[i-2+W*2], a[i-1+W*2], a[i+W*2], a[i+1+W*2], a[i+2+W*2],
]
# TODO: Implement custom pattern matching that can handle rotation and mirroring.
# var x := -1
# var pattern: Array[int] = [
# x, x, x, x, x,
# x, x, 0, 0, 0,
# x, 0, 0, 1, 1,
# x, 1, 1, 1, x,
# x, x, x, x, x,
# ]
match values:
# HALF_SLOPE (non-mirrored)
[
_, _, _, _, _,
_, _, 0, 0, 0,
_, 0, 0, 1, 1,
_, 1, 1, 1, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[0]
[
_, 0, 1, _, _,
_, 0, 1, 1, _,
_, 0, 0, 1, _,
_, _, 0, 1, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[1]
[
_, _, _, _, _,
_, 1, 1, 1, _,
1, 1, 0, 0, _,
0, 0, 0, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[2]
[
_, _, _, _, _,
_, 1, 0, _, _,
_, 1, 0, 0, _,
_, 1, 1, 0, _,
_, _, 1, 0, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[3]
[
_, _, _, _, _,
_, 0, 0, 0, _,
0, 0, 1, 1, _,
1, 1, 1, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[0]
[
_, _, _, _, _,
_, 0, 1, _, _,
_, 0, 1, 1, _,
_, 0, 0, 1, _,
_, _, 0, 1, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[1]
[
_, _, _, _, _,
_, _, 1, 1, 1,
_, 1, 1, 0, 0,
_, 0, 0, 0, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[2]
[
_, 1, 0, _, _,
_, 1, 0, 0, _,
_, 1, 1, 0, _,
_, _, 1, 0, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[3]
# HALF_SLOPE (mirrored)
[
_, _, _, _, _,
0, 0, 0, _, _,
1, 1, 0, 0, _,
_, 1, 1, 1, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[4]
[
_, _, _, _, _,
_, _, 0, 1, _,
_, 0, 0, 1, _,
_, 0, 1, 1, _,
_, 0, 1, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[5]
[
_, _, _, _, _,
_, 1, 1, 1, _,
_, 0, 0, 1, 1,
_, _, 0, 0, 0,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[6]
[
_, _, 1, 0, _,
_, 1, 1, 0, _,
_, 1, 0, 0, _,
_, 1, 0, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE.variants[7]
[
_, _, _, _, _,
_, 0, 0, 0, _,
_, 1, 1, 0, 0,
_, _, 1, 1, 1,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[4]
[
_, _, 0, 1, _,
_, 0, 0, 1, _,
_, 0, 1, 1, _,
_, 0, 1, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[5]
[
_, _, _, _, _,
1, 1, 1, _, _,
0, 0, 1, 1, _,
_, 0, 0, 0, _,
_, _, _, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[6]
[
_, _, _, _, _,
_, _, 1, 0, _,
_, 1, 1, 0, _,
_, 1, 0, 0, _,
_, 1, 0, _, _,
]:
shape = Shape.Base.HALF_SLOPE_BIG.variants[7]
# SLOPE
[
_, _, _, _, _,
_, _, 0, _, _,
_, 0, 0, 1, _,
_, _, 1, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.SLOPE.variants[0]
[
_, _, _, _, _,
_, _, 1, _, _,
_, 0, 0, 1, _,
_, _, 0, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.SLOPE.variants[1]
[
_, _, _, _, _,
_, _, 1, _, _,
_, 1, 0, 0, _,
_, _, 0, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.SLOPE.variants[2]
[
_, _, _, _, _,
_, _, 0, _, _,
_, 1, 0, 0, _,
_, _, 1, _, _,
_, _, _, _, _,
]:
shape = Shape.Base.SLOPE.variants[3]
# FULL
[
_, _, _, _, _,
_, _, _, _, _,
_, _, 1, _, _,
_, _, _, _, _,
_, _, _, _, _,
]:
shape = Shape.FULL
if shape:
matter.set_at(pos, Matter.PLASTIC)
shapes.set_at(pos, shape)