mirror of
https://github.com/Relintai/broken_seals_roguelike.git
synced 2024-11-21 13:17:17 +01:00
Implement support for multiple levels.
This commit is contained in:
parent
df0584a9e1
commit
7843e75599
@ -58,10 +58,15 @@ var tile_size : int = 32
|
||||
|
||||
var nameplate : Node
|
||||
|
||||
var init : bool = false
|
||||
|
||||
func _enter_tree() -> void:
|
||||
world = get_node(world_path) as Node2D
|
||||
tile_size = get_node("/root/Main").get_tile_size()
|
||||
|
||||
if init:
|
||||
return
|
||||
|
||||
camera = get_node_or_null("Camera") as Camera2D
|
||||
|
||||
set_process_input(false)
|
||||
@ -78,6 +83,8 @@ func _enter_tree() -> void:
|
||||
on_c_controlled_changed(entity.c_is_controlled)
|
||||
|
||||
transform = entity.get_transform_2d(true)
|
||||
|
||||
init = true
|
||||
|
||||
func set_visibility(val : bool) -> void:
|
||||
if val:
|
||||
@ -282,9 +289,7 @@ func target(position : Vector2) -> bool:
|
||||
return false
|
||||
|
||||
func cmouseover(position : Vector2):
|
||||
#https://github.com/godotengine/godot/issues/32222
|
||||
position = position - get_viewport_transform().origin
|
||||
position *= camera.zoom
|
||||
position = world.make_canvas_position_local(position)
|
||||
|
||||
var pos : Vector2 = world.pixel_to_tile(position.x, position.y)
|
||||
var enemy : Entity = world.get_enemy_at_tile(pos.x, pos.y)
|
||||
|
@ -217,7 +217,7 @@ func spawn_player(class_id : int, position : Vector3, name : String, node_name
|
||||
return createinfo.created_entity
|
||||
|
||||
|
||||
func spawn_mob(class_id : int, level : int, position : Vector3) -> Entity:
|
||||
func spawn_mob(class_id : int, level : int, position : Vector3, parent_path : String = "") -> Entity:
|
||||
var createinfo : EntityCreateInfo = EntityCreateInfo.new()
|
||||
|
||||
var cls : EntityData = ESS.get_resource_db().get_entity_data(class_id)
|
||||
@ -229,6 +229,7 @@ func spawn_mob(class_id : int, level : int, position : Vector3) -> Entity:
|
||||
createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_AI
|
||||
createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_AI
|
||||
createinfo.transform2d.origin = Vector2(position.x, position.y)
|
||||
createinfo.parent_path = parent_path
|
||||
|
||||
ESS.request_entity_spawn(createinfo)
|
||||
|
||||
|
@ -27,11 +27,10 @@ export(bool) var editor_generate : bool = false setget set_editor_generate, get_
|
||||
export(bool) var show_loading_screen : bool = true
|
||||
export(bool) var generate_on_ready : bool = false
|
||||
|
||||
var initial_generation : bool = false
|
||||
var generated : bool = false
|
||||
|
||||
var _editor_generate : bool
|
||||
|
||||
var _player_file_name : String
|
||||
var _player : Entity
|
||||
|
||||
enum Tile { Floor, Wall, Door, Ladder, Stone }
|
||||
@ -47,17 +46,30 @@ var map : Array = []
|
||||
var rooms : Array = []
|
||||
var enemies : Array = []
|
||||
var nav_graph : AStar2D
|
||||
var entrance_position : Transform2D = Transform2D()
|
||||
|
||||
onready var tile_map : TileMap = $Terrarin
|
||||
onready var visibility_map : TileMap = $VisibilityMap
|
||||
|
||||
func _ready():
|
||||
tile_size = get_node("/root/Main").get_tile_size()
|
||||
connect("visibility_changed", self, "on_visibility_changed")
|
||||
pass # Replace with function body.
|
||||
|
||||
func load_character(file_name: String) -> void:
|
||||
_player_file_name = file_name
|
||||
func place_player(player: Entity) -> void:
|
||||
_player = player
|
||||
|
||||
if (_player == null):
|
||||
return
|
||||
|
||||
if !generated:
|
||||
build()
|
||||
|
||||
_player.get_body().transform = entrance_position
|
||||
|
||||
call_deferred("update_visibility")
|
||||
|
||||
func build():
|
||||
randomize()
|
||||
build_level()
|
||||
|
||||
@ -65,8 +77,9 @@ func load_character(file_name: String) -> void:
|
||||
var start_room = rooms.front()
|
||||
var player_x = start_room.position.x + 1 + randi() % int(start_room.size.x - 2)
|
||||
var player_y = start_room.position.y + 1 + randi() % int(start_room.size.y - 2)
|
||||
var pos : Vector3 = Vector3(player_x * tile_size + tile_size / 2, player_y * tile_size + tile_size / 2, 0)
|
||||
_player = ESS.entity_spawner.load_player(_player_file_name, pos, 1) as Entity
|
||||
|
||||
entrance_position.origin = Vector2(player_x * tile_size + tile_size / 2, player_y * tile_size + tile_size / 2)
|
||||
# _player = ESS.entity_spawner.load_player(_player_file_name, pos, 1) as Entity
|
||||
#Server.sset_seed(_player.sseed)
|
||||
|
||||
#Place enemies
|
||||
@ -85,14 +98,13 @@ func load_character(file_name: String) -> void:
|
||||
|
||||
if !blocked:
|
||||
var t = tile_to_pixel_center(x, y)
|
||||
var enemy = ESS.entity_spawner.spawn_mob(1, 1, Vector3(t.x, t.y, 0))
|
||||
var enemy = ESS.entity_spawner.spawn_mob(1, 1, Vector3(t.x, t.y, 0), get_path())
|
||||
|
||||
enemies.append(enemy)
|
||||
|
||||
|
||||
tile_map.update_dirty_quadrants()
|
||||
|
||||
call_deferred("update_visibility")
|
||||
generated = true
|
||||
|
||||
func player_moved():
|
||||
_player.update(1)
|
||||
@ -103,6 +115,12 @@ func player_moved():
|
||||
call_deferred("update_visibility")
|
||||
|
||||
func update_visibility():
|
||||
if !visible:
|
||||
return
|
||||
|
||||
if tile_map.collision_layer == 2:
|
||||
return
|
||||
|
||||
if _player == null:
|
||||
return
|
||||
|
||||
@ -112,7 +130,7 @@ func update_visibility():
|
||||
return
|
||||
|
||||
var tp : Vector2 = body.get_tile_position()
|
||||
|
||||
|
||||
var space_state : Physics2DDirectSpaceState = get_world_2d().direct_space_state
|
||||
|
||||
for x in range(level_size.x):
|
||||
@ -122,7 +140,7 @@ func update_visibility():
|
||||
var y_dir = 1 if y < tp.y else -1
|
||||
var test_point = tile_to_pixel_center(x, y) + Vector2(x_dir, y_dir) * tile_size / 2
|
||||
|
||||
var occlusion = space_state.intersect_ray(body.transform.origin, test_point)
|
||||
var occlusion = space_state.intersect_ray(body.transform.origin, test_point, [], 1)
|
||||
|
||||
if !occlusion || (occlusion.position - test_point).length() < 1:
|
||||
visibility_map.set_cell(x, y, -1)
|
||||
@ -133,11 +151,15 @@ func update_visibility():
|
||||
if !b.visible:
|
||||
var pos : Vector2 = b.transform.origin
|
||||
|
||||
var occlusion = space_state.intersect_ray(body.transform.origin, pos)
|
||||
var occlusion = space_state.intersect_ray(body.transform.origin, pos, [], 1)
|
||||
|
||||
if !occlusion:
|
||||
b.set_visibility(true)
|
||||
e.sets_target(_player)
|
||||
|
||||
|
||||
# tile_map.update_dirty_quadrants()
|
||||
# visibility_map.update_dirty_quadrants()
|
||||
|
||||
func clear_path(tile):
|
||||
var new_point = nav_graph.get_available_point_id()
|
||||
@ -425,12 +447,6 @@ func set_tile(x, y, type):
|
||||
|
||||
if type == Tile.Floor:
|
||||
clear_path(Vector2(x, y))
|
||||
|
||||
func save() -> void:
|
||||
if _player == null or _player_file_name == "":
|
||||
return
|
||||
|
||||
ESS.entity_spawner.save_player(_player, _player_file_name)
|
||||
|
||||
func _generation_finished():
|
||||
|
||||
@ -456,3 +472,20 @@ func set_editor_generate(value : bool) -> void:
|
||||
pass
|
||||
|
||||
_editor_generate = value
|
||||
|
||||
func on_visibility_changed():
|
||||
if visible:
|
||||
if tile_map.collision_layer != 1:
|
||||
tile_map.collision_layer = 1
|
||||
else:
|
||||
if tile_map.collision_layer != 2:
|
||||
tile_map.collision_layer = 2
|
||||
|
||||
for e in enemies:
|
||||
var b = e.get_body()
|
||||
|
||||
if b.visible:
|
||||
b.set_visibility(false)
|
||||
e.sets_target(null)
|
||||
|
||||
|
||||
|
@ -132,8 +132,8 @@ func switch_scene(scene : int) -> void:
|
||||
current_scene = gs
|
||||
|
||||
elif scene == StartSceneTypes.WORLD:
|
||||
# var gs : Node = world_scene.instance()
|
||||
var gs : Node = get_world().instance()
|
||||
var gs : Node = world_scene.instance()
|
||||
# var gs : Node = get_world().instance()
|
||||
add_child(gs)
|
||||
gs.owner = self
|
||||
|
||||
@ -163,7 +163,7 @@ class ModulePathSorter:
|
||||
return false
|
||||
|
||||
func get_world():
|
||||
return worlds[curent_style]
|
||||
return world_scene
|
||||
|
||||
func get_world_scale():
|
||||
return world_scales[curent_style]
|
||||
|
76
game/scenes/World.gd
Normal file
76
game/scenes/World.gd
Normal file
@ -0,0 +1,76 @@
|
||||
extends Node2D
|
||||
|
||||
var _player_file_name : String
|
||||
var _player : Entity
|
||||
|
||||
export(Array, NodePath) var level_paths : Array
|
||||
var levels : Array
|
||||
var current_level : int = -1
|
||||
|
||||
func _ready():
|
||||
for lp in level_paths:
|
||||
var l = get_node(lp)
|
||||
|
||||
if l.visible:
|
||||
l.hide()
|
||||
|
||||
levels.append(l)
|
||||
|
||||
func _unhandled_key_input(event):
|
||||
if event.scancode == KEY_M and event.pressed:
|
||||
var l : int = current_level + 1
|
||||
|
||||
if l >= levels.size():
|
||||
l = 0
|
||||
|
||||
switch_to_level(l)
|
||||
|
||||
func switch_to_level(level_index : int):
|
||||
_player.get_body().hide()
|
||||
|
||||
if current_level != -1:
|
||||
levels[current_level].hide()
|
||||
|
||||
current_level = level_index
|
||||
|
||||
levels[current_level].show()
|
||||
|
||||
if _player.get_parent():
|
||||
_player.get_parent().place_player(null)
|
||||
_player.get_parent().remove_child(_player)
|
||||
|
||||
levels[current_level].add_child(_player)
|
||||
levels[current_level].place_player(_player)
|
||||
# _player.get_body().world = levels[current_level]
|
||||
_player.get_body().show()
|
||||
|
||||
func load_character(file_name: String) -> void:
|
||||
_player_file_name = file_name
|
||||
|
||||
_player = ESS.entity_spawner.load_player(_player_file_name, Vector3.ZERO, 1) as Entity
|
||||
_player.get_body().hide()
|
||||
#Server.sset_seed(_player.sseed)
|
||||
|
||||
call_deferred("switch_to_level", 0)
|
||||
|
||||
func save() -> void:
|
||||
if _player == null or _player_file_name == "":
|
||||
return
|
||||
|
||||
ESS.entity_spawner.save_player(_player, _player_file_name)
|
||||
|
||||
#so body won't have to check things every time
|
||||
func pixel_to_tile(x, y):
|
||||
return Vector2.ZERO
|
||||
|
||||
func tile_to_pixel_center(x, y):
|
||||
return Vector2.ZERO
|
||||
|
||||
func is_position_walkable(x : int, y : int) -> bool:
|
||||
return false
|
||||
|
||||
func get_enemy_at_tile(x : int, y : int) -> Entity:
|
||||
return null
|
||||
|
||||
func place_player(player: Entity) -> void:
|
||||
return
|
File diff suppressed because one or more lines are too long
@ -1,63 +0,0 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://scripts/settings/DirectionalLightSettings.gd" type="Script" id=3]
|
||||
|
||||
[sub_resource type="ProceduralSky" id=1]
|
||||
sky_top_color = Color( 0.435294, 0.423529, 0.313726, 1 )
|
||||
sky_horizon_color = Color( 0.309804, 0.317647, 0.219608, 1 )
|
||||
sky_curve = 0.263535
|
||||
sky_energy = 0.3
|
||||
ground_bottom_color = Color( 0.196078, 0.152941, 0.152941, 1 )
|
||||
ground_horizon_color = Color( 0.223529, 0.192157, 0.164706, 1 )
|
||||
ground_curve = 0.101965
|
||||
ground_energy = 0.4
|
||||
sun_color = Color( 0.356863, 0.313726, 0.219608, 1 )
|
||||
sun_latitude = 39.71
|
||||
sun_longitude = -8.09
|
||||
sun_angle_min = 0.0
|
||||
sun_angle_max = 23.15
|
||||
sun_energy = 9.29
|
||||
texture_size = 0
|
||||
|
||||
[sub_resource type="Environment" id=2]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 1 )
|
||||
ambient_light_color = Color( 0.870588, 0.870588, 0.870588, 1 )
|
||||
ambient_light_energy = 1.67
|
||||
ambient_light_sky_contribution = 0.09
|
||||
fog_enabled = true
|
||||
fog_color = Color( 0.184314, 0.207843, 0.156863, 1 )
|
||||
fog_sun_color = Color( 0.196078, 0.266667, 0.309804, 1 )
|
||||
fog_sun_amount = 0.53
|
||||
fog_depth_begin = 155.9
|
||||
fog_depth_end = 379.9
|
||||
fog_depth_curve = 1.18921
|
||||
tonemap_mode = 2
|
||||
tonemap_exposure = 0.83
|
||||
auto_exposure_max_luma = 7.33
|
||||
ss_reflections_enabled = true
|
||||
ssao_enabled = true
|
||||
glow_levels/3 = false
|
||||
glow_intensity = 1.6
|
||||
glow_strength = 1.1
|
||||
glow_bloom = 0.1
|
||||
glow_hdr_luminance_cap = 1.0
|
||||
|
||||
[node name="World" type="Spatial" groups=[
|
||||
"save",
|
||||
]]
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource( 2 )
|
||||
__meta__ = {
|
||||
"_editor_description_": ""
|
||||
}
|
||||
|
||||
[node name="DirectionalLight" type="DirectionalLight" parent="."]
|
||||
transform = Transform( -0.797163, 0.45442, 0.397535, 0.124932, -0.520028, 0.844963, 0.590697, 0.723238, 0.357776, 0, 18.834, 0 )
|
||||
layers = 3
|
||||
light_color = Color( 1, 0.878431, 0.878431, 1 )
|
||||
light_energy = 0.87
|
||||
light_specular = 0.65
|
||||
shadow_bias = 0.07
|
||||
script = ExtResource( 3 )
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user