mirror of
https://github.com/Relintai/broken_seals.git
synced 2025-02-05 02:45:55 +01:00
Now the generated terrain and dungeons are actually seeded.
This commit is contained in:
parent
715e4f209f
commit
fcf4e520e9
@ -61,20 +61,28 @@ func _generate_terra_chunk(chunk, spawn_mobs):
|
|||||||
# entrance_position = d.next_level_teleporter_position_data_space
|
# entrance_position = d.next_level_teleporter_position_data_space
|
||||||
# entrance_position *= voxel_scale
|
# entrance_position *= voxel_scale
|
||||||
|
|
||||||
|
var cx : int = chunk.get_position_x()
|
||||||
|
var cz : int = chunk.get_position_z()
|
||||||
|
|
||||||
|
var chunk_seed : int = 123 + (cx * 231) + (cz * 123)
|
||||||
|
|
||||||
|
var rng : RandomNumberGenerator = RandomNumberGenerator.new()
|
||||||
|
rng.seed = chunk_seed
|
||||||
|
|
||||||
#terrarin_gen.generate_simple_terrarin(chunk, spawn_mobs)
|
#terrarin_gen.generate_simple_terrarin(chunk, spawn_mobs)
|
||||||
gen_terra_chunk(chunk)
|
gen_terra_chunk(chunk, rng)
|
||||||
|
|
||||||
if chunk.position_x == 0 && chunk.position_z == 0:
|
if chunk.position_x == 0 && chunk.position_z == 0:
|
||||||
#test
|
#test
|
||||||
spawn_dungeon(chunk)
|
spawn_dungeon(chunk, chunk_seed)
|
||||||
else:
|
else:
|
||||||
if randi() % 10 == 0:
|
if rng.randi() % 10 == 0:
|
||||||
spawn_dungeon(chunk)
|
spawn_dungeon(chunk, chunk_seed)
|
||||||
|
|
||||||
for i in range(get_building_count()):
|
for i in range(get_building_count()):
|
||||||
get_building(i).generate_terra_chunk(chunk, spawn_mobs)
|
get_building(i).generate_terra_chunk(chunk, spawn_mobs)
|
||||||
|
|
||||||
if not Engine.editor_hint and spawn_mobs and randi() % 4 == 0:
|
if not Engine.editor_hint and spawn_mobs and rng.randi() % 4 == 0:
|
||||||
var level : int = 1
|
var level : int = 1
|
||||||
|
|
||||||
if chunk.get_voxel_world().has_method("get_mob_level"):
|
if chunk.get_voxel_world().has_method("get_mob_level"):
|
||||||
@ -85,7 +93,7 @@ func _generate_terra_chunk(chunk, spawn_mobs):
|
|||||||
100, \
|
100, \
|
||||||
chunk.position_z * chunk.size_z * chunk.voxel_scale + chunk.size_z / 2))
|
chunk.position_z * chunk.size_z * chunk.voxel_scale + chunk.size_z / 2))
|
||||||
|
|
||||||
func gen_terra_chunk(chunk: TerraChunk) -> void:
|
func gen_terra_chunk(chunk: TerraChunk, rng : RandomNumberGenerator) -> void:
|
||||||
chunk.channel_ensure_allocated(TerraChunkDefault.DEFAULT_CHANNEL_TYPE, 1)
|
chunk.channel_ensure_allocated(TerraChunkDefault.DEFAULT_CHANNEL_TYPE, 1)
|
||||||
chunk.channel_ensure_allocated(TerraChunkDefault.DEFAULT_CHANNEL_ISOLEVEL, 0)
|
chunk.channel_ensure_allocated(TerraChunkDefault.DEFAULT_CHANNEL_ISOLEVEL, 0)
|
||||||
|
|
||||||
@ -117,13 +125,13 @@ func gen_terra_chunk(chunk: TerraChunk) -> void:
|
|||||||
if chunk.position_x == 0 && chunk.position_z == 0:
|
if chunk.position_x == 0 && chunk.position_z == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if randf() > 0.992:
|
if rng.randf() > 0.992:
|
||||||
var tr : Transform = Transform()
|
var tr : Transform = Transform()
|
||||||
|
|
||||||
tr = tr.rotated(Vector3(0, 1, 0), randf() * PI)
|
tr = tr.rotated(Vector3(0, 1, 0), rng.randf() * PI)
|
||||||
tr = tr.rotated(Vector3(1, 0, 0), randf() * 0.2 - 0.1)
|
tr = tr.rotated(Vector3(1, 0, 0), rng.randf() * 0.2 - 0.1)
|
||||||
tr = tr.rotated(Vector3(0, 0, 1), randf() * 0.2 - 0.1)
|
tr = tr.rotated(Vector3(0, 0, 1), rng.randf() * 0.2 - 0.1)
|
||||||
tr = tr.scaled(Vector3(0.9 + randf() * 0.2, 0.9 + randf() * 0.2, 0.9 + randf() * 0.2))
|
tr = tr.scaled(Vector3(0.9 + rng.randf() * 0.2, 0.9 + rng.randf() * 0.2, 0.9 + rng.randf() * 0.2))
|
||||||
tr.origin = Vector3((x + chunk.position_x * chunk.size_x), ((val - 2) / 255.0) * chunk.world_height, (z + chunk.position_z * chunk.size_z))
|
tr.origin = Vector3((x + chunk.position_x * chunk.size_x), ((val - 2) / 255.0) * chunk.world_height, (z + chunk.position_z * chunk.size_z))
|
||||||
|
|
||||||
chunk.voxel_world.prop_add(tr, prop_tree)
|
chunk.voxel_world.prop_add(tr, prop_tree)
|
||||||
@ -135,7 +143,7 @@ func gen_terra_chunk(chunk: TerraChunk) -> void:
|
|||||||
# chunk.voxel_world.prop_add(tr, prop_tree2)
|
# chunk.voxel_world.prop_add(tr, prop_tree2)
|
||||||
|
|
||||||
|
|
||||||
func spawn_dungeon(chunk: TerraChunk) -> void:
|
func spawn_dungeon(chunk: TerraChunk, dungeon_seed : int) -> void:
|
||||||
var x : float = chunk.position_x * chunk.voxel_scale * chunk.size_x
|
var x : float = chunk.position_x * chunk.voxel_scale * chunk.size_x
|
||||||
var z : float = chunk.position_z * chunk.voxel_scale * chunk.size_z
|
var z : float = chunk.position_z * chunk.voxel_scale * chunk.size_z
|
||||||
|
|
||||||
@ -153,5 +161,6 @@ func spawn_dungeon(chunk: TerraChunk) -> void:
|
|||||||
|
|
||||||
dt.min_level = level - 1
|
dt.min_level = level - 1
|
||||||
dt.max_level = level + 1
|
dt.max_level = level + 1
|
||||||
|
dt.dungeon_seed = dungeon_seed
|
||||||
dt.transform = Transform(Basis().scaled(Vector3(chunk.voxel_scale, chunk.voxel_scale, chunk.voxel_scale)), Vector3(x, vwh, z))
|
dt.transform = Transform(Basis().scaled(Vector3(chunk.voxel_scale, chunk.voxel_scale, chunk.voxel_scale)), Vector3(x, vwh, z))
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ export(PackedScene) var dungeon_back_teleporter : PackedScene
|
|||||||
|
|
||||||
var min_level : int = 1
|
var min_level : int = 1
|
||||||
var max_level : int = 2
|
var max_level : int = 2
|
||||||
|
var dungeon_seed : int = 0
|
||||||
|
|
||||||
var owner_chunk : TerraChunk = null
|
var owner_chunk : TerraChunk = null
|
||||||
var _dungeon : Spatial = null
|
var _dungeon : Spatial = null
|
||||||
@ -90,6 +91,7 @@ func teleport():
|
|||||||
_dungeon.transform = t
|
_dungeon.transform = t
|
||||||
_dungeon.min_level = min_level
|
_dungeon.min_level = min_level
|
||||||
_dungeon.max_level = max_level
|
_dungeon.max_level = max_level
|
||||||
|
_dungeon.dungeon_seed = dungeon_seed
|
||||||
get_parent().add_child(_dungeon)
|
get_parent().add_child(_dungeon)
|
||||||
|
|
||||||
teleport_to = t.xform(Vector3())
|
teleport_to = t.xform(Vector3())
|
||||||
|
@ -11,6 +11,7 @@ export(bool) var spawn_mobs : bool = true
|
|||||||
export(int) var min_level : int = 1
|
export(int) var min_level : int = 1
|
||||||
export(int) var max_level : int = 2
|
export(int) var max_level : int = 2
|
||||||
|
|
||||||
|
export(int) var dungeon_seed : int = 0
|
||||||
|
|
||||||
#todo calc aabbs and store in PropData during prop conversion
|
#todo calc aabbs and store in PropData during prop conversion
|
||||||
var room_hulls : Dictionary
|
var room_hulls : Dictionary
|
||||||
@ -21,6 +22,8 @@ var current_aabbs : Array
|
|||||||
|
|
||||||
var debug : bool = true
|
var debug : bool = true
|
||||||
|
|
||||||
|
var _rng : RandomNumberGenerator = RandomNumberGenerator.new()
|
||||||
|
|
||||||
func _enter_tree() -> void:
|
func _enter_tree() -> void:
|
||||||
if not Engine.editor_hint && generate_on_ready:
|
if not Engine.editor_hint && generate_on_ready:
|
||||||
call_deferred("generate")
|
call_deferred("generate")
|
||||||
@ -122,6 +125,8 @@ func clear_room_data() -> void:
|
|||||||
current_aabbs.clear()
|
current_aabbs.clear()
|
||||||
|
|
||||||
func generate() -> void:
|
func generate() -> void:
|
||||||
|
_rng.seed = dungeon_seed
|
||||||
|
|
||||||
clear()
|
clear()
|
||||||
set_up_room_data()
|
set_up_room_data()
|
||||||
|
|
||||||
@ -168,7 +173,7 @@ func spawn_room(room_lworld_transform : Transform, room : PropData, level : int
|
|||||||
current_aabbs.push_back(ctfab)
|
current_aabbs.push_back(ctfab)
|
||||||
|
|
||||||
if spawn_mobs && level > 0 && ctfab.size() > 0:
|
if spawn_mobs && level > 0 && ctfab.size() > 0:
|
||||||
if randi() % 3 == 0:
|
if _rng.randi() % 3 == 0:
|
||||||
var v2 : Vector2 = ctfab[0]
|
var v2 : Vector2 = ctfab[0]
|
||||||
|
|
||||||
for i in range(1, ctfab.size()):
|
for i in range(1, ctfab.size()):
|
||||||
@ -178,7 +183,7 @@ func spawn_room(room_lworld_transform : Transform, room : PropData, level : int
|
|||||||
var scale : Vector3 = gt.basis.get_scale()
|
var scale : Vector3 = gt.basis.get_scale()
|
||||||
v2 *= Vector2(scale.x, scale.z)
|
v2 *= Vector2(scale.x, scale.z)
|
||||||
|
|
||||||
ESS.entity_spawner.spawn_mob(0, min_level + (randi() % (max_level - min_level)), Vector3(v2.x, gt.origin.y, v2.y))
|
ESS.entity_spawner.spawn_mob(0, min_level + (_rng.randi() % (max_level - min_level)), Vector3(v2.x, gt.origin.y, v2.y))
|
||||||
|
|
||||||
#if Engine.editor_hint and debug:
|
#if Engine.editor_hint and debug:
|
||||||
# sr.owner = get_tree().edited_scene_root
|
# sr.owner = get_tree().edited_scene_root
|
||||||
@ -195,9 +200,7 @@ func spawn_room(room_lworld_transform : Transform, room : PropData, level : int
|
|||||||
if d.size() == 0:
|
if d.size() == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
randomize()
|
var new_room_data = d[_rng.randi() % d.size()]
|
||||||
|
|
||||||
var new_room_data = d[randi() % d.size()]
|
|
||||||
|
|
||||||
#[ croom, cportal, cj ]
|
#[ croom, cportal, cj ]
|
||||||
var new_room : PropData = new_room_data[0]
|
var new_room : PropData = new_room_data[0]
|
||||||
|
@ -349,6 +349,8 @@ func load_character(file_name : String) -> void:
|
|||||||
|
|
||||||
set_player(_player.get_body())
|
set_player(_player.get_body())
|
||||||
|
|
||||||
|
#_player.sseed = 2
|
||||||
|
|
||||||
Server.sset_seed(_player.sseed)
|
Server.sset_seed(_player.sseed)
|
||||||
if level_generator != null:
|
if level_generator != null:
|
||||||
level_generator.setup(self, _player.sseed, true, library)
|
level_generator.setup(self, _player.sseed, true, library)
|
||||||
|
Loading…
Reference in New Issue
Block a user