Compare commits

..

1 Commits
master ... sslo

Author SHA1 Message Date
Hamcha e54b8e3504
WIP SSLO 2020-07-12 17:27:55 +02:00
116 changed files with 1046 additions and 4527 deletions

3
.gitignore vendored
View File

@ -1,3 +1,2 @@
.import
export
.vscode
export

View File

@ -19,10 +19,14 @@ var powered = false setget set_powered
func get_wired() -> bool:
return socket != null
remotesync func set_powered(val: bool) -> void:
func set_powered(val: bool) -> void:
var current = powered
powered = val
if current and not val:
emit_signal("power_disconnected")
elif not current and val:
emit_signal("power_connected")
func _physics_process(_delta: float) -> void:
if wired:
pass

View File

@ -1,36 +0,0 @@
tool
extends Node2D
class_name POI
enum POIType {
Null,
SpawnPoint
}
enum POIClass {
Null,
Player
}
export(POIType) var poitype = POIType.Null
export(POIClass) var poiclass = POIClass.Null
func _draw():
if Engine.editor_hint:
match poitype:
POIType.SpawnPoint:
match poiclass:
POIClass.Player:
draw_arc(Vector2.ZERO, 10, 0, PI*2, 16, Color.red, 2)
func serialize():
return {
"poitype": poitype,
"poiclass": poiclass
}
func deserialize(data):
poitype = data["poitype"]
poiclass = data["poiclass"]

View File

@ -1,9 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://Actors/Meta/POI/POI.gd" type="Script" id=1]
[node name="NullPOI" type="Node2D"]
position = Vector2( 208, 256 )
script = ExtResource( 1 )
poitype = 1
poiclass = 1

View File

@ -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)

View File

@ -5,9 +5,8 @@ extends StaticBody2D
class_name GameObjectComputer
enum Direction { LEFT, RIGHT, UP, DOWN }
enum ComputerType { ShipCommand, Comms, Medical, Research, Energy, ShipEngine, Atmos, Monitoring }
enum ComputerType { ShipCommand, Comms, Medical, Research, Energy, ShipEngine, Atmos }
export var object_name = ""
export(Direction) var direction = Direction.DOWN setget set_direction
export(ComputerType) var computer_type = ComputerType.ShipCommand setget set_type
@ -20,7 +19,6 @@ onready var manager = $PowerManager as PowerManager
func _ready():
if not Engine.editor_hint:
activationRange.visible = true
$computer/screen/Light2D.visible = true
func set_type(val):
computer_type = val
@ -39,8 +37,6 @@ func set_type(val):
screen_region_offset = Vector2(128, 192)
ComputerType.ShipEngine:
screen_region_offset = Vector2(0, 256)
ComputerType.Monitoring:
screen_region_offset = Vector2(128, 32)
refresh_sprite()
@ -71,8 +67,6 @@ func manage_controls(show: bool):
match computer_type:
ComputerType.ShipCommand:
$Control/ControlComp.visible = show
ComputerType.Energy:
$Control/EnergyComp.visible = show
func _input(event):
if event is InputEventMouseButton and event.pressed and not is_inside and open:
@ -101,9 +95,6 @@ func _force_close_ui():
if open:
open = false
$UIAnimation.play("fadeout")
match computer_type:
ComputerType.ShipCommand:
$Control/ControlComp.force_close()
func _power_status_changed(powered: bool) -> void:
activationRange.visible = powered
@ -111,64 +102,3 @@ func _power_status_changed(powered: bool) -> void:
$ScreenAnimation.play("on")
else:
$ScreenAnimation.play("off")
func serialize():
return {
"direction": direction,
"computer_type": computer_type
}
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"
}

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=16 format=2]
[gd_scene load_steps=15 format=2]
[ext_resource path="res://Graphics/tgstation/computer-screens.png" type="Texture" id=1]
[ext_resource path="res://Graphics/tgstation/computer.png" type="Texture" id=2]
@ -7,7 +7,6 @@
[ext_resource path="res://Graphics/light_shadow_light.png" type="Texture" id=5]
[ext_resource path="res://Actors/Components/ActivationRange.gd" type="Script" id=6]
[ext_resource path="res://Actors/Components/PowerManager.gd" type="Script" id=7]
[ext_resource path="res://Actors/Objects/Computer/UI/EnergyComp.tscn" type="PackedScene" id=8]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 16, 16 )
@ -127,7 +126,6 @@ extents = Vector2( 48, 48 )
[node name="Computer" type="StaticBody2D"]
input_pickable = true
collision_layer = 3
script = ExtResource( 3 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
@ -141,7 +139,6 @@ region_enabled = true
region_rect = Rect2( 0, 0, 32, 32 )
[node name="screen" type="Sprite" parent="computer"]
modulate = Color( 0, 0, 0, 1 )
material = SubResource( 2 )
texture = ExtResource( 1 )
centered = false
@ -149,9 +146,7 @@ region_enabled = true
region_rect = Rect2( 0, 0, 32, 32 )
[node name="Light2D" type="Light2D" parent="computer/screen"]
visible = false
position = Vector2( 16, 16 )
enabled = false
texture = ExtResource( 5 )
texture_scale = 0.5
energy = 0.5
@ -170,23 +165,14 @@ z_index = 999
[node name="ControlComp" parent="Control" instance=ExtResource( 4 )]
visible = false
margin_left = -47.0
margin_top = -81.0
margin_right = 208.0
margin_bottom = 66.0
rect_scale = Vector2( 0.5, 0.5 )
[node name="EnergyComp" parent="Control" instance=ExtResource( 8 )]
visible = false
margin_left = -47.0
margin_top = -53.0
margin_right = 207.0
margin_bottom = 36.0
margin_left = -42.0
margin_top = -58.0
margin_right = 193.0
margin_bottom = 47.0
rect_scale = Vector2( 0.5, 0.5 )
[node name="ActivationRange" type="Area2D" parent="."]
visible = false
input_pickable = false
script = ExtResource( 6 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="ActivationRange"]

View File

@ -3,22 +3,13 @@ extends Control
onready var scene = $"/root/scene" as GameInstance
func _physics_process(_delta):
if not visible:
return
var speed_str = "%.0f u/s" % (scene.world.map.current_ship_speed * 10000)
$Margin/Container/VelocityBox/HBoxContainer3/CurrentSpeed.text = speed_str
var dir_str = "%.0f deg" % rad2deg(scene.world.map.current_ship_direction)
$Margin/Container/VelocityBox/HBoxContainer2/CurrentDirection.text = dir_str
var current_position_str = Coordinates.as_string(scene.world.map.current_ship_position + scene.world.map.current_ship_subpos, true)
$Margin/Container/VelocityBox/HBoxContainer4/CurrentPosition.text = current_position_str
var current_target_str = scene.world.map.current_ship_target
if current_target_str == null:
$Margin/Container/VelocityBox/HBoxContainer/CurrentTarget.text = "None"
else:
$Margin/Container/VelocityBox/HBoxContainer/CurrentTarget.text = Coordinates.as_string(current_target_str, true)
var speed_str = str(round(scene.world.map.current_ship_speed)) + " u/s"
$Container/VelocityBox/HBoxContainer3/CurrentSpeed.text = speed_str
var dir_str = str(round(rad2deg(scene.world.map.current_ship_direction))) + " deg"
$Container/VelocityBox/HBoxContainer2/CurrentDirection.text = dir_str
func _map_button_pressed():
scene.ui.open_popup(GameUI.PopupName.SpaceMap)
func _ship_velocity_changed(value):
scene.process_command(UICommand.new(UICommand.CommandType.SetShipSpeed, [value]))
func force_close():
scene.ui.close_popup(GameUI.PopupName.SpaceMap)
func _ship_direction_changed(value):
scene.process_command(UICommand.new(UICommand.CommandType.SetShipDirection, [deg2rad(value)]))

View File

@ -7,12 +7,10 @@
[node name="ControlComp" type="Control"]
material = ExtResource( 4 )
margin_left = -157.0
margin_top = -160.0
margin_right = 156.0
margin_left = -121.0
margin_top = -150.0
margin_right = 121.0
margin_bottom = -20.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
script = ExtResource( 1 )
__meta__ = {
@ -50,38 +48,25 @@ __meta__ = {
"_edit_use_anchors_": false
}
[node name="Margin" type="MarginContainer" parent="."]
[node name="Container" type="VBoxContainer" parent="."]
material = ExtResource( 4 )
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 10.0
margin_right = -10.0
margin_bottom = -10.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/separation = 20
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Container" type="VBoxContainer" parent="Margin"]
[node name="VelocityBox" type="VBoxContainer" parent="Container"]
material = ExtResource( 4 )
margin_right = 293.0
margin_bottom = 120.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="VelocityBox" type="VBoxContainer" parent="Margin/Container"]
material = ExtResource( 4 )
margin_right = 293.0
margin_bottom = 86.0
margin_right = 222.0
margin_bottom = 110.0
size_flags_horizontal = 3
size_flags_vertical = 3
alignment = 1
@ -89,16 +74,16 @@ __meta__ = {
"_edit_use_anchors_": false
}
[node name="HBoxContainer" type="HBoxContainer" parent="Margin/Container/VelocityBox"]
margin_top = 1.0
margin_right = 293.0
margin_bottom = 19.0
[node name="HBoxContainer" type="HBoxContainer" parent="Container/VelocityBox"]
margin_top = 13.0
margin_right = 222.0
margin_bottom = 31.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ShipTarget" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer"]
[node name="ShipTarget" type="Label" parent="Container/VelocityBox/HBoxContainer"]
material = ExtResource( 4 )
margin_right = 98.0
margin_bottom = 18.0
@ -106,10 +91,10 @@ mouse_filter = 1
theme = ExtResource( 3 )
text = "Current target"
[node name="CurrentTarget" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer"]
[node name="CurrentTarget" type="Label" parent="Container/VelocityBox/HBoxContainer"]
material = ExtResource( 4 )
margin_left = 108.0
margin_right = 293.0
margin_right = 222.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
@ -118,16 +103,16 @@ custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
text = "2A.01/10"
align = 2
[node name="HBoxContainer4" type="HBoxContainer" parent="Margin/Container/VelocityBox"]
margin_top = 23.0
margin_right = 293.0
margin_bottom = 41.0
[node name="HBoxContainer4" type="HBoxContainer" parent="Container/VelocityBox"]
margin_top = 35.0
margin_right = 222.0
margin_bottom = 53.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ShipTarget" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer4"]
[node name="ShipTarget" type="Label" parent="Container/VelocityBox/HBoxContainer4"]
material = ExtResource( 4 )
margin_right = 110.0
margin_bottom = 18.0
@ -135,10 +120,10 @@ mouse_filter = 1
theme = ExtResource( 3 )
text = "Current position"
[node name="CurrentPosition" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer4"]
[node name="CurrentPosition" type="Label" parent="Container/VelocityBox/HBoxContainer4"]
material = ExtResource( 4 )
margin_left = 120.0
margin_right = 293.0
margin_right = 222.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
@ -147,16 +132,16 @@ custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
text = "0A.00/00"
align = 2
[node name="HBoxContainer3" type="HBoxContainer" parent="Margin/Container/VelocityBox"]
margin_top = 45.0
margin_right = 293.0
margin_bottom = 63.0
[node name="HBoxContainer3" type="HBoxContainer" parent="Container/VelocityBox"]
margin_top = 57.0
margin_right = 222.0
margin_bottom = 75.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ShipVelocityLabel" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer3"]
[node name="ShipVelocityLabel" type="Label" parent="Container/VelocityBox/HBoxContainer3"]
material = ExtResource( 4 )
margin_right = 88.0
margin_bottom = 18.0
@ -164,10 +149,10 @@ mouse_filter = 1
theme = ExtResource( 3 )
text = "Ship velocity"
[node name="CurrentSpeed" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer3"]
[node name="CurrentSpeed" type="Label" parent="Container/VelocityBox/HBoxContainer3"]
material = ExtResource( 4 )
margin_left = 98.0
margin_right = 293.0
margin_right = 222.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
@ -175,12 +160,12 @@ theme = ExtResource( 3 )
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
align = 2
[node name="HBoxContainer2" type="HBoxContainer" parent="Margin/Container/VelocityBox"]
margin_top = 67.0
margin_right = 293.0
margin_bottom = 85.0
[node name="HBoxContainer2" type="HBoxContainer" parent="Container/VelocityBox"]
margin_top = 79.0
margin_right = 222.0
margin_bottom = 97.0
[node name="ShipDirectionLabel" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer2"]
[node name="ShipDirectionLabel" type="Label" parent="Container/VelocityBox/HBoxContainer2"]
material = ExtResource( 4 )
margin_right = 94.0
margin_bottom = 18.0
@ -188,22 +173,13 @@ mouse_filter = 1
theme = ExtResource( 3 )
text = "Ship direction"
[node name="CurrentDirection" type="Label" parent="Margin/Container/VelocityBox/HBoxContainer2"]
[node name="CurrentDirection" type="Label" parent="Container/VelocityBox/HBoxContainer2"]
material = ExtResource( 4 )
margin_left = 98.0
margin_right = 293.0
margin_right = 222.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
theme = ExtResource( 3 )
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
align = 2
[node name="Button" type="Button" parent="Margin/Container"]
material = ExtResource( 4 )
margin_top = 96.0
margin_right = 293.0
margin_bottom = 120.0
theme = ExtResource( 3 )
text = "Open map"
[connection signal="pressed" from="Margin/Container/Button" to="." method="_map_button_pressed"]

View File

@ -1,26 +0,0 @@
extends Control
onready var scene = $"/root/scene" as GameInstance
func _physics_process(_delta):
if not visible:
return
var children = scene.systems.get_children()
var total_sink = 0
var total_source = 0
var total_alerts = 0
for child in children:
if child is PowerNetwork:
var network = child as PowerNetwork
total_sink += network.total_usage
total_source += network.total_source
total_alerts += network.unpowered
$Margin/Container/EnergyBox/CurrentSource/Value.text = "%.0f kW" % total_source
$Margin/Container/EnergyBox/CurrentSink/Value.text = "%.0f kW" % total_sink
$Margin/Container/EnergyBox/CurrentAlerts/Value.text = str(total_alerts)
func _map_button_pressed():
scene.ui.open_popup(GameUI.PopupName.EnergyUsage)
func force_close():
scene.ui.close_popup(GameUI.PopupName.EnergyUsage)

View File

@ -1,187 +0,0 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://Actors/Objects/Computer/UI/EnergyComp.gd" type="Script" id=1]
[ext_resource path="res://Graphics/UI/ui-popup-panel.png" type="Texture" id=2]
[ext_resource path="res://Graphics/UI/ui_theme.tres" type="Theme" id=3]
[ext_resource path="res://Graphics/unshaded_mat.tres" type="Material" id=4]
[node name="EnergyComp" type="Control"]
material = ExtResource( 4 )
margin_left = -157.0
margin_top = -144.0
margin_right = 156.0
margin_bottom = -20.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="TextureRect" type="TextureRect" parent="."]
material = ExtResource( 4 )
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -8.0
margin_top = -16.5409
margin_right = 8.27014
margin_bottom = 15.4881
texture = ExtResource( 2 )
stretch_mode = 3
__meta__ = {
"_edit_use_anchors_": false
}
[node name="NinePatchRect" type="NinePatchRect" parent="."]
material = ExtResource( 4 )
anchor_right = 1.0
anchor_bottom = 1.0
texture = ExtResource( 2 )
region_rect = Rect2( 0, 0, 16, 16 )
patch_margin_left = 4
patch_margin_top = 4
patch_margin_right = 4
patch_margin_bottom = 5
axis_stretch_horizontal = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Margin" type="MarginContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 10.0
margin_right = -10.0
margin_bottom = -10.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Container" type="VBoxContainer" parent="Margin"]
material = ExtResource( 4 )
margin_right = 293.0
margin_bottom = 104.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="EnergyBox" type="VBoxContainer" parent="Margin/Container"]
material = ExtResource( 4 )
margin_right = 293.0
margin_bottom = 104.0
size_flags_horizontal = 3
size_flags_vertical = 3
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="CurrentSource" type="HBoxContainer" parent="Margin/Container/EnergyBox"]
margin_top = 21.0
margin_right = 293.0
margin_bottom = 39.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="Margin/Container/EnergyBox/CurrentSource"]
material = ExtResource( 4 )
margin_right = 106.0
margin_bottom = 18.0
mouse_filter = 1
theme = ExtResource( 3 )
text = "Available power"
[node name="Value" type="Label" parent="Margin/Container/EnergyBox/CurrentSource"]
material = ExtResource( 4 )
margin_left = 116.0
margin_right = 293.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
theme = ExtResource( 3 )
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
text = "2A.01/10"
align = 2
[node name="CurrentSink" type="HBoxContainer" parent="Margin/Container/EnergyBox"]
margin_top = 43.0
margin_right = 293.0
margin_bottom = 61.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="Margin/Container/EnergyBox/CurrentSink"]
material = ExtResource( 4 )
margin_right = 130.0
margin_bottom = 18.0
mouse_filter = 1
theme = ExtResource( 3 )
text = "Current power load"
[node name="Value" type="Label" parent="Margin/Container/EnergyBox/CurrentSink"]
material = ExtResource( 4 )
margin_left = 140.0
margin_right = 293.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
theme = ExtResource( 3 )
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
text = "0A.00/00"
align = 2
[node name="CurrentAlerts" type="HBoxContainer" parent="Margin/Container/EnergyBox"]
margin_top = 65.0
margin_right = 293.0
margin_bottom = 83.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="Margin/Container/EnergyBox/CurrentAlerts"]
material = ExtResource( 4 )
margin_right = 130.0
margin_bottom = 18.0
mouse_filter = 1
theme = ExtResource( 3 )
text = "Unpowered devices"
[node name="Value" type="Label" parent="Margin/Container/EnergyBox/CurrentAlerts"]
material = ExtResource( 4 )
margin_left = 140.0
margin_right = 293.0
margin_bottom = 18.0
mouse_filter = 1
size_flags_horizontal = 3
theme = ExtResource( 3 )
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
text = "0A.00/00"
align = 2
[node name="Button" type="Button" parent="Margin/Container"]
visible = false
material = ExtResource( 4 )
margin_top = 80.0
margin_right = 293.0
margin_bottom = 104.0
theme = ExtResource( 3 )
text = "Open usage monitor"
[connection signal="pressed" from="Margin/Container/Button" to="." method="_map_button_pressed"]

View File

@ -2,13 +2,9 @@ extends StaticBody2D
class_name GameObjectDoor
export var object_name = ""
export(NodePath) var interlockTargetPath
var interlockTarget: GameObjectDoor = null
var open_sound = preload("res://Sounds/SFX/effects/door-open.wav")
var close_sound = preload("res://Sounds/SFX/effects/door-close.wav")
export var idle_usage = 2
export var active_usage = 10
@ -18,50 +14,37 @@ onready var manager = $PowerManager as PowerManager
signal changed(open)
func _ready():
if is_network_master():
if interlockTargetPath != null:
interlockTarget = get_node_or_null(interlockTargetPath)
if not Engine.editor_hint:
activationRange.visible = true
if interlockTargetPath != null:
interlockTarget = get_node_or_null(interlockTargetPath)
if not Engine.editor_hint:
activationRange.visible = true
master func set_open(open: bool):
func set_open(open: bool):
if not manager:
return
manager.power_usage = active_usage
if manager.powered:
if open:
$Sprite.play("open")
if interlockTarget != null:
interlockTarget.set_open(false)
rpc("anim_open", open)
remotesync func anim_open(open: bool):
if open:
if $Sprite.animation != "open":
$AudioStreamPlayer2D.stream = open_sound
$AudioStreamPlayer2D.play()
$Sprite.play("open")
else:
if $Sprite.animation != "close":
$AudioStreamPlayer2D.stream = close_sound
$AudioStreamPlayer2D.play()
$Sprite.play("close")
else:
$Sprite.play("close")
func _animation_finished():
if is_network_master():
if manager:
manager.power_usage = idle_usage
if $Sprite.animation == "open":
# Start timer for auto-close
$Timer.start()
if manager:
manager.power_usage = idle_usage
if $Sprite.animation == "open":
# Disable collider
collision_layer &= ~1
collision_mask &= ~1
collision_layer = 16
collision_mask = 16
emit_signal("changed", true)
# Start timer for auto-close
$Timer.start()
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):
@ -69,23 +52,7 @@ func _input_event(_viewport, event, _shape_idx):
if event is InputEventMouseButton and event.pressed:
# Must be in activation range
if activationRange.in_range():
rpc("set_open", $Sprite.animation == "close")
set_open($Sprite.animation == "close")
master func _close_timer_triggered():
rpc("set_open", false)
func serialize():
return {}
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)
func _close_timer_triggered():
$Sprite.play("close")

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=2]
[gd_scene load_steps=13 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,14 +42,10 @@ animations = [ {
} ]
[sub_resource type="CircleShape2D" id=8]
radius = 42.0
[sub_resource type="CircleShape2D" id=9]
radius = 18.0
radius = 64.0
[node name="Door" type="StaticBody2D"]
input_pickable = true
collision_layer = 19
script = ExtResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
@ -68,29 +64,15 @@ wait_time = 5.0
one_shot = true
[node name="ActivationRange" type="Area2D" parent="."]
input_pickable = false
visible = false
script = ExtResource( 3 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="ActivationRange"]
visible = false
position = Vector2( 16, 16 )
shape = SubResource( 8 )
[node name="CloseRange" type="Area2D" parent="."]
input_pickable = false
script = ExtResource( 3 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="CloseRange"]
position = Vector2( 16, 16 )
shape = SubResource( 9 )
[node name="PowerManager" type="Node" parent="."]
script = ExtResource( 4 )
power_usage = 2.0
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
max_distance = 512.0
attenuation = 3.0
[connection signal="animation_finished" from="Sprite" to="." method="_animation_finished"]
[connection signal="timeout" from="Timer" to="." method="_close_timer_triggered"]
[connection signal="player_entered" from="CloseRange" to="." method="_open_sensor_triggered"]

View File

@ -62,23 +62,3 @@ func refresh_sprite() -> void:
socket.material.set_shader_param("cable_color", sink_color)
Flow.BIDIRECTIONAL:
socket.material.set_shader_param("cable_color", bidirectional_color)
func serialize():
var connection_paths = []
for conn in connections:
connection_paths.append({ "path": get_path_to(conn), "powered": conn.powered })
return {
"direction": direction,
"flow": flow,
"connections": connection_paths
}
func deserialize(data):
set_direction(data["direction"])
set_flow(data["flow"])
for node in data["connections"]:
var manager = get_node(node.path) as PowerManager
manager.socket = self
manager.powered = node.powered
connections.append(manager)

View File

@ -14,13 +14,13 @@ void fragment() {
if (col.r/col.g > 2.) {
if (length(cable_color) == 0.) {
if (UV.y > 0.6 && UV.y < 0.85) {
if (mod(UV.x * 200., 12.) > 4.) {
if (int(UV.x * 200.) % 12 > 4) {
col.rgb = vec3(0.94, 0.08, 0.08) * length(col.rgb);
} else {
col.rgb = vec3(0.04, 0.58, 0.98) * length(col.rgb);
}
} else {
if (mod(UV.y * 200., 12.) > 4.) {
if (int(UV.y * 200.) % 12 > 4) {
col.rgb = vec3(0.94, 0.08, 0.08) * length(col.rgb);
} else {
col.rgb = vec3(0.04, 0.58, 0.98) * length(col.rgb);
@ -32,28 +32,32 @@ void fragment() {
}
COLOR = col;
}"
custom_defines = ""
[sub_resource type="ShaderMaterial" id=2]
shader = SubResource( 1 )
shader_param/cable_color = Color( 0.0901961, 0.533333, 0.960784, 1 )
shader_param/cable_color = Color( 0, 0, 0, 0 )
[sub_resource type="CircleShape2D" id=3]
radius = 12.0
[node name="ElectricSocket" type="Area2D"]
z_index = -8
collision_layer = 4
collision_mask = 2147483652
script = ExtResource( 2 )
direction = 2
source_color = Color( 0.937255, 0.0823529, 0.0823529, 1 )
sink_color = Color( 0.0901961, 0.533333, 0.960784, 1 )
bidirectional_color = Color( 0, 0, 0, 0 )
flow = 2
[node name="socket" type="Sprite" parent="."]
material = SubResource( 2 )
texture = ExtResource( 1 )
centered = false
region_enabled = true
region_rect = Rect2( 0, 0, 32, 32 )
region_rect = Rect2( 32, 0, 32, 32 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2( 16, 16 )

View File

@ -7,34 +7,28 @@ class_name GameObjectEngine
const LIGHT_STRENGTH_MULT = 0.002
const MAX_ENERGY = 2
const MAX_USAGE = 0.5
enum Direction { LEFT, RIGHT, UP, DOWN }
export(Direction) var direction = Direction.DOWN setget set_direction
onready var activationRange = $ActivationRange as ActivationRange
onready var manager = $PowerManager as PowerManager
export var strength = 1.0 setget set_strength
export var max_force = 0.05
var force = 0
func _ready() -> void:
func _ready():
if not Engine.editor_hint:
activationRange.visible = true
$Light2D.visible = true
func set_direction(dir) -> void:
func set_direction(dir):
direction = dir
refresh_sprite()
func set_strength(val: float) -> void:
func set_strength(val):
strength = val
$Light2D.energy = val * LIGHT_STRENGTH_MULT
func refresh_sprite() -> void:
func refresh_sprite():
var rot = 0
match direction:
Direction.DOWN:
@ -51,11 +45,7 @@ func refresh_sprite() -> void:
rot = -PI/2
$Light2D.rotation = rot
$ActivationRange.rotation = rot
func _physics_process(_delta: float) -> void:
if Engine.editor_hint:
return
manager.power_usage = max(1e-3, MAX_USAGE * strength)
func _input_event(_viewport, event, _shape_idx):
if Engine.editor_hint:
@ -64,21 +54,3 @@ func _input_event(_viewport, event, _shape_idx):
if activationRange.in_range():
# TODO
pass
func serialize():
return {
"direction": direction,
"strength": strength
}
func deserialize(data):
set_direction(data["direction"])
set_strength(data["strength"])
func _power_status_changed(powered):
if powered:
force = max_force
$Light2D.enabled = true
else:
force = 0
$Light2D.enabled = false

View File

@ -1,10 +1,9 @@
[gd_scene load_steps=8 format=2]
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Actors/Components/ActivationRange.gd" type="Script" id=1]
[ext_resource path="res://Actors/Objects/Engine/Engine.gd" type="Script" id=2]
[ext_resource path="res://Graphics/tgstation/engine-big.png" type="Texture" id=3]
[ext_resource path="res://Graphics/light_shadow_light.png" type="Texture" id=4]
[ext_resource path="res://Actors/Components/PowerManager.gd" type="Script" id=5]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 48, 48 )
@ -26,7 +25,6 @@ region_enabled = true
region_rect = Rect2( 0, 0, 96, 96 )
[node name="Light2D" type="Light2D" parent="."]
visible = false
position = Vector2( 48, 48 )
texture = ExtResource( 4 )
offset = Vector2( 0, 50 )
@ -35,15 +33,8 @@ energy = 0.002
[node name="ActivationRange" type="Area2D" parent="."]
visible = false
input_pickable = false
script = ExtResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="ActivationRange"]
position = Vector2( 48, 56 )
shape = SubResource( 2 )
[node name="PowerManager" type="Node" parent="."]
script = ExtResource( 5 )
power_usage = 1.0
[connection signal="power_connected" from="PowerManager" to="." method="_power_status_changed" binds= [ true ]]
[connection signal="power_disconnected" from="PowerManager" to="." method="_power_status_changed" binds= [ false ]]

View File

@ -17,11 +17,11 @@ func _ready():
activationRange.visible = true
refresh_sprite()
remotesync func set_direction(dir):
func set_direction(dir):
direction = dir
refresh_sprite()
remotesync func set_lit(val):
func set_lit(val):
lit = val
update_light()
refresh_sprite()
@ -35,7 +35,7 @@ func refresh_sprite():
match direction:
Direction.DOWN:
$light.region_rect.position = Vector2(32, lit_offset)
rot = 0
rot =0
Direction.UP:
$light.region_rect.position = Vector2(0, lit_offset)
rot = PI
@ -45,29 +45,19 @@ func refresh_sprite():
Direction.RIGHT:
$light.region_rect.position = Vector2(64, lit_offset)
rot = PI/2
$Light2D.rotation = rot
$ActivationRange.rotation = rot
func _input_event(_viewport, event, _shape_idx):
if Engine.editor_hint:
return
if event is InputEventMouseButton and event.pressed:
if activationRange.in_range():
rpc("set_lit", !lit)
set_lit(!lit)
func _power_status_changed(_powered: bool) -> void:
update_light()
refresh_sprite()
func update_light():
$Light2D.enabled = lit and (manager != null and manager.powered)
func serialize():
return {
"direction": direction,
"lit": lit
}
func deserialize(data):
set_direction(data["direction"])
set_lit(data["lit"])
pass

View File

@ -1,6 +1,5 @@
[gd_scene load_steps=8 format=2]
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Graphics/light_shadow_light.png" type="Texture" id=1]
[ext_resource path="res://Graphics/tgstation/light.png" type="Texture" id=2]
[ext_resource path="res://Actors/Objects/Lightbulb/Lightbulb.gd" type="Script" id=3]
[ext_resource path="res://Actors/Components/ActivationRange.gd" type="Script" id=4]
@ -23,22 +22,8 @@ texture = ExtResource( 2 )
region_enabled = true
region_rect = Rect2( 32, 0, 32, 32 )
[node name="Light2D" type="Light2D" parent="."]
enabled = false
texture = ExtResource( 1 )
texture_scale = 3.5
energy = 1.2
mode = 2
shadow_color = Color( 0, 0, 0, 1 )
shadow_filter_smooth = 10.0
__meta__ = {
"_edit_group_": true,
"_edit_lock_": true
}
[node name="ActivationRange" type="Area2D" parent="."]
visible = false
input_pickable = false
script = ExtResource( 4 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="ActivationRange"]

View File

@ -2,7 +2,7 @@ extends StaticBody2D
class_name GameObjectPowerStorage
const MAX_CHARGE = 5e5
const MAX_CHARGE = 100000.0
var open = false
var attached = true
@ -11,41 +11,25 @@ onready var manager = $PowerManager as PowerManager
export var current_charge = MAX_CHARGE setget set_charge
export var max_charge_rate = 0 setget set_max_charge
export var max_discharge_rate = 2000 setget set_max_discharge
var next_network_update = Multiplayer.SYSTEMS_UPDATE_INTERVAL
export var max_discharge_rate = 200 setget set_max_discharge
func _ready() -> void:
if not Engine.editor_hint:
activationRange.visible = true
$Control/PowerUI.set_current_charge(current_charge)
$Control/PowerUI.set_max_charge(MAX_CHARGE)
$Control/PowerUI.init_values(max_charge_rate, max_discharge_rate)
set_max_charge(max_charge_rate)
func _physics_process(delta: float) -> void:
if not is_network_master():
return
next_network_update -= 1
if next_network_update < 0:
next_network_update = Multiplayer.SYSTEMS_UPDATE_INTERVAL
if manager.wired:
if current_charge > 0:
manager.power_source = min(current_charge, max_discharge_rate)
if manager.power_load > 0:
var new_charge = current_charge - manager.power_load * delta
if next_network_update == 0:
rpc("set_charge", new_charge)
else:
set_charge(new_charge)
set_charge(current_charge - manager.power_load * delta)
if PowerNetwork.DEBUG:
update()
if manager.powered:
var new_charge = current_charge + max_charge_rate * delta
if next_network_update == 0:
rpc("set_charge", new_charge)
else:
set_charge(new_charge)
set_charge(current_charge + max_charge_rate * delta)
func _input(event):
if event is InputEventMouseButton and event.pressed and not is_inside and open:
@ -85,26 +69,14 @@ func _draw():
charge_color = Color.red
draw_rect(Rect2(32, 32-charge_px, 4, charge_px), charge_color)
remotesync func set_max_discharge(val: float) -> void:
func set_max_discharge(val: float) -> void:
max_discharge_rate = val
remotesync func set_max_charge(val: float) -> void:
func set_max_charge(val: float) -> void:
max_charge_rate = val
if manager != null:
manager.power_usage = val
remotesync func set_charge(val: float) -> void:
func set_charge(val: float) -> void:
current_charge = val
$Control/PowerUI.set_current_charge(current_charge)
func serialize():
return {
"current_charge": current_charge,
"max_charge_rate": max_charge_rate,
"max_discharge_rate": max_discharge_rate
}
func deserialize(data):
set_charge(data["current_charge"])
set_max_charge(data["max_charge_rate"])
set_max_discharge(data["max_discharge_rate"])

View File

@ -97,7 +97,6 @@ rect_scale = Vector2( 0.5, 0.5 )
[node name="ActivationRange" type="Area2D" parent="."]
visible = false
position = Vector2( 16, 16 )
input_pickable = false
script = ExtResource( 3 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="ActivationRange"]

View File

@ -2,13 +2,9 @@ extends Control
onready var scene = $"/root/scene" as GameInstance
func set_current_charge(val: float):
$Container/CurrentBox/HBoxContainer/CurrentChargeLabel.text = "(%.2fMJ)" % (val / 1000.0)
func set_current_charge(val):
$Container/CurrentBox/HBoxContainer/CurrentChargeLabel.text = "(" + str(round(val/10)/100) + "kJ)"
$Container/CurrentBox/ProgressBar.value = val
func set_max_charge(val: float):
$Container/CurrentBox/ProgressBar.max_value = val
func init_values(max_charge: float, max_discharge: float):
$Container/ChargeBox/SpinBox.value = int(max_charge)
$Container/ChargeBox/SpinBox2.value = int(max_discharge)

View File

@ -129,7 +129,7 @@ margin_bottom = 28.0
mouse_filter = 1
theme = ExtResource( 3 )
max_value = 200.0
suffix = "kW"
suffix = "W"
[node name="Discharge" type="Label" parent="Container/ChargeBox"]
material = ExtResource( 4 )
@ -148,6 +148,6 @@ margin_right = 186.0
margin_bottom = 60.0
mouse_filter = 1
theme = ExtResource( 3 )
max_value = 2000.0
max_value = 200.0
value = 200.0
suffix = "kW"
suffix = "W"

View File

@ -2,8 +2,3 @@ extends StaticBody2D
class_name GameObjectScanner
func serialize():
return {}
func deserialize(_data):
pass

View File

@ -1,5 +0,0 @@
extends Node2D
const MAX_HEALTH = 100.0
var health = MAX_HEALTH

View File

@ -5,22 +5,15 @@ const EPSILON = 0.1
const MAX_STAMINA = 3.0
const BOOST_COEFF = 50.0
const STAMINA_RECOVER_RATE = 0.3
const NET_KEY_TRANSFORM_DELAY = 0.2
var velocity = Vector2.ZERO
var grip = 1.0
var stamina = MAX_STAMINA
var speed_boost = 0
var transform_update_remaining = 0.0
puppet var pup_motion = Vector2.ZERO
puppet var pup_velocity = Vector2.ZERO
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
@ -28,49 +21,33 @@ func _ready():
$Camera.current = is_controlled
func _physics_process(delta):
var motion = Vector2.ZERO
if is_network_master():
if not scene.writing:
motion = Vector2(
Input.get_action_strength("ui_right")-Input.get_action_strength("ui_left"),
Input.get_action_strength("ui_down")-Input.get_action_strength("ui_up"))
# Check sprinting
var speed = BASE_SPEED
if Input.is_action_pressed("sprint") and not scene.writing:
if motion.length() > EPSILON and stamina > 0:
speed_boost += BOOST_COEFF * delta * ease(stamina/MAX_STAMINA, 1.1)
stamina -= delta
update()
else:
if stamina < MAX_STAMINA:
stamina += delta * STAMINA_RECOVER_RATE
update()
# Apply friction to speed boost and the boost itself, if any
if speed_boost > 0:
speed_boost /= 2
speed *= 1.0 + speed_boost
if speed_boost < EPSILON:
speed_boost = 0
# Set velocity
velocity = velocity * (1.0-grip) + motion.clamped(1.0) * speed * grip
rset("pup_motion", motion)
rset("pup_velocity", velocity)
rset("pup_transform", global_transform)
else:
velocity = pup_velocity
motion = pup_motion
if transform_update_remaining <= 0.0:
transform_update_remaining = NET_KEY_TRANSFORM_DELAY
global_transform = pup_transform
else:
transform_update_remaining -= delta
var motion = Vector2(
Input.get_action_strength("ui_right")-Input.get_action_strength("ui_left"),
Input.get_action_strength("ui_down")-Input.get_action_strength("ui_up"))
if motion.length() > EPSILON:
$Sprite/AnimationTree.set("parameters/direction/blend_position", motion)
# Check sprinting
var speed = BASE_SPEED
if Input.is_action_pressed("sprint"):
if motion.length() > EPSILON and stamina > 0:
speed_boost += BOOST_COEFF * delta * ease(stamina/MAX_STAMINA, 1.1)
stamina -= delta
update()
else:
if stamina < MAX_STAMINA:
stamina += delta * STAMINA_RECOVER_RATE
update()
# Apply friction to speed boost and the boost itself, if any
if speed_boost > 0:
speed_boost /= 2
speed *= 1.0 + speed_boost
if speed_boost < EPSILON:
speed_boost = 0
# Set velocity
velocity = velocity * (1.0-grip) + motion.clamped(1.0) * speed * grip
velocity = move_and_slide(velocity)
# Check what tile I'm on
@ -86,9 +63,8 @@ func set_is_controlled(val):
$Camera.current = val
func _draw():
if is_network_master():
if stamina+EPSILON < MAX_STAMINA:
draw_circle_arc_poly(Vector2(-10, -30), 6, 0, stamina/MAX_STAMINA * 360, Color.orange)
if stamina+EPSILON < MAX_STAMINA:
draw_circle_arc_poly(Vector2(-10, -30), 6, 0, stamina/MAX_STAMINA * 360, Color.orange)
func draw_circle_arc_poly(center, radius, angle_from, angle_to, color):
var nb_points = 32
@ -100,6 +76,3 @@ func draw_circle_arc_poly(center, radius, angle_from, angle_to, color):
var angle_point = deg2rad(angle_from + i * (angle_to - angle_from) / nb_points - 90)
points_arc.push_back(center + Vector2(cos(angle_point), sin(angle_point)) * radius)
draw_polygon(points_arc, colors)
func get_info():
return netgame.player_info[get_network_master()]

View File

@ -1,19 +1,14 @@
[gd_scene load_steps=6 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://Graphics/tgstation/sprites/Player.tscn" type="PackedScene" id=1]
[ext_resource path="res://Actors/Player/Player.gd" type="Script" id=2]
[ext_resource path="res://Actors/Player/BodyPart.gd" type="Script" id=3]
[sub_resource type="CapsuleShape2D" id=1]
radius = 10.4436
height = 5.44386
[sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 32, 32 )
[node name="Player" type="KinematicBody2D"]
z_index = 10
collision_layer = 8
script = ExtResource( 2 )
[node name="Camera" type="Camera2D" parent="."]
@ -23,31 +18,3 @@ position = Vector2( 0, -3 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )
[node name="Earing" type="Area2D" parent="."]
input_pickable = false
collision_layer = 32
collision_mask = 32
[node name="CollisionShape2D" type="CollisionShape2D" parent="Earing"]
shape = SubResource( 2 )
[node name="BodyParts" type="Node2D" parent="."]
[node name="Head" type="Node2D" parent="BodyParts"]
script = ExtResource( 3 )
[node name="Torso" type="Node2D" parent="BodyParts"]
script = ExtResource( 3 )
[node name="LeftArm" type="Node2D" parent="BodyParts"]
script = ExtResource( 3 )
[node name="RightArm" type="Node2D" parent="BodyParts"]
script = ExtResource( 3 )
[node name="LeftLeg" type="Node2D" parent="BodyParts"]
script = ExtResource( 3 )
[node name="RightLeg" type="Node2D" parent="BodyParts"]
script = ExtResource( 3 )

View File

@ -1,136 +0,0 @@
tool
extends Node2D
class_name ProbeArea
export(String) var area_name
export(NodePath) var wall_tilemap
export(NodePath) var base_tilemap
var debug_font = preload("res://Graphics/UI/uifont.tres")
const AREA_LAYER_ID = 16
onready var walls = get_node(wall_tilemap) as TileMap
onready var base = get_node(base_tilemap) as TileMap
onready var physics = get_world_2d().direct_space_state
onready var map = walls.get_parent() as GameMap
const TILE_SIZE = 32
var cells = {}
var bounds = {}
func _ready():
scout()
update()
func scout():
# Reset lists
cells = {}
bounds = {}
# Get origin and immediate neighbour of probe
var origin = Vector2(floor(position.x / TILE_SIZE), floor(position.y / TILE_SIZE))
cells[origin] = true
var queue = get_neighbours(origin)
# Use children probes for extra areas
for child in get_children():
var child_origin = Vector2(floor((position.x + child.position.x) / TILE_SIZE), floor((position.y + child.position.y) / TILE_SIZE))
cells[child_origin] = true
for neighbour in get_neighbours(child_origin):
queue.push_front(neighbour)
# Depth-first search
while not queue.empty():
var current = queue.pop_front()
# Have we checked this already?
if not is_valid(current):
continue
var wall_tile = walls.get_cellv(current)
if wall_tile == -1:
var objects = physics.intersect_point(current * TILE_SIZE + Vector2.ONE * TILE_SIZE / 2.0, 1, [], AREA_LAYER_ID)
if objects.size() > 0:
bounds[current] = true
else:
cells[current] = true
for neighbour in get_neighbours(current):
queue.push_front(neighbour)
else:
bounds[current] = true
# Join walls
var joined = []
for cell in bounds:
var sides = [
[Vector2(cell.x, cell.y-1),Vector2(cell.x, cell.y+1)],
[Vector2(cell.x-1, cell.y),Vector2(cell.x+1, cell.y)],
]
for side_pair in sides:
if cells.has(side_pair[0]) and cells.has(side_pair[1]):
# This bound is joined at one side, make it a cell and not a bound
joined.push_back(cell)
for wall in joined:
bounds.erase(wall)
cells[wall] = true
func is_valid(cell: Vector2) -> bool:
# Have we checked this already?
if cells.has(cell) or bounds.has(cell):
return false
# Is it a valid tile for an area
return base.get_cellv(cell) != -1
func get_neighbours(cell: Vector2) -> Array:
var neighbours = [
Vector2(cell.x-1, cell.y-1), Vector2(cell.x, cell.y-1), Vector2(cell.x+1, cell.y-1),
Vector2(cell.x-1, cell.y), Vector2(cell.x+1, cell.y),
Vector2(cell.x-1, cell.y+1), Vector2(cell.x, cell.y+1), Vector2(cell.x+1, cell.y+1)
]
var out = []
for neighbour in neighbours:
# Have we checked this already?
if not is_valid(neighbour):
continue
out.push_back(neighbour)
return out
func _draw():
if map == null or not map.debug_areas:
return
var origin = Vector2(floor(position.x / TILE_SIZE), floor(position.y / TILE_SIZE))
var draw_origin = origin * TILE_SIZE - position
var rect_size = Vector2.ONE * TILE_SIZE
draw_rect(Rect2(draw_origin, rect_size), Color.red, false, 2)
draw_string(debug_font, Vector2.ZERO, area_name, Color.blue)
for child in get_children():
var child_origin = Vector2(floor(child.position.x / TILE_SIZE), floor(child.position.y / TILE_SIZE))
draw_rect(Rect2(draw_origin + child_origin * TILE_SIZE, rect_size), Color.orange, false, 2)
draw_string(debug_font, child.position, area_name + "/" + child.name, Color.blue)
for wall in bounds:
draw_rect(Rect2(wall * TILE_SIZE - position + Vector2.ONE * (TILE_SIZE / 2.0 - TILE_SIZE / 4.0), rect_size/2.0), Color(0,0.5,1,0.5))
func _area_moved():
scout()
update()
func serialize():
var subareas = {}
for child in get_children():
subareas[child.name] = {
"transform": child.transform
}
return {
"name": area_name,
"wall_path": wall_tilemap,
"base_path": base_tilemap,
"subareas": subareas
}
func deserialize(data):
for subarea in data.subareas:
var node = Node2D.new()
node.name = subarea
node.transform = data.subareas[subarea].transform
add_child(node)
area_name = data.name
wall_tilemap = data.wall_path
base_tilemap = data.base_path

View File

@ -1,7 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://Actors/Systems/Area/AreaProbe.gd" type="Script" id=1]
[node name="AreaProbe" type="Sprite"]
script = ExtResource( 1 )
[connection signal="item_rect_changed" from="." to="." method="_area_moved"]

View File

@ -8,13 +8,13 @@ var neighbours = []
var network: PowerNetwork = null
master func _ready():
func _ready():
if network == null:
network = PowerNetwork.new()
network.add_node(self)
$"/root/scene/systems".add_child(network, true)
master func _physics_process(_delta):
func _physics_process(_delta):
if PowerNetwork.DEBUG:
update()
@ -25,13 +25,13 @@ func _draw():
var delta = (neighbour.global_position - global_position) / global_scale
draw_line(center, delta + center, network.debugColor, 2)
master func _got_neighbour(area: Area2D):
func _got_neighbour(area: Area2D):
if area == self:
return
if area.network == null:
area.network = network
network.rpc("add_node", area)
network.add_node(area)
elif area.network != network:
# Merge networks
network.rpc("join", area.network)
network.join(area.network)
neighbours.push_back(area)

View File

@ -14,7 +14,6 @@ a = Vector2( -16, 16 )
b = Vector2( 48, 16 )
[node name="ElProbe" type="Area2D"]
input_pickable = false
collision_layer = 4
collision_mask = 4
script = ExtResource( 1 )

View File

@ -9,7 +9,6 @@ var sockets = []
var total_source = 0
var total_usage = 0
var unpowered = 0
var debugColor = Color.cyan
@ -17,12 +16,12 @@ func _ready():
name = "PowerNetwork"
debugColor = Color.from_hsv(randf(), 0.8, 0.8)
remotesync func add_node(node) -> void:
func add_node(node) -> void:
nodes.append(node)
if "connections" in node:
sockets.append(node)
remotesync func remove_node(node) -> void:
func remove_node(node) -> void:
var node_idx = nodes.find(node)
if node_idx >= 0:
nodes.remove(node_idx)
@ -32,7 +31,7 @@ remotesync func remove_node(node) -> void:
# Do other splitting here
node.network = null
remotesync func join(network) -> void:
func join(network) -> void:
for node in network.nodes:
nodes.append(node)
node.network = self
@ -43,8 +42,6 @@ remotesync func join(network) -> void:
network.queue_free()
func _physics_process(_delta: float) -> void:
if not is_network_master():
return
# Recalculate power availability and usage
total_source = 0
total_usage = 0
@ -68,18 +65,14 @@ func _physics_process(_delta: float) -> void:
sources.append(manager)
# Update manager stats
var available_supply = total_source
unpowered = 0
for sink in sinks:
# Check if item can be powered this cycle
if sink.power_usage > 0:
if available_supply > sink.power_usage:
available_supply -= sink.power_usage
if not sink.powered:
sink.rpc("set_powered", true)
sink.powered = true
else:
if sink.powered:
sink.rpc("set_powered", false)
unpowered += 1
sink.powered = false
# Update available power to sinks
for sink in sinks:
sink.available = available_supply
@ -89,18 +82,3 @@ func _physics_process(_delta: float) -> void:
for source in sources:
var source_load = source.power_source / total_source * remaining_drain
source.power_load = source_load
func serialize():
var node_paths = []
var socket_paths = []
for node in nodes:
node_paths.append(get_path_to(node))
for socket in sockets:
socket_paths.append(get_path_to(socket))
return { "nodes": node_paths, "sockets": socket_paths }
func deserialize(data):
for node_path in data["nodes"]:
nodes.append(get_node(node_path))
for socket_path in data["sockets"]:
sockets.append(get_node(socket_path))

View File

@ -1,22 +0,0 @@
# Graphics
- Title screen background: [Star Nest by Pablo Roman Andrioli](https://www.shadertoy.com/view/XlfGRj) (MIT)
- All graphics in `Graphics/tgstation` is from [/tg/station](https://github.com/tgstation/tgstation) (CC BY-SA 3.0)
# Music
- Title screen music: [Je suis un Phoenix by BlueMillenium](http://ccmixter.org/files/Bluemillenium/61325) (CC BY-NC 3.0)
# Sound effects
- Door open/close sounds:
- [Hatch Seal.wav by Paul368 (freesound)](https://freesound.org/people/Paul368/sounds/264063/) (CC0 1.0)
- [SFX Door Open.wav by Paul368 (freesound)](https://freesound.org/people/Paul368/sounds/264061/) (CC0 1.0)
- Notification/beeps:
- [Chord Alert Notification by graham_makes (freesound)](https://freesound.org/people/graham_makes/sounds/457518/) (CC BY 3.0)
- [Messenger Notification Sounds by zzwerty (freesound)](https://freesound.org/people/zzwerty/sounds/315878/) (CC BY-NC 3.0)
- [Radio Sign Off by dylanh.sound (freesound)](https://freesound.org/people/dylanh.sound/sounds/524205/) (CC0 1.0)
# Code
- Uses the [GOTM API library](https://github.com/PlayGotm/GDGotm) from Macaroni Studios (MIT)

View File

@ -1,38 +0,0 @@
class_name Coordinates
static func as_string(coord: Vector2, include_subcoord: bool = false) -> String:
var x = floor(coord.x)
var y = floor(coord.y)
var main = as_string_parts(coord)
var sector_name = main[0] + main[1]
if include_subcoord:
sector_name += ".%02d/%02d" % [(coord.x - x) * 100, (coord.y - y) * 100]
return sector_name
static func as_string_parts(coord: Vector2) -> Array:
var x = floor(coord.x)
var y = floor(coord.y)
var x_str = to_letter(int(x))
var y_str = ""
if y < 0:
y_str = to_letter(int(y))
else:
y_str = str(int(y))
return [x_str, y_str]
static func to_letter(num: int) -> String:
#var letters = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if num == 0:
return "Α"
elif num < 0:
letters = "αβγδεζηθικλμνξοπρστυφχψω"
if num < 0:
num = -num
var out = ""
var base = letters.length()
while num > 0:
out = letters.substr(num % base, 1) + out
num /= base
return out

View File

@ -1,531 +0,0 @@
class_name Names
const first_names = [
"aakash","aamir","aaron","abbas","abby","abdul","abdullah","abe","abel","abhay",
"abhijeet","abhijit","abhilash","abhinav","abhishek","abigail","abraham","abu","ace","ada",
"adam","adarsh","adeel","adel","adi","adil","aditi","aditya","adnan","adolfo",
"adrian","adriana","adriano","adrienne","agnes","agnieszka","ahmad","ahmed","ahmet","ahsan",
"aida","aidan","aileen","aimee","aisha","aj","ajay","ajit","akash","akhil",
"akshay","al","alaa","alain","alan","alana","albert","alberto","aldo","ale",
"alec","alejandra","alejandro","aleksandra","alessandra","alessandro","alex","alexa","alexander","alexandr",
"alexandra","alexandre","alexandria","alexandru","alexey","alexis","alfonso","alfred","alfredo","ali",
"alice","alicia","alina","aline","alireza","alisa","alisha","alison","alissa","alistair",
"allan","allen","allie","allison","ally","allyson","alma","alok","alvaro","alvin",
"alyssa","amal","aman","amanda","amar","amber","amelia","american","ami","amie",
"amin","amina","amine","amir","amit","amol","amos","amr","amy","ana",
"anand","anas","anastasia","anders","anderson","andi","andre","andrea","andreas","andreea",
"andrei","andres","andrew","andrey","andré","andrés","andy","angel","angela","angelica",
"angelina","angelo","angie","angus","anh","ani","anil","anish","anita","anjali",
"ankit","ankita","ankur","ann","anna","anne","annette","annie","anoop","anshul",
"anthony","antoine","antoinette","anton","antonia","antonio","antony","antónio","anu","anuj",
"anup","anurag","anwar","anya","apple","april","archie","ari","ariel","arif",
"arjun","arlene","armand","armando","arnaud","arnold","arpit","arshad","art","artem",
"arthur","artur","arturo","arun","arvind","asad","ash","asha","asher","ashish",
"ashleigh","ashley","ashok","ashraf","ashton","ashutosh","ashwin","asif","asim","astrid",
"athena","atif","atul","aubrey","audrey","augusto","aurora","austin","autumn","ava",
"avery","avi","avinash","axel","ayesha","ayman","ayush","aziz","bailey","bala",
"balaji","barb","barbara","barney","baron","barry","bart","basil","beatrice","beatriz",
"beau","becca","becky","bee","belinda","bella","ben","benedict","benjamin","benny",
"benoit","benson","bernadette","bernard","bernardo","bernie","bert","best","beth","bethany",
"betsy","betty","bev","beverly","bhanu","bharat","bianca","big","bilal","bill",
"billie","billy","bjorn","black","blaine","blair","blake","blanca","blue","bob",
"bobbi","bobbie","bobby","bogdan","bonnie","boris","boyd","brad","bradford","bradley",
"brady","brandi","brandon","brandy","brenda","brendan","brendon","brent","bret","brett",
"brian","brianna","bridget","bright","brigitte","britt","brittany","brittney","brock","brooke",
"bruce","bruno","bryan","bryant","bryce","buck","bud","butch","byron","caio",
"caitlin","cal","caleb","calvin","cam","cameron","camila","camilla","camille","camilo",
"candace","candice","candy","captain","cara","carey","cari","carina","carl","carla",
"carlo","carlos","carlton","carly","carmen","carol","carole","carolina","caroline","carolyn",
"carrie","carson","carter","cary","caryn","casey","cassandra","cassie","catalina","catherine",
"cathy","cecil","cecilia","cedric","celeste","celia","cesar","chad","chaitanya","chan",
"chance","chandan","chandler","chandra","chantal","charity","charlene","charles","charley","charlie",
"charlotte","charmaine","chas","chase","chaz","chelsea","chen","cheri","cherie","cherry",
"cheryl","chester","chet","chetan","chi","chiara","chip","chirag","chloe","chris",
"chrissy","christa","christi","christian","christie","christina","christine","christoph","christophe","christopher",
"christy","chuck","cindi","cindy","cj","claire","clara","clare","clarence","clark",
"claude","claudia","claudio","clay","clayton","clement","cliff","clifford","clifton","clint",
"clinton","clive","clyde","cody","cole","colette","colin","colleen","collin","collins",
"connie","connor","conor","conrad","constance","cora","corey","corinne","cory","courtney",
"craig","cris","cristian","cristiano","cristina","crystal","curt","curtis","cyndi","cynthia",
"cyril","cyrus","césar","daisy","dakota","dale","dalia","dallas","dalton","damian",
"damien","damon","dan","dana","dane","dani","daniel","daniela","daniele","daniella",
"danielle","danilo","danish","danny","dante","daphne","dara","darcy","daren","daria",
"darin","dario","darius","darla","darlene","darrel","darrell","darren","darrin","darryl",
"darshan","darwin","daryl","dave","david","davide","davis","dawn","dean","deanna",
"deb","debbie","debby","debi","deborah","debra","dee","deep","deepa","deepak",
"deirdre","dejan","delia","delores","dena","denis","denise","dennis","denny","derek",
"derrick","desiree","desmond","destiny","devendra","devin","devon","dexter","dheeraj","dhiraj",
"dhruv","diana","diane","dianna","dianne","dick","diego","dilip","dillon","dima",
"dimitri","dimitris","dina","dinesh","dino","diogo","dion","dirk","divya","dmitri",
"dmitriy","dmitry","dolly","dolores","dom","dominic","dominick","dominique","don","donald",
"donna","donnie","donny","donovan","dora","doreen","dorian","doris","dorothy","doug",
"douglas","drake","drew","duane","duke","duncan","dustin","dusty","dwayne","dwight",
"dylan","earl","ed","eddie","eddy","edgar","edith","edmond","edmund","edna",
"edson","eduard","eduardo","edward","edwin","ehsan","eileen","ekaterina","el","elaine",
"eleanor","elena","eleni","eli","elias","elie","elijah","elisa","elisabeth","elise",
"elisha","eliza","elizabeth","ella","elle","ellen","ellie","elliot","elliott","elmer",
"elsa","elsie","elvis","emanuel","emeka","emil","emilia","emilie","emilio","emily",
"emma","emmanuel","enrico","enrique","eric","erica","erich","erick","ericka","erik",
"erika","erin","ernest","ernesto","ernie","errol","erwin","esteban","esther","ethan",
"etienne","eugene","eunice","eva","evan","evans","eve","evelyn","everett","ezra",
"fabian","fabien","fabio","fadi","fahad","faisal","faith","farah","farhan","farid",
"fatima","faye","federico","felicia","felipe","felix","fernanda","fernando","filip","filipe",
"fiona","flavio","flora","florence","florian","floyd","forbes","forrest","fran","frances",
"francesca","francesco","francine","francis","francisco","franco","francois","frank","frankie","franklin",
"franz","fred","freddie","freddy","frederic","frederick","fredrick","fredrik","fritz","gabby",
"gabe","gabriel","gabriela","gabriele","gabriella","gabrielle","gaby","gail","gale","galina",
"ganesh","gareth","garrett","garry","gary","gaurav","gautam","gavin","gayle","gemma",
"gene","genevieve","geo","geoff","geoffrey","george","georges","georgia","georgina","gerald",
"geraldine","gerard","gerardo","geri","german","gerry","gideon","gigi","gil","gilbert",
"gilberto","gilles","gillian","gina","ginger","ginny","gino","gio","giorgi","giorgio",
"giovanni","girish","gisele","giuseppe","gladys","glen","glenda","glenn","gloria","godfrey",
"godwin","gonzalo","gopal","goran","gordon","govind","grace","graeme","graham","grant",
"green","greg","gregg","gregory","greta","gretchen","guido","guilherme","guillaume","guillermo",
"gus","gustavo","gwen","gwendolyn","hadi","hai","hal","haley","hamid","hamza",
"han","hana","hani","hank","hanna","hannah","hans","happy","hardik","hari",
"haris","harish","harley","harold","harriet","harris","harrison","harry","harsh","harsha",
"harvey","hasan","hassan","hayden","hayley","hazel","heath","heather","hector","heidi",
"helen","helena","helene","hemant","henri","henrik","henrique","henry","herb","herbert",
"herman","hilary","hillary","himanshu","hitesh","hoang","holly","hong","hope","howard",
"hubert","hugh","hugo","humberto","hung","hunter","hussain","hussein","huy","héctor",
"iain","ian","ibrahim","ida","ignacio","igor","ike","ilona","ilya","iman",
"imran","ina","inga","ingrid","inna","ioana","ira","irena","irene","irfan",
"irina","iris","irma","irving","isaac","isabel","isabella","isabelle","isaiah","ismael",
"ismail","israel","ivan","ivana","ivo","ivy","jack","jacki","jackie","jackson",
"jacky","jaclyn","jacob","jacqueline","jacquelyn","jacques","jacqui","jacquie","jade","jae",
"jai","jaime","jake","jakob","jakub","jamal","james","jami","jamie","jamil",
"jan","jana","jane","janelle","janet","janette","janice","janie","janine","janis",
"jared","jarrett","jarrod","jasmin","jasmine","jason","jasper","jatin","javier","jay",
"jayne","jayson","jc","jd","jean","jeanette","jeanie","jeanine","jeanne","jeannette",
"jeannie","jed","jeff","jefferson","jeffery","jeffrey","jelena","jen","jenifer","jenn",
"jenna","jenni","jennie","jennifer","jenny","jens","jeremiah","jeremy","jeri","jeroen",
"jerome","jerry","jesper","jess","jesse","jessica","jessie","jesus","jhon","jill",
"jillian","jim","jimmie","jimmy","jin","jing","jitendra","jo","joan","joana",
"joann","joanna","joanne","joao","joaquin","jocelyn","jodi","jodie","jody","joe",
"joel","joelle","joey","johan","johann","johanna","john","johnathan","johnnie","johnny",
"johnson","jojo","jon","jonah","jonas","jonathan","jonathon","joni","jonny","jordan",
"jordi","jorge","jose","josef","joseph","josephine","josh","joshua","josie","josue",
"josé","joy","joyce","joão","jp","jr","juan","juanita","jude","judi",
"judith","judy","jules","julia","julian","juliana","julie","julien","juliet","julio",
"julius","jun","junaid","june","junior","just","justin","justine","jyoti","kai",
"kaitlyn","kamal","kamil","kamran","kapil","kara","karan","kareem","karen","kari",
"karim","karin","karina","karl","karla","karolina","karthik","kartik","karyn","kasey",
"kashif","kasia","kat","katarina","kate","katelyn","katerina","katharine","katherine","kathi",
"kathie","kathleen","kathryn","kathy","katia","katie","katrina","katy","katya","kaushik",
"kay","kayla","kc","keisha","keith","kelley","kelli","kellie","kelly","kelsey",
"kelvin","ken","kendall","kendra","kennedy","kenneth","kenny","kent","keri","kerri",
"kerry","ketan","kevin","khaled","khalid","kieran","kim","kimberley","kimberly","king",
"kingsley","kira","kiran","kirk","kirsten","kishore","kit","kitty","klaus","kofi",
"konstantin","kris","krishna","krista","kristen","kristi","kristian","kristie","kristin","kristina",
"kristine","kristy","krystal","krzysztof","kumar","kunal","kurt","kwame","kyle","kylie",
"la","lacey","lady","lakshmi","lalit","lana","lance","lane","lara","larissa",
"larry","lars","laura","laurel","lauren","laurence","laurent","lauri","laurie","lawrence",
"le","lea","leah","leandro","leanne","lee","lei","leigh","leila","leland",
"len","lena","lenny","leo","leon","leonard","leonardo","leroy","lesley","leslie",
"lester","leticia","levi","lewis","lex","li","lia","liam","libby","lidia",
"lilian","liliana","lillian","lilly","lily","lim","lin","lina","lincoln","linda",
"lindsay","lindsey","linh","lionel","lisa","lise","little","liz","liza","lizzie",
"lloyd","logan","lois","lokesh","lola","long","lonnie","lora","lord","loren",
"lorena","lorenzo","loretta","lori","lorna","lorraine","lou","louie","louis","louisa",
"louise","lourdes","love","lowell","lu","luc","luca","lucas","lucia","luciana",
"luciano","lucky","lucy","luigi","luis","luisa","luiz","lukas","luke","luz",
"luís","lydia","lyle","lyn","lynda","lynette","lynn","lynne","ma","mac",
"mack","madeline","madhav","madison","magda","magdalena","maggie","magnus","mahendra","mahesh",
"mahmoud","mai","maja","malcolm","malik","mallory","mandy","mani","manish","manisha",
"manny","manoj","manu","manuel","manuela","mara","marc","marcel","marcela","marcelo",
"marci","marcia","marcie","marcin","marcio","marco","marcos","marcus","marcy","marek",
"margaret","margarita","margie","margo","mari","maria","mariah","mariam","marian","mariana",
"marianna","marianne","mariano","marie","marilyn","marina","mario","marion","marisa","marisol",
"marissa","maritza","marius","marjorie","mark","marko","markus","marla","marlene","marlon",
"marsha","marshall","marta","martha","marti","martin","martina","marty","marvin","mary",
"maryam","maryann","maría","mason","massimo","mat","matheus","mathew","mathieu","matt",
"matteo","matthew","matthias","maura","maureen","maurice","mauricio","mauro","max","maxim",
"maxine","maxwell","may","maya","mayank","mayra","mayur","md","md.","meagan",
"meg","megan","megha","meghan","mehdi","mehmet","mehul","mel","melanie","melinda",
"melissa","melody","melvin","mercedes","meredith","mia","micah","michael","michaela","michal",
"micheal","michel","michele","michelle","mick","mickey","miguel","mihaela","mihai","mikael",
"mike","mikey","mikhail","miki","mila","milan","milena","miles","millie","milos",
"milton","mimi","min","mina","mindy","ming","minh","mir","mira","miranda",
"miriam","miss","missy","mister","misty","mitch","mitchell","mj","mo","moe",
"mohamad","mohamed","mohammad","mohammed","mohan","mohd","mohit","mohsin","moises","molly",
"mona","monica","monika","monique","morgan","morris","morten","moses","moshe","mostafa",
"muhammad","muhammed","mukesh","murali","murat","murray","musa","mustafa","mustapha","my",
"myles","myra","myron","nabil","nadeem","nadia","nadine","nana","nancy","naomi",
"narendra","naresh","nasir","nat","natalia","natalie","natasha","nate","nathalie","nathan",
"nathaniel","naveed","naveen","navin","neal","ned","neeraj","neha","neil","nelly",
"nelson","neo","nestor","new","ng","nguyen","nic","nicholas","nichole","nick",
"nicki","nicky","nico","nicola","nicolas","nicole","nidhi","niels","nigel","nik",
"nikhil","niki","nikita","nikki","nikola","nikolay","nikos","nilesh","nina","nino",
"niraj","nirmal","nisha","nishant","nita","nitesh","nitin","noah","noel","noelle",
"nolan","noor","nora","norm","norma","norman","not","nuno","nur","oksana",
"ola","old","oleg","olga","oliver","olivia","olivier","omar","omer","orlando",
"osama","oscar","osman","osvaldo","otto","owen","pablo","paco","paige","pam",
"pamela","pankaj","paola","paolo","parker","parth","pascal","pastor","pat","patrice",
"patricia","patrick","patsy","patti","patty","paul","paula","paulette","paulina","pauline",
"paulo","pavan","pavel","pawan","pearl","pedro","peggy","penelope","penny","per",
"perry","pete","peter","petr","petra","phil","philip","philippe","phillip","phoebe",
"phoenix","phuong","phyllis","pia","pierre","pieter","piotr","piyush","pj","polly",
"pooja","poonam","pradeep","prakash","pramod","pranav","prasad","prasanna","prashant","prashanth",
"prateek","pratik","praveen","pravin","precious","preeti","prem","preston","prince","princess",
"priscilla","priya","priyanka","puneet","quang","quentin","quinn","rachael","rachel","rachelle",
"radu","rae","rafael","raghu","rahul","rainer","raj","raja","rajan","rajat",
"rajeev","rajendra","rajesh","rajiv","raju","rakesh","ralph","ram","rama","raman",
"ramesh","rami","ramiro","ramon","ramona","rana","randal","randall","randi","randolph",
"randy","ranjeet","raphael","raquel","rashid","rashmi","raul","raven","ravi","ravindra",
"ray","raymond","real","rebecca","rebekah","red","reed","reggie","regina","reginald",
"reid","rekha","renata","renato","rene","renee","rené","reuben","rex","rey",
"reza","rhonda","ria","ric","ricardo","riccardo","rich","richa","richard","richie",
"rick","ricky","rico","riley","rishabh","rishi","rita","ritesh","ritu","rizwan",
"rj","rob","robb","robbie","robby","robert","roberta","roberto","robin","robyn",
"rocco","rochelle","rocio","rocky","rod","roderick","rodger","rodney","rodolfo","rodrigo",
"rogelio","roger","rogerio","rohan","rohit","roland","rolando","rolf","roman","romeo",
"ron","ronald","ronaldo","ronda","roni","ronnie","ronny","rory","rosa","rosanne",
"rosario","rose","rosemarie","rosemary","roshan","rosie","ross","roxana","roxanne","roy",
"royce","ruben","ruby","rudy","rui","ruslan","russ","russell","rusty","ruth",
"ryan","saad","sabina","sabrina","sachin","saeed","sagar","sahil","sai","said",
"saif","sajid","sal","salah","salim","sally","salman","salvador","salvatore","sam",
"samantha","sameer","samer","sami","samir","sammy","samson","samuel","san","sana",
"sandeep","sandi","sandip","sandra","sandro","sandy","sanjay","sanjeev","santhosh","santiago",
"santosh","sara","sarah","sascha","sasha","satish","satya","saul","saurabh","saurav",
"savannah","sayed","scot","scott","sean","sebastian","sebastien","seema","senthil","serena",
"serge","sergei","sergey","sergio","seth","shah","shahid","shahzad","shan","shana",
"shane","shankar","shanna","shannon","shantanu","sharad","shari","sharon","shashank","shashi",
"shaun","shauna","shawn","shawna","shay","sheena","sheila","shelby","sheldon","shelley",
"shelly","sheri","sherif","sherman","sherri","sherrie","sherry","sheryl","shirley","shiv",
"shiva","shivam","shoaib","shruti","shubham","shweta","shyam","sid","siddharth","sidney",
"silver","silvia","simon","simona","simone","siobhan","siva","sky","skyler","smith",
"sneha","sofia","solomon","sonali","sonia","sonja","sonny","sonya","sophia","sophie",
"spencer","sri","sridhar","srikanth","srinivas","sriram","stacey","stacie","stacy","stan",
"stanley","star","stefan","stefanie","stefano","stella","steph","stephan","stephane","stephanie",
"stephen","sterling","steve","steven","stewart","stu","stuart","su","sudhir","sue",
"suman","sumit","sunil","sunny","suraj","suresh","surya","susan","susana","susanna",
"susanne","sushant","sushil","susie","suzan","suzanne","suzi","suzie","suzy","sven",
"svetlana","swapnil","swati","sydney","syed","sylvia","sérgio","tabitha","tam","tamara",
"tamer","tami","tammie","tammy","tan","tania","tanja","tanner","tanya","tara",
"tarek","tariq","tarun","taryn","tasha","tatiana","taylor","tech","ted","teddy",
"tee","tejas","terence","teresa","teri","terrance","terrence","terri","terry","tess",
"tessa","thanh","theo","theodore","theresa","therese","thiago","thierry","thom","thomas",
"tia","tiago","tiffany","tim","timmy","timothy","tin","tina","tj","tobias",
"toby","tod","todd","tom","tomas","tomasz","tommy","toni","tony","tonya",
"tori","tracey","traci","tracie","tracy","tran","travis","trent","trevor","trey",
"tricia","trina","trish","trisha","tristan","troy","trudy","tuan","tushar","tyler",
"tyrone","tyson","uday","uma","umair","umar","umesh","ursula","usman","vadim",
"vaibhav","val","valentina","valeria","valerie","van","vanessa","varun","vaughn","venkat",
"venkatesh","vera","vernon","veronica","veronika","vic","vicente","vicki","vickie","vicky",
"victor","victoria","vijay","vikas","vikram","viktor","vinay","vince","vincent","vineet",
"vinicius","vinny","vinod","vipin","vipul","virginia","vishal","vishnu","vitor","vivek",
"vivian","vlad","vladimir","wade","waleed","walid","wallace","wally","walt","walter",
"wan","wanda","wang","waqas","warren","wayne","wei","wendell","wendy","wes",
"wesley","whitney","wil","will","william","williams","willie","willis","willy","wilma",
"wilson","winnie","winston","wolf","wolfgang","wong","wyatt","xavier","xiao","yan",
"yana","yang","yash","yasir","yasmin","yasser","yi","ying","yogesh","yolanda",
"yong","young","youssef","yu","yulia","yuri","yusuf","yves","yvette","yvonne",
"zac","zach","zachary","zack","zain","zak","zane","zeeshan","zoe"
]
const last_names = [
"aakre","aardema","aas","abdelal","abdool","abe","abela","abington","abney","abramovitz",
"abrantes","acal","aceret","achane","acken","addiego","adkins","aeschliman","afshari","agee",
"agel","airington","akhavan","alampi","alas","albang","albee","alcala","alcine","aldarondo",
"alexakis","alexandre","alfson","aliotta","allegrini","allgire","alosa","alperin","altman","altomari",
"altrogge","alvarracin","alward","aman","amauty","amedro","amigon","amiri","amolsch","amon",
"amoros","amsberry","analla","andalora","andelman","anderst","andras","andreasen","anecelle","angel",
"angelbeck","angeloro","ankrapp","ankrum","ansbro","antillon","antinarelli","antonsen","antony","apker",
"appell","apt","aracena","aragus","arbuthnot","arciniega","ardizzone","ardon","areias","arena",
"arflack","argenziano","argrave","arhart","aristide","arizola","armagost","armbruster","arnoux","arnstein",
"aronhalt","aruizu","asam","asch","asenjo","aspell","asperheim","asselta","assum","astorino",
"astudillo","athayde","atkins","attwood","auld","auman","austria","auxier","auzston","avansino",
"avanzato","avera","aversano","awyie","ayalla","azua","azzopardi","babbin","babikian","bach",
"bachrodt","bacot","badey","badolato","baggesen","baham","bahnsen","bair","baisch","baitg",
"bajdas","bajwa","bakst","balboa","balerio","baltazor","balthrop","banco","banducci","bankowski",
"bann","bannister","banowetz","bansal","bantin","baptiste","bara","baranga","barbaro","barbella",
"barbie","barcus","barden","barentine","barkley","barmer","barner","barnett","barras","barsamian",
"bartholemew","bartles","bartsch","basley","bass","bastain","bathe","batiste","batrum","battani",
"battiato","baudino","baudoin","bauers","baugess","baurer","bayona","bazzle","beagley","bear",
"bears","beatley","beaty","bedeau","beerling","begg","beilinson","beine","beitzel","belasco",
"belich","bellingtier","bellion","belski","benedetti","beneke","benes","benett","bennice","benston",
"benyamin","berardo","berdecia","bergenstock","bergfield","berlinski","bernabe","bernheim","berschauer","bertschy",
"besser","bessire","betcher","bethany","betsinger","betters","beulah","beutler","bevard","beverlin",
"biasi","biber","biebel","biehle","bilger","billa","billiter","bing","birak","birchall",
"birdine","birdinground","biscardi","bisconer","bisset","black","blacksmith","blackstar","blagg","blailock",
"blakney","blankship","blann","blasen","blasko","blaylock","bleecker","bless","blinka","blondin",
"blood","bloschichak","bluemel","blurton","blute","boardley","boatner","bochenek","boches","boedecker",
"boenig","boese","boesel","bogacz","bogdanski","bogden","bohrer","boken","bolinder","bolinsky",
"bolitho","bomar","bombaci","bonebright","bonnell","bookman","borde","borell","borghi","borkenhagen",
"borquez","borries","borrow","boruvka","boshers","boston","botras","bouges","bouman","boushie",
"boutot","bouwens","bowels","bowne","boxley","braatz","bradd","braham","brame","branaugh",
"branch","branstrom","brassil","bratten","braund","brendeland","brennon","breslin","bresolin","breutzmann",
"bria","briano","brichetto","briede","brien","brigges","brinson","briskey","broddy","brode",
"brodfuehrer","brofman","bronsky","bronzo","brood","brookes","brozek","brozyna","bruccoleri","brugal",
"brumley","brumwell","brunjes","brustmann","brwon","bryars","bryson","brzostowski","buban","buccieri",
"buchinski","buchna","buckwald","buening","buffaloe","buffin","bukhari","bulin","bullivant","bunning",
"buntin","bunting","burdge","burford","burgardt","burget","burhans","burigsay","burkhalter","burkhead",
"burman","burrola","burruss","burttram","buscemi","buseman","busk","bussen","buteux","buther",
"buttimer","button","butzke","byker","byrom","cabugos","caddy","cadena","cafasso","cake",
"calamia","calderon","callagher","callam","calle","callo","calnick","calnimptewa","camack","camino",
"campus","campuzano","cancino","canedy","canela","cantor","capozzoli","cappelluti","cappetta","capriola",
"capurro","caraig","carbon","cardamone","carinio","carlberg","carlozzi","caronna","carrin","carrington",
"cartier","casagrande","casalenda","casalman","casareno","caselton","castellana","caston","catalanatto","cataldi",
"cates","catherman","catoire","caudy","caviggia","cavins","cayo","cecchinato","cecilio","cedillo",
"cellini","celso","cerami","ceraos","cerchia","cerdan","cerni","cerreta","cerverizzo","cervoni",
"chaboya","chadd","chafetz","chaidez","chanady","chanley","chareunsri","chaskey","chastain","chasteen",
"chatcho","chaudoin","chauhan","chavies","cheairs","cheeves","chelette","chernoff","cherny","chesla",
"chiaro","chichester","chindlund","chopp","christenbury","christoffer","chupp","churley","cichy","cidre",
"cinnamond","cinotti","cintra","ciocca","cippina","circle","cito","citrino","ciulla","civiello",
"civils","clairday","clapham","claussen","clayter","clem","clemmon","clester","clive","cloepfil",
"clopton","clutts","cobane","cockley","cofield","cohea","cokely","colbert","colclasure","colegrove",
"coleman","coleson","colletta","collette","colletti","colony","come","comisky","compono","conant",
"conboy","conceicao","condiff","cong","connaughton","conninghan","connon","conoly","conrow","cooperider",
"copps","corf","cornford","corporan","correia","corseri","corso","corvelli","costantini","cotterman",
"coulbourne","coult","coutcher","coven","cozine","crabill","craigen","cranor","crapp","crawshaw",
"cray","crazier","creason","credo","cremona","crepeau","crim","cripe","cristal","cristales",
"cronce","crumbliss","crumpton","cuadrado","cubie","cucuta","cuddington","culbreth","culliton","culverson",
"cunliffe","curboy","curi","curnow","curra","cussen","cuthbertson","cutillo","cutshaw","cuzman",
"cyler","czapla","czartoryski","dagostino","dahlman","dakin","dallam","dandurand","danehy","danese",
"danielovich","danley","danoski","dantuono","daprile","darbeau","darsch","darsey","dashner","datu",
"dausch","davel","davick","davidsmeyer","deaguero","dean","deardon","debettignies","debiew","debolt",
"debrita","decastro","decent","dechart","decourley","degele","degener","degori","degraffenreid","deibler",
"deichmann","deihl","deinhardt","dejes","dejongh","deleppo","delgado","delhoyo","delille","delilli",
"delio","dellbringge","delmonico","delorenzo","delsol","demasters","demeester","demello","demery","demirchyan",
"demling","demma","demmon","dempewolf","demske","dentler","depa","deperte","depoyster","deppner",
"dequattro","derer","derickson","derocco","derwin","deserio","deserres","desisles","desmet","desrevisseau",
"desrosier","dettmering","detty","deubler","deutschendorf","devai","devargas","devenport","devier","dewinter",
"dhaliwal","dhruva","diachenko","dibernardo","dicker","dietterick","digiulio","dignan","dijulio","dilbeck",
"dillworth","dimaggio","dimino","dingell","dinkin","dinn","diosdado","dirado","disher","diskind",
"divincenzo","dobrinin","doby","doe","dolby","dolder","dolecek","dolecki","dolezal","domann",
"domenick","dominiguez","donaldson","donelly","donning","dorantes","doriean","dorland","dorlando","dornellas",
"dorney","dose","dotie","doub","double","dougharity","douthit","dovalina","doxbeck","drach",
"drago","drayer","drennen","drenon","dreyfus","driesbach","droke","drow","dubiansky","dudek",
"dueno","dufek","duignan","dukes","dulatre","dumdei","duncanson","duncker","dunlavy","dunshie",
"dupuy","durrett","dust","dyba","dyer","dymke","dys","dzurnak","earheart","echavarria",
"edd","edenfield","edgman","edland","edmons","eggink","egidio","egland","egle","egvirre",
"eilbert","eisman","ekas","ekwall","eldreth","elery","elewa","elgas","eliezrie","elrod",
"elsey","emrich","eng","engebretsen","engelhard","engelmeyer","ennett","enrico","equils","erdelt",
"erichsen","ernstes","erp","ertel","escalera","escamilla","escober","escovedo","esenwein","esguerra",
"eskaran","eskin","espenoza","espina","essaid","estus","etters","eubank","eugley","evatt",
"everage","exantus","eylicio","ezpeleta","fabin","fagley","fahrenbruck","fahringer","faigin","fairbanks",
"falconi","falker","fallin","falling","fallon","faltin","fandino","fannin","fantasia","farah",
"farahkhan","fare","fargnoli","farish","faro","farran","fason","fassett","fauset","favela",
"fay","fazzinga","fearing","fearon","fechner","fechtig","fedoriw","fedorka","feduniewicz","fefer",
"feilbach","fellin","feltenberger","fendley","fenniwald","fent","ferandez","ferenc","ferlenda","fernette",
"ferrato","feurtado","fidell","figurelli","fili","fillion","finco","finkenbinder","finseth","firkins",
"firpi","fiser","fitchett","fitzgibbons","fitzsimons","fjetland","flagge","fleeger","fleeks","fletes",
"flinders","flister","flore","florek","florio","fluhman","fluitt","foersterling","foglia","foller",
"follick","fontenelle","forand","forehand","foriest","forpahl","fortunato","foss","fossati","fosser",
"fouracre","fower","foxman","fraine","franck","frankovich","franzoni","frayre","fredicks","freed",
"freitag","friddell","friedler","friehe","friess","frischkorn","fruehauf","fucile","fujita","fulena",
"fulfer","gaar","gabby","gable","gagarin","gagner","galanga","galdi","gale","galea",
"galla","gallaspy","gama","gambill","gammond","gappa","garacia","garate","garbe","garces",
"garcy","gargano","garis","garnette","garon","garrell","garrod","garwin","garwood","gasiewski",
"gather","gathman","gatliff","gaubert","gaukroger","gauron","gebel","gebo","geitner","gelbach",
"gellatly","gencarelli","gendreau","genetti","genous","gerdeman","gergen","gerhauser","gerich","geronime",
"gerosa","gettman","getzlaff","ghelfi","giacchi","gianopulos","gibbs","gica","giddins","gierman",
"gilbar","gilfillan","gimble","ging","gioe","girgenti","girouard","gittere","gjorven","gladstein",
"glascoe","glise","glista","glunz","gnerre","go","gobea","gobler","godard","godbe",
"godsey","goedicke","goettig","goffigan","gogan","goldhammer","goldklang","goliday","goligoski","goluba",
"gomillion","gonseth","gooden","goral","gordy","gorovitz","goshay","gosnell","gossack","goswami",
"gotlib","gottdenger","gottke","goudelock","goutremout","grabenstein","gradert","graef","grammes","granai",
"granger","granizo","gras","grav","greenwood","greeson","gremo","griffo","grismer","groeschel",
"grondin","groover","groshans","grove","grulke","gruska","grussing","grzesiak","guadarrama","guareno",
"gueits","guerriero","gugel","guggenheim","guilfoos","guillebeau","guire","guler","gundert","gunnell",
"gunstream","guntert","gussler","guster","gutreuter","guttenberg","gutteridge","guzowski","hable","hackbart",
"hade","hadley","hadsell","haegele","hafer","hagele","hagemeier","hagle","hahnert","haifley",
"haigwood","haimes","hainsworth","hairgrove","hairston","hakala","hakeem","haldiman","halfhill","hallahan",
"hallee","hallo","halo","halt","halverson","hamblin","hammonds","hammons","hanken","hanline",
"hansing","hansley","hanson","hanten","harbert","harbison","harbuck","harcey","hard","hardi",
"hardway","harer","harian","harke","harkenreader","harles","haroun","harrigan","hartlep","harvard",
"haseman","hasper","hass","hassel","hassick","haswell","hathorn","hatman","hauan","haughey",
"haury","haward","hawk","hawkes","hawthorne","haza","head","heartley","heberly","heddins",
"heeren","heflin","heidgerken","heinicke","heinis","heishman","heiss","hejl","helfen","helfritz",
"helgerman","helgeson","hellickson","helman","helphinstine","hemberger","hembry","hemker","hemmings","hemon",
"henzel","heraty","herkstroeter","herley","hermance","hernon","herrara","herrero","herres","herstad",
"hetcher","hett","hettenhausen","hetzler","heuett","heyne","hikel","hilaire","hillers","hinajosa",
"hinesley","hinh","hinley","hinman","hinokawa","hironaka","hirschhorn","hirschman","hiskey","hitsman",
"hittman","hjelle","hobgood","hoffelt","hogancamp","hohnstein","holderfield","holding","hollaway","holling",
"hollinger","hollow","holmlund","holstad","holtzlander","holzhauer","honeycott","honeycutt","hoopingarner","hooser",
"hopman","hoppenrath","hora","hortman","hotchkin","houpt","houston","hoven","hoye","hronick",
"hubert","huckins","huckle","hudelson","hudnut","huehn","huffines","hugee","hugel","hughes",
"hughey","huizenga","hulmes","humbles","hume","hunker","hurns","huskins","husmann","huxford",
"huyett","huynh","hwang","hylle","iacobellis","iadarola","iannuzzi","ida","iffert","ifill",
"ilalio","imdieke","imus","ingargiola","inghem","inghram","ingmire","ink","insogna","iqbal",
"irland","irsik","iwanejko","jaap","jackon","jaggers","jagoda","jagoe","jakubczak","jandrey",
"jandrin","janicki","jarecke","jarencio","jarosz","jarzynka","jaubert","jauregui","jauss","jeans",
"jehlicka","jendro","jennifer","jenniges","jeon","jergen","jeschke","jex","jividen","joehnck",
"jonassen","jone","jons","jordt","jorinscay","josephs","juariqui","jubie","juenemann","jukich",
"jumbo","jungbluth","jurica","justiss","ka","kadlec","kady","kaeding","kaercher","kagy",
"kajder","kalfayan","kalina","kaltefleiter","kaniecki","kao","kaopua","kapanke","kapps","kara",
"karren","karsh","kasahara","kassa","kassler","kaszynski","kaui","kazmierczak","keane","keba",
"keblish","keesey","keeter","keiper","keirstead","keiser","keitzer","kellam","kellin","kemick",
"kempker","kempner","kempon","kemppainen","keniry","kennington","keobaunleuang","keomanivong","kerechanko","kersh",
"kerss","kesley","ketcham","kettenring","kevan","kevwitch","keyon","khatak","khauv","khay",
"kho","khum","kickel","kientz","kieser","kiko","kilbert","kildare","kill","kilmon",
"kilty","kinas","kinatyan","kincannon","kingcade","kington","kinnion","kinroth","kinsley","kinzle",
"kirchoff","kirkman","kiser","kissell","kitner","klamm","klawinski","kleinsasser","klemke","klever",
"kliger","klimas","klitzner","kluttz","klyce","knaphus","knecht","knestrick","knoble","knobloch",
"knoblock","knotowicz","knudson","koba","kobashigawa","koch","kochanek","kocur","koening","koepper",
"kolber","kolling","kolodziej","kolodzik","konczak","konick","koo","kooistra","kool","koone",
"koors","koppen","kops","korinta","korvin","kosack","koskie","kosoff","kosse","kotowski",
"kouyate","kovacs","kovalovsky","kravec","krawiecz","krein","kress","kresse","kriegel","krissie",
"kroenke","krommes","krone","kropff","krows","krudop","kruizenga","krus","krysl","kubal",
"kuban","kubinski","kuchle","kuczkowski","kudrle","kuechle","kulas","kum","kung","kuntz",
"kuperman","kupfer","kuprewicz","kutlu","kvaternik","kyper","laabs","labove","lacasse","ladeau",
"lafountain","lafuente","lagonia","laguire","lair","lakes","lall","lalley","lalumiere","lamarr",
"lambino","lambright","lammey","lamontagne","lampo","lamprey","laney","langelier","lanosa","lanquist",
"laperle","lapinski","larabee","laramore","larman","larrick","lasseter","latassa","lathim","latona",
"lau","laube","laubscher","laudat","laukitis","laurenitis","lavatch","lavell","lavelle","lavey",
"lavina","lawery","lawis","lawn","lawver","lay","layher","layland","leach","leaming",
"leber","ledermann","ledezma","ledford","ledsinger","lefort","leftwich","legat","legore","legrow",
"leider","leitman","lemmond","lemus","leners","leng","lenherr","lenig","lenning","lenzini",
"leonardo","leppanen","lerner","lesueur","letendre","leuasseur","leubner","leuchs","levangie","leveille",
"levendosky","levenhagen","levens","levo","lezama","lichtenberg","lichtenfeld","licor","liebler","liechti",
"liehr","lieske","lifland","lifshitz","ligonis","likar","lile","limauro","limke","lindburg",
"lindell","lindenberg","linko","linley","linnane","linssen","linthicum","lips","liquet","liranzo",
"litherland","litvin","litza","livingston","lloyd","lobalbo","lockrem","locsin","logue","lolley",
"lombrana","lones","longman","longobardi","lonneman","lopey","lopinto","lopze","loretto","losado",
"losito","losneck","loth","louato","louderback","loughmiller","loukota","lovin","lowes","loze",
"lozier","lu","lubawy","lucca","luczkowiak","lueking","luescher","luk","lukianov","lule",
"lulewicz","lulic","lund","lundman","luneau","lunstrum","lutfy","lutke","luvene","luzell",
"lynam","lynch","lynds","lytal","maass","maccarthy","machen","maciak","mackedanz","mackowiak",
"macola","macrina","macvean","madagan","maedke","magaw","magaziner","maggio","maglio","maglott",
"mahlum","mahone","mahr","mainor","mairs","maisey","maisonet","makekau","makofsky","malakai",
"malaver","malcomb","malehorn","malia","malicoat","malin","malis","malkin","malpica","maltez",
"maltz","manard","manche","mancherian","manders","mandoza","mangicavallo","maniace","mannon","manolis",
"manza","marberry","marceaux","marcinka","marcoguisepp","marcus","marden","marfil","mariner","maritato",
"markevich","markey","markland","markos","marks","marlette","marling","marotte","marrapodi","marshal",
"marshbanks","martinelli","martinolli","martucci","marucci","maruschak","marzan","masek","mask","masri",
"masters","mastroianni","mathenia","matier","matkowski","mattimoe","mattlin","matzinger","maule","maxwell",
"maydew","mayhan","mazzocco","mcalarney","mcalmond","mcandrews","mcausland","mccaig","mccalpane","mccargar",
"mccartha","mccleary","mcclement","mcclenon","mccorry","mccovery","mccreedy","mccullen","mcdanial","mcdermett",
"mcelhattan","mcfadyen","mcgarey","mcgarrah","mcgoey","mcgraw","mcgurr","mchone","mcilhinney","mcinally",
"mckendree","mckin","mckinlay","mckissic","mckiver","mclean","mcmahen","mcnealy","mcneeley","mcnew",
"mcnitt","mcquaig","mcquillan","mcquirk","mcraney","mcratt","mcraven","mcveigh","mcvicar","meadow",
"mebane","medeiros","medill","mednis","megeath","megginson","mehrtens","meiggs","meile","meinzer",
"melino","mellard","mellecker","mellick","melstrom","mende","menes","menzella","merk","merseal",
"merta","messerschmidt","mevis","meyette","mezza","miazga","michalski","michell","michelli","mickley",
"miclette","mielke","miernik","mihalco","mihalios","mikola","mikulich","milam","milberger","milbrett",
"mileti","milinazzo","millard","milloway","minardo","minerich","minvielle","miraflores","miskovich","mittendorf",
"mitzel","mizrahi","modic","moellers","moglia","mohrbacher","mohseni","moisant","molen","mollere",
"mollo","molock","moment","monas","mondejar","monges","monjaras","monsees","monske","montalvan",
"montanari","monterrubio","montgonery","montoney","moorcroft","morawski","morelock","morely","moreno","morentin",
"morgenroth","morgon","morie","morones","morquecho","morrero","morriss","moryl","mosen","moudy",
"moulthrop","moulton","mowan","mowat","mowris","muchler","muffoletto","mujica","mulkin","mulkins",
"mullinex","mumper","munet","munshower","munzer","muraski","murden","murrufo","murzynski","muszar",
"muzzy","myles","nachbar","naegeli","nagode","naiman","nall","nalls","namer","nanes",
"nanney","narvaez","nasser","natt","nau","needham","neel","nehmer","neider","neill",
"nelles","nemes","nesbeth","nesler","netland","netley","nettle","neuhoff","neville","nickell",
"nickenberry","nickisch","niederhauser","night","nightwine","nilsby","nims","nocella","nogales","nole",
"nonemaker","nonu","nooner","nordlinger","noreiga","noriego","norley","norlund","normann","nostrand",
"nothacker","novelli","nowland","nowlen","nuckels","nuhn","nungesser","nunlee","nutley","nutter",
"nwagbara","oaxaca","obaker","obeid","obenshain","oby","occhino","oday","odore","oestreich",
"offley","oguendo","ogunyemi","ohl","ohlhauser","ohmit","ohnstad","ojano","okajima","okuna",
"olafson","olenick","oleson","olgvin","olinghouse","olivio","oller","olsby","oltremari","omer",
"onaga","ondersma","ondo","onks","onnen","onyeagu","opalka","ordaz","orduna","orengo",
"orlowsky","ormand","ororke","orrego","orsak","ortaga","osayande","oshita","ostler","ostrum",
"otta","otting","ottosen","ottoson","outler","outwater","ouzts","overly","overman","ow",
"owenby","pagett","pahls","pahulu","paladino","palczynski","palifka","palmeter","panah","panak",
"panchik","pandey","pangburn","paquette","parden","parisien","parlin","paro","parolari","paronto",
"parrillo","parsh","partin","partis","pasaya","pascal","pasko","passalacqua","passe","patch",
"pate","paterno","patry","patz","paullus","pavelich","pawlowski","pea","pead","pearlman",
"peckens","pedrick","pedrotti","peeters","peha","peixoto","pel","pelino","pellom","penceal",
"penington","penny","penuel","pepin","pereyra","peri","perlson","perotti","perschall","pershall",
"persichetti","perugini","pettay","pettey","pexton","pezzuti","pfeifle","pfisterer","pfleuger","pfliger",
"phare","philabaum","philhower","phillipson","pichon","picini","piedigrossi","piekos","piening","piertraccini",
"pietrini","pilat","pillot","pina","pinckley","pinette","pintello","pinuelas","piper","pirone",
"pirrello","pitchford","pitocco","pitorak","pixler","pizzico","plana","plank","plater","plaxico",
"pleasanton","plemel","plew","ploeger","poague","poblete","pock","podolsky","poetter","poissant",
"polian","pollan","pollart","pollinger","porch","poro","pottebaum","potter","pou","prange",
"prashad","prester","prestridge","primus","privateer","prizio","probasco","proch","protas","prunier",
"przybyla","puckett","pudlinski","puelo","pugliese","pulley","pundsack","pupa","pyeatt","pyscher",
"quails","quattrocchi","quay","quebedeaux","quinlan","quirion","quiroz","quiver","rabbe","rabenhorst",
"raby","racicot","raczka","rade","radlinski","rady","raebel","raffety","rafi","raguay",
"rainie","raio","rajan","rajaratnam","rall","rambert","ramdas","ramin","ramp","ran",
"ranallo","raney","ranney","ransford","rappenecker","rashdi","rathbone","rattanasinh","raught","rauschenberg",
"rausin","ravenel","ravitz","raychard","rayside","reagen","reagle","rebar","rebman","rebolledo",
"rebuldela","reckard","recker","redding","redican","redway","reff","regalado","reinbolt","reinhard",
"reinking","reisz","rekus","rella","rementer","remiasz","ren","renault","rendel","renfer",
"reninger","renison","renning","renz","resper","rettkowski","reuben","reuer","revak","reveron",
"revord","rexford","reza","ribao","ricciardone","richan","richerson","rickard","ricke","riddock",
"ridgle","ridings","riechman","rieder","rieger","riemersma","rietschlin","rieves","rigali","risha",
"risse","rissell","ristow","rizas","robak","robasciotti","robuck","rocker","rockett","rockhold",
"rodefer","rodeiguez","roesing","roffman","rohl","roker","rolf","rollie","rollock","roney",
"roose","rosendale","rosendorf","rosenkoetter","rosenlof","rossignol","rossing","rothlisberger","rotondi","routte",
"routzen","roux","rowley","rubalcaba","rubidoux","rubottom","ruddy","ruetz","ruggirello","rulon",
"ruminski","rump","rumpel","rusiecki","russett","rusteika","rutski","ryan","rydzewski","rysavy",
"ryser","ryu","saari","saathoff","sabad","sabastian","sadat","sadhu","sadorra","saeli",
"safranek","sagehorn","sagrera","sahni","sain","saison","sakamoto","sakata","salcedo","salis",
"saliva","sallach","salles","salois","salsberry","salvio","sama","samaan","samaha","sampair",
"sampogna","sanborn","sandefur","sandison","sanflippo","sanner","santarsiero","santheson","santino","santoli",
"santos","santy","saras","sarconi","sarra","sarracino","sarvey","sarzynski","saults","sauter",
"sauve","sawlivich","sawrey","saxbury","sayas","sayed","saylee","sboro","scagliotti","scalice",
"scandrett","scannapieco","scarberry","schaal","schadel","schaefers","schafer","schafersman","schaupp","scheele",
"schegetz","schei","scheman","schemonia","scherff","schertz","scheuerman","scheuren","schiffer","schleck",
"schleifer","schlein","schlepp","schlesselman","schlinker","schlotthauer","schluter","schmaling","schmelzle","schmiedeskamp",
"schmuhl","schnader","schnieders","schoel","schoening","schoepp","scholz","schoneck","schook","schrage",
"schrayter","schulder","schuller","schutt","schutzman","schwall","schwend","schweppe","schwerd","schweyen",
"scrobola","scroggy","seagroves","sealander","seber","secore","seel","seesholtz","segalla","seiser",
"seldomridge","seliga","selvig","sember","sembler","semrau","senecal","senesenes","senneker","sephus",
"serban","serles","serret","sespinosa","sestoso","setchell","seufert","sevedge","severo","sey",
"shaddock","shaffen","shafran","shafto","shanklin","shapero","shapin","sharber","sharon","sharrard",
"shaud","shawley","shazier","shearin","shears","sheeks","shelko","shellenbarger","shellenberger","shelling",
"sheltra","sherlock","sheumaker","sheward","shider","shieh","shigeta","shindo","shingles","shinkle",
"shiraishi","shiraki","shireman","shoddie","shone","shonerd","shont","shouse","shrigley","shuffleburg",
"shugars","shulick","shumay","shumski","shupp","shuter","shymske","sibille","siebe","siebens",
"siedel","siegel","siem","sienicki","siert","sifontes","siford","sigmon","signaigo","sikander",
"sillas","silsby","silverstein","simens","simiskey","simison","sine","singler","siracuse","sittloh",
"sitzes","sjogren","skillern","skufca","sleger","slemmons","slingland","slingluff","slonaker","slonski",
"slovacek","sluyter","smid","smink","smithhisler","smithwick","smuin","smykowski","smyntek","snaders",
"snare","snith","snowdy","soapes","soderlund","sogge","solas","sollman","sondelski","sonnee",
"sonstroem","sora","sorce","sorell","sorenson","sortino","sosbe","southard","sovel","sowada",
"spain","sparaco","sparr","sparrow","spaugh","speith","spencer","sperger","sperling","speth",
"spevak","spicknall","spieker","spielmann","spight","spike","spiney","spinney","spray","springs",
"springston","spurlin","spurr","spurrier","squair","srey","stadick","stake","stamand","stamour",
"stamp","stamper","stanciel","stanclift","stancoven","standafer","starcic","starghill","starkson","starley",
"starns","start","stasiuk","stauder","staudt","staum","stawasz","steagell","stecklair","steckline",
"steeber","steffani","steins","steinworth","stenback","stenseth","sterner","stindt","stjames","stjuste",
"stockholm","stoeber","stoey","stoffey","stokey","stooksbury","stopp","storz","stough","stracke",
"strassner","streat","streetman","strey","stricklen","strieter","strike","string","stringari","stromquist",
"strous","strouse","struck","strum","strutton","stubbolo","studebaker","studer","stumb","subia",
"sugiyama","sultemeier","summerour","sundeen","surrette","sutfin","suther","sutor","swanston","swarm",
"swayze","sweetland","swirsky","sword","szabo","szaflarski","taffer","tafuri","tagata","taggert",
"talaga","talahytewa","talat","tambasco","tamburrelli","tankard","tankersley","tannazzo","tappan","tarboro",
"tarbutton","tarmey","tarquinio","tasby","tatsak","taub","tavolario","teachey","tecuanhuey","teer",
"teissedre","teixeria","templeton","terlizzi","terrones","terry","tertinek","tetreau","tetro","teuteberg",
"tewolde","thain","thang","thaniel","tharrington","thay","therres","thetford","thews","thielbar",
"thiesse","thillet","thoman","thomen","thomley","thornburgh","thornley","thrapp","thrill","throop",
"tiegs","tigert","tijernia","tillberg","tilmon","tilus","tinajero","tintle","tirona","tischler",
"tlatelpa","tobola","todeschi","toelle","toews","tolmie","tomczak","tomkowicz","toney","toomey",
"tooms","tooze","torchio","tosti","touchton","townsley","traeger","traff","trafton","tramm",
"trapp","traux","traynham","treamer","trebilcock","treichler","tremore","trenor","trimm","triolo",
"trochesset","troester","troncoso","trowel","truby","trucco","truehart","truss","truxell","tryon",
"tuazon","tubeszewski","tuffey","tullar","tupy","turcotte","turdo","turja","twellman","twiet",
"twiggs","twyman","tyberg","tyl","tyo","tyrone","ubaldo","uc","ueno","ulbrich",
"ulicki","ulrick","ungerleider","unnewehr","uphoff","upson","urbanski","usina","uzun","vadner",
"valensuela","valenzuela","vallien","vanalst","vandagriff","vandenacre","vandergrift","vanderveer","vanderwoude","vandewalker",
"vandriel","vanduser","vandyne","vanfleet","vanfossan","vanhamlin","vanhook","vanhoozer","vankeuren","vanleeuwen",
"vanlier","vanloo","vannorden","vannuck","vanoni","vanpatton","vanslooten","vansteenhuyse","vanta","vanvuren",
"vanwagoner","vanwey","varughese","vautour","ve","vecchi","veile","velmontes","velunza","venzeio",
"venzon","verbasco","vercher","verdun","verduzco","veres","verfaille","verlin","vermeulen","verrelli",
"verunza","vessell","viar","vicks","vidaca","viebrock","vieweg","vigus","villamarin","villamayor",
"villante","villecus","viscera","visick","visker","vital","vitale","viverette","vizuete","vlasak",
"vlloa","vogland","vollette","vonarx","vonasek","voorheis","vorachek","vorholt","vormwald","votraw",
"wacker","wadusky","wagnon","wagster","wah","wake","waldrope","walk","wallaert","waller",
"wallo","walrond","wandell","wanner","warbington","wardell","warnasch","warnberg","warnick","warnken",
"warton","washpun","waska","wasowski","wassil","wates","wattenbarger","wauford","waybright","waynick",
"weadon","weatherwax","wedd","weers","weightman","weigle","weinland","weinman","weinreich","weisberger",
"weisenhorn","weishaupt","weissenborn","weissman","weiszbrod","welson","werber","werry","wertenberger","wethje",
"weyler","whelehan","whipps","whirry","whistle","whitis","whitlatch","whitsel","wice","wicher",
"wicinsky","wicklin","wideman","widmaier","widrig","wieand","wiechman","wiechmann","wieto","wigger",
"wikel","wikle","wilburn","wilderman","wilfahrt","wilhelmi","wilhoit","willardson","willick","willing",
"willmes","willwerth","wilmer","wilmouth","wilshusen","winchell","winick","winner","winterfeld","wisniowski",
"wison","wiszynski","witherite","witkus","wittich","wittlinger","wittmer","witvoet","wlodyka","woelk",
"wolfenbarger","wolkow","wonderling","woodley","woodside","worthy","wuebker","wuest","wunner","wurdeman",
"wyrosdick","yaftali","yagues","yahna","yanity","yann","yarboro","yard","yenner","yett",
"yetto","yiu","yoast","yokota","yoshimoto","yoshizawa","youkers","younge","youngkin","yovan",
"yovanovich","ypina","yusuf","zadina","zahri","zakowski","zambelli","zamborano","zangari","zange",
"zarcone","zavatson","zeanah","zebracki","zecchini","zelenka","zelinka","zendejas","zentz","zepf",
"zeto","ziadie","ziel","ziesman","zolty","zondlo","zsadanyi","zullinger","zunino","zwolak"
]
static func get_random_name():
return first_names[randi() % first_names.size()].capitalize() + " " + last_names[randi() % last_names.size()].capitalize()

9
Classes/POI.gd Normal file
View File

@ -0,0 +1,9 @@
class_name POIData
enum POIType {
SpawnPoint
}
enum POIClass {
Player
}

View File

@ -1,147 +0,0 @@
class_name ResourceQueue
var thread
var mutex
var sem
var threaded = true
var time_max = 100 # Milliseconds.
var queue = []
var pending = {}
func _lock(_caller):
mutex.lock()
func _unlock(_caller):
mutex.unlock()
func _post(_caller):
sem.post()
func _wait(_caller):
sem.wait()
func queue_resource(path, p_in_front = false):
_lock("queue_resource")
if path in pending:
_unlock("queue_resource")
return
elif ResourceLoader.has_cached(path):
var res = ResourceLoader.load(path)
pending[path] = res
_unlock("queue_resource")
return
else:
var res = ResourceLoader.load_interactive(path)
res.set_meta("path", path)
if p_in_front:
queue.insert(0, res)
else:
queue.push_back(res)
pending[path] = res
_post("queue_resource")
_unlock("queue_resource")
return
func cancel_resource(path):
_lock("cancel_resource")
if path in pending:
if pending[path] is ResourceInteractiveLoader:
queue.erase(pending[path])
pending.erase(path)
_unlock("cancel_resource")
func get_progress(path):
if not threaded:
return 1.0
_lock("get_progress")
var ret = -1
if path in pending:
if pending[path] is ResourceInteractiveLoader:
ret = float(pending[path].get_stage()) / float(pending[path].get_stage_count())
else:
ret = 1.0
_unlock("get_progress")
return ret
func is_ready(path):
if not threaded:
return true
var ret
_lock("is_ready")
if path in pending:
ret = !(pending[path] is ResourceInteractiveLoader)
else:
ret = false
_unlock("is_ready")
return ret
func _wait_for_resource(res, path):
if not threaded:
return get_resource(path)
_unlock("wait_for_resource")
while true:
VisualServer.sync()
OS.delay_usec(16000) # Wait approximately 1 frame.
_lock("wait_for_resource")
if queue.size() == 0 || queue[0] != res:
return pending[path]
_unlock("wait_for_resource")
func get_resource(path):
if not threaded:
return load(path)
_lock("get_resource")
if path in pending:
if pending[path] is ResourceInteractiveLoader:
var res = pending[path]
if res != queue[0]:
var pos = queue.find(res)
queue.remove(pos)
queue.insert(0, res)
res = _wait_for_resource(res, path)
pending.erase(path)
_unlock("return")
return res
else:
var res = pending[path]
pending.erase(path)
_unlock("return")
return res
else:
_unlock("return")
return ResourceLoader.load(path)
func thread_process():
_wait("thread_process")
_lock("process")
while queue.size() > 0:
var res = queue[0]
_unlock("process_poll")
var ret = res.poll()
_lock("process_check_queue")
if ret == ERR_FILE_EOF || ret != OK:
var path = res.get_meta("path")
if path in pending: # Else, it was already retrieved.
pending[res.get_meta("path")] = res.get_resource()
# Something might have been put at the front of the queue while
# we polled, so use erase instead of remove.
queue.erase(res)
_unlock("process")
func thread_func(_u):
while true:
thread_process()
func start(use_threads: bool):
threaded = use_threads
if not threaded:
return
mutex = Mutex.new()
sem = Semaphore.new()
thread = Thread.new()
thread.start(self, "thread_func", 0)

View File

@ -1,7 +1,8 @@
class_name UICommand
enum CommandType {
SetShipTarget
SetShipSpeed,
SetShipDirection
}
var cmd_type = null
var cmd_args = []

View File

@ -5,20 +5,19 @@ shader_type canvas_item;
render_mode unshaded;
const int volsteps = 20;
const int iterations = 17;
const float formuparam = 0.53;
const float stepsize = 0.1;
const float brightness = 0.0015;
const float darkmatter = 0.300;
const float distfading = 0.730;
const float saturation = 0.850;
const float rotx = 0.;
const float roty = 0.001;
const float tile = 0.85;
uniform float speed = 0.001;
uniform int iterations = 17;
uniform float formuparam = 0.53;
uniform int volsteps = 20;
uniform float stepsize = 0.1;
uniform float zoom = 0.80;
uniform float tile = 0.85;
uniform float speed = 0.001;
uniform float brightness = 0.0015;
uniform float darkmatter = 0.300;
uniform float distfading = 0.730;
uniform float saturation = 0.850;
uniform float rotx = 0;
uniform float roty = 0.001;
void fragment() {
vec2 uv = FRAGCOORD.xy * SCREEN_PIXEL_SIZE - 0.5;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 B

View File

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/handicons.png-8c76520aab77ec37eaad0980d02800ac.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Graphics/UI/handicons.png"
dest_files=[ "res://.import/handicons.png-8c76520aab77ec37eaad0980d02800ac.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

View File

@ -1,13 +1,34 @@
[remap]
importer="image"
type="Image"
path="res://.import/splash.png-48a9249fadebd8f0056b1de9f1a63568.image"
importer="texture"
type="StreamTexture"
path="res://.import/splash.png-48a9249fadebd8f0056b1de9f1a63568.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Graphics/UI/splash.png"
dest_files=[ "res://.import/splash.png-48a9249fadebd8f0056b1de9f1a63568.image" ]
dest_files=[ "res://.import/splash.png-48a9249fadebd8f0056b1de9f1a63568.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View File

@ -1,19 +1,19 @@
[gd_resource type="TileSet" load_steps=2 format=2]
[ext_resource path="res://Graphics/tgstation/floors.png" type="Texture" id=1]
[ext_resource path="res://Graphics/tgstation/plating.png" type="Texture" id=1]
[resource]
1/name = "Plating"
1/texture = ExtResource( 1 )
1/tex_offset = Vector2( 0, 0 )
1/modulate = Color( 1, 1, 1, 1 )
1/region = Rect2( 96, 160, 32, 32 )
1/tile_mode = 0
1/occluder_offset = Vector2( 0, 0 )
1/navigation_offset = Vector2( 0, 0 )
1/shape_offset = Vector2( 0, 0 )
1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
1/shape_one_way = false
1/shape_one_way_margin = 0.0
1/shapes = [ ]
1/z_index = 0
0/name = "Plating"
0/texture = ExtResource( 1 )
0/tex_offset = Vector2( 0, 0 )
0/modulate = Color( 1, 1, 1, 1 )
0/region = Rect2( 0, 0, 32, 32 )
0/tile_mode = 0
0/occluder_offset = Vector2( 0, 0 )
0/navigation_offset = Vector2( 0, 0 )
0/shape_offset = Vector2( 0, 0 )
0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
0/shape_one_way = false
0/shape_one_way_margin = 0.0
0/shapes = [ ]
0/z_index = 0

BIN
Graphics/tgstation/floor.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -2,15 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/tcomm.png-d10359105f84709691a87ffd8437229d.stex"
path="res://.import/floor.png-3bcc52916d51a4ca8cbe3f63cd3f1ef7.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Graphics/tgstation/tcomm.png"
dest_files=[ "res://.import/tcomm.png-d10359105f84709691a87ffd8437229d.stex" ]
source_file="res://Graphics/tgstation/floor.png"
dest_files=[ "res://.import/floor.png-3bcc52916d51a4ca8cbe3f63cd3f1ef7.stex" ]
[params]

View File

@ -1,27 +1,13 @@
[gd_resource type="TileSet" load_steps=2 format=2]
[ext_resource path="res://Graphics/tgstation/floors.png" type="Texture" id=1]
[ext_resource path="res://Graphics/tgstation/floor.png" type="Texture" id=1]
[resource]
0/name = "Iron"
0/texture = ExtResource( 1 )
0/tex_offset = Vector2( 0, 0 )
0/modulate = Color( 1, 1, 1, 1 )
0/region = Rect2( 160, 160, 32, 32 )
0/tile_mode = 0
0/occluder_offset = Vector2( 0, 0 )
0/navigation_offset = Vector2( 0, 0 )
0/shape_offset = Vector2( 0, 0 )
0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
0/shape_one_way = false
0/shape_one_way_margin = 0.0
0/shapes = [ ]
0/z_index = 0
1/name = "Wood"
1/name = "Floor"
1/texture = ExtResource( 1 )
1/tex_offset = Vector2( 0, 0 )
1/modulate = Color( 1, 1, 1, 1 )
1/region = Rect2( 0, 96, 32, 32 )
1/region = Rect2( 0, 0, 32, 32 )
1/tile_mode = 0
1/occluder_offset = Vector2( 0, 0 )
1/navigation_offset = Vector2( 0, 0 )
@ -31,143 +17,3 @@
1/shape_one_way_margin = 0.0
1/shapes = [ ]
1/z_index = 0
2/name = "Grass"
2/texture = ExtResource( 1 )
2/tex_offset = Vector2( 0, 0 )
2/modulate = Color( 1, 1, 1, 1 )
2/region = Rect2( 160, 96, 32, 32 )
2/tile_mode = 0
2/occluder_offset = Vector2( 0, 0 )
2/navigation_offset = Vector2( 0, 0 )
2/shape_offset = Vector2( 0, 0 )
2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
2/shape_one_way = false
2/shape_one_way_margin = 0.0
2/shapes = [ ]
2/z_index = 0
3/name = "LightCheck"
3/texture = ExtResource( 1 )
3/tex_offset = Vector2( 0, 0 )
3/modulate = Color( 1, 1, 1, 1 )
3/region = Rect2( 128, 32, 32, 32 )
3/tile_mode = 0
3/occluder_offset = Vector2( 0, 0 )
3/navigation_offset = Vector2( 0, 0 )
3/shape_offset = Vector2( 0, 0 )
3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
3/shape_one_way = false
3/shape_one_way_margin = 0.0
3/shapes = [ ]
3/z_index = 0
4/name = "Reinforced"
4/texture = ExtResource( 1 )
4/tex_offset = Vector2( 0, 0 )
4/modulate = Color( 1, 1, 1, 1 )
4/region = Rect2( 96, 32, 32, 32 )
4/tile_mode = 0
4/occluder_offset = Vector2( 0, 0 )
4/navigation_offset = Vector2( 0, 0 )
4/shape_offset = Vector2( 0, 0 )
4/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
4/shape_one_way = false
4/shape_one_way_margin = 0.0
4/shapes = [ ]
4/z_index = 0
5/name = "PlatWhite"
5/texture = ExtResource( 1 )
5/tex_offset = Vector2( 0, 0 )
5/modulate = Color( 1, 1, 1, 1 )
5/region = Rect2( 32, 96, 32, 32 )
5/tile_mode = 0
5/occluder_offset = Vector2( 0, 0 )
5/navigation_offset = Vector2( 0, 0 )
5/shape_offset = Vector2( 0, 0 )
5/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
5/shape_one_way = false
5/shape_one_way_margin = 0.0
5/shapes = [ ]
5/z_index = 0
6/name = "PlatYellow"
6/texture = ExtResource( 1 )
6/tex_offset = Vector2( 0, 0 )
6/modulate = Color( 1, 1, 1, 1 )
6/region = Rect2( 32, 64, 32, 32 )
6/tile_mode = 0
6/occluder_offset = Vector2( 0, 0 )
6/navigation_offset = Vector2( 0, 0 )
6/shape_offset = Vector2( 0, 0 )
6/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
6/shape_one_way = false
6/shape_one_way_margin = 0.0
6/shapes = [ ]
6/z_index = 0
7/name = "PlatPurple"
7/texture = ExtResource( 1 )
7/tex_offset = Vector2( 0, 0 )
7/modulate = Color( 1, 1, 1, 1 )
7/region = Rect2( 32, 128, 32, 32 )
7/tile_mode = 0
7/occluder_offset = Vector2( 0, 0 )
7/navigation_offset = Vector2( 0, 0 )
7/shape_offset = Vector2( 0, 0 )
7/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
7/shape_one_way = false
7/shape_one_way_margin = 0.0
7/shapes = [ ]
7/z_index = 0
8/name = "PlatBlue"
8/texture = ExtResource( 1 )
8/tex_offset = Vector2( 0, 0 )
8/modulate = Color( 1, 1, 1, 1 )
8/region = Rect2( 32, 160, 32, 32 )
8/tile_mode = 0
8/occluder_offset = Vector2( 0, 0 )
8/navigation_offset = Vector2( 0, 0 )
8/shape_offset = Vector2( 0, 0 )
8/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
8/shape_one_way = false
8/shape_one_way_margin = 0.0
8/shapes = [ ]
8/z_index = 0
9/name = "PlayGrey"
9/texture = ExtResource( 1 )
9/tex_offset = Vector2( 0, 0 )
9/modulate = Color( 1, 1, 1, 1 )
9/region = Rect2( 32, 192, 32, 32 )
9/tile_mode = 0
9/occluder_offset = Vector2( 0, 0 )
9/navigation_offset = Vector2( 0, 0 )
9/shape_offset = Vector2( 0, 0 )
9/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
9/shape_one_way = false
9/shape_one_way_margin = 0.0
9/shapes = [ ]
9/z_index = 0
10/name = "InternalGrey"
10/texture = ExtResource( 1 )
10/tex_offset = Vector2( 0, 0 )
10/modulate = Color( 1, 1, 1, 1 )
10/region = Rect2( 128, 0, 32, 32 )
10/tile_mode = 0
10/occluder_offset = Vector2( 0, 0 )
10/navigation_offset = Vector2( 0, 0 )
10/shape_offset = Vector2( 0, 0 )
10/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
10/shape_one_way = false
10/shape_one_way_margin = 0.0
10/shapes = [ ]
10/z_index = 0
11/name = "InternalRed"
11/texture = ExtResource( 1 )
11/tex_offset = Vector2( 0, 0 )
11/modulate = Color( 1, 1, 1, 1 )
11/region = Rect2( 96, 192, 32, 32 )
11/tile_mode = 0
11/occluder_offset = Vector2( 0, 0 )
11/navigation_offset = Vector2( 0, 0 )
11/shape_offset = Vector2( 0, 0 )
11/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
11/shape_one_way = false
11/shape_one_way_margin = 0.0
11/shapes = [ ]
11/z_index = 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/floors.png-279dfb5ae1aa7c2899e8dc438ae741e5.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Graphics/tgstation/floors.png"
dest_files=[ "res://.import/floors.png-279dfb5ae1aa7c2899e8dc438ae741e5.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/midnight.png-3d811938da348be9b831f07b37a9d5f1.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Graphics/tgstation/midnight.png"
dest_files=[ "res://.import/midnight.png-3d811938da348be9b831f07b37a9d5f1.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 781 B

View File

@ -4,6 +4,7 @@
code = "shader_type canvas_item;
render_mode unshaded;"
custom_defines = ""
[resource]
shader = SubResource( 1 )

View File

@ -1,5 +0,0 @@
Copyright 2020 Alessandro Gatti
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@ -1,13 +0,0 @@
# NSS Odyssey
**Warning: Toy project**
Co-op survival space sim, keep the NSS Odyssey alive and kicking while roaming in space.
Takes heavy inspiration (and for now, graphics) from Space Station 13 and FTL.
## Credits
See `CREDITS.md` for an exhaustive list of sources for all assets not made by me (Hamcha)
See `LICENSE` for code license (TL;DR it's [ISC](https://en.wikipedia.org/wiki/ISC_license))

View File

@ -1,11 +0,0 @@
[gd_scene load_steps=2 format=2]
[sub_resource type="GDScript" id=1]
script/source = "extends Node
func _ready():
$\"/root/Multiplayer\".host()
"
[node name="Node" type="Node"]
script = SubResource( 1 )

View File

@ -2,81 +2,18 @@ extends Node
class_name GameInstance
signal state_received()
onready var ui = $CanvasLayer/ui
onready var lighting = $CanvasLayer/sslo
onready var world = $world
onready var systems = $systems
onready var netgame = $"/root/Multiplayer"
onready var physics = world.get_world_2d().direct_space_state as Physics2DDirectSpaceState
var writing = false
func _ready():
ui.connect("command", world, "process_command")
world.initiate()
func _ready() -> void:
$"/root/Music/BGM".stop()
randomize()
if netgame.hosting:
world.load_map(netgame.get_current_map())
world.map.current_ship_position = Vector2(randf() * 1e4, randf() * 1e4)
world.map.current_ship_target = world.map.current_ship_position + Vector2(randf() * 1e2, randf() * 1e2)
rpc("spawn_player", 1)
else:
world.load_map(GameWorld.Map.EMPTY)
rpc_id(1, "send_map")
yield(self, "state_received")
rpc_id(1, "ready_to_spawn")
master func send_map() -> void:
var id = get_tree().get_rpc_sender_id()
var map_data = world.map.serialize()
var systems_data = systems.serialize()
print("sending map data to %d" % id)
rpc_id(id, "receive_data", {
"map": map_data,
"systems": systems_data
})
puppet func receive_data(data: Dictionary) -> void:
world.map.deserialize(data["map"])
systems.deserialize(data["systems"])
print("Received map data from master")
emit_signal("state_received")
master func ready_to_spawn() -> void:
var id = get_tree().get_rpc_sender_id()
print("%d is ready to spawn players" % id)
# Tell him everyone to spawn
var players = $world/players.get_children()
for player in players:
rpc_id(id, "spawn_player", player.get_network_master())
# Then spawn him as well
rpc("spawn_player", id)
master func broadcast_zone(message: String, origin: Vector2, radius: float) -> void:
var shape = CircleShape2D.new()
shape.radius = radius
var query = Physics2DShapeQueryParameters.new()
query.collide_with_areas = true
query.collide_with_bodies = false
query.collision_layer = 32
query.transform.origin = origin
query.set_shape(shape)
var res = physics.intersect_shape(query, 100)
for col in res:
rpc_id(col.collider.get_network_master(), "add_log", message)
master func broadcast(message: String) -> void:
rpc("add_log", message)
remotesync func add_log(message: String) -> void:
ui.logs.add_line(message)
remotesync func spawn_player(id: int) -> void:
world.spawn_player(id, multiplayer.get_network_unique_id() == id)
remotesync func process_command(cmd: UICommand) -> void:
func process_command(cmd: UICommand):
match cmd.cmd_type:
UICommand.CommandType.SetShipTarget:
world.map.current_ship_target = cmd.cmd_args[0]
UICommand.CommandType.SetShipSpeed:
world.map.ship_speed = cmd.cmd_args[0]
UICommand.CommandType.SetShipDirection:
world.map.ship_direction = cmd.cmd_args[0]

View File

@ -1,6 +1,5 @@
[gd_scene load_steps=5 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://Scenes/systems.gd" type="Script" id=1]
[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]
@ -9,11 +8,11 @@
script = ExtResource( 5 )
[node name="systems" type="Node" parent="."]
script = ExtResource( 1 )
[node name="world" type="Node2D" parent="."]
scale = Vector2( 2, 2 )
script = ExtResource( 4 )
mapToLoad = 1
[node name="players" type="Node2D" parent="world"]

View File

@ -8,32 +8,22 @@ const SERVER_PORT = 5513
const MAX_PLAYERS = 30
var port = SERVER_PORT
# Throttle network updates of often-changed variables by this many physics frames
const SYSTEMS_UPDATE_INTERVAL = 10
# Master server data
const MASTER_SERVER_ADDR = "fgms.zyg.ovh"
const MASTER_SERVER_UDP_PORT = 9434
const MS_GAME_CODE = "odyssey-0-a2"
const GOTM_OVERRIDE = false
const MS_GAME_CODE = "odyssey-0-a1"
# Master server entry
var ms_active = false
var ms_key = ""
var server_name = ""
var hosting = false
export var player_name = ""
var player_info = {}
var round_info = {}
onready var scene_manager = $"/root/SceneManager"
func _ready():
randomize()
player_name = Names.get_random_name()
player_name = "tider-" + str(randi() % 1000)
func bind_events():
get_tree().connect("network_peer_connected", self, "_player_connected")
@ -54,7 +44,7 @@ func punch_nat():
yield(get_tree().create_timer(.3), "timeout")
if socketUDP.get_available_packet_count() < 1:
failed += 1
print("no reply (attempt #%d)" % failed)
print("no reply (attempt #", failed, ")")
continue
port = socketUDP.get_var(false)
print("Received ", port)
@ -66,14 +56,7 @@ func discover_upnp():
upnp.discover(2000, 2, "InternetGatewayDevice")
return upnp.add_port_mapping(SERVER_PORT)
func host(map_name: String = "odyssey"):
scene_manager.enter_loader()
scene_manager.loading_text = "Starting server"
# Wait just a sec to draw
yield(get_tree().create_timer(0.3), "timeout")
# Run port forwarding/nat punchthrough if the platform doesn't do it already
func host():
print("Running UPNP magicks")
if discover_upnp() == UPNP.UPNP_RESULT_SUCCESS:
print("UPNP mapping added")
@ -81,13 +64,8 @@ func host(map_name: String = "odyssey"):
push_warning("UPNP magicks fail, punching NAT in the face")
yield(punch_nat(), "completed")
server_name = "%s's server" % player_name
player_info[1] = { "name": player_name }
round_info = { "map": map_name }
bind_events()
var peer = NetworkedMultiplayerENet.new()
peer.compression_mode = NetworkedMultiplayerENet.COMPRESS_FASTLZ
var server_res = peer.create_server(port, MAX_PLAYERS)
if server_res != OK:
match server_res:
@ -98,33 +76,20 @@ func host(map_name: String = "odyssey"):
return
get_tree().network_peer = peer
print("Hosting")
hosting = true
server_name = player_name + "'s server"
player_info[1] = { name=player_name }
scene_manager.loading_text = null
scene_manager.load_scene("res://Scenes/Game.tscn", [
"res://Scenes/Maps/%s.tscn" % map_name
])
get_tree().change_scene("res://Scenes/Game.tscn")
# Add to master server after hosting
# Add to master server
create_ms_entry()
func join(server):
scene_manager.enter_loader()
scene_manager.loading_text = "Joining server"
# Wait just a sec to draw
yield(get_tree().create_timer(0.3), "timeout")
func join(addr: String):
bind_events()
var peer = NetworkedMultiplayerENet.new()
peer.compression_mode = NetworkedMultiplayerENet.COMPRESS_FASTLZ
var addr = server.address
peer.create_client(addr, SERVER_PORT)
get_tree().network_peer = peer
print("Connecting to %s" % addr)
print("Connecting to ", addr)
func leave():
var peer = get_tree().network_peer
@ -138,20 +103,18 @@ func leave():
pass
get_tree().network_peer = null
emit_signal("left")
func _player_connected(id):
rpc_id(id, "register_player", player_name)
if get_tree().is_network_server():
rpc_id(id, "_handshake", { "round": round_info, "players": player_info })
pass
#rpc_id(id, "spawn_players", mapLoader.map.all_players())
func _player_disconnected(id):
print("%s (%d) disconnected" % [player_info[id].name, id])
print(player_info[id].name, " (", id, ") disconnected")
player_info.erase(id)
func _connected_ok():
print("Connected to server")
scene_manager.loading_text = null
scene_manager.load_scene("res://Scenes/Game.tscn", [])
func _server_disconnected():
print("Disconnected from server")
@ -162,35 +125,27 @@ func _connected_fail():
remote func register_player(username: String):
var id = get_tree().get_rpc_sender_id()
player_info[id] = { name=username }
print("%s (%d) connected" % [player_info[id].name, id])
print(player_info[id].name, " (", id, ") connected")
remote func _handshake(infos):
round_info = infos["round"]
player_info = infos["players"]
remote func spawn_players(players):
for player_id in players:
pass
#mapLoader.map.spawn_player(player_id)
# Spawn myself as well
#mapLoader.map.rpc("spawn_player", get_tree().network_peer.get_unique_id())
func _ms_request(endpoint: String, data):
var http_request = HTTPRequest.new()
add_child(http_request)
http_request.connect("request_completed", self, "_ms_response", [endpoint])
print_debug("Telling ms to %s" % endpoint)
print_debug("Telling ms to " + endpoint)
var error = http_request.request(
"https://%s/%s" % [MASTER_SERVER_ADDR, endpoint],
"https://" + MASTER_SERVER_ADDR + "/" + endpoint,
["Content-Type: application/json"],
true, HTTPClient.METHOD_POST, JSON.print(data))
if error != OK:
push_error("An error occurred in the HTTP request.")
func ms_get_entries():
var http_request = HTTPRequest.new()
add_child(http_request)
http_request.connect("request_completed", self, "_ms_response", ["list_games"])
var error = http_request.request(
"https://%s/%s" % [MASTER_SERVER_ADDR, MS_GAME_CODE],
["Content-Type: application/json"],
true, HTTPClient.METHOD_GET)
if error != OK:
push_error("An error occurred in the HTTP request.")
func get_game_data():
return {
"name": server_name,
@ -204,6 +159,7 @@ func create_ms_entry():
"game_id": MS_GAME_CODE,
"data": get_game_data()
})
update_ms_entry()
func update_ms_entry():
if ms_active:
@ -211,20 +167,12 @@ func update_ms_entry():
"key": ms_key,
"data": get_game_data()
})
var time_left = 30
func _process(delta):
if not ms_active:
return
time_left -= delta
if time_left < 0:
update_ms_entry()
time_left = 30
yield(get_tree().create_timer(20), "timeout")
func _ms_response(_result: int, response_code: int, _headers: PoolStringArray, body: PoolByteArray, action: String):
print_debug("MS said %s" % response_code)
print_debug("MS said " + str(response_code))
if response_code > 299:
push_error("ms action '%s' returned error: %s - %s" % [action, response_code, body.get_string_from_utf8()])
push_error("ms action \"" + action + "\" returned error: " + str(response_code) + " - " + body.get_string_from_utf8())
return
var json = JSON.parse(body.get_string_from_utf8())
match action:
@ -239,12 +187,3 @@ func _notification(what):
if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
leave()
yield(self, "left")
func get_current_map():
match round_info.map:
"odyssey":
return GameWorld.Map.ODYSSEY
"runtime":
return GameWorld.Map.RUNTIME
_:
return GameWorld.Map.EMPTY

View File

@ -1,49 +0,0 @@
extends Node
var queue = ResourceQueue.new()
var target_scene = null
var loading_text = null
var loader = preload("res://Scenes/Loader.tscn")
onready var netgame = $"/root/Multiplayer"
func _ready() -> void:
var threads_supported = true
if OS.get_name() == "HTML5":
threads_supported = false
queue.start(threads_supported)
func enter_loader() -> void:
get_tree().change_scene_to(loader)
func load_scene(scene_path: String, dependencies: Array) -> void:
if queue.threaded:
target_scene = scene_path
queue.queue_resource(scene_path)
for dep in dependencies:
queue.queue_resource(dep)
else:
get_tree().change_scene(scene_path)
func _physics_process(_delta: float) -> void:
if queue.threaded:
if target_scene != null:
var remaining = queue.pending.size()
for path in queue.pending:
if queue.is_ready(path):
remaining -= 1
if remaining == 0:
get_tree().change_scene_to(queue.get_resource(target_scene))
target_scene = null
func get_progress() -> String:
if loading_text != null:
return loading_text
var count = queue.pending.size()
if count == 0:
return "Reticulating splines"
var current = 0
for path in queue.pending:
current += queue.get_progress(path)
return "Loading scene (%.0f%%)" % (current/count*100)

View File

@ -1,7 +0,0 @@
extends Control
onready var text = $BottomRight/Label
onready var scene_manager = $"/root/SceneManager"
func _physics_process(_delta):
text.text = str(scene_manager.get_progress())

View File

@ -1,139 +0,0 @@
[gd_scene load_steps=12 format=2]
[ext_resource path="res://Graphics/UI/logo-temp-pixel.png" type="Texture" id=1]
[ext_resource path="res://Graphics/UI/iosevka-aile-regular.ttf" type="DynamicFontData" id=2]
[ext_resource path="res://Scenes/Loader.gd" type="Script" id=3]
[sub_resource type="Shader" id=1]
code = "shader_type canvas_item;
uniform vec2 tex_size;
uniform vec4 uv_rect;
void fragment() {
vec2 uv_adjusted = (UV - (uv_rect.xy / tex_size)) * (tex_size / uv_rect.zw);
float dist = distance(uv_adjusted, vec2(0.5));
if (dist < 0.26) {
COLOR = vec4(1.);
} else {
COLOR = texture(TEXTURE, UV);
}
}"
[sub_resource type="ShaderMaterial" id=2]
shader = SubResource( 1 )
shader_param/tex_size = Vector2( 240, 180 )
shader_param/uv_rect = Plane( 126, 16, 82, 84 )
[sub_resource type="AtlasTexture" id=3]
atlas = ExtResource( 1 )
region = Rect2( 126, 16, 82, 84 )
[sub_resource type="Shader" id=4]
code = "shader_type canvas_item;
uniform vec2 tex_size;
uniform vec4 uv_rect;
void fragment() {
vec4 tex = texture(TEXTURE, UV);
vec2 uv_adjusted = (UV - (uv_rect.xy / tex_size)) * (tex_size / uv_rect.zw);
float dist = distance(uv_adjusted, vec2(0.5));
if (dist > 0.56) {
discard;
} else {
COLOR = vec4(tex.aaa, 1.-tex.a);
}
}"
[sub_resource type="ShaderMaterial" id=5]
shader = SubResource( 4 )
shader_param/tex_size = Vector2( 240, 180 )
shader_param/uv_rect = Plane( 146, 39, 39, 38 )
[sub_resource type="AtlasTexture" id=6]
atlas = ExtResource( 1 )
region = Rect2( 146, 39, 39, 38 )
[sub_resource type="DynamicFont" id=7]
size = 32
font_data = ExtResource( 2 )
[sub_resource type="Animation" id=8]
length = 7.0
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("BottomRight/logo-temp-pixel2:rect_rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 7 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ 0.0, 360.0 ]
}
[node name="Loading" type="Control"]
anchor_right = 0.5
anchor_bottom = 0.5
rect_scale = Vector2( 2, 2 )
script = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="BottomRight" type="Control" parent="."]
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = -114.5
margin_top = -109.5
margin_right = -2.5
margin_bottom = -1.5
__meta__ = {
"_edit_use_anchors_": false
}
[node name="logo-temp-pixel2" type="TextureRect" parent="BottomRight"]
material = SubResource( 2 )
margin_left = -7.11853
margin_top = -6.38116
margin_right = 92.8815
margin_bottom = 93.6188
rect_pivot_offset = Vector2( 50, 50 )
texture = SubResource( 3 )
stretch_mode = 4
__meta__ = {
"_edit_use_anchors_": false
}
[node name="logo-temp-pixel" type="TextureRect" parent="BottomRight"]
material = SubResource( 5 )
margin_left = -1.5
margin_top = -1.0
margin_right = 88.5
margin_bottom = 89.0
rect_pivot_offset = Vector2( 79, 59 )
texture = SubResource( 6 )
stretch_mode = 4
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="BottomRight"]
margin_left = -220.0
margin_top = 63.0
margin_right = 174.0
margin_bottom = 104.0
rect_scale = Vector2( 0.5, 0.5 )
custom_fonts/font = SubResource( 7 )
custom_colors/font_color = Color( 1, 1, 1, 1 )
align = 2
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
autoplay = "spinner"
anims/spinner = SubResource( 8 )

View File

@ -3,30 +3,15 @@ extends Node2D
class_name GameMap
var debug_areas = false
var ship_direction = 0
var ship_speed = 0
var current_ship_position = Vector2.ZERO
var current_ship_subpos = Vector2.ZERO
var current_ship_target = Vector2.ZERO
var current_ship_direction = 0
var current_ship_speed = 0
var current_ship_direction = 0.0
var current_ship_speed = 0.0
puppet var pup_ship_position = Vector2.ZERO
puppet var pup_ship_subpos = Vector2.ZERO
puppet var pup_ship_target = Vector2.ZERO
puppet var pup_ship_direction = 0.0
puppet var pup_ship_speed = 0.0
const MAX_ACCELERATION = 0.03
const MAX_STEERING = 0.06
const EPSILON = 1e-3
const SCROLL_MULTIPLIER = 1e4
const ENGINE_MULTIPLIER = 5000
const NO_SPEED_THRESHOLD = 0.01
const SPEED_EASE = 0.5
const DIRECTION_EASE = 0.5
const EPSILON = 0.01
const ProbeElectricity = preload("res://Actors/Systems/Electricity/ElectricProbe.tscn")
@ -35,7 +20,6 @@ onready var tilemaps = [ $base, $cables, $floor, $walls ]
onready var pois = $pois
export var unlit = false setget set_unlit
onready var darkness = $darkness
export var shadow_intensity = 0.2
@ -43,198 +27,32 @@ func _ready():
if Engine.editor_hint:
return
$editor.queue_free()
set_unlit(true)
set_unlit(false)
if not is_network_master():
return
# Run autotile conversions and generate occlusions
$walls.run_conversions()
# Electricity setup
make_electric_probes($cables, "Wire")
# Set engines to expected power level
set_engine_strength(current_ship_speed)
func _process(delta: float):
if Engine.editor_hint:
return
var engines = get_engine_count()
var max_speed = get_max_speed()
# Ease ship speed/direction changes
if abs(current_ship_direction) > PI*2:
current_ship_direction -= PI*2 * sign(current_ship_direction)
var direction_delta = ship_direction - current_ship_direction
if direction_delta < 0:
direction_delta += PI*2
if direction_delta > PI:
direction_delta -= PI*2
if abs(direction_delta) < 1e-3:
if abs(ship_direction - current_ship_direction) < EPSILON:
current_ship_direction = ship_direction
else:
# Avoid stuttering by not turning until there's enough reason to
if abs(direction_delta) > 0.1:
current_ship_direction += MAX_STEERING * engines * delta * sign(direction_delta)
var speed_delta = ship_speed - current_ship_speed
if abs(speed_delta) < EPSILON:
current_ship_direction = lerp(current_ship_direction, ship_direction, delta * DIRECTION_EASE)
if abs(ship_speed - current_ship_speed) < EPSILON:
current_ship_speed = ship_speed
else:
current_ship_speed += MAX_ACCELERATION * max_speed * delta * sign(speed_delta)
set_engine_strength(current_ship_speed * ENGINE_MULTIPLIER)
$deepspace.rotation = -current_ship_direction-PI/2
$deepspace.region_rect.position += Vector2(-sin(current_ship_direction), cos(current_ship_direction)) * current_ship_speed * SCROLL_MULTIPLIER * delta
func _physics_process(delta):
if Engine.editor_hint:
return
if is_network_master():
var adj_position = current_ship_position+current_ship_subpos
if current_ship_target != null:
var distance = adj_position.distance_to(current_ship_target)
if distance > NO_SPEED_THRESHOLD:
ship_direction = current_ship_target.angle_to_point(adj_position)
var max_speed = get_max_speed()
if max_speed > 0:
var deceleration_time = current_ship_speed / (MAX_ACCELERATION * max_speed)
if current_ship_speed * deceleration_time < distance:
ship_speed = max_speed
else:
ship_speed = 0.0
else:
ship_speed = 0.0
rset("pup_ship_direction", ship_direction)
rset("pup_ship_speed", ship_speed)
else:
ship_speed = 0.0
rset("pup_ship_speed", ship_speed)
if current_ship_speed > EPSILON:
var pos_delta = (Vector2.RIGHT * current_ship_speed * delta).rotated(current_ship_direction)
current_ship_subpos += pos_delta
if current_ship_subpos.x >= 1.0:
var int_part = floor(current_ship_subpos.x)
current_ship_position.x += int_part
current_ship_subpos.x -= int_part
if current_ship_subpos.y >= 1.0:
var int_part = floor(current_ship_subpos.y)
current_ship_position.y += int_part
current_ship_subpos.y -= int_part
rset("pup_ship_position", current_ship_position)
rset("pup_ship_subpos", current_ship_subpos)
else:
ship_speed = 0.0
rset("pup_ship_speed", ship_speed)
else:
ship_direction = pup_ship_direction
ship_speed = pup_ship_speed
current_ship_position = pup_ship_position
current_ship_subpos = pup_ship_subpos
func get_engine_count():
var working_engines = 0
for child in $engines.get_children():
var engine = child as GameObjectEngine
if engine.force > 0:
working_engines += 1
return working_engines
func get_max_speed():
var max_speed = 0
for child in $engines.get_children():
var engine = child as GameObjectEngine
max_speed += engine.force
return max_speed
# Serialization / Deserialization
func serialize() -> Dictionary:
# Get tilemap data
var tilemapdata = {}
for tilemap in tilemaps:
var data = []
for cell in tilemap.get_used_cells():
data.append([cell, tilemap.get_cellv(cell)])
tilemapdata[tilemap.name] = data
return {
"tilemaps": tilemapdata,
"engines": serialize_children($engines),
"objects": serialize_children($objects),
"lights": serialize_children($lights),
"sockets": serialize_children($sockets),
"pois": serialize_children($pois),
"areas": serialize_children($areas),
"ship": {
"position": current_ship_position,
"target": current_ship_target,
"set_speed": ship_speed,
"set_direction": ship_direction,
"speed": current_ship_speed,
"direction": current_ship_direction
}
}
func deserialize(data: Dictionary) -> void:
# Create maps
for tilemap in data["tilemaps"]:
var tilemap_node = get_node(tilemap) as TileMap
for tile in data["tilemaps"][tilemap]:
tilemap_node.set_cellv(tile[0], tile[1])
tilemap_node.update_bitmask_region()
tilemap_node.update_dirty_quadrants()
# Create objects
deserialize_children($engines, data["engines"])
deserialize_children($objects, data["objects"])
deserialize_children($lights, data["lights"])
deserialize_children($pois, data["pois"])
deserialize_children($sockets, data["sockets"])
deserialize_children($sockets, data["sockets"])
deserialize_children($areas, data["areas"], true)
# Set ship parameters
current_ship_position = data["ship"]["position"]
current_ship_target = data["ship"]["target"]
ship_speed = data["ship"]["set_speed"]
ship_direction = data["ship"]["set_direction"]
current_ship_speed = data["ship"]["speed"]
current_ship_direction = data["ship"]["direction"]
# Run autotile conversions and generate occlusions
$walls.run_conversions()
func serialize_children(node: Node) -> Dictionary:
var data = {}
for child in node.get_children():
data[child.name] = {
"filename": child.filename,
"data": child.serialize(),
"transform": child.transform
}
return data
func deserialize_children(node: Node, data: Dictionary, deserialize_first: bool = false) -> void:
for node_name in data:
var node_data = data[node_name] as Dictionary
var node_scene = load(node_data.filename).instance()
node_scene.name = node_name
node_scene.transform = node_data.transform
if deserialize_first:
node_scene.deserialize(node_data.data)
node.add_child(node_scene, true)
if not deserialize_first:
node_scene.deserialize(node_data.data)
current_ship_speed = lerp(current_ship_speed, ship_speed, delta * SPEED_EASE)
set_engine_strength(current_ship_speed)
$deepspace.rotation = current_ship_direction-PI/2
$deepspace.region_rect.position += Vector2(sin(current_ship_direction), cos(current_ship_direction)) * current_ship_speed * delta
# Lighting
func set_unlit(val: bool):
unlit = val
if darkness:
darkness.visible = not val
# Engine related functions

17
Scenes/Maps/Objects.gd Normal file
View File

@ -0,0 +1,17 @@
extends TileMap
const objects = {
"Door": preload("res://Actors/Objects/Door/Door.tscn")
}
func _ready():
for cell in get_used_cells():
var id = get_cellv(cell)
var name = tile_set.tile_get_name(id)
if objects.has(name):
var obj = objects[name].instance() as Node2D
add_child(obj)
obj.transform.origin = map_to_world(cell)
else:
print("Placed object tile ", name, " at ", cell, " but has no object associated!")
set_cellv(cell, -1)

View File

@ -1,107 +0,0 @@
[gd_scene load_steps=10 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]
[ext_resource path="res://Scenes/Rendering/MapTiles.gd" type="Script" id=3]
[ext_resource path="res://Scenes/Map.gd" type="Script" id=4]
[ext_resource path="res://Graphics/space.png" type="Texture" id=7]
[ext_resource path="res://Graphics/tgstation/floor.tres" type="TileSet" id=9]
[ext_resource path="res://Graphics/tgstation/base.tres" type="TileSet" id=11]
[ext_resource path="res://Graphics/tgstation/cables.tres" type="TileSet" id=13]
[sub_resource type="CanvasItemMaterial" id=1]
light_mode = 1
[node name="map" type="Node2D"]
script = ExtResource( 4 )
[node name="darkness" type="CanvasModulate" parent="."]
visible = false
color = Color( 0, 0, 0, 1 )
[node name="editor" type="Node2D" parent="."]
[node name="deepspace" type="Sprite" parent="."]
material = SubResource( 1 )
texture = ExtResource( 7 )
region_enabled = true
region_rect = Rect2( 0, 0, 10000, 10000 )
__meta__ = {
"_edit_group_": true,
"_edit_lock_": true
}
[node name="base" type="TileMap" parent="."]
z_index = 1
z_as_relative = false
tile_set = ExtResource( 11 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
occluder_light_mask = -2147483647
format = 1
[node name="cables" type="TileMap" parent="."]
z_index = 2
z_as_relative = false
tile_set = ExtResource( 13 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
occluder_light_mask = -2147483647
format = 1
[node name="floor" type="TileMap" parent="."]
z_index = 3
z_as_relative = false
tile_set = ExtResource( 9 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
occluder_light_mask = -2147483647
format = 1
[node name="walls" type="TileMap" parent="."]
z_index = 4
z_as_relative = false
tile_set = ExtResource( 1 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
occluder_light_mask = -2147483647
format = 1
script = ExtResource( 3 )
extended_tilemap_node = NodePath("../1x1")
[node name="1x1" type="TileMap" parent="."]
z_index = 5
z_as_relative = false
tile_set = ExtResource( 2 )
cell_size = Vector2( 16, 16 )
format = 1
[node name="engines" type="Node2D" parent="."]
modulate = Color( 0.980392, 0.980392, 0.980392, 1 )
__meta__ = {
"_edit_group_": true,
"_edit_lock_": true
}
[node name="objects" type="Node2D" parent="."]
z_index = 10
__meta__ = {
"_editor_description_": ""
}
[node name="sockets" type="Node2D" parent="."]
z_index = 2
z_as_relative = false
[node name="lights" type="Node2D" parent="."]
modulate = Color( 0.980392, 0.980392, 0.980392, 1 )
z_index = 11
__meta__ = {
"_edit_group_": true,
"_edit_lock_": true
}
[node name="pois" type="Node2D" parent="."]
z_index = 999
[node name="areas" type="Node2D" parent="."]

15
Scenes/Maps/odyssey.gd Normal file
View File

@ -0,0 +1,15 @@
extends GameMap
func _ready():
tilemaps = [
$base,
$cables,
$floor,
$walls
]
func get_occlusion_mask():
return $walls.create_occlusion_mask()
func get_occlusion_offset():
return $walls.get_used_rect().position

File diff suppressed because one or more lines are too long

4
Scenes/Maps/runtime.gd Normal file
View File

@ -0,0 +1,4 @@
extends GameMap
func _ready():
set_unlit(true)

View File

@ -4,28 +4,21 @@
[ext_resource path="res://Graphics/tgstation/1x1.tres" type="TileSet" id=2]
[ext_resource path="res://Scenes/Rendering/MapTiles.gd" type="Script" id=3]
[ext_resource path="res://Graphics/tgstation/cables.tres" type="TileSet" id=4]
[ext_resource path="res://Actors/Meta/POI/POI.tscn" type="PackedScene" id=5]
[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]
[ext_resource path="res://Actors/Objects/PowerStorage/PowerStorage.tscn" type="PackedScene" id=12]
[ext_resource path="res://Actors/Objects/ElectricSocket/ElectricSocket.tscn" type="PackedScene" id=13]
[sub_resource type="GDScript" id=1]
script/source = "extends GameMap
func _ready():
set_unlit(true)
"
[sub_resource type="CanvasItemMaterial" id=2]
[sub_resource type="CanvasItemMaterial" id=1]
light_mode = 1
[node name="map" type="Node2D"]
z_as_relative = false
script = SubResource( 1 )
script = ExtResource( 5 )
[node name="darkness" type="CanvasModulate" parent="."]
visible = false
@ -34,7 +27,7 @@ color = Color( 0, 0, 0, 1 )
[node name="editor" type="Node2D" parent="."]
[node name="deepspace" type="Sprite" parent="."]
material = SubResource( 2 )
material = SubResource( 1 )
texture = ExtResource( 7 )
region_enabled = true
region_rect = Rect2( 0, 0, 10000, 10000 )
@ -45,7 +38,6 @@ __meta__ = {
[node name="base" type="TileMap" parent="."]
z_index = 1
z_as_relative = false
tile_set = ExtResource( 11 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
@ -55,7 +47,6 @@ tile_data = PoolIntArray( 262137, 0, 0, 262138, 0, 0, 262139, 0, 0, 262140, 0, 0
[node name="cables" type="TileMap" parent="."]
z_index = 2
z_as_relative = false
tile_set = ExtResource( 4 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
@ -65,7 +56,6 @@ tile_data = PoolIntArray( 393212, 0, 131072, 393213, 0, 65536, 393214, 0, 65536,
[node name="floor" type="TileMap" parent="."]
z_index = 3
z_as_relative = false
tile_set = ExtResource( 9 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
@ -74,7 +64,6 @@ format = 1
[node name="walls" type="TileMap" parent="."]
z_index = 4
z_as_relative = false
tile_set = ExtResource( 1 )
cell_size = Vector2( 32, 32 )
cell_quadrant_size = 32
@ -86,7 +75,6 @@ extended_tilemap_node = NodePath("../1x1")
[node name="1x1" type="TileMap" parent="."]
z_index = 5
z_as_relative = false
tile_set = ExtResource( 2 )
cell_size = Vector2( 16, 16 )
format = 1
@ -146,48 +134,44 @@ position = Vector2( 128, 128 )
position = Vector2( 64, 128 )
computer_type = 6
[node name="sockets" type="Node2D" parent="."]
z_index = 2
z_as_relative = false
[node name="ElectricSocket4" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket4" parent="objects" instance=ExtResource( 13 )]
position = Vector2( -128, 160 )
connectionPaths = [ NodePath("../../objects/Computer6") ]
connectionPaths = [ NodePath("../Computer6") ]
flow = 1
[node name="ElectricSocket5" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket5" parent="objects" instance=ExtResource( 13 )]
position = Vector2( -96, 160 )
connectionPaths = [ NodePath("../../objects/Computer5") ]
connectionPaths = [ NodePath("../Computer5") ]
flow = 1
[node name="ElectricSocket6" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket6" parent="objects" instance=ExtResource( 13 )]
position = Vector2( -64, 160 )
connectionPaths = [ NodePath("../../objects/Computer") ]
connectionPaths = [ NodePath("../Computer") ]
flow = 1
[node name="ElectricSocket7" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket7" parent="objects" instance=ExtResource( 13 )]
position = Vector2( -32, 160 )
connectionPaths = [ NodePath("../../objects/Computer2") ]
connectionPaths = [ NodePath("../Computer2") ]
flow = 1
[node name="ElectricSocket8" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket8" parent="objects" instance=ExtResource( 13 )]
position = Vector2( 0, 160 )
connectionPaths = [ NodePath("../../objects/Computer3") ]
connectionPaths = [ NodePath("../Computer3") ]
flow = 1
[node name="ElectricSocket9" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket9" parent="objects" instance=ExtResource( 13 )]
position = Vector2( 32, 160 )
connectionPaths = [ NodePath("../../objects/Computer4") ]
connectionPaths = [ NodePath("../Computer4") ]
flow = 1
[node name="ElectricSocket10" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket10" parent="objects" instance=ExtResource( 13 )]
position = Vector2( 64, 160 )
connectionPaths = [ NodePath("../../objects/Computer7") ]
connectionPaths = [ NodePath("../Computer7") ]
flow = 1
[node name="ElectricSocket3" parent="sockets" instance=ExtResource( 13 )]
[node name="ElectricSocket3" parent="objects" instance=ExtResource( 13 )]
position = Vector2( 128, 160 )
connectionPaths = [ NodePath("../../objects/SMES2") ]
connectionPaths = [ NodePath("../SMES2") ]
[node name="lights" type="Node2D" parent="."]
modulate = Color( 0.980392, 0.980392, 0.980392, 1 )
@ -199,5 +183,6 @@ __meta__ = {
[node name="pois" type="Node2D" parent="."]
z_index = 999
[node name="SpawnpointPlayer" parent="pois" instance=ExtResource( 5 )]
position = Vector2( 80, 272 )
[node name="SpawnpointPlayer" type="Node2D" parent="pois"]
position = Vector2( 112, 272 )
script = ExtResource( 8 )

View File

@ -1,85 +1,42 @@
extends Control
const REFRESH_SERVER_DELAY = 5.0
export var scale = 4 setget set_scale
export var upThreshold = 1.0/59.0
export var scale = 2 setget set_scale
export var upThreshold = 1.0/Engine.iterations_per_second
export var downThreshold = 1.0/30.0
export var delay = 1.0
export var refresh_server_remaining = REFRESH_SERVER_DELAY
onready var viewport = $Viewport
onready var background = $Background
onready var netgame = $"/root/Multiplayer"
onready var server_list = $Popup/MarginContainer/VBoxContainer/ItemList
onready var name_field = $CenterContainer/PanelContainer/HBoxContainer/HBoxContainer/NameField
var servers = []
func _ready() -> void:
name_field.text = netgame.player_name
func _ready():
set_scale(scale)
$"/root/Music/BGM".play()
netgame.connect("ms_updated", self, "_ms_update")
request_servers()
func _process(delta: float) -> void:
refresh_server_remaining -= delta
if refresh_server_remaining <= 0:
request_servers()
refresh_server_remaining = REFRESH_SERVER_DELAY
func _process(delta):
# Give the system time to adjust
if delay > 0:
delay -= delta
return
if delta > downThreshold:
print("GPU is taking too much (%ss > %ss), adjusting shader scale" % [ delta, downThreshold ])
print("GPU is taking too much (", delta, "s < ", downThreshold, "s), adjusting shader scale")
set_scale(scale+1)
elif delta < upThreshold and scale > 2:
print("GPU is taking it easy (%ss < %ss), adjusting shader scale" % [ delta, upThreshold ])
print("GPU is taking it easy (", delta, "s < ", upThreshold, "s), adjusting shader scale")
set_scale(scale-1)
func request_servers():
netgame.ms_get_entries()
const server_list_format = "{name} ({address}) - {players}/{max_players} players"
func _ms_update(action, result):
if action == "list_games":
# Reset server list
server_list.clear()
servers = result
for server in servers:
server.data.address = server.address
server_list.add_item(server_list_format.format(server.data))
func set_scale(val) -> void:
func set_scale(val):
scale = val
if viewport:
viewport.size = rect_size / scale
background.update()
$Viewport.size = rect_size / scale
$Background.update()
func _on_resized() -> void:
if viewport:
viewport.size = rect_size / scale
background.update()
func _on_resized():
$Viewport.size = rect_size / scale
$Background.update()
func _host_pressed() -> void:
func _host_pressed():
$"/root/Music/BGM".stop()
$"/root/Multiplayer".host()
func _join_pressed() -> void:
$Popup.popup_centered_ratio()
func _join_pressed():
pass
func join_server(server) -> void:
$"/root/Music/BGM".stop()
netgame.join(server)
func _server_addr_changed(new_text: String) -> void:
$Popup/MarginContainer/VBoxContainer/HBoxContainer/Button.disabled = new_text.length() < 1
func _manual_join_pressed():
join_server({ "address": $Popup/MarginContainer/VBoxContainer/HBoxContainer/LineEdit.text })
func _server_item_clicked(index):
$"/root/Music/BGM".stop()
join_server(servers[index])
func _server_addr_changed(new_text: String):
$CenterContainer/PanelContainer/HBoxContainer/JoinButton.disabled = new_text.length() < 1

View File

@ -1,10 +1,9 @@
[gd_scene load_steps=13 format=2]
[gd_scene load_steps=10 format=2]
[ext_resource path="res://Scenes/Menu.gd" type="Script" id=1]
[ext_resource path="res://Graphics/UI/Background.shader" type="Shader" id=2]
[ext_resource path="res://Graphics/UI/logo-temp-pixel.png" type="Texture" id=3]
[ext_resource path="res://Graphics/UI/ui_theme.tres" type="Theme" id=4]
[ext_resource path="res://Graphics/UI/iosevka-aile-regular.ttf" type="DynamicFontData" id=5]
[sub_resource type="ViewportTexture" id=1]
viewport_path = NodePath("Viewport")
@ -16,14 +15,26 @@ void fragment() {
vec4 tex = texture(TEXTURE, UV);
COLOR = vec4(tex.rgb * 0., tex.a * 0.5);
}"
custom_defines = ""
[sub_resource type="ShaderMaterial" id=3]
shader = SubResource( 2 )
[sub_resource type="ShaderMaterial" id=4]
shader = ExtResource( 2 )
shader_param/speed = 0.001
shader_param/iterations = 17
shader_param/formuparam = 0.53
shader_param/volsteps = 20
shader_param/stepsize = 0.1
shader_param/zoom = 0.8
shader_param/tile = 0.85
shader_param/speed = 0.001
shader_param/brightness = 0.0015
shader_param/darkmatter = 0.3
shader_param/distfading = 0.73
shader_param/saturation = 0.85
shader_param/rotx = 0.0
shader_param/roty = 0.001
[sub_resource type="StyleBoxFlat" id=5]
content_margin_left = 16.0
@ -35,24 +46,12 @@ border_width_left = 4
border_width_top = 4
border_width_right = 4
border_width_bottom = 4
border_color = Color( 0.27451, 0.415686, 0.984314, 0.392157 )
border_color = Color( 0.27301, 0.417506, 0.984375, 0.392157 )
corner_radius_top_left = 4
corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
[sub_resource type="DynamicFont" id=6]
size = 20
extra_spacing_top = 5
extra_spacing_bottom = 5
font_data = ExtResource( 5 )
[sub_resource type="DynamicFont" id=7]
size = 20
extra_spacing_top = 10
extra_spacing_bottom = 10
font_data = ExtResource( 5 )
[node name="Control" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
@ -127,9 +126,9 @@ __meta__ = {
[node name="PanelContainer" type="PanelContainer" parent="CenterContainer"]
margin_left = 390.0
margin_top = 8.0
margin_top = 43.0
margin_right = 690.0
margin_bottom = 241.0
margin_bottom = 207.0
rect_min_size = Vector2( 300, 0 )
custom_styles/panel = SubResource( 5 )
@ -137,160 +136,41 @@ custom_styles/panel = SubResource( 5 )
margin_left = 16.0
margin_top = 20.0
margin_right = 284.0
margin_bottom = 213.0
margin_bottom = 144.0
custom_constants/separation = 10
[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_right = 268.0
margin_bottom = 28.0
custom_constants/separation = 10
__meta__ = {
"_edit_use_anchors_": false
}
[node name="NameLabel" type="Label" parent="CenterContainer/PanelContainer/HBoxContainer/HBoxContainer"]
margin_top = 5.0
margin_right = 34.0
margin_bottom = 23.0
theme = ExtResource( 4 )
text = "Name"
[node name="NameField" type="LineEdit" parent="CenterContainer/PanelContainer/HBoxContainer/HBoxContainer"]
margin_left = 44.0
margin_right = 268.0
margin_bottom = 28.0
size_flags_horizontal = 3
theme = ExtResource( 4 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Panel" type="Panel" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_top = 38.0
margin_right = 268.0
margin_bottom = 43.0
rect_min_size = Vector2( 0, 5 )
[node name="HostButton" type="Button" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_top = 53.0
margin_right = 268.0
margin_bottom = 95.0
margin_bottom = 24.0
theme = ExtResource( 4 )
custom_fonts/font = SubResource( 6 )
text = "Start a new game"
[node name="Label" type="Label" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_top = 105.0
margin_top = 34.0
margin_right = 268.0
margin_bottom = 141.0
margin_bottom = 52.0
theme = ExtResource( 4 )
custom_fonts/font = SubResource( 6 )
text = "or"
align = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="JoinButton" type="Button" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_top = 151.0
[node name="ServerAddr" type="LineEdit" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_top = 62.0
margin_right = 268.0
margin_bottom = 193.0
margin_bottom = 90.0
theme = ExtResource( 4 )
custom_fonts/font = SubResource( 6 )
text = "Join an existing game"
placeholder_text = "Server address or URL"
[node name="Popup" type="PopupDialog" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 100.0
[node name="JoinButton" type="Button" parent="CenterContainer/PanelContainer/HBoxContainer"]
margin_top = 100.0
margin_right = -100.0
margin_bottom = -100.0
custom_styles/panel = SubResource( 5 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="MarginContainer" type="MarginContainer" parent="Popup"]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 20.0
margin_top = 20.0
margin_right = -20.0
margin_bottom = -20.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="VBoxContainer" type="VBoxContainer" parent="Popup/MarginContainer"]
margin_right = 1040.0
margin_bottom = 560.0
custom_constants/separation = 5
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="Popup/MarginContainer/VBoxContainer"]
margin_right = 1040.0
margin_bottom = 36.0
custom_fonts/font = SubResource( 6 )
text = "Server Browser"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ItemList" type="ItemList" parent="Popup/MarginContainer/VBoxContainer"]
margin_top = 41.0
margin_right = 1040.0
margin_bottom = 468.0
size_flags_vertical = 3
custom_fonts/font = SubResource( 7 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label2" type="Label" parent="Popup/MarginContainer/VBoxContainer"]
margin_top = 473.0
margin_right = 1040.0
margin_bottom = 509.0
custom_fonts/font = SubResource( 6 )
text = "Join by IP/address"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HBoxContainer" type="HBoxContainer" parent="Popup/MarginContainer/VBoxContainer"]
margin_top = 514.0
margin_right = 1040.0
margin_bottom = 560.0
size_flags_horizontal = 3
custom_constants/separation = 10
[node name="LineEdit" type="LineEdit" parent="Popup/MarginContainer/VBoxContainer/HBoxContainer"]
margin_right = 300.0
margin_bottom = 46.0
rect_min_size = Vector2( 300, 0 )
custom_fonts/font = SubResource( 6 )
placeholder_text = "server.address"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Button" type="Button" parent="Popup/MarginContainer/VBoxContainer/HBoxContainer"]
margin_left = 310.0
margin_right = 410.0
margin_bottom = 46.0
rect_min_size = Vector2( 100, 0 )
margin_right = 268.0
margin_bottom = 124.0
theme = ExtResource( 4 )
custom_fonts/font = SubResource( 6 )
disabled = true
text = "Join"
__meta__ = {
"_edit_use_anchors_": false
}
text = "Join an existing game"
[connection signal="resized" from="." to="." method="_on_resized"]
[connection signal="pressed" from="CenterContainer/PanelContainer/HBoxContainer/HostButton" to="." method="_host_pressed"]
[connection signal="text_changed" from="CenterContainer/PanelContainer/HBoxContainer/ServerAddr" to="." method="_server_addr_changed"]
[connection signal="pressed" from="CenterContainer/PanelContainer/HBoxContainer/JoinButton" to="." method="_join_pressed"]
[connection signal="item_activated" from="Popup/MarginContainer/VBoxContainer/ItemList" to="." method="_server_item_clicked"]
[connection signal="text_changed" from="Popup/MarginContainer/VBoxContainer/HBoxContainer/LineEdit" to="." method="_server_addr_changed"]
[connection signal="pressed" from="Popup/MarginContainer/VBoxContainer/HBoxContainer/Button" to="." method="_manual_join_pressed"]

View File

@ -12,14 +12,10 @@ export var shadow_intensity = 0.2
onready var extended_tilemap = get_node(extended_tilemap_node) as TileMap
func run_conversions():
# Make occluders
make_occluders()
func _ready():
# Convert 2x2 tiles to 1x1 if possible
convert_extended()
func convert_extended():
var extended = extended_tilemap.tile_set
for id in tile_set.get_tiles_ids():
@ -40,31 +36,20 @@ func convert_extended():
extended_tilemap.update_bitmask_region()
extended_tilemap.update_dirty_quadrants()
func make_occluders():
func create_occlusion_mask():
var tile_size = get_used_rect()
var mask_image = Image.new()
mask_image.create(tile_size.size.x, tile_size.size.y, false, Image.FORMAT_L8)
mask_image.fill(Color.black)
mask_image.lock()
var occluder_ids = []
for occluder_name in occluders:
var id = tile_set.find_tile_by_name(occluder_name)
if id >= 0:
occluder_ids.push_back(id)
for id in tile_set.get_tiles_ids():
if occluder_ids.find(id) < 0:
# Not an occluder, skip it
continue
# Find all uses of this tile
for cell in get_used_cells_by_id(id):
# Check sides
var occluder = Occluder.new()
occluder.ignore_sides = [
occluder_ids.find(get_cell(cell.x, cell.y-1)) >= 0, # Top
occluder_ids.find(get_cell(cell.x+1, cell.y)) >= 0, # Right
occluder_ids.find(get_cell(cell.x, cell.y+1)) >= 0, # Bottom
occluder_ids.find(get_cell(cell.x-1, cell.y)) >= 0 # Left
]
occluder.transform.origin = map_to_world(cell)
add_child(occluder)
func set_occluder_origin(origin):
for child in get_children():
if child is Occluder:
child.origin = origin
for occluder in occluders:
occluder_ids.append(tile_set.find_tile_by_name(occluder))
for occluder_id in occluder_ids:
for cell in get_used_cells_by_id(occluder_id):
mask_image.set_pixelv(cell - tile_size.position, Color.white)
mask_image.unlock()
mask_image.save_png("res://test.png")
var mask_texture = ImageTexture.new()
mask_texture.create_from_image(mask_image, 0)
return mask_texture

View File

@ -1,52 +0,0 @@
extends Node2D
class_name Occluder
const MAX_LENGTH = 200
const EPSILON = 0.1
const DEBUG = false
var ignore_sides = [false, false, false, false]
var size = Vector2(32, 32)
var origin = null
var polygon: PoolVector2Array = [Vector2.ZERO, Vector2(size.x, 0), Vector2(size.x, size.y), Vector2(0, size.y)]
func _draw():
if polygon == null:
return
if origin == null:
return
var player_position = origin.global_position - global_position
# Find what edges is the players looking at
var edges = [
player_position.y < 0, # TOP
player_position.x > size.x*2, # RIGHT
player_position.y > size.y*2, # BOTTOM
player_position.x < 0 # LEFT
]
for current in range(0, polygon.size()):
var next = (current + 1) % polygon.size()
if not ignore_sides[current] and not edges[current]:
var points = [
(polygon[current] * 2.1 - origin.global_position + global_position) * MAX_LENGTH,
polygon[current], polygon[next],
(polygon[next] * 2.1 - origin.global_position + global_position) * MAX_LENGTH
]
draw_polygon(points, [Color.black])
if DEBUG:
draw_polyline(points, Color.rebeccapurple)
else:
if DEBUG:
if ignore_sides[current]:
draw_line(polygon[current], polygon[next], Color.red, 1)
else:
draw_line(polygon[current], polygon[next], Color.yellow, 2)
func _process(_delta):
update()
z_index = 999

15
Scenes/Rendering/SSLO.gd Normal file
View File

@ -0,0 +1,15 @@
extends ColorRect
var player = null
var occlusion_mask: ImageTexture = null
var occlusion_offset = Vector2.ZERO
onready var shader = (material as ShaderMaterial)
func _process(delta):
if occlusion_mask != null:
shader.set_shader_param("occlusion_mask", occlusion_mask)
shader.set_shader_param("occlusion_rect", Color(occlusion_offset.x, occlusion_offset.y, occlusion_mask.get_width(), occlusion_mask.get_height()))
var viewport_rect = get_viewport_rect()
var camera_offset = player.camera.get_camera_position() - viewport_rect.size * 0.5
shader.set_shader_param("viewport_rect", Color(camera_offset.x, camera_offset.y, viewport_rect.size.x, viewport_rect.size.y))

View File

@ -0,0 +1,34 @@
shader_type canvas_item;
render_mode unshaded;
uniform vec4 viewport_rect;
uniform sampler2D occlusion_mask;
uniform vec4 occlusion_rect;
uniform float cell_div = 0.03125; // 1/cell_size = 1/32
uniform float diffusion = 0.3;
uniform float scale_factor = 0.5;
float tile_at(vec2 coord, vec2 camera_tile_offset, vec2 occlusion_div) {
return texture(occlusion_mask, (coord * cell_div - occlusion_rect.xy) * occlusion_div + camera_tile_offset).r;
}
void fragment() {
vec2 occlusion_div = 1.0 / occlusion_rect.zw;
vec2 camera_offset = viewport_rect.xy * scale_factor;
vec2 camera_tile_offset = camera_offset * cell_div * occlusion_div;
vec2 coords = UV.xy * viewport_rect.zw * scale_factor;
float tile = tile_at(coords, camera_tile_offset, occlusion_div);
vec4 ray_coords = vec4(0,0, viewport_rect.zw/2.) * scale_factor;
vec2 ray_dir = normalize(ray_coords.zw - ray_coords.xy);
if (int(coords.x+camera_offset.x) % 32 < 1 || int(coords.y+camera_offset.y) % 32 < 1) {
COLOR = vec4(1);
} else if (distance(coords, ray_coords.xy) < 10.0 || distance(coords, ray_coords.zw) < 10.) {
COLOR = vec4(0,1,0,1);
} else if (tile >= diffusion) {
COLOR = vec4(1,0,0,1);
} else {
COLOR = texture(SCREEN_TEXTURE, SCREEN_UV);
}
}

92
Scenes/SSLOTest.tscn Normal file
View File

@ -0,0 +1,92 @@
[gd_scene load_steps=9 format=2]
[ext_resource path="res://Scenes/Maps/odyssey.tscn" type="PackedScene" id=1]
[ext_resource path="res://Scenes/Rendering/SSLO.shader" type="Shader" id=2]
[ext_resource path="res://Scenes/UI.tscn" type="PackedScene" id=3]
[ext_resource path="res://Scenes/Rendering/SSLO.gd" type="Script" id=4]
[ext_resource path="res://Scenes/Game.gd" type="Script" id=5]
[ext_resource path="res://test.png" type="Texture" id=6]
[sub_resource type="GDScript" id=1]
script/source = "extends Node2D
enum Map { RUNTIME, ODYSSEY }
export(Map) var mapToLoad = Map.RUNTIME
const playerRes = preload(\"res://Actors/Player/Player.tscn\")
var map = null
var player = null
func initiate():
player = playerRes.instance()
player.is_controlled = true
map = $map
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)\")
$players.add_child(player)
$\"/root/scene\".lighting.player = player
var occlusion_mask = map.get_occlusion_mask()
$\"/root/scene\".lighting.occlusion_mask = occlusion_mask
$\"/root/scene\".lighting.occlusion_offset = map.get_occlusion_offset()
print(map.get_occlusion_offset())
($\"/root/scene/CanvasLayer/TextureRect\" as TextureRect).texture = occlusion_mask
func initiate_editor():
map = $map
var occlusion_mask = map.get_occlusion_mask()
$\"/root/scene\".lighting.occlusion_mask = occlusion_mask
($\"/root/scene/CanvasLayer/TextureRect\" as TextureRect).texture = occlusion_mask
"
[sub_resource type="ShaderMaterial" id=2]
shader = ExtResource( 2 )
shader_param/viewport_rect = Plane( 0, 0, 1280, 800 )
shader_param/occlusion_rect = Plane( -12, -9, 32, 33 )
shader_param/cell_div = 0.03125
shader_param/diffusion = 0.3
shader_param/scale_factor = 0.5
shader_param/occlusion_mask = ExtResource( 6 )
[node name="scene" type="Node"]
script = ExtResource( 5 )
[node name="systems" type="Node" parent="."]
[node name="world" type="Node2D" parent="."]
scale = Vector2( 2, 2 )
script = SubResource( 1 )
[node name="map" parent="world" instance=ExtResource( 1 )]
[node name="players" type="Node2D" parent="world"]
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="TextureRect" type="TextureRect" parent="CanvasLayer"]
visible = false
margin_right = 20.0
margin_bottom = 15.0
rect_scale = Vector2( 4, 4 )
mouse_filter = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="sslo" type="ColorRect" parent="CanvasLayer"]
material = SubResource( 2 )
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
color = Color( 0, 0, 0, 0.764706 )
script = ExtResource( 4 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ui" parent="CanvasLayer" instance=ExtResource( 3 )]
visible = false

View File

@ -1,195 +1,18 @@
extends Control
class_name GameUI
signal command(command)
enum ServerMenuItem {
ServerInfo
SERVER_INFO
}
enum PopupName {
SpaceMap,
EnergyUsage
}
onready var logs = $Logs
onready var inspect_box = $InspectBox as RichTextLabel
onready var item_slots_container = $ItemSlots
onready var map_popup = $MapPopup
onready var sever_info_popup = $ServerInfoPopup
onready var scene = $"/root/scene"
onready var netgame = $"/root/Multiplayer"
const ItemBox = preload("res://Scenes/UI/Items/ItemBox.tscn")
var left_selected = null
var right_selected = null
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)
serverMenu.add_item("Server info", ServerMenuItem.SERVER_INFO)
# Create item slots
for slot_id in range(4):
var item_slot = ItemBox.instance()
# By default, slot 2/3 are L/R, and 2 is selected
match slot_id:
1:
item_slot.selected = true
item_slot.current_hand = UIItemBox.CurrentHand.Left
left_selected = item_slot
2:
item_slot.current_hand = UIItemBox.CurrentHand.Right
right_selected = item_slot
# Connect signals
item_slot.connect("selected", self, "_itembox_selected", [item_slot])
item_slot.connect("used_in_hand", self, "_itembox_used", [item_slot])
item_slots_container.add_child(item_slot)
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:
ServerMenuItem.SERVER_INFO:
$ServerInfoPopup.popup_centered()
func open_popup(popup_name) -> void:
match popup_name:
PopupName.SpaceMap:
$MapPopup.popup_centered_ratio()
PopupName.EnergyUsage:
pass
func close_popup(popup_name) -> void:
match popup_name:
PopupName.SpaceMap:
$MapPopup.visible = false
PopupName.EnergyUsage:
pass
const say_format = "%s says \"%s\"\n"
const ask_format = "%s asks \"%s\"\n"
const shout_format = "%s shouts \"[b]%s[/b]\"\n"
const whisper_format = "[i]%s whispers \"%s\"[/i]\n"
func _send_chat(text: String) -> void:
var escaped_text = text.replace("[", "[\u8203").strip_edges() # Hacky way to escape BBCode
if text.ends_with("?"):
scene.rpc("broadcast_zone", ask_format % [netgame.player_name, escaped_text], scene.world.player.global_position, SHOUT_RADIUS)
if text.ends_with("!!"):
scene.rpc("broadcast_zone", shout_format % [netgame.player_name, escaped_text], scene.world.player.global_position, SHOUT_RADIUS)
elif text.begins_with("#"):
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:
var no_popups = not check_popups()
if event.is_action_released("inspect"):
set_inspect(false)
elif event.is_action_pressed("inspect"):
set_inspect(true)
elif event.is_action_pressed("ui_scroll_left") and no_popups:
select_next_box(-1, Input.is_action_pressed("alt_hand"))
elif event.is_action_pressed("ui_scroll_right") and no_popups:
select_next_box(1, Input.is_action_pressed("alt_hand"))
elif event.is_action_pressed("swap_hands"):
swap_hands()
elif event is InputEventMouseMotion:
var mousemotion = event as InputEventMouseMotion
if inspect_mode:
inspect_box.rect_global_position = mousemotion.position + inspect_offset
func _itembox_selected(hand, item_box: UIItemBox) -> void:
left_selected.selected = false
right_selected.selected = false
match hand:
UIItemBox.CurrentHand.Left:
if item_box.current_hand != UIItemBox.CurrentHand.None:
left_selected.current_hand = item_box.current_hand
match item_box.current_hand:
UIItemBox.CurrentHand.Right:
right_selected = left_selected
else:
left_selected.current_hand = UIItemBox.CurrentHand.None
left_selected = item_box
UIItemBox.CurrentHand.Right:
if item_box.current_hand != UIItemBox.CurrentHand.None:
right_selected.current_hand = item_box.current_hand
match item_box.current_hand:
UIItemBox.CurrentHand.Left:
left_selected = right_selected
else:
right_selected.current_hand = UIItemBox.CurrentHand.None
right_selected = item_box
item_box.selected = true
item_box.current_hand = hand
func _itembox_used(item_box) -> void:
pass
func check_popups() -> bool:
return map_popup.visible or sever_info_popup.visible
func select_next_box(direction: int, right_hand: bool) -> void:
var box = left_selected as UIItemBox
if right_hand:
box = right_selected
var parent = box.get_parent()
var child_count = parent.get_child_count()
var index = box.get_index()
index += direction
if index < 0:
index = child_count + index
elif index >= child_count:
index -= child_count
var hand = UIItemBox.CurrentHand.Left
if right_hand:
hand = UIItemBox.CurrentHand.Right
_itembox_selected(hand, parent.get_child(index))
func swap_hands() -> void:
if left_selected.selected:
_itembox_selected(UIItemBox.CurrentHand.Left, right_selected)
else:
_itembox_selected(UIItemBox.CurrentHand.Right, left_selected)

View File

@ -1,49 +1,10 @@
[gd_scene load_steps=16 format=2]
[gd_scene load_steps=5 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]
[ext_resource path="res://Graphics/UI/iosevka-aile-regular.ttf" type="DynamicFontData" id=3]
[ext_resource path="res://Scenes/UI/Panels/ServerInfo.tscn" type="PackedScene" id=4]
[ext_resource path="res://Scenes/UI/Widgets/ResizablePanel.tscn" type="PackedScene" id=5]
[ext_resource path="res://Scenes/UI/Panels/Logs.gd" type="Script" id=6]
[ext_resource path="res://Graphics/UI/iosevka-aile-italic.ttf" type="DynamicFontData" id=7]
[ext_resource path="res://Graphics/UI/iosevka-aile-bold.ttf" type="DynamicFontData" id=8]
[ext_resource path="res://Graphics/UI/iosevka-aile-bolditalic.ttf" type="DynamicFontData" id=9]
[ext_resource path="res://Scenes/UI/Widgets/ResizablePanel.tscn" type="PackedScene" id=3]
[sub_resource type="DynamicFont" id=1]
size = 14
use_mipmaps = true
font_data = ExtResource( 9 )
[sub_resource type="DynamicFont" id=2]
size = 14
use_mipmaps = true
font_data = ExtResource( 7 )
[sub_resource type="DynamicFont" id=3]
size = 14
use_mipmaps = true
font_data = ExtResource( 8 )
[sub_resource type="DynamicFont" id=4]
size = 14
use_mipmaps = true
font_data = ExtResource( 3 )
[sub_resource type="StyleBoxFlat" id=5]
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
[sub_resource type="StyleBoxFlat" id=6]
[sub_resource type="StyleBoxFlat" id=1]
bg_color = Color( 0.133333, 0.12549, 0.203922, 0.705882 )
border_width_left = 4
border_width_top = 4
@ -69,53 +30,10 @@ __meta__ = {
[node name="MapPopup" parent="." instance=ExtResource( 1 )]
[node name="Logs" type="Control" parent="."]
margin_left = 10.0
margin_top = 10.0
margin_right = 475.0
margin_bottom = 273.0
script = ExtResource( 6 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ResizablePanel" parent="Logs" instance=ExtResource( 5 )]
title = "Logs"
[node name="RichTextLabel" type="RichTextLabel" parent="Logs/ResizablePanel"]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 40.0
margin_right = -10.0
margin_bottom = -40.0
focus_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
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 )
bbcode_enabled = true
selection_enabled = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="LineEdit" type="LineEdit" parent="Logs/ResizablePanel"]
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 6.0
margin_top = -30.0
margin_right = -16.0
margin_bottom = -6.0
focus_mode = 1
caret_blink = true
caret_blink_speed = 0.5
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Logs" parent="." instance=ExtResource( 3 )]
margin_right = 392.0
margin_bottom = 256.0
title = "Log"
[node name="Menu" type="PanelContainer" parent="."]
anchor_left = 1.0
@ -128,7 +46,7 @@ grow_horizontal = 0
grow_vertical = 0
size_flags_horizontal = 8
size_flags_vertical = 8
custom_styles/panel = SubResource( 5 )
custom_styles/panel = SubResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
@ -165,45 +83,13 @@ margin_right = 144.0
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
[node name="ServerInfoPopup" type="WindowDialog" parent="."]
margin_left = -278.587
margin_top = 58.4538
margin_right = -22.587
margin_bottom = 226.454
window_title = "Server info"
resizable = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ItemSlots" type="HBoxContainer" parent="."]
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_top = -100.0
margin_bottom = -50.0
rect_scale = Vector2( 2, 2 )
alignment = 1
__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 ]]
[connection signal="mouse_entered" from="Logs/ResizablePanel/LineEdit" to="Logs" method="_chat_bar_focus" binds= [ true ]]
[connection signal="mouse_exited" from="Logs/ResizablePanel/LineEdit" to="Logs" method="_chat_bar_focus" binds= [ false ]]
[connection signal="text_entered" from="Logs/ResizablePanel/LineEdit" to="Logs" method="_text_submitted"]

View File

@ -1,64 +0,0 @@
extends TextureRect
class_name UIItemBox
signal selected(hand)
signal used_in_hand()
enum CurrentHand {
None,
Left,
Right
}
var hovering = false
export var selected = false setget set_selected
export(CurrentHand) var current_hand = CurrentHand.None setget set_hand
const LEFT_Y_OFFSET = 0
const RIGHT_Y_OFFSET = 10
onready var hand_icon = $HandIcon
func _ready():
hand_icon.texture = hand_icon.texture.duplicate()
set_hand(current_hand)
func _mouse_hover(inside: bool) -> void:
hovering = inside
if hovering:
self_modulate.a = 1
else:
self_modulate.a = 0.86
func set_selected(val: bool) -> void:
selected = val
$SelectedOverlay.visible = selected
func set_hand(hand):
current_hand = hand
if hand_icon != null:
match hand:
CurrentHand.None:
hand_icon.visible = false
CurrentHand.Left:
hand_icon.visible = true
(hand_icon.texture as AtlasTexture).region.position.y = LEFT_Y_OFFSET
CurrentHand.Right:
hand_icon.visible = true
(hand_icon.texture as AtlasTexture).region.position.y = RIGHT_Y_OFFSET
func _gui_input(event):
if event is InputEventMouseButton:
var mouse_event = event as InputEventMouseButton
if mouse_event.pressed:
if mouse_event.button_index == BUTTON_LEFT:
if current_hand != CurrentHand.Left:
emit_signal("selected", CurrentHand.Left)
else:
emit_signal("used_in_hand")
elif mouse_event.button_index == BUTTON_RIGHT:
if current_hand != CurrentHand.Right:
emit_signal("selected", CurrentHand.Right)
else:
emit_signal("used_in_hand")

View File

@ -1,53 +0,0 @@
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Graphics/tgstation/midnight.png" type="Texture" id=1]
[ext_resource path="res://Scenes/UI/Items/ItemBox.gd" type="Script" id=2]
[ext_resource path="res://Graphics/UI/selected.png" type="Texture" id=3]
[ext_resource path="res://Graphics/UI/handicons.png" type="Texture" id=4]
[sub_resource type="AtlasTexture" id=1]
atlas = ExtResource( 1 )
region = Rect2( 32, 32, 32, 32 )
margin = Rect2( 2, 2, 4, 4 )
[sub_resource type="AtlasTexture" id=2]
atlas = ExtResource( 4 )
region = Rect2( 1, 0, 21, 9 )
margin = Rect2( 2, 2, 4, 4 )
[node name="ItemBox" type="TextureRect"]
self_modulate = Color( 1, 1, 1, 0.862745 )
margin_left = -1.0
margin_right = 35.0
margin_bottom = 53.0
mouse_default_cursor_shape = 2
texture = SubResource( 1 )
stretch_mode = 4
script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="SelectedOverlay" type="TextureRect" parent="."]
visible = false
modulate = Color( 1, 1, 1, 0.5 )
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
texture = ExtResource( 3 )
stretch_mode = 4
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HandIcon" type="TextureRect" parent="."]
visible = false
anchor_right = 1.0
margin_left = -0.176781
margin_top = -5.0
margin_right = -0.176781
mouse_filter = 2
texture = SubResource( 2 )
stretch_mode = 6
[connection signal="mouse_entered" from="." to="." method="_mouse_hover" binds= [ true ]]
[connection signal="mouse_exited" from="." to="." method="_mouse_hover" binds= [ false ]]

View File

@ -1,29 +0,0 @@
extends Control
signal chat_message_sent(text)
onready var log_text = $ResizablePanel/RichTextLabel
onready var chat_bar = $ResizablePanel/LineEdit
func _input(event: InputEvent) -> void:
if event is InputEventMouseButton:
if not chat_bar_focus:
chat_bar.release_focus()
if event.is_action_released("ui_chat") and chat_bar_focus == false:
chat_bar.grab_focus()
func add_line(line: String) -> void:
log_text.append_bbcode(line)
var chat_bar_focus = false
func _chat_bar_status(editing: bool) -> void:
$"/root/scene".writing = editing
func _chat_bar_focus(entered: bool) -> void:
chat_bar_focus = entered
func _text_submitted(text):
emit_signal("chat_message_sent", text)
chat_bar.text = ""
chat_bar.release_focus()

View File

@ -1,5 +0,0 @@
extends WindowDialog
func _physics_process(_delta):
if not visible:
return

View File

@ -1,23 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://Scenes/UI/Panels/ServerInfo.gd" type="Script" id=1]
[node name="ServerInfoPopup" type="WindowDialog"]
visible = true
margin_left = 19.9312
margin_top = 34.9087
margin_right = 275.931
margin_bottom = 202.909
window_title = "Server info"
resizable = true
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ItemList" type="ItemList" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
size_flags_horizontal = 3
size_flags_vertical = 3

View File

@ -33,80 +33,20 @@ size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/separation = 10
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"]
[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"]
margin_right = 528.0
margin_bottom = 18.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer"]
margin_right = 104.0
margin_bottom = 18.0
text = "S01\\AR SYSTEM"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer"]
margin_left = 108.0
margin_right = 528.0
margin_bottom = 18.0
size_flags_horizontal = 3
alignment = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label2" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer/HBoxContainer"]
margin_left = 330.0
margin_right = 368.0
margin_bottom = 18.0
text = "SPD: "
align = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="CurrentSpeed" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer/HBoxContainer"]
margin_left = 372.0
margin_right = 372.0
margin_bottom = 18.0
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
align = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label3" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer/HBoxContainer"]
margin_left = 376.0
margin_right = 416.0
margin_bottom = 18.0
text = "ANGL:"
align = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="CurrentAngle" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer/HBoxContainer"]
margin_left = 420.0
margin_right = 420.0
margin_bottom = 18.0
custom_colors/font_color = Color( 0.494118, 0.52549, 0.737255, 1 )
align = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Map" type="Control" parent="MarginContainer/VBoxContainer"]
margin_top = 28.0
margin_right = 528.0
margin_bottom = 446.0
margin_bottom = 28.0
rect_clip_content = true
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource( 4 )
background = ExtResource( 2 )
font = ExtResource( 3 )
[connection signal="about_to_show" from="." to="MarginContainer/VBoxContainer/Map" method="_reset_position"]
[connection signal="popup_hide" from="." to="MarginContainer/VBoxContainer/Map" method="_on_hide"]

View File

@ -1,157 +1,60 @@
extends Control
export var cell_size = 150
export var cell_size = 100
export var bgzoom = 50
const BORDER_WIDTH = 4
const BORDER_LENGTH = 30
const RADAR_EFFECT_DELAY = 1
const HALF_BORDER = BORDER_LENGTH/2
const MIN_ZOOM = 30
const ZOOM_STEP = 10
const MAX_ZOOM = 400
export(Texture) var background
export(Font) var font
var dragging = false
var origin = Vector2.ZERO
var origin = Vector2(randf() * -1e4, randf() * -1e4)
var last_origin = origin
var last_mouse_pos = Vector2.ZERO
var set_position = true
var radar_next_remaining = RADAR_EFFECT_DELAY
var offset = Vector2.ZERO
var text_two_lines = false
onready var scene = $"/root/scene"
onready var speed_text = $"../HBoxContainer/HBoxContainer/CurrentSpeed"
onready var dir_text = $"../HBoxContainer/HBoxContainer/CurrentAngle"
onready var popup = $"../../.."
var last_pos = []
func _ready():
font = font.duplicate()
func _physics_process(delta):
radar_next_remaining -= delta
if radar_next_remaining < 0:
var current_position = (scene.world.map.current_ship_position + scene.world.map.current_ship_subpos)
last_pos.append(current_position)
if last_pos.size() > 20:
last_pos.pop_front()
radar_next_remaining = RADAR_EFFECT_DELAY
if not visible:
return
speed_text.text = "%.0f u/s" % (scene.world.map.current_ship_speed * 10000)
dir_text.text = "%.0f deg" % rad2deg(scene.world.map.current_ship_direction)
update()
func _draw():
var win_size = get_global_rect().size
var current_position = (scene.world.map.current_ship_position + scene.world.map.current_ship_subpos) * cell_size
if set_position:
origin = current_position - win_size/2
last_origin = origin
if win_size.x > 0:
set_position = false
var cols = int(ceil(win_size.x/cell_size))
var rows = int(ceil(win_size.y/cell_size))
var xoffset = float(int(origin.x) % cell_size)
var yoffset = float(int(origin.y) % cell_size)
draw_texture_rect_region(background, Rect2(Vector2.ZERO, win_size), Rect2(origin*bgzoom, win_size*bgzoom), Color(0.5,0.5,0.5,1))
draw_texture_rect_region(background, Rect2(Vector2.ZERO, win_size), Rect2(-origin*bgzoom, win_size*bgzoom), Color(0.5,0.5,0.5,1))
for i in range(0, cols+1):
draw_line(Vector2(i * cell_size-xoffset, 0), Vector2(i * cell_size-xoffset, win_size.y), Color.white * 0.5)
for i in range(0, rows+1):
draw_line(Vector2(0, i * cell_size-yoffset), Vector2(win_size.x, i * cell_size-yoffset), Color.white * 0.5)
draw_line(Vector2(i * cell_size+xoffset, 0), Vector2(i * cell_size+xoffset, win_size.y), Color.white * 0.5)
for i in range(0, rows):
draw_line(Vector2(0, i * cell_size+yoffset), Vector2(win_size.x, i * cell_size+yoffset), Color.white * 0.5)
for x in range(-1, cols+1):
for y in range(-1, rows+1):
var real_x = x + int(origin.x/cell_size)
var real_y = y + int(origin.y/cell_size)
var sector = Coordinates.as_string_parts(Vector2(real_x, real_y))
if text_two_lines:
draw_string(font, Vector2(x * cell_size + 6 - xoffset, y * cell_size + 20 - yoffset), sector[0], Color(1,1,1,0.5))
draw_string(font, Vector2(x * cell_size + 6 - xoffset, y * cell_size + 20 - yoffset + font.size + 2), sector[1], Color(1,1,1,0.5))
var real_x = x - int(origin.x/cell_size)
var real_y = y - int(origin.y/cell_size)
var sector_name = to_letter(real_x)
if real_y < 0:
sector_name += to_letter(real_y)
else:
draw_string(font, Vector2(x * cell_size + 6 - xoffset, y * cell_size + 20 - yoffset), sector[0] + sector[1], Color(1,1,1,0.5))
var viewport = Rect2(origin, win_size)
var point_count = last_pos.size()
for pos_index in range(0, point_count):
draw_circle(last_pos[pos_index] * cell_size - origin, 2, Color(1, 0, 0, pos_index*1.0/point_count))
draw_target(viewport, current_position, Color.red)
# Debug directions:
#draw_line(current_position - viewport.position, current_position - viewport.position + Vector2.RIGHT.rotated(scene.world.map.ship_direction) * 100, Color.green)
#draw_line(current_position - viewport.position, current_position - viewport.position + Vector2.RIGHT.rotated(scene.world.map.current_ship_direction) * 100, Color.yellow)
var current_target = scene.world.map.current_ship_target
if current_target != null:
var current_target_adj = current_target * cell_size
draw_target(viewport, current_target_adj, Color.green)
draw_line(current_position - origin, current_target_adj - origin, Color.darkcyan)
func draw_target(viewport: Rect2, position: Vector2, color: Color):
# Check if target is in range
if viewport.has_point(position):
draw_circle(position - viewport.position, 5, color)
else:
# Draw line pointing to target
var relative_pos = position - viewport.position
var clamped = Vector2(clamp(relative_pos.x, 0, viewport.size.x), clamp(relative_pos.y, 0, viewport.size.y))
if relative_pos.x < 0:
draw_line(Vector2(0, clamped.y-HALF_BORDER), Vector2(0, clamped.y+HALF_BORDER), color, BORDER_WIDTH)
elif relative_pos.x > viewport.size.x:
draw_line(Vector2(viewport.size.x, clamped.y-HALF_BORDER), Vector2(viewport.size.x, clamped.y+HALF_BORDER), color, BORDER_WIDTH)
if relative_pos.y < 0:
draw_line(Vector2(clamped.x-HALF_BORDER, 0), Vector2(clamped.x+HALF_BORDER, 0), color, BORDER_WIDTH)
elif relative_pos.y > viewport.size.y:
draw_line(Vector2(clamped.x-HALF_BORDER, viewport.size.y), Vector2(clamped.x+HALF_BORDER, viewport.size.y), color, BORDER_WIDTH)
sector_name += str(real_y)
draw_string(font, Vector2(x * cell_size + 6 + xoffset, y * cell_size + 20 + yoffset), sector_name, Color(1,1,1,0.5))
func _input(event):
if not visible:
return
if event.is_action_pressed("ui_zoomin"):
if cell_size < MAX_ZOOM:
_recalc_offset(ZOOM_STEP)
cell_size += ZOOM_STEP
update_font()
update()
return
if event.is_action_pressed("ui_zoomout"):
if cell_size > MIN_ZOOM:
_recalc_offset(-ZOOM_STEP)
cell_size -= ZOOM_STEP
update_font()
update()
return
if event is InputEventMouseButton:
dragging = event.pressed
last_origin = origin
last_mouse_pos = event.position
update()
return
if event is InputEventMouseMotion:
elif event is InputEventMouseMotion:
if dragging:
origin = last_origin - (event.position - last_mouse_pos)
origin = last_origin + (event.position - last_mouse_pos)
update()
return
func update_font():
text_two_lines = cell_size < 70
if cell_size < 100:
font.size = 11
else:
font.size = 14
func _recalc_offset(mult: float):
var mouse = get_local_mouse_position()
origin = ((origin + mouse) / cell_size * (cell_size + mult)) - mouse
func _reset_position():
set_position = true
func _on_hide():
popup.visible = false
func to_letter(num: int) -> String:
#var letters = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if num == 0:
return "Α"
elif num < 0:
letters = "αβγδεζηθικλμνξοπρστυφχψω"
num = abs(num)
var out = ""
var base = letters.length()
while num > 0:
out += letters.substr(num % base, 1)
num /= base
return out

View File

@ -26,11 +26,10 @@ func _handle_resize(event):
rect_size = last_origin + (event.global_position - last_mouse)
func _input(event):
if event is InputEventMouseButton:
if dragging and not event.pressed:
dragging = false
if resizing and not event.pressed:
resizing = false
if dragging and event is InputEventMouseButton and not event.pressed:
dragging = false
if resizing and event is InputEventMouseButton and not event.pressed:
resizing = false
func set_title(val):
title = val

View File

@ -16,8 +16,10 @@ corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
[node name="ResizablePanel" type="Panel"]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 10.0
margin_right = 376.0
margin_bottom = 336.0
custom_styles/panel = SubResource( 1 )
script = ExtResource( 1 )
__meta__ = {

View File

@ -2,38 +2,32 @@ extends Node2D
class_name GameWorld
enum Map { RUNTIME, ODYSSEY, EMPTY }
enum Map { RUNTIME, ODYSSEY }
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
onready var scene_manager = $"/root/SceneManager"
func load_map(map_name):
match map_name:
func _ready():
match mapToLoad:
Map.RUNTIME:
map = scene_manager.queue.get_resource("res://Scenes/Maps/runtime.tscn").instance()
map = runtimeRes.instance()
Map.ODYSSEY:
map = scene_manager.queue.get_resource("res://Scenes/Maps/odyssey.tscn").instance()
Map.EMPTY:
map = preload("res://Scenes/Maps/empty.tscn").instance()
map = odysseyRes.instance()
add_child(map)
func spawn_player(peer: int, is_current_user: bool):
var playerNode = playerRes.instance()
playerNode.set_network_master(peer, true)
playerNode.is_controlled = is_current_user
var spawnpoints = map.get_pois(POI.POIType.SpawnPoint, POI.POIClass.Player)
player = playerRes.instance()
player.is_controlled = true
var spawnpoints = map.get_pois(POIData.POIType.SpawnPoint, POIData.POIClass.Player)
if spawnpoints.size() > 0:
playerNode.transform.origin = (spawnpoints[0] as Node2D).transform.origin
player.transform.origin = (spawnpoints[0] as Node2D).transform.origin
else:
print("Map does not have Player spawnpoint POI! Spawning at origin (very bad)")
$players.add_child(playerNode, true)
if is_current_user:
player = playerNode
for tilemap in map.tilemaps:
if tilemap is MapTiles:
tilemap.set_occluder_origin(playerNode)
return playerNode
$players.add_child(player)
for tilemap in map.tilemaps:
if tilemap is MapTiles:
tilemap.set_occluder_origin(player)

View File

@ -1,18 +0,0 @@
extends Node
func serialize() -> Dictionary:
var systems = {}
for child in get_children():
systems[child.name] = {
"script": child.script.resource_path,
"data": child.serialize()
}
return systems
func deserialize(data: Dictionary) -> void:
for system_name in data:
var system_data = data[system_name] as Dictionary
var system_node = load(system_data.script).new()
system_node.name = system_name
add_child(system_node, true)
system_node.deserialize(system_data.data)

Binary file not shown.

View File

@ -1,21 +0,0 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/door-close.wav-f2186a53d65333241246e455153168e4.sample"
[deps]
source_file="res://Sounds/SFX/effects/door-close.wav"
dest_files=[ "res://.import/door-close.wav-f2186a53d65333241246e455153168e4.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=true
edit/normalize=true
edit/loop=false
compress/mode=1

Binary file not shown.

View File

@ -1,21 +0,0 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/door-open.wav-50d5fc4e7eea744e9b203efe71dc9b86.sample"
[deps]
source_file="res://Sounds/SFX/effects/door-open.wav"
dest_files=[ "res://.import/door-open.wav-50d5fc4e7eea744e9b203efe71dc9b86.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=true
edit/normalize=true
edit/loop=false
compress/mode=1

Binary file not shown.

View File

@ -1,21 +0,0 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/door-sound.wav-a7dd359f7d7f7690a94b538a2bf51d4e.sample"
[deps]
source_file="res://Sounds/SFX/effects/door-sound.wav"
dest_files=[ "res://.import/door-sound.wav-a7dd359f7d7f7690a94b538a2bf51d4e.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=true
edit/normalize=true
edit/loop=false
compress/mode=1

View File

@ -1,40 +0,0 @@
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE project PUBLIC "-//audacityproject-1.3.0//DTD//EN" "http://audacity.sourceforge.net/xml/audacityproject-1.3.0.dtd" >
<project xmlns="http://audacity.sourceforge.net/xml/" projname="door-sound_data" version="1.3.0" audacityversion="2.3.3" sel0="0.0000000000" sel1="0.0000000000" vpos="0" h="0.0000000000" zoom="300.2769352499" rate="48000.0" snapto="off" selectionformat="hh:mm:ss + milliseconds" frequencyformat="Hz" bandwidthformat="octaves">
<tags/>
<wavetrack name="door-sound" isSelected="1" height="150" minimized="0" channel="2" linked="0" mute="0" solo="1" rate="48000" gain="1.0" pan="0.0" colorindex="0">
<waveclip offset="0.00000000" colorindex="0">
<sequence maxsamples="262144" sampleformat="262159" numsamples="116852">
<waveblock start="0">
<simpleblockfile filename="e0808e31.au" len="116852" min="-1.0" max="1.0" rms="0.106046"/>
</waveblock>
</sequence>
<envelope numpoints="7">
<controlpoint t="0.725996486605" val="1.000000000000"/>
<controlpoint t="0.825904259991" val="0.620437979698"/>
<controlpoint t="0.855876592007" val="0.562043786049"/>
<controlpoint t="0.929142292490" val="0.445255458355"/>
<controlpoint t="1.049031620553" val="0.915492951870"/>
<controlpoint t="1.128957839262" val="1.429577469826"/>
<controlpoint t="1.308791831357" val="0.725352108479"/>
</envelope>
</waveclip>
</wavetrack>
<wavetrack name="264061__paul368__sfx-door-open" isSelected="0" height="150" minimized="0" channel="2" linked="0" mute="1" solo="0" rate="48000" gain="0.501187" pan="0.0" colorindex="0">
<waveclip offset="0.22643750" colorindex="0">
<sequence maxsamples="262144" sampleformat="262159" numsamples="85596">
<waveblock start="0">
<simpleblockfile filename="e0808367.au" len="85596" min="-0.316331" max="0.389588" rms="0.023447"/>
</waveblock>
</sequence>
<envelope numpoints="6">
<controlpoint t="0.046643747255" val="0.514084517956"/>
<controlpoint t="0.166533075318" val="1.000000000000"/>
<controlpoint t="0.476247172815" val="0.971830964088"/>
<controlpoint t="0.749328420070" val="0.816901445389"/>
<controlpoint t="0.885869043698" val="0.598591566086"/>
<controlpoint t="1.022409667325" val="0.267605662346"/>
</envelope>
</waveclip>
</wavetrack>
</project>

Some files were not shown because too many files have changed in this diff Show More