summaryrefslogtreecommitdiffstats
path: root/World.gd
diff options
context:
space:
mode:
Diffstat (limited to 'World.gd')
-rw-r--r--World.gd68
1 files changed, 68 insertions, 0 deletions
diff --git a/World.gd b/World.gd
new file mode 100644
index 0000000..15e283f
--- /dev/null
+++ b/World.gd
@@ -0,0 +1,68 @@
+extends RigidBody
+
+export var acceleration = 10.0
+export var generation_distance = 300.0
+export var generation_subdivision = 5.0
+
+var gen_coords = Vector2.ZERO
+const init_distance = 10
+
+onready var Rock = preload("res://Rock.tscn")
+onready var noise = OpenSimplexNoise.new()
+
+func _on_WorldGenCull_body_exited(body:Node):
+ body.queue_free()
+
+func make_rock(xform:Transform):
+ var rock = Rock.instance()
+ rock.transform = xform
+ self.add_child(rock)
+
+func generate_location(coords:Vector2):
+ if coords.x < -init_distance || coords.x > init_distance || coords.y < -init_distance || coords.y > init_distance:
+ if noise.get_noise_2d(coords.x,coords.y) > 0.6:
+ coords *= generation_subdivision
+ make_rock(Transform(Basis(), Vector3(coords.x,0.0,coords.y)))
+
+func generate_world():
+ var new_coords = -(self.transform.origin / generation_subdivision).floor()
+ new_coords = Vector2(new_coords.x,new_coords.z)
+ var direction = new_coords - gen_coords
+ var gen_max = generation_distance / generation_subdivision
+ var gen_min = -gen_max
+ if gen_coords.x != new_coords.x:
+ for i in range(new_coords.y+gen_min,new_coords.y+gen_max):
+ generate_location(Vector2(new_coords.x+(gen_min if direction.x < 0 else gen_max),i))
+ if gen_coords.y != new_coords.y:
+ for i in range(new_coords.x+gen_min,new_coords.x+gen_max):
+ generate_location(Vector2(i,new_coords.y+(gen_min if direction.y < 0 else gen_max)))
+ gen_coords = new_coords
+
+func _ready():
+ randomize()
+ noise.seed = randi()
+ noise.octaves = 4
+ noise.period = 16
+ noise.persistence = 0.001
+ noise.lacunarity = 2.0
+
+ var gen_max = generation_distance / generation_subdivision
+ var gen_min = -gen_max
+ for i in range(gen_min,gen_max):
+ for j in range(gen_min,gen_max):
+ generate_location(Vector2(i,j))
+
+func travel(direction:Vector3):
+ var boat = $"/root/Main/ShipRigidBody"
+ var boat_direction = boat.global_transform.basis
+ boat_direction = Basis(Vector3.UP*boat_direction.get_euler().y)
+ direction = -direction
+ direction = boat_direction * direction
+ direction = direction.normalized()
+ self.add_central_force(direction*acceleration)
+
+func _integrate_forces(_state):
+ generate_world()
+ var stick = Input.get_axis("ship_down","ship_up")
+ if stick != 0.0:
+ travel(Vector3.FORWARD*stick)