diff --git a/.gitignore b/.gitignore index 8e694a3..c760c45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .import -export \ No newline at end of file +export +.vscode \ No newline at end of file diff --git a/Actors/Objects/Computer/Computer.gd b/Actors/Objects/Computer/Computer.gd index 1279123..ebc5c7e 100644 --- a/Actors/Objects/Computer/Computer.gd +++ b/Actors/Objects/Computer/Computer.gd @@ -7,6 +7,7 @@ class_name GameObjectComputer enum Direction { LEFT, RIGHT, UP, DOWN } enum ComputerType { ShipCommand, Comms, Medical, Research, Energy, ShipEngine, Atmos, Monitoring } +export var object_name = "" export(Direction) var direction = Direction.DOWN setget set_direction export(ComputerType) var computer_type = ComputerType.ShipCommand setget set_type @@ -120,3 +121,54 @@ func serialize(): func deserialize(data): set_direction(data["direction"]) set_type(data["computer_type"]) + +func inspect(): + match computer_type: + ComputerType.ShipCommand: + return { + "type": "Control board computer", + "description": "A computer for moving the ship around the galaxy", + "interaction": "Click when near to interact" + } + ComputerType.Comms: + return { + "type": "Comms computer", + "description": "A computer for issuing and controlling communications", + "interaction": "Click when near to interact" + } + ComputerType.Medical: + return { + "type": "Medical computer", + "description": "A computer for checking health status and medical procedures", + "interaction": "Click when near to interact" + } + ComputerType.Research: + return { + "type": "R&D computer", + "description": "A computer for researching new tech and control printers", + "interaction": "Click when near to interact" + } + ComputerType.Energy: + return { + "type": "Energy supply computer", + "description": "A computer for monitoring and managing the energy grid", + "interaction": "Click when near to interact" + } + ComputerType.Atmos: + return { + "type": "Atmos computer", + "description": "A computer for monitoring and managing the air supply", + "interaction": "Click when near to interact" + } + ComputerType.ShipEngine: + return { + "type": "Engine control computer", + "description": "A computer for monitoring and managing the ship engines", + "interaction": "Click when near to interact" + } + ComputerType.Monitoring: + return { + "type": "Monitoring computer", + "description": "A computer for monitoring crew and ship status", + "interaction": "Click when near to interact" + } diff --git a/Actors/Objects/Computer/Computer.tscn b/Actors/Objects/Computer/Computer.tscn index abd2e91..fcfc3d2 100644 --- a/Actors/Objects/Computer/Computer.tscn +++ b/Actors/Objects/Computer/Computer.tscn @@ -127,6 +127,7 @@ extents = Vector2( 48, 48 ) [node name="Computer" type="StaticBody2D"] input_pickable = true +collision_layer = 3 script = ExtResource( 3 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] diff --git a/Actors/Objects/Door/Door.gd b/Actors/Objects/Door/Door.gd index 3412f8e..209c37e 100644 --- a/Actors/Objects/Door/Door.gd +++ b/Actors/Objects/Door/Door.gd @@ -2,6 +2,7 @@ extends StaticBody2D class_name GameObjectDoor +export var object_name = "" export(NodePath) var interlockTargetPath var interlockTarget: GameObjectDoor = null @@ -54,13 +55,13 @@ func _animation_finished(): $Timer.start() if $Sprite.animation == "open": # Disable collider - collision_layer = 16 - collision_mask = 16 + collision_layer &= ~1 + collision_mask &= ~1 emit_signal("changed", true) else: # Enable collider - collision_mask = 1 - collision_layer = 1 + collision_mask |= 1 + collision_layer |= 1 emit_signal("changed", false) func _input_event(_viewport, event, _shape_idx): @@ -79,5 +80,12 @@ func serialize(): func deserialize(_data): pass +func inspect(): + return { + "type": "Airlock", + "description": "Allows you to move between rooms while keeping rooms air-tight sealed", + "interaction": "Click when close to manually open/close" + } + func _open_sensor_triggered(): rpc("set_open", true) diff --git a/Actors/Objects/Door/Door.tscn b/Actors/Objects/Door/Door.tscn index 32fa906..c20308f 100644 --- a/Actors/Objects/Door/Door.tscn +++ b/Actors/Objects/Door/Door.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=2] +[gd_scene load_steps=14 format=2] [ext_resource path="res://Actors/Objects/Door/Door.gd" type="Script" id=1] [ext_resource path="res://Graphics/tgstation/opening-sheet.png" type="Texture" id=2] @@ -42,11 +42,14 @@ animations = [ { } ] [sub_resource type="CircleShape2D" id=8] +radius = 42.0 + +[sub_resource type="CircleShape2D" id=9] radius = 18.0 [node name="Door" type="StaticBody2D"] input_pickable = true -collision_layer = 17 +collision_layer = 19 script = ExtResource( 1 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] @@ -65,11 +68,11 @@ wait_time = 5.0 one_shot = true [node name="ActivationRange" type="Area2D" parent="."] -visible = false input_pickable = false script = ExtResource( 3 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="ActivationRange"] +visible = false position = Vector2( 16, 16 ) shape = SubResource( 8 ) @@ -79,7 +82,7 @@ script = ExtResource( 3 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="CloseRange"] position = Vector2( 16, 16 ) -shape = SubResource( 8 ) +shape = SubResource( 9 ) [node name="PowerManager" type="Node" parent="."] script = ExtResource( 4 ) diff --git a/Actors/Player/Player.gd b/Actors/Player/Player.gd index 4d9ae31..d6e27d8 100644 --- a/Actors/Player/Player.gd +++ b/Actors/Player/Player.gd @@ -20,6 +20,7 @@ puppet var pup_transform = Transform() onready var scene = $"/root/scene" onready var world = $"/root/scene/world" onready var camera = $Camera +onready var netgame = $"/root/Multiplayer" export var is_controlled = false setget set_is_controlled @@ -100,5 +101,5 @@ func draw_circle_arc_poly(center, radius, angle_from, angle_to, color): points_arc.push_back(center + Vector2(cos(angle_point), sin(angle_point)) * radius) draw_polygon(points_arc, colors) -func hear(_event): - pass +func get_info(): + return netgame.player_info[get_network_master()] diff --git a/Scenes/Game.gd b/Scenes/Game.gd index 4e9a110..e22dfe8 100644 --- a/Scenes/Game.gd +++ b/Scenes/Game.gd @@ -8,7 +8,7 @@ onready var ui = $CanvasLayer/ui onready var world = $world onready var systems = $systems onready var netgame = $"/root/Multiplayer" -onready var physics = world.get_world_2d().direct_space_state +onready var physics = world.get_world_2d().direct_space_state as Physics2DDirectSpaceState var writing = false diff --git a/Scenes/Maps/odyssey.tscn b/Scenes/Maps/odyssey.tscn index fe9c759..30b5606 100644 --- a/Scenes/Maps/odyssey.tscn +++ b/Scenes/Maps/odyssey.tscn @@ -96,22 +96,32 @@ z_index = 10 [node name="Engine" parent="engines" instance=ExtResource( 10 )] position = Vector2( -1024, -128 ) direction = 0 +strength = 1.0 +max_force = 0.05 [node name="Engine5" parent="engines" instance=ExtResource( 10 )] position = Vector2( -1024, -32 ) direction = 0 +strength = 1.0 +max_force = 0.05 [node name="Engine4" parent="engines" instance=ExtResource( 10 )] position = Vector2( -928, -224 ) direction = 0 +strength = 1.0 +max_force = 0.05 [node name="Engine2" parent="engines" instance=ExtResource( 10 )] position = Vector2( -928, 160 ) direction = 0 +strength = 1.0 +max_force = 0.05 [node name="Engine3" parent="engines" instance=ExtResource( 10 )] position = Vector2( -1024, 64 ) direction = 0 +strength = 1.0 +max_force = 0.05 [node name="objects" type="Node2D" parent="."] z_index = 10 @@ -140,12 +150,15 @@ position = Vector2( -704, 0 ) [node name="Door2" parent="objects" instance=ExtResource( 4 )] position = Vector2( 608, 0 ) +object_name = "Bridge entrance" [node name="Door4" parent="objects" instance=ExtResource( 4 )] position = Vector2( 160, -128 ) +object_name = "Docking entrance B" [node name="Door3" parent="objects" instance=ExtResource( 4 )] position = Vector2( 96, -128 ) +object_name = "Docking entrance A" [node name="Door5" parent="objects" instance=ExtResource( 4 )] position = Vector2( 64, -320 ) @@ -218,21 +231,27 @@ position = Vector2( -352, 128 ) [node name="Door14" parent="objects" instance=ExtResource( 4 )] position = Vector2( 352, 64 ) +object_name = "Medical entrance A" [node name="Door15" parent="objects" instance=ExtResource( 4 )] position = Vector2( 416, 64 ) +object_name = "Medical entrance B" [node name="Door16" parent="objects" instance=ExtResource( 4 )] position = Vector2( 256, 128 ) +object_name = "Medical Doubledoors A" [node name="Door17" parent="objects" instance=ExtResource( 4 )] position = Vector2( 256, 160 ) +object_name = "Medical Doubledoors B" [node name="Door18" parent="objects" instance=ExtResource( 4 )] position = Vector2( 416, -64 ) +object_name = "Armory entrance (Halls)" [node name="Door19" parent="objects" instance=ExtResource( 4 )] position = Vector2( 224, -160 ) +object_name = "Armory entrance (Docking)" [node name="sockets" type="Node2D" parent="."] z_index = 2 @@ -266,160 +285,199 @@ flow = 2 position = Vector2( -928, 96 ) direction = 0 connectionPaths = [ NodePath("../../engines/Engine3") ] +flow = 1 [node name="ElectricSocket6" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -832, -192 ) direction = 0 connectionPaths = [ NodePath("../../engines/Engine4") ] +flow = 1 [node name="ElectricSocket7" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -928, 0 ) direction = 0 connectionPaths = [ NodePath("../../engines/Engine5") ] +flow = 1 [node name="ElectricSocket8" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -832, 192 ) direction = 0 connectionPaths = [ NodePath("../../engines/Engine2") ] +flow = 1 [node name="ElectricSocket9" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -928, -96 ) direction = 0 connectionPaths = [ NodePath("../../engines/Engine") ] +flow = 1 [node name="ElectricSocket10" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 768, 0 ) direction = 1 connectionPaths = [ NodePath("../../objects/Computer") ] +flow = 1 [node name="ElectricSocket12" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 576, 0 ) direction = 1 connectionPaths = [ NodePath("../../objects/Door2") ] +flow = 1 [node name="ElectricSocket11" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -736, 0 ) direction = 1 connectionPaths = [ NodePath("../../objects/Door") ] +flow = 1 [node name="ElectricSocket13" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 96, -96 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door3") ] +flow = 1 [node name="ElectricSocket14" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 160, -96 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door4") ] +flow = 1 [node name="ElectricSocket15" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 64, -224 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door7") ] +flow = 1 [node name="ElectricSocket16" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 64, -288 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door5") ] +flow = 1 [node name="ElectricSocket17" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 192, -288 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door6") ] +flow = 1 [node name="ElectricSocket18" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 192, -224 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door8") ] +flow = 1 [node name="ElectricSocket19" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -832, 0 ) direction = 0 connectionPaths = [ NodePath("../../objects/Computer3") ] +flow = 1 [node name="ElectricSocket20" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -832, -32 ) direction = 0 connectionPaths = [ NodePath("../../objects/Computer2") ] +flow = 1 [node name="ElectricSocket22" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 736, -64 ) direction = 2 connectionPaths = [ NodePath("../../objects/Computer4") ] +flow = 1 [node name="ElectricSocket21" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 704, -64 ) direction = 2 connectionPaths = [ NodePath("../../objects/Computer5") ] +flow = 1 [node name="ElectricSocket23" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 704, 64 ) +direction = 3 connectionPaths = [ NodePath("../../objects/Computer9") ] +flow = 1 [node name="ElectricSocket24" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 736, 64 ) +direction = 3 connectionPaths = [ NodePath("../../objects/Computer8") ] +flow = 1 [node name="ElectricSocket25" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 768, -32 ) direction = 1 connectionPaths = [ NodePath("../../objects/Computer7") ] +flow = 1 [node name="ElectricSocket26" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 768, 32 ) direction = 1 connectionPaths = [ NodePath("../../objects/Computer6") ] +flow = 1 [node name="ElectricSocket27" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -512, 224 ) direction = 0 connectionPaths = [ NodePath("../../objects/Door9") ] +flow = 1 [node name="ElectricSocket28" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -448, 32 ) +direction = 3 connectionPaths = [ NodePath("../../objects/Door10") ] +flow = 1 [node name="ElectricSocket29" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -320, 128 ) direction = 0 connectionPaths = [ NodePath("../../objects/Door12") ] +flow = 1 [node name="ElectricSocket30" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -224, 32 ) +direction = 3 connectionPaths = [ NodePath("../../objects/Door11") ] +flow = 1 [node name="ElectricSocket31" parent="sockets" instance=ExtResource( 14 )] position = Vector2( -128, 192 ) direction = 1 connectionPaths = [ NodePath("../../objects/Door13") ] +flow = 1 [node name="ElectricSocket32" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 224, 128 ) direction = 1 connectionPaths = [ NodePath("../../objects/Door16") ] +flow = 1 [node name="ElectricSocket33" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 224, 160 ) direction = 1 connectionPaths = [ NodePath("../../objects/Door17") ] +flow = 1 [node name="ElectricSocket34" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 352, 32 ) +direction = 3 connectionPaths = [ NodePath("../../objects/Door14") ] +flow = 1 [node name="ElectricSocket35" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 416, 32 ) +direction = 3 connectionPaths = [ NodePath("../../objects/Door15") ] +flow = 1 [node name="ElectricSocket36" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 192, -160 ) direction = 1 connectionPaths = [ NodePath("../../objects/Door19") ] +flow = 1 [node name="ElectricSocket37" parent="sockets" instance=ExtResource( 14 )] position = Vector2( 416, -32 ) direction = 2 connectionPaths = [ NodePath("../../objects/Door18") ] +flow = 1 [node name="lights" type="Node2D" parent="."] modulate = Color( 0.980392, 0.980392, 0.980392, 1 ) @@ -436,6 +494,7 @@ z_index = 999 position = Vector2( 720, 16 ) [node name="areas" type="Node2D" parent="."] +visible = false [node name="Bridge" parent="areas" instance=ExtResource( 8 )] position = Vector2( 752, 16 ) diff --git a/Scenes/Menu.tscn b/Scenes/Menu.tscn index d74fea6..1a7c39a 100644 --- a/Scenes/Menu.tscn +++ b/Scenes/Menu.tscn @@ -127,9 +127,9 @@ __meta__ = { [node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] margin_left = 390.0 -margin_top = 19.0 +margin_top = 8.0 margin_right = 690.0 -margin_bottom = 252.0 +margin_bottom = 241.0 rect_min_size = Vector2( 300, 0 ) custom_styles/panel = SubResource( 5 ) diff --git a/Scenes/UI.gd b/Scenes/UI.gd index 009cc9d..c3306d7 100644 --- a/Scenes/UI.gd +++ b/Scenes/UI.gd @@ -12,6 +12,8 @@ enum PopupName { } onready var logs = $Logs +onready var inspect_box = $InspectBox as RichTextLabel + onready var scene = $"/root/scene" onready var netgame = $"/root/Multiplayer" @@ -19,12 +21,40 @@ const WHISPER_RADIUS = 32*3 const CHAT_RADIUS = 32*10 const SHOUT_RADIUS = 32*14 +var inspect_mode = false +var current_inspecting = null + func _ready() -> void: # Add options to menu buttons var serverMenu = $Menu/Margins/Grid/Server.get_popup() serverMenu.connect("id_pressed", self, "_server_option_chosen") serverMenu.add_item("Server info", ServerMenuItem.ServerInfo) - + +func _physics_process(_delta: float) -> void: + if inspect_mode: + var mouse_pos = scene.world.get_local_mouse_position() * scene.world.scale + var results = scene.physics.intersect_point(mouse_pos, 1, [], 2) + if results.size() > 0: + var obj = results[0].collider + if obj != current_inspecting: + current_inspecting = obj + if obj.has_method("inspect"): + var data = obj.inspect() + inspect_box.bbcode_text = "" + inspect_box.rect_size.y = 0 + if "object_name" in obj and obj.object_name != "": + inspect_box.append_bbcode("[b]%s[/b] (%s)" % [obj.object_name, data.type]) + else: + inspect_box.append_bbcode("A [b]%s[/b]" % data.type) + if "description" in data: + inspect_box.append_bbcode("\n" + data.description) + if "interaction" in data: + inspect_box.append_bbcode("\n\n[i]%s[/i]" % data.interaction) + inspect_box.visible = true + else: + current_inspecting = null + inspect_box.visible = false + func _server_option_chosen(id) -> void: match id: ServerMenuItem.ServerInfo: @@ -55,3 +85,19 @@ func _send_chat(text: String) -> void: scene.rpc("broadcast_zone", whisper_format % [netgame.player_name, escaped_text.substr(1)], scene.world.player.global_position, WHISPER_RADIUS) else: scene.rpc("broadcast_zone", say_format % [netgame.player_name, escaped_text], scene.world.player.global_position, CHAT_RADIUS) + +var inspect_offset = Vector2(20, 20) +func set_inspect(active: bool) -> void: + inspect_box.visible = inspect_box.visible and active + inspect_mode = active + inspect_box.rect_global_position = get_viewport().get_mouse_position() + inspect_offset + +func _input(event: InputEvent) -> void: + if event.is_action_released("inspect"): + set_inspect(false) + elif event.is_action_pressed("inspect"): + set_inspect(true) + elif event is InputEventMouseMotion: + var mousemotion = event as InputEventMouseMotion + if inspect_mode: + inspect_box.rect_global_position = mousemotion.position + inspect_offset diff --git a/Scenes/UI.tscn b/Scenes/UI.tscn index 06d38fb..a6b362e 100644 --- a/Scenes/UI.tscn +++ b/Scenes/UI.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=2] +[gd_scene load_steps=16 format=2] [ext_resource path="res://Scenes/UI/SpaceMap.tscn" type="PackedScene" id=1] [ext_resource path="res://Scenes/UI.gd" type="Script" id=2] @@ -43,6 +43,19 @@ corner_radius_top_right = 4 corner_radius_bottom_right = 4 corner_radius_bottom_left = 4 +[sub_resource type="StyleBoxFlat" id=6] +bg_color = Color( 0.133333, 0.12549, 0.203922, 0.705882 ) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color( 0.0941176, 0.0823529, 0.180392, 1 ) +border_blend = true +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 + [node name="ui" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -153,10 +166,29 @@ margin_bottom = 20.0 text = "Preferences" [node name="ServerInfoPopup" parent="." instance=ExtResource( 4 )] +visible = false margin_left = 31.2773 margin_top = 46.9222 margin_right = 287.277 margin_bottom = 214.923 + +[node name="InspectBox" type="RichTextLabel" parent="."] +margin_left = 19.0 +margin_top = -124.0 +margin_right = 376.0 +margin_bottom = -97.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +custom_styles/normal = SubResource( 6 ) +custom_fonts/bold_italics_font = SubResource( 1 ) +custom_fonts/italics_font = SubResource( 2 ) +custom_fonts/bold_font = SubResource( 3 ) +custom_fonts/normal_font = SubResource( 4 ) +fit_content_height = true +scroll_active = false +__meta__ = { +"_edit_use_anchors_": false +} [connection signal="chat_message_sent" from="Logs" to="." method="_send_chat"] [connection signal="focus_entered" from="Logs/ResizablePanel/LineEdit" to="Logs" method="_chat_bar_status" binds= [ true ]] [connection signal="focus_exited" from="Logs/ResizablePanel/LineEdit" to="Logs" method="_chat_bar_status" binds= [ false ]] diff --git a/project.godot b/project.godot index 21c20a5..65e202b 100644 --- a/project.godot +++ b/project.godot @@ -226,11 +226,16 @@ ui_chat={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":84,"unicode":0,"echo":false,"script":null) ] } +inspect={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777237,"unicode":0,"echo":false,"script":null) + ] +} [layer_names] 2d_physics/layer_1="Environment" -2d_physics/layer_2="Projectile" +2d_physics/layer_2="Objects" 2d_physics/layer_3="Electric" 2d_physics/layer_4="Actors" 2d_physics/layer_5="AreaBound"