diff --git a/project.godot b/project.godot index 473336a..c21e553 100644 --- a/project.godot +++ b/project.godot @@ -63,6 +63,11 @@ _global_script_classes=[ { "class": "TrapTiles", "language": "GDScript", "path": "res://assets/Tiles/TrapTiles.gd" +}, { +"base": "Area2D", +"class": "WarpZone", +"language": "GDScript", +"path": "res://src/Scripts/WarpZone.gd" } ] _global_script_class_icons={ "CameraGame": "", @@ -75,7 +80,8 @@ _global_script_class_icons={ "Level": "", "Player": "", "Spike": "", -"TrapTiles": "" +"TrapTiles": "", +"WarpZone": "" } [application] diff --git a/src/GameWorld/GameWorld.gd b/src/GameWorld/GameWorld.gd index 1d04c5a..cdf7bf0 100644 --- a/src/GameWorld/GameWorld.gd +++ b/src/GameWorld/GameWorld.gd @@ -26,14 +26,14 @@ var _levels = [ ] -export var _current_zone_level: = Vector2(0,1) +export var _current_zone_level: = Vector2(0,0) onready var _player:Player = (load("res://src/Actors/Player.tscn")).instance() func _ready() -> void: - _player.connect("died", self, "_on_player_died") + var _void = _player.connect("died", self, "_on_player_died") _change_level(_current_zone_level) yield(self, "level_ready") @@ -49,7 +49,7 @@ func _change_level( newLevel:Vector2 = Vector2.ZERO, oldLevel:Vector2 = Vector2( $Level.remove_child(_levels[oldLevel.x][oldLevel.y]) if !_levels[newLevel.x][newLevel.y].is_class("Node2D"): _levels[newLevel.x][newLevel.y] = _levels[newLevel.x][newLevel.y].instance() - + _levels[newLevel.x][newLevel.y].level_coords = newLevel _levels[newLevel.x][newLevel.y].set_player(_player, _get_player_entering(oldLevel, newLevel)) _levels[newLevel.x][newLevel.y].connect("level_exited", self, "_on_level_exited") $Level.add_child(_levels[newLevel.x][newLevel.y]) @@ -73,18 +73,15 @@ func _on_player_died(): yield(Stage, "fade_finished") GameState.set_state(prev_state) -func _on_level_exited(next_level:bool = true, zone:int = -1): - print("current level: %s, next_level: %s zone: %s" % [_current_zone_level, next_level, zone]) +func _on_level_exited(is_exit:bool, to_coords:Vector2, position:Vector2): + print("current level: %s, is_exit: %s to_coords: %s position %s" % [_current_zone_level, is_exit, to_coords, position]) var next = Vector2.ZERO - if zone != -1: - next = Vector2( - zone, - 0 if next_level else len(_levels[zone]) -1 - ) + if to_coords.x == -1: # The zone is to a specific plase + next = to_coords else: next = Vector2( _current_zone_level.x, - _current_zone_level.y + 1 if next_level else _current_zone_level.y - 1 + _current_zone_level.y + 1 if is_exit else _current_zone_level.y - 1 ) if next.y < 0: next.x -= 1 diff --git a/src/GameWorld/Levels/FirstLevels/TMP.tscn b/src/GameWorld/Levels/FirstLevels/TMP.tscn index 46f82a7..1139653 100644 --- a/src/GameWorld/Levels/FirstLevels/TMP.tscn +++ b/src/GameWorld/Levels/FirstLevels/TMP.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://src/GameWorld/Levels/FirstLevels/TMP.gd" type="Script" id=1] [ext_resource path="res://assets/Tiles/SolidsTileMap.tscn" type="PackedScene" id=2] @@ -6,13 +6,12 @@ [ext_resource path="res://src/Scripts/SpawnPoint.tscn" type="PackedScene" id=4] [ext_resource path="res://src/Scripts/WarpZone.tscn" type="PackedScene" id=5] -[sub_resource type="RectangleShape2D" id=1] -extents = Vector2( 10, 18 ) - [node name="TMP" type="Node2D"] script = ExtResource( 1 ) level_entry_point = Vector2( 16, 240 ) level_exit_point = Vector2( 675, 240 ) +exit_area_2d_path = NodePath("ExitLevelArea") +enter_area_2d_path = NodePath("ExitLevelNextArea") camer_limits = { "bottom": 240, "left": 0, @@ -24,16 +23,12 @@ camer_limits = { tile_data = PoolIntArray( -131072, 0, 0, -131071, 0, 131076, -131070, 0, 131076, -131069, 0, 131076, -131068, 0, 131076, -131067, 0, 1, -131066, 0, 1, -131065, 0, 1, -131064, 0, 1, -131063, 0, 1, -131062, 0, 1, -131061, 0, 131076, -131060, 0, 1, -131059, 0, 131076, -131058, 0, 1, -131057, 0, 131076, -131056, 0, 131076, -131055, 0, 1, -131054, 0, 1, -131053, 0, 131076, -131052, 0, 1, -131051, 0, 1, -131050, 0, 1, -131049, 0, 131076, -131048, 0, 131076, -131047, 0, 1, -131046, 0, 131076, -131045, 0, 1, -131044, 0, 131076, -131043, 0, 1, -131042, 0, 2, -65536, 0, 65536, -65535, 0, 3, -65534, 0, 131073, -65533, 0, 4, -65532, 0, 4, -65531, 0, 131073, -65530, 0, 131073, -65529, 0, 4, -65528, 0, 4, -65527, 0, 131073, -65526, 0, 4, -65525, 0, 4, -65524, 0, 4, -65523, 0, 131073, -65522, 0, 4, -65521, 0, 131073, -65520, 0, 4, -65519, 0, 4, -65518, 0, 131073, -65517, 0, 131073, -65516, 0, 131073, -65515, 0, 4, -65514, 0, 4, -65513, 0, 131073, -65512, 0, 4, -65511, 0, 4, -65510, 0, 131073, -65509, 0, 131073, -65508, 0, 131073, -65507, 0, 5, -65506, 0, 65539, 65535, 0, 0, 0, 0, 131077, 1, 0, 65538, 29, 0, 65536, 30, 0, 65539, 131071, 0, 65536, 65536, 0, 65537, 65537, 0, 65539, 65565, 0, 65541, 65566, 0, 65538, 196607, 0, 65536, 131072, 0, 65537, 131073, 0, 65538, 131087, 0, 1, 131101, 0, 65541, 131102, 0, 65539, 262143, 0, 65536, 196608, 0, 65537, 196609, 0, 65538, 196622, 0, 1, 196623, 0, 1, 196637, 0, 65536, 196638, 0, 131075, 196639, 0, 1, 196640, 0, 131076, 196641, 0, 1, 196642, 0, 1, 196643, 0, 1, 196644, 0, 1, 196645, 0, 1, 196646, 0, 131076, 196647, 0, 1, 196648, 0, 131076, 196649, 0, 1, 196650, 0, 2, 327679, 0, 65541, 262144, 0, 65537, 262145, 0, 65538, 262157, 0, 1, 262159, 0, 1, 262173, 0, 65536, 262174, 0, 3, 262175, 0, 4, 262176, 0, 131073, 262177, 0, 4, 262178, 0, 131073, 262179, 0, 5, 262180, 0, 65537, 262181, 0, 65537, 262182, 0, 65537, 262183, 0, 65537, 262184, 0, 65537, 262185, 0, 65537, 262186, 0, 65538, 393215, 0, 65541, 327680, 0, 65537, 327681, 0, 65539, 327692, 0, 1, 327695, 0, 1, 327709, 0, 65536, 327710, 0, 65538, 327715, 0, 65541, 327716, 0, 65537, 327717, 0, 65537, 327718, 0, 65537, 327719, 0, 65537, 327720, 0, 65537, 327721, 0, 65537, 327722, 0, 65539, 458751, 0, 65541, 393216, 0, 65537, 393217, 0, 65538, 393228, 0, 1, 393230, 0, 1, 393245, 0, 65536, 393246, 0, 65538, 393251, 0, 65541, 393252, 0, 65537, 393253, 0, 65537, 393254, 0, 65537, 393255, 0, 65537, 393256, 0, 65537, 393257, 0, 65537, 393258, 0, 65538, 524287, 0, 65541, 458752, 0, 65537, 458753, 0, 65538, 458766, 0, 1, 458781, 0, 65541, 458782, 0, 65538, 458787, 0, 65541, 458788, 0, 65537, 458789, 0, 65537, 458790, 0, 65537, 458791, 0, 65537, 458792, 0, 65537, 458793, 0, 65537, 458794, 0, 65539, 589823, 0, 65536, 524288, 0, 65537, 524289, 0, 65538, 524302, 0, 1, 524317, 0, 65536, 524318, 0, 65538, 524323, 0, 65541, 524324, 0, 65537, 524325, 0, 65537, 524326, 0, 65537, 524327, 0, 65537, 524328, 0, 65537, 524329, 0, 65537, 524330, 0, 65538, 655359, 0, 65541, 589824, 0, 65537, 589825, 0, 65539, 589838, 0, 1, 589853, 0, 65541, 589854, 0, 65539, 589859, 0, 65541, 589860, 0, 65537, 589861, 0, 65537, 589862, 0, 65537, 589863, 0, 65537, 589864, 0, 65537, 589865, 0, 65537, 589866, 0, 65538, 720895, 0, 65541, 655360, 0, 65537, 655361, 0, 65539, 655372, 0, 1, 655373, 0, 1, 655374, 0, 1, 655375, 0, 1, 655376, 0, 1, 655389, 0, 65541, 655390, 0, 65538, 655395, 0, 131072, 655396, 0, 131073, 655397, 0, 131073, 655398, 0, 131073, 655399, 0, 131073, 655400, 0, 131073, 655401, 0, 5, 655402, 0, 65538, 786431, 0, 65541, 720896, 0, 65537, 720897, 0, 65539, 720925, 0, 65536, 720926, 0, 65538, 720937, 0, 65541, 720938, 0, 65539, 851967, 0, 131072, 786432, 0, 131073, 786433, 0, 131074, 786461, 0, 131072, 786462, 0, 131074, 786473, 0, 131072, 786474, 0, 131074, 852004, 0, 0, 852005, 0, 2, 917540, 0, 65541, 917541, 0, 65538, 1048573, 0, 0, 1048574, 0, 1, 1048575, 0, 131076, 983040, 0, 131076, 983041, 0, 1, 983042, 0, 131076, 983043, 0, 131076, 983044, 0, 1, 983045, 0, 131076, 983046, 0, 131076, 983047, 0, 1, 983048, 0, 131076, 983049, 0, 1, 983050, 0, 131076, 983051, 0, 1, 983052, 0, 131076, 983053, 0, 1, 983054, 0, 1, 983055, 0, 131076, 983056, 0, 131076, 983057, 0, 1, 983058, 0, 1, 983059, 0, 131076, 983060, 0, 131076, 983061, 0, 131076, 983062, 0, 1, 983063, 0, 1, 983064, 0, 1, 983065, 0, 131076, 983066, 0, 1, 983067, 0, 131076, 983068, 0, 131076, 983069, 0, 131076, 983070, 0, 131076, 983071, 0, 1, 983072, 0, 1, 983073, 0, 131076, 983074, 0, 131076, 983075, 0, 131076, 983076, 0, 131077, 983077, 0, 131075, 983078, 0, 131076, 983079, 0, 1, 983080, 0, 131076, 983081, 0, 1, 983082, 0, 2, 1114109, 0, 131072, 1114110, 0, 4, 1114111, 0, 131073, 1048576, 0, 4, 1048577, 0, 4, 1048578, 0, 4, 1048579, 0, 4, 1048580, 0, 131073, 1048581, 0, 131073, 1048582, 0, 131073, 1048583, 0, 131073, 1048584, 0, 131073, 1048585, 0, 131073, 1048586, 0, 131073, 1048587, 0, 131073, 1048588, 0, 4, 1048589, 0, 131073, 1048590, 0, 131073, 1048591, 0, 131073, 1048592, 0, 4, 1048593, 0, 131073, 1048594, 0, 131073, 1048595, 0, 131073, 1048596, 0, 131073, 1048597, 0, 4, 1048598, 0, 131073, 1048599, 0, 4, 1048600, 0, 4, 1048601, 0, 4, 1048602, 0, 131073, 1048603, 0, 4, 1048604, 0, 4, 1048605, 0, 4, 1048606, 0, 4, 1048607, 0, 131073, 1048608, 0, 4, 1048609, 0, 4, 1048610, 0, 131073, 1048611, 0, 4, 1048612, 0, 131073, 1048613, 0, 131073, 1048614, 0, 131073, 1048615, 0, 131073, 1048616, 0, 131073, 1048617, 0, 4, 1048618, 0, 131074 ) [node name="ExitLevelArea" parent="." instance=ExtResource( 5 )] +position = Vector2( -15, 240 ) +is_exit = false -[node name="ExitLevelAreaNext" type="Area2D" parent="."] -position = Vector2( 694, 218 ) -collision_layer = 0 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="ExitLevelAreaNext"] -position = Vector2( 0, 6 ) -shape = SubResource( 1 ) +[node name="ExitLevelNextArea" parent="." instance=ExtResource( 5 )] +position = Vector2( 680, 240 ) [node name="SpawnPoint" parent="." instance=ExtResource( 4 )] position = Vector2( 239, 240 ) node = ExtResource( 3 ) -[connection signal="body_entered" from="ExitLevelAreaNext" to="." method="_on_ExitLevelAreaNext_body_entered"] diff --git a/src/GameWorld/Levels/Level.gd b/src/GameWorld/Levels/Level.gd index 8d45b95..50cc6bb 100644 --- a/src/GameWorld/Levels/Level.gd +++ b/src/GameWorld/Levels/Level.gd @@ -14,11 +14,9 @@ export var game_state = GameState.States.GAME export var level_entry_point := Vector2.ZERO export var level_exit_point := Vector2.ZERO -export var exit_area_2d_path : NodePath -export var enter_area_2d_path : NodePath +var level_coords :=Vector2.ZERO +export(Vector2) var prev_level = null -var _exit_area_2d = null; -var _enter_area_2d = null; export var camer_limits := { "top": 0, @@ -28,24 +26,23 @@ export var camer_limits := { } func _ready(): - self._exit_area_2d = get_node(exit_area_2d_path) - self._enter_area_2d = get_node(enter_area_2d_path) pass -func _set_active(activated:bool = true): - is_active_level = activated; +func _set_active(activated:bool, prev_level_:Vector2): + is_active_level = activated + self.prev_level = prev_level_ if activated: - if _exit_area_2d != null: _exit_area_2d.connect("player_entered", self, "_on_ExitLevelAreaNext_player_entered") - if _enter_area_2d != null: _enter_area_2d.connect("player_entered", self, "_on_ExitLevelArea_player_entered") + for warp in _get_all_warps(): + warp.connect("player_entered", self, "_on_WarpZone_player_entered") emit_signal("level_ready") -func set_player(player:Player, is_entering:bool): +func set_player(player:Player, is_entering:bool, spesific_position=null): _player = player _camera = _player.get_camera() _set_camera_limits() - _set_player_position(is_entering) + _set_player_position(is_entering, spesific_position) add_child(player) func remove_player(): @@ -59,26 +56,25 @@ func _set_camera_limits(): _camera.limit_bottom = camer_limits.bottom _camera.limit_left = camer_limits.left -func _set_player_position(is_entering:bool): - _player.position = level_entry_point if is_entering else level_exit_point +func _set_player_position(is_entering:bool, spesific_position=null): + if spesific_position != null: + _player.position = spesific_position + else: + _player.position = level_entry_point if is_entering else level_exit_point _player.face_player(is_entering) _player.respawn_position = _player.position + -func set_exit_area_enabled(enabled:bool=true): - if _exit_area_2d != null: _exit_area_2d.set_block_signals(enabled) - -func set_enter_area_enabled(enabled:bool=true): - if _enter_area_2d != null: _enter_area_2d.set_block_signals(enabled) - -func _on_ExitLevelArea_player_entered(is_exit, zone) -> void: - print("_on_ExitLevelArea_player_entered") +func _on_WarpZone_player_entered(is_exit, to_coords, position) -> void: + print("_on_WarpZone_player_entered is_exit=%s to_coord=%s position=%s" % [is_exit, to_coords, position]) self.is_active_level = false; - emit_signal("level_exited", false) + emit_signal("level_exited", is_exit, to_coords) pass # Replace with function body. -func _on_ExitLevelAreaNext_player_entered(is_exit, zone) -> void: - print("_on_ExitLevelAreaNext_player_entered") - self.is_active_level = false; - emit_signal("level_exited", true) - pass # Replace with function body. +func _get_all_warps(): + var warps := [] + for node in get_children(): + if node.is_in_group("WarpZones"): + warps.push_back(node) + return warps \ No newline at end of file diff --git a/src/Scripts/WarpZone.gd b/src/Scripts/WarpZone.gd index cb3b1d1..c992184 100644 --- a/src/Scripts/WarpZone.gd +++ b/src/Scripts/WarpZone.gd @@ -4,9 +4,14 @@ class_name WarpZone signal player_entered -export(int,-1, 3) var zone = -1; +var NON_SPECIFIED_LEVEL :=Vector2(-1, -1) + +export var to_level_coord:Vector2 =NON_SPECIFIED_LEVEL export var is_exit:bool = true +func _ready() -> void: + add_to_group("WarpZones") + func _on_body_entered(body:Node): if body.name == "Player" and get_parent().is_active_level: - emit_signal("player_entered", is_exit, zone) + emit_signal("player_entered", is_exit, to_level_coord, position)