summaryrefslogtreecommitdiffstats
path: root/World.gd
blob: da811a8ddaa77f63c9d8f7d6bfa12560c7654cd1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
extends Spatial

export(NodePath) var traveler = null
onready var _traveler = get_node(traveler)
export var acceleration = 10.0

onready var Chunk = preload("res://Chunk.tscn")
onready var chunk_size = $"Chunks/Chunk/Size".shape.radius*2.0
var chunks = {}

func v2_coords(coords:Vector3):
    return Vector2(coords.x,coords.z)

func v3_coords(coords:Vector2):
    return Vector3(coords.x,0.0,coords.y)

func chunk_coords(coords:Vector2):
    return coords.snapped(Vector2(chunk_size,chunk_size))

func gen_chunk(coords:Vector2):
    var chunk = Chunk.instance()
    chunk.transform.origin = v3_coords(coords)
    $"Chunks".add_child(chunk)
    chunks[coords] = chunk

func gen_chunks():
    var gen_center = -v2_coords($"Chunks".transform.origin)
    var gen_radius = $"ChunkRenderDistance/Radius".shape.radius
    var gen_radius_rounded = stepify(gen_radius, chunk_size)
    for x in range(-gen_radius_rounded, gen_radius_rounded+chunk_size, chunk_size):
        for y in range(-gen_radius_rounded, gen_radius_rounded+chunk_size, chunk_size):
            var gen_coords = Vector2(x,y)
            if gen_coords.length() > gen_radius:
                continue
            var coords = chunk_coords(gen_coords + gen_center)
            if !chunks.has(coords):
                gen_chunk(coords)

func _on_ChunkRenderDistance_area_exited(area:Area):
    gen_chunks()
    area.queue_free()
    chunks.erase(v2_coords(area.transform.origin))

func _ready():
    gen_chunks()

func travel(direction:Vector3):
    var heading = _traveler.global_transform.basis
    heading = Basis(Vector3.UP*heading.get_euler().y)
    direction = -direction
    direction = heading * direction
    direction = direction.normalized()
    $"Chunks".add_central_force(direction*acceleration)

func _physics_process(_state):
    var stick = Input.get_axis("ship_down","ship_up")
    if stick != 0.0:
        self.travel(Vector3.FORWARD*stick)