From 95bdff8c37b5267fe8f59205e632b49f75e113f9 Mon Sep 17 00:00:00 2001 From: Hamcha Date: Fri, 10 Jul 2020 10:45:57 +0200 Subject: [PATCH] Add dynamic map loading and spawnpoints --- Actors/Meta/POI/Spawnpoints/Player.gd | 12 ++++++++ Actors/Objects/Lightbulb/Lightbulb.gd | 2 +- Actors/Player/Player.gd | 2 +- Actors/Player/Player.tscn | 1 + Classes/POI.gd | 9 ++++++ Scenes/Game.gd | 4 +-- Scenes/Game.tscn | 18 ++---------- Scenes/Map.gd | 12 ++++++++ Scenes/Maps/odyssey.tscn | 41 ++++++--------------------- Scenes/Maps/runtime.tscn | 18 ++++++------ Scenes/World.gd | 27 +++++++++++++++--- project.godot | 12 ++++++++ 12 files changed, 92 insertions(+), 66 deletions(-) create mode 100644 Actors/Meta/POI/Spawnpoints/Player.gd mode change 100755 => 100644 Actors/Player/Player.tscn create mode 100644 Classes/POI.gd diff --git a/Actors/Meta/POI/Spawnpoints/Player.gd b/Actors/Meta/POI/Spawnpoints/Player.gd new file mode 100644 index 0000000..f997847 --- /dev/null +++ b/Actors/Meta/POI/Spawnpoints/Player.gd @@ -0,0 +1,12 @@ +tool + +extends Node2D + +class_name SpawnpointPlayer + +var poitype = POIData.POIType.SpawnPoint +var poiclass = POIData.POIClass.Player + +func _draw(): + if Engine.editor_hint: + draw_arc(Vector2.ZERO, 10, 0, PI*2, 16, Color.red) diff --git a/Actors/Objects/Lightbulb/Lightbulb.gd b/Actors/Objects/Lightbulb/Lightbulb.gd index 7914a4f..50cf098 100644 --- a/Actors/Objects/Lightbulb/Lightbulb.gd +++ b/Actors/Objects/Lightbulb/Lightbulb.gd @@ -55,7 +55,7 @@ func _input_event(_viewport, event, _shape_idx): if activationRange.in_range(): set_lit(!lit) -func _power_status_changed(powered: bool) -> void: +func _power_status_changed(_powered: bool) -> void: update_light() refresh_sprite() diff --git a/Actors/Player/Player.gd b/Actors/Player/Player.gd index 732b6c4..bd881b7 100644 --- a/Actors/Player/Player.gd +++ b/Actors/Player/Player.gd @@ -11,7 +11,7 @@ var grip = 1.0 var stamina = MAX_STAMINA var speed_boost = 0 -onready var world = $"/root/scene/world" as GameWorld +onready var world = $"/root/scene/world" export var is_controlled = false setget set_is_controlled diff --git a/Actors/Player/Player.tscn b/Actors/Player/Player.tscn old mode 100755 new mode 100644 index d046691..7c865aa --- a/Actors/Player/Player.tscn +++ b/Actors/Player/Player.tscn @@ -8,6 +8,7 @@ radius = 10.4436 height = 5.44386 [node name="Player" type="KinematicBody2D"] +z_index = 10 script = ExtResource( 2 ) [node name="Camera" type="Camera2D" parent="."] diff --git a/Classes/POI.gd b/Classes/POI.gd new file mode 100644 index 0000000..a696f29 --- /dev/null +++ b/Classes/POI.gd @@ -0,0 +1,9 @@ +class_name POIData + +enum POIType { + SpawnPoint +} + +enum POIClass { + Player +} diff --git a/Scenes/Game.gd b/Scenes/Game.gd index bb6fddf..e4fa257 100644 --- a/Scenes/Game.gd +++ b/Scenes/Game.gd @@ -3,14 +3,12 @@ extends Node class_name GameInstance onready var ui = $CanvasLayer/ui -onready var world = $world as GameWorld +onready var world = $world onready var systems = $systems func _ready(): randomize() - ui.connect("command", world, "process_command") - $world/runtime.queue_free() func process_command(cmd: UICommand): match cmd.cmd_type: diff --git a/Scenes/Game.tscn b/Scenes/Game.tscn index 3441d07..8db167d 100644 --- a/Scenes/Game.tscn +++ b/Scenes/Game.tscn @@ -1,11 +1,8 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=4 format=2] -[ext_resource path="res://Scenes/Maps/odyssey.tscn" type="PackedScene" id=1] -[ext_resource path="res://Actors/Player/Player.tscn" type="PackedScene" id=2] [ext_resource path="res://Scenes/UI.tscn" type="PackedScene" id=3] [ext_resource path="res://Scenes/World.gd" type="Script" id=4] [ext_resource path="res://Scenes/Game.gd" type="Script" id=5] -[ext_resource path="res://Scenes/Maps/runtime.tscn" type="PackedScene" id=7] [node name="scene" type="Node"] script = ExtResource( 5 ) @@ -13,18 +10,7 @@ script = ExtResource( 5 ) [node name="world" type="Node2D" parent="."] scale = Vector2( 2, 2 ) script = ExtResource( 4 ) -player_path = NodePath("player") -map_path = NodePath("odyssey") - -[node name="runtime" parent="world" instance=ExtResource( 7 )] -visible = false - -[node name="odyssey" parent="world" instance=ExtResource( 1 )] - -[node name="player" parent="world" instance=ExtResource( 2 )] -position = Vector2( 206.017, 250.966 ) -z_index = 10 -is_controlled = true +mapToLoad = 1 [node name="CanvasLayer" type="CanvasLayer" parent="."] diff --git a/Scenes/Map.gd b/Scenes/Map.gd index 6cc5c30..998ae47 100644 --- a/Scenes/Map.gd +++ b/Scenes/Map.gd @@ -17,6 +17,8 @@ const ProbeElectricity = preload("res://Actors/Systems/Electricity/ElectricProbe onready var tilemaps = [ $base, $cables, $floor, $walls ] +onready var pois = $pois + export var unlit = false setget set_unlit onready var darkness = $darkness @@ -73,3 +75,13 @@ func make_electric_probes(tilemap: TileMap, tile_name: String): var probe = ProbeElectricity.instance() probe.position = coord tilemap.add_child(probe) + +func get_pois(type_filter, class_filter) -> Array: + var filtered = [] + for child in $pois.get_children(): + if type_filter != null and child.poitype != type_filter: + continue + if class_filter != null and child.poiclass != class_filter: + continue + filtered.append(child) + return filtered diff --git a/Scenes/Maps/odyssey.tscn b/Scenes/Maps/odyssey.tscn index 7c618a9..2a2d001 100644 --- a/Scenes/Maps/odyssey.tscn +++ b/Scenes/Maps/odyssey.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=2] +[gd_scene load_steps=17 format=2] [ext_resource path="res://Graphics/tgstation/walls.tres" type="TileSet" id=1] [ext_resource path="res://Graphics/tgstation/1x1.tres" type="TileSet" id=2] @@ -14,6 +14,7 @@ [ext_resource path="res://Actors/Objects/PowerStorage/PowerStorage.tscn" type="PackedScene" id=12] [ext_resource path="res://Graphics/tgstation/cables.tres" type="TileSet" id=13] [ext_resource path="res://Actors/Objects/ElectricSocket/ElectricSocket.tscn" type="PackedScene" id=14] +[ext_resource path="res://Actors/Meta/POI/Spawnpoints/Player.gd" type="Script" id=15] [sub_resource type="CanvasItemMaterial" id=1] light_mode = 1 @@ -455,115 +456,91 @@ __meta__ = { [node name="Lighttube" parent="lights" instance=ExtResource( 8 )] position = Vector2( 80, 144 ) -direction = 3 -lit = true [node name="Lighttube2" parent="lights" instance=ExtResource( 8 )] position = Vector2( 336, 144 ) -direction = 3 -lit = true [node name="Lighttube3" parent="lights" instance=ExtResource( 8 )] position = Vector2( 336, 368 ) direction = 2 -lit = true [node name="Lighttube4" parent="lights" instance=ExtResource( 8 )] position = Vector2( 80, 368 ) direction = 2 -lit = true [node name="Lighttube7" parent="lights" instance=ExtResource( 8 )] position = Vector2( -112, 144 ) -direction = 3 -lit = true [node name="Lighttube8" parent="lights" instance=ExtResource( 8 )] position = Vector2( -112, 368 ) direction = 2 -lit = true [node name="Lighttube5" parent="lights" instance=ExtResource( 8 )] position = Vector2( 528, 368 ) direction = 2 -lit = true [node name="Lighttube6" parent="lights" instance=ExtResource( 8 )] position = Vector2( 528, 144 ) -direction = 3 -lit = true [node name="Lighttube9" parent="lights" instance=ExtResource( 8 )] position = Vector2( 80, -48 ) direction = 2 -lit = true [node name="Lighttube10" parent="lights" instance=ExtResource( 8 )] position = Vector2( 272, -48 ) direction = 2 -lit = true [node name="Lighttube11" parent="lights" instance=ExtResource( 8 )] position = Vector2( 272, -208 ) -direction = 3 -lit = true [node name="Lighttube12" parent="lights" instance=ExtResource( 8 )] position = Vector2( -16, -208 ) direction = 0 -lit = true [node name="Lighttube13" parent="lights" instance=ExtResource( 8 )] position = Vector2( -240, -208 ) -direction = 3 -lit = true [node name="Lighttube14" parent="lights" instance=ExtResource( 8 )] position = Vector2( -240, -48 ) direction = 2 -lit = true [node name="Lighttube15" parent="lights" instance=ExtResource( 8 )] position = Vector2( 208, 112 ) direction = 0 -lit = true [node name="Lighttube16" parent="lights" instance=ExtResource( 8 )] position = Vector2( 208, -16 ) direction = 1 -lit = true [node name="Lighttube17" parent="lights" instance=ExtResource( 8 )] position = Vector2( 208, 400 ) direction = 1 -lit = true [node name="Lighttube18" parent="lights" instance=ExtResource( 8 )] position = Vector2( 208, 528 ) direction = 0 -lit = true [node name="Lighttube19" parent="lights" instance=ExtResource( 8 )] position = Vector2( 48, 560 ) -direction = 3 -lit = true [node name="Lighttube21" parent="lights" instance=ExtResource( 8 )] position = Vector2( -240, 560 ) -direction = 3 -lit = true [node name="Lighttube23" parent="lights" instance=ExtResource( 8 )] position = Vector2( -240, 720 ) direction = 2 -lit = true [node name="Lighttube20" parent="lights" instance=ExtResource( 8 )] position = Vector2( 272, 720 ) direction = 2 -lit = true [node name="Lighttube22" parent="lights" instance=ExtResource( 8 )] position = Vector2( 80, 720 ) direction = 2 -lit = true + +[node name="pois" type="Node2D" parent="."] +z_index = 999 + +[node name="SpawnpointPlayer" type="Node2D" parent="pois"] +position = Vector2( 208, 256 ) +script = ExtResource( 15 ) diff --git a/Scenes/Maps/runtime.tscn b/Scenes/Maps/runtime.tscn index bcd4edc..e1370a9 100644 --- a/Scenes/Maps/runtime.tscn +++ b/Scenes/Maps/runtime.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=2] +[gd_scene load_steps=15 format=2] [ext_resource path="res://Graphics/tgstation/walls.tres" type="TileSet" id=1] [ext_resource path="res://Graphics/tgstation/1x1.tres" type="TileSet" id=2] @@ -7,6 +7,7 @@ [ext_resource path="res://Scenes/Maps/runtime.gd" type="Script" id=5] [ext_resource path="res://Actors/Objects/Computer/Computer.tscn" type="PackedScene" id=6] [ext_resource path="res://Graphics/space.png" type="Texture" id=7] +[ext_resource path="res://Actors/Meta/POI/Spawnpoints/Player.gd" type="Script" id=8] [ext_resource path="res://Graphics/tgstation/floor.tres" type="TileSet" id=9] [ext_resource path="res://Actors/Objects/Engine/Engine.tscn" type="PackedScene" id=10] [ext_resource path="res://Graphics/tgstation/base.tres" type="TileSet" id=11] @@ -135,49 +136,41 @@ computer_type = 6 [node name="ElectricSocket4" parent="objects" instance=ExtResource( 13 )] position = Vector2( -128, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer6") ] flow = 1 [node name="ElectricSocket5" parent="objects" instance=ExtResource( 13 )] position = Vector2( -96, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer5") ] flow = 1 [node name="ElectricSocket6" parent="objects" instance=ExtResource( 13 )] position = Vector2( -64, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer") ] flow = 1 [node name="ElectricSocket7" parent="objects" instance=ExtResource( 13 )] position = Vector2( -32, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer2") ] flow = 1 [node name="ElectricSocket8" parent="objects" instance=ExtResource( 13 )] position = Vector2( 0, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer3") ] flow = 1 [node name="ElectricSocket9" parent="objects" instance=ExtResource( 13 )] position = Vector2( 32, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer4") ] flow = 1 [node name="ElectricSocket10" parent="objects" instance=ExtResource( 13 )] position = Vector2( 64, 160 ) -z_index = -8 connectionPaths = [ NodePath("../Computer7") ] flow = 1 [node name="ElectricSocket3" parent="objects" instance=ExtResource( 13 )] position = Vector2( 128, 160 ) -z_index = -8 connectionPaths = [ NodePath("../SMES2") ] [node name="lights" type="Node2D" parent="."] @@ -186,3 +179,10 @@ __meta__ = { "_edit_group_": true, "_edit_lock_": true } + +[node name="pois" type="Node2D" parent="."] +z_index = 999 + +[node name="SpawnpointPlayer" type="Node2D" parent="pois"] +position = Vector2( 112, 272 ) +script = ExtResource( 8 ) diff --git a/Scenes/World.gd b/Scenes/World.gd index 0876e8d..d73ebff 100644 --- a/Scenes/World.gd +++ b/Scenes/World.gd @@ -2,13 +2,32 @@ extends Node2D class_name GameWorld -export(NodePath) var player_path -export(NodePath) var map_path +enum Map { RUNTIME, ODYSSEY } -onready var player = get_node(player_path) as Node2D -onready var map = get_node(map_path) as GameMap +export(Map) var mapToLoad = Map.RUNTIME + +const runtimeRes = preload("res://Scenes/Maps/runtime.tscn") +const odysseyRes = preload("res://Scenes/Maps/odyssey.tscn") +const playerRes = preload("res://Actors/Player/Player.tscn") + +var map = null +var player = null func _ready(): + match mapToLoad: + Map.RUNTIME: + map = runtimeRes.instance() + Map.ODYSSEY: + map = odysseyRes.instance() + add_child(map) for tilemap in map.tilemaps: if tilemap is MapTiles: tilemap.set_occluder_origin(player) + player = playerRes.instance() + player.is_controlled = true + var spawnpoints = map.get_pois(POIData.POIType.SpawnPoint, POIData.POIClass.Player) + if spawnpoints.size() > 0: + player.transform.origin = (spawnpoints[0] as Node2D).transform.origin + else: + print("Map does not have Player spawnpoint POI! Spawning at origin (very bad)") + add_child(player) diff --git a/project.godot b/project.godot index 770eecc..7780b6d 100644 --- a/project.godot +++ b/project.godot @@ -74,6 +74,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://Scenes/Rendering/Occluder.gd" }, { +"base": "Reference", +"class": "POIData", +"language": "GDScript", +"path": "res://Classes/POI.gd" +}, { "base": "Node", "class": "PowerManager", "language": "GDScript", @@ -89,6 +94,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://Actors/Systems/Electricity/ElectricProbe.gd" }, { +"base": "Node2D", +"class": "SpawnpointPlayer", +"language": "GDScript", +"path": "res://Actors/Meta/POI/Spawnpoints/Player.gd" +}, { "base": "Reference", "class": "UICommand", "language": "GDScript", @@ -108,9 +118,11 @@ _global_script_class_icons={ "GameWorld": "", "MapTiles": "", "Occluder": "", +"POIData": "", "PowerManager": "", "PowerNetwork": "", "ProbeElectric": "", +"SpawnpointPlayer": "", "UICommand": "" }