Compare commits

..

No commits in common. "a0d94d63547da93418361488c1130c1849a6f676" and "c17289f385bd005cf078cee3d53c652df17e97bd" have entirely different histories.

26 changed files with 214 additions and 815 deletions

View File

@ -1,10 +1,13 @@
[gd_scene load_steps=9 format=2] [gd_scene load_steps=12 format=2]
[ext_resource path="res://src/classes/camera_guide.gd" type="Script" id=1] [ext_resource path="res://src/actors/players/playerE/PlayerE.tscn" type="PackedScene" id=1]
[ext_resource path="res://src/Camera2D.gd" type="Script" id=2] [ext_resource path="res://src/levels/TestBox.tscn" type="PackedScene" id=2]
[ext_resource path="res://src/ui/HUD.tscn" type="PackedScene" id=3]
[ext_resource path="res://src/ui/scene_transition.tscn" type="PackedScene" id=4] [ext_resource path="res://src/ui/scene_transition.tscn" type="PackedScene" id=4]
[ext_resource path="res://src/classes/camera_guide.gd" type="Script" id=5]
[ext_resource path="res://src/Camera2D.gd" type="Script" id=6]
[ext_resource path="res://src/Main.gd" type="Script" id=7] [ext_resource path="res://src/Main.gd" type="Script" id=7]
[ext_resource path="res://src/ui/lobby.tscn" type="PackedScene" id=9] [ext_resource path="res://assets/items/mushroom_icon.png" type="Texture" id=8]
[sub_resource type="Shader" id=2] [sub_resource type="Shader" id=2]
code = "shader_type canvas_item; code = "shader_type canvas_item;
@ -19,7 +22,7 @@ void vertex() {
shader = SubResource( 2 ) shader = SubResource( 2 )
shader_param/cam_offset = Vector2( 0, 0 ) shader_param/cam_offset = Vector2( 0, 0 )
[sub_resource type="RectangleShape2D" id=4] [sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 160, 90 ) extents = Vector2( 160, 90 )
[node name="Main" type="Node2D"] [node name="Main" type="Node2D"]
@ -39,26 +42,41 @@ size = Vector2( 320, 180 )
handle_input_locally = false handle_input_locally = false
render_target_update_mode = 3 render_target_update_mode = 3
[node name="Lobby" parent="ViewportContainer/Viewport" instance=ExtResource( 9 )]
[node name="SceneTransition" parent="ViewportContainer/Viewport" instance=ExtResource( 4 )] [node name="SceneTransition" parent="ViewportContainer/Viewport" instance=ExtResource( 4 )]
[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"] [node name="TestBox" parent="ViewportContainer/Viewport" instance=ExtResource( 2 )]
unique_name_in_owner = true __meta__ = {
position = Vector2( 160, 90 ) "_edit_lock_": true
current = true }
script = ExtResource( 2 )
tracking_node_path = NodePath("../CameraGuide") [node name="PlayerE" parent="ViewportContainer/Viewport" instance=ExtResource( 1 )]
position = Vector2( 112, 56 )
[node name="PlayerE2" parent="ViewportContainer/Viewport" instance=ExtResource( 1 )]
position = Vector2( 112, 56 )
player_number = 2
[node name="UI_Layer" parent="ViewportContainer/Viewport" instance=ExtResource( 3 )]
[node name="CameraGuide" type="KinematicBody2D" parent="ViewportContainer/Viewport"] [node name="CameraGuide" type="KinematicBody2D" parent="ViewportContainer/Viewport"]
unique_name_in_owner = true unique_name_in_owner = true
position = Vector2( 160, 90 ) position = Vector2( 160, 90 )
collision_layer = 0 collision_layer = 0
collision_mask = 256 collision_mask = 256
script = ExtResource( 1 ) script = ExtResource( 5 )
debug_camera_guide = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/CameraGuide"] [node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/CameraGuide"]
visible = false visible = false
shape = SubResource( 4 ) shape = SubResource( 1 )
one_way_collision = true one_way_collision = true
[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"]
unique_name_in_owner = true
position = Vector2( 160, 90 )
current = true
script = ExtResource( 6 )
tracking_node_path = NodePath("../CameraGuide")
[node name="MushroomIcon" type="Sprite" parent="ViewportContainer/Viewport"]
position = Vector2( 60, 160 )
texture = ExtResource( 8 )

View File

@ -1,49 +1,67 @@
class_name Actor class_name Actor
extends KinematicBody2D extends KinematicBody2D
#var velocity = Vector2(0,0)
#var direction = Vector2(-1,0)
export(String, "Player", "Enemy", "NPC", "Object") var actor_type export(String, "Player", "Enemy", "NPC", "Object") var actor_type
#export var sprite_facing_right: bool = true #export var sprite_facing_right: bool = true
export var debug_actor: bool = false export var debug_actor: bool = false
#onready var movement_animations: AnimatedSprite = $AnimatedSprite
onready var sound_effect_player: AudioStreamPlayer = $AudioStreamPlayer_StateReceiver onready var sound_effect_player: AudioStreamPlayer = $AudioStreamPlayer_StateReceiver
#onready var movement_component: MovementComponent = $movement_component
onready var movement_component: Movement_StateReceiver = $Movement_StateReceiver onready var movement_component: Movement_StateReceiver = $Movement_StateReceiver
#onready var movement_state_machine: StateMachineAnimatedActor = $movement_state_machine
onready var movement_state_machine: StateMachine = $Movement_StateMachine onready var movement_state_machine: StateMachine = $Movement_StateMachine
onready var animated_sprite : AnimatedSprite = $AnimatedSprite_StateReceiver
## Multiplayer Variables
puppet var puppet_pos = Vector2()
puppet var puppet_transform: Transform2D
##TODO:
# Can't seem to implement the ready and process node functions
# without causing a double run somehow. Not sure why.
# not a huge deal because this is mostly to help with
# interfaces for the state machines.
func _ready() -> void: func _ready() -> void:
puppet_transform = transform pass
#movement_state_machine.init_animated_actor(self)
#movement_component.attack_function = funcref(self, "attack")
# movement_component.player_number = player_number
func _unhandled_input(event: InputEvent) -> void: func _unhandled_input(event: InputEvent) -> void:
if is_network_master(): if actor_type == "Player":
if actor_type == "Player": movement_component.process_input(event)
movement_component.process_unhandled_input(event) #movement_state_machine.process_input(event)
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
# Input based or polling input is not done in _unhandled_input # Input based or polling input is not done in _unhandled_input
# gives us the ability to turn off polling this way # gives us the ability to turn off polling this way
if is_network_master(): if actor_type == "Player":
if actor_type == "Player": movement_component.process_physics_input(delta)
movement_component.process_physics_input(delta) movement_component.process_physics(delta)
movement_component.process_physics(delta) #movement_state_machine.process_physics(delta)
rset("puppet_pos", position) #
rset("puppet_transform", transform) #func _process(delta: float) -> void:
else: # if actor_type == "NPC" or actor_type == "Enemy":
position = puppet_pos # movement_component.process(delta)
transform = puppet_transform # movement_state_machine.process_frame(delta)
## PlayerInfo.player_position = global_position
func _process(delta: float) -> void: # #play_sound_frame(movement_animations.animation , movement_animations.frame)
if actor_type == "NPC" or actor_type == "Enemy":
if is_network_master():
movement_component.process(delta)
func attack():
#print(self.name, ": It's not inheritence, it's funcrefs")
# if movement_state_machine.current_state.name != 'attack':
# if($movement_state_machine/attack):
# movement_state_machine.change_state($movement_state_machine/attack)
# if ($Hitbox_Component/CollisionShape2D):
# #print(self.name, ": Found a hitbox")
# var hit_box = $Hitbox_Component
# hit_box.set_hitbox(true)
pass

View File

@ -74,7 +74,7 @@ func process(delta):
call('_state_process_' + current_state.name) call('_state_process_' + current_state.name)
# For event based input polling (Hadouken?) # For event based input polling (Hadouken?)
func process_unhandled_input(event: InputEvent): func process_input(event: InputEvent):
# Reset desired movement vector # Reset desired movement vector
desired_movement_vector = Vector2(0,0) desired_movement_vector = Vector2(0,0)
if has_method('_state_process_input_' + current_state.name): if has_method('_state_process_input_' + current_state.name):

View File

@ -80,9 +80,6 @@ func change_state(new_state: State) -> void:
current_state = new_state current_state = new_state
current_state.enter() current_state.enter()
#puppet puppet_change_state(new_state: State) -> void:
# pass
# Seems like I don't have to do this every state change! # Seems like I don't have to do this every state change!
# if(state_modifiers.size() > 0): # if(state_modifiers.size() > 0):
# print("Active Modifiers:") # print("Active Modifiers:")
@ -93,7 +90,7 @@ func change_state(new_state: State) -> void:
emit_signal("state_changed",current_state_name,current_state) emit_signal("state_changed",current_state_name,current_state)
puppet func puppet_change_to_known_state(new_state_name: String) -> void: func change_to_known_state(new_state_name: String) -> void:
if new_state_name.empty() == false: if new_state_name.empty() == false:
if states_index.has(new_state_name): if states_index.has(new_state_name):
change_state(states_index[new_state_name]) change_state(states_index[new_state_name])
@ -101,16 +98,6 @@ puppet func puppet_change_to_known_state(new_state_name: String) -> void:
push_warning(get_parent().name + ": Attempt to switch state to unknown: " + new_state_name) push_warning(get_parent().name + ": Attempt to switch state to unknown: " + new_state_name)
change_state(states_index["default"]) change_state(states_index["default"])
func change_to_known_state(new_state_name: String) -> void:
if is_network_master():
if new_state_name.empty() == false:
if states_index.has(new_state_name):
change_state(states_index[new_state_name])
else:
push_warning(get_parent().name + ": Attempt to switch state to unknown: " + new_state_name)
change_state(states_index["default"])
rpc("puppet_change_to_known_state", new_state_name)
#func check_parent_before_state_change(new_state_name: String) -> bool: #func check_parent_before_state_change(new_state_name: String) -> bool:
# ##TODO: Make this a verifiable funcref or something # ##TODO: Make this a verifiable funcref or something
# if get_parent().has_method("check_state_change"): # if get_parent().has_method("check_state_change"):

View File

@ -6,7 +6,7 @@
[ext_resource path="res://lib/classes/animated_sprite_state_receiver.gd" type="Script" id=4] [ext_resource path="res://lib/classes/animated_sprite_state_receiver.gd" type="Script" id=4]
[ext_resource path="res://lib/classes/audiostreamplayer_state_receiver.gd" type="Script" id=5] [ext_resource path="res://lib/classes/audiostreamplayer_state_receiver.gd" type="Script" id=5]
[node name="Actor" type="KinematicBody2D" groups=["world"]] [node name="Actor" type="KinematicBody2D"]
collision_layer = 2 collision_layer = 2
script = ExtResource( 2 ) script = ExtResource( 2 )

View File

@ -13,17 +13,6 @@ onready var viewport_container = get_node("/root/Main/ViewportContainer") #$View
onready var viewport = get_node("/root/Main/ViewportContainer/Viewport") # $ViewportContainer/Viewport onready var viewport = get_node("/root/Main/ViewportContainer/Viewport") # $ViewportContainer/Viewport
onready var camera_guide :CameraGuide = get_node("/root/Main/ViewportContainer/Viewport/CameraGuide") onready var camera_guide :CameraGuide = get_node("/root/Main/ViewportContainer/Viewport/CameraGuide")
func _ready():
NetworkManager.connect("game_started", self, "_on_game_started")
NetworkManager.connect("game_ended", self, "_on_game_ended")
func _on_game_started():
camera_guide.enable_tracking()
func _on_game_ended():
camera_guide.disable_tracking()
camera_guide.reset_position()
func change_music_track(_music_track :AudioStream ): func change_music_track(_music_track :AudioStream ):
if current_music_track != _music_track: if current_music_track != _music_track:
current_music_track = _music_track current_music_track = _music_track
@ -49,27 +38,20 @@ func change_level(_level_name :String, _position_name :String):
var new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance() var new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance()
#print (get_tree().get_root().get_children()) #print (get_tree().get_root().get_children())
for l in viewport.get_children(): for l in get_node("/root/Main/ViewportContainer/Viewport").get_children():
#print (get_node("/root/Main").get_children()) #print (get_node("/root/Main").get_children())
if l is Level: if l is Level:
camera_guide.disable_tracking() camera_guide.disable_tracking()
##TODO: Disabled signal based yield because I think it was taking too long SceneTransition.transition_dissolve("foo")
# No more errors but I'd like to know how to do this. yield(SceneTransition,"done")
#SceneTransition.transition_dissolve("foo")
#yield(SceneTransition,"done")
yield(SceneTransition.transition_dissolve(), "completed")
print(l) print(l)
viewport.remove_child(l) get_node("/root/Main/ViewportContainer/Viewport").remove_child(l)
viewport.add_child(new_level) get_node("/root/Main/ViewportContainer/Viewport").add_child(new_level)
##TODO: make this right below scene transition get_node("/root/Main/ViewportContainer/Viewport").move_child(new_level,1)
viewport.move_child(new_level,2)
#get_node("/root/Main/ViewportContainer/Viewport/World").remove_child(l)
#get_node("/root/Main/ViewportContainer/Viewport/World").add_child(new_level)
#get_node("/root/Main/ViewportContainer/Viewport/World").move_child(new_level,1)
##TODO: Probably set start position ##TODO: Probably set start position
if new_level.entrances.has(_position_name): if new_level.entrances.has(_position_name):
player_start_position = new_level.entrances[_position_name].transform.origin player_start_position = new_level.entrances[_position_name].transform.origin
#print (get_node("/root/Main/ViewportContainer/Viewport").get_children()) print (get_node("/root/Main/ViewportContainer/Viewport").get_children())
#get_node("/root/Main/ViewportContainer/Viewport/CameraGuide").global_position = Vector2(160,90) #get_node("/root/Main/ViewportContainer/Viewport/CameraGuide").global_position = Vector2(160,90)
SceneTransition.reset() SceneTransition.reset()
camera_guide.transform.origin = Vector2(160,90) camera_guide.transform.origin = Vector2(160,90)

View File

@ -1,236 +0,0 @@
extends Node
# Signals to let lobby GUI know what's going on.
signal player_list_changed()
signal connection_failed()
signal connection_succeeded()
signal game_ended()
signal game_started()
signal game_error(what)
# Default game server port. Can be any number between 1024 and 49151.
# Not on the list of registered or common ports as of November 2020:
# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
const DEFAULT_PORT = 10567
# Max number of players.
const MAX_PEERS = 4
var peer = null
# Name for my player.
var player_name = "The Warrior"
# Names for remote players in id:name format.
var players = {}
var players_ready = []
func _ready():
get_tree().connect("network_peer_connected", self, "_player_connected")
get_tree().connect("network_peer_disconnected", self,"_player_disconnected")
get_tree().connect("connected_to_server", self, "_connected_ok")
get_tree().connect("connection_failed", self, "_connected_fail")
get_tree().connect("server_disconnected", self, "_server_disconnected")
# Callback from SceneTree.
func _player_connected(id):
# Registration of a client beings here, tell the connected player that we are here.
rpc_id(id, "register_player", player_name)
# Callback from SceneTree.
func _player_disconnected(id):
##TODO: Need better way to determine a game is running
if has_node("/root/Main/ViewportContainer/Viewport/1"): # Game is in progress.
if get_tree().is_network_server():
emit_signal("game_error", "Player " + players[id] + " disconnected")
end_game()
else: # Game is not in progress.
# Unregister this player.
unregister_player(id)
# Callback from SceneTree, only for clients (not server).
func _connected_ok():
# We just connected to a server
emit_signal("connection_succeeded")
# Callback from SceneTree, only for clients (not server).
func _server_disconnected():
emit_signal("game_error", "Server disconnected")
end_game()
# Callback from SceneTree, only for clients (not server).
func _connected_fail():
get_tree().set_network_peer(null) # Remove peer
emit_signal("connection_failed")
# Lobby management functions.
remote func register_player(new_player_name):
var id = get_tree().get_rpc_sender_id()
print(id)
players[id] = new_player_name
emit_signal("player_list_changed")
func unregister_player(id):
players.erase(id)
emit_signal("player_list_changed")
func instance_on_peer_players(_scene :Resource, _node_path :NodePath, _global_position :Vector2 , _as_toplevel = true):
# print ("Scene Path: ", _scene.resource_path,
# " Instance At: ", _node_path,
# " Position : ", _global_position)
## was going to create local instance here but, lets see if I don't have to.
## makes me thing that node name and path must be very important for multiplayer
rpc("load_scene_on_all_clients", _scene.resource_path, _node_path, _global_position, _as_toplevel)
## remote means only runs on peers, remotesync goes both here and in peers
## because I want the node I load in two steps
remote func load_scene_on_all_clients(_scene :String, _node_path :NodePath, _global_position :Vector2 , _as_toplevel = true):
print ( "-- Remote Scene Call -- \n",
" Scene Path: ", _scene,
" Instance At: ", _node_path,
" Position : ", _global_position)
var new_scene = load(_scene).instance()
var _caller_id = get_tree().get_rpc_sender_id()
new_scene.set_network_master(_caller_id)
new_scene.set_as_toplevel(_as_toplevel)
new_scene.global_position = _global_position
get_node(_node_path).add_child(new_scene)
# for _player in players:
# rpc_id(_player, "load_scene_on_all_clients", _scene, _node_path, _global_position, _as_toplevel )
# if new_scene.get_network_master() == _caller_id:
# return new_scene
# else:
# return null
remote func pre_start_game(spawn_points):
# Change scene.
var world :Node = load("res://src/levels/TestBox.tscn").instance()
var ui :Node = load("res://src/ui/HUD.tscn").instance()
world.set_name("World")
world.add_to_group('world')
ui.add_to_group('world')
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(world)
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(ui)
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport/Lobby").hide()
## Clear the PlayerInfo table in case this is a restart.
PlayerInfo.reset()
var player_scene = load("res://src/actors/players/playerE/PlayerE.tscn")
for p_id in spawn_points:
#var spawn_pos = world.get_node("SpawnPoints/" + str(spawn_points[p_id])).position
var player = player_scene.instance()
player.set_name(str(p_id)) # Use unique ID as node name.
#player.position=spawn_pos
player.set_network_master(p_id) #set unique id as master.
# We don't yet use a player name like a node yet
# if p_id == get_tree().get_network_unique_id():
# # If node for this peer id, set name.
# player.set_player_name(player_name)
# else:
# # Otherwise set name from peer.
# player.set_player_name(players[p_id])
get_tree().get_root().get_node("/root/Main/ViewportContainer/Viewport").add_child(player)
#world.get_node("Players").add_child(player)
# # Set up score.
# world.get_node("Score").add_player(get_tree().get_network_unique_id(), player_name)
# for pn in players:
# world.get_node("Score").add_player(pn, players[pn])
if not get_tree().is_network_server():
# Tell server we are ready to start.
rpc_id(1, "ready_to_start", get_tree().get_network_unique_id())
elif players.size() == 0:
post_start_game()
remote func post_start_game():
get_tree().set_pause(false) # Unpause and unleash the game!
emit_signal("game_started")
remote func ready_to_start(id):
assert(get_tree().is_network_server())
if not id in players_ready:
players_ready.append(id)
if players_ready.size() == players.size():
for p in players:
rpc_id(p, "post_start_game")
post_start_game()
func host_game(new_player_name):
player_name = new_player_name
peer = NetworkedMultiplayerENet.new()
peer.create_server(DEFAULT_PORT, MAX_PEERS)
get_tree().set_network_peer(peer)
func join_game(ip, new_player_name):
player_name = new_player_name
peer = NetworkedMultiplayerENet.new()
peer.create_client(ip, DEFAULT_PORT)
get_tree().set_network_peer(peer)
func get_player_list():
return players.values()
func get_player_ids():
return players.keys()
func get_player_name():
return player_name
func begin_game():
assert(get_tree().is_network_server())
# Create a dictionary with peer id and respective spawn points, could be improved by randomizing.
var spawn_points = {}
spawn_points[1] = 0 # Server in spawn point 0.
var spawn_point_idx = 1
for p in players:
spawn_points[p] = spawn_point_idx
spawn_point_idx += 1
# Call to pre-start game with the spawn points.
for p in players:
rpc_id(p, "pre_start_game", spawn_points)
pre_start_game(spawn_points)
func end_game():
rpc("end_clients_game")
remotesync func end_clients_game():
get_tree().call_group("world","queue_free")
# if has_node("/root/Main/ViewportContainer/Viewport/World"): # Game is in progress.
# # End it
# get_node("/root/Main/ViewportContainer/Viewport/World").queue_free()
emit_signal("game_ended")
players.clear()

View File

@ -27,9 +27,6 @@ func get_player_data(index :int) -> PlayerData:
else: else:
return null return null
func reset():
_player_data.clear()
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta): #func _process(delta):
# pass # pass

View File

@ -23,6 +23,4 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta): #func _process(delta):
# debug_text = '' # pass
# for _player_id in NetworkManager.get_player_ids():
# debug_text += str(_player_id) + '\n'

View File

@ -34,6 +34,11 @@ _global_script_classes=[ {
"language": "GDScript", "language": "GDScript",
"path": "res://lib/classes/collision_shape2D_state_receiver.gd" "path": "res://lib/classes/collision_shape2D_state_receiver.gd"
}, { }, {
"base": "",
"class": "GitAPI",
"language": "NativeScript",
"path": "res://addons/godot-git-plugin/git_api.gdns"
}, {
"base": "Node", "base": "Node",
"class": "HealthComponent", "class": "HealthComponent",
"language": "GDScript", "language": "GDScript",
@ -109,11 +114,6 @@ _global_script_classes=[ {
"language": "GDScript", "language": "GDScript",
"path": "res://lib/classes/sound_effect_state_frame.gd" "path": "res://lib/classes/sound_effect_state_frame.gd"
}, { }, {
"base": "CanvasLayer",
"class": "SceneTransitions",
"language": "GDScript",
"path": "res://src/classes/scene_transition.gd"
}, {
"base": "Node", "base": "Node",
"class": "StaminaComponent", "class": "StaminaComponent",
"language": "GDScript", "language": "GDScript",
@ -160,6 +160,7 @@ _global_script_class_icons={
"AudioStreamPlayer_StateReceiver": "", "AudioStreamPlayer_StateReceiver": "",
"CameraGuide": "", "CameraGuide": "",
"CollisionShape2D_StateReceiver": "", "CollisionShape2D_StateReceiver": "",
"GitAPI": "",
"HealthComponent": "", "HealthComponent": "",
"HealthPickup": "", "HealthPickup": "",
"Interactable": "", "Interactable": "",
@ -175,7 +176,6 @@ _global_script_class_icons={
"PlayerData": "", "PlayerData": "",
"Projectile": "", "Projectile": "",
"SE_StateFrame": "", "SE_StateFrame": "",
"SceneTransitions": "",
"StaminaComponent": "", "StaminaComponent": "",
"State": "", "State": "",
"StateAnimatedActor": "", "StateAnimatedActor": "",
@ -205,7 +205,6 @@ animation/layers/only_include_visible_layers_by_default=true
PlayerInfo="*res://lib/singleton_autoloads/PlayerInfo.gd" PlayerInfo="*res://lib/singleton_autoloads/PlayerInfo.gd"
UiManager="*res://lib/singleton_autoloads/UIManager.gd" UiManager="*res://lib/singleton_autoloads/UIManager.gd"
LevelInfo="*res://lib/singleton_autoloads/LevelInfo.gd" LevelInfo="*res://lib/singleton_autoloads/LevelInfo.gd"
NetworkManager="*res://lib/singleton_autoloads/NetworkManager.gd"
[debug] [debug]

View File

@ -1,36 +0,0 @@
[gd_scene load_steps=7 format=2]
[ext_resource path="res://src/classes/camera_guide.gd" type="Script" id=1]
[ext_resource path="res://src/actors/players/playerE/PlayerE.tscn" type="PackedScene" id=2]
[ext_resource path="res://src/Camera2D.gd" type="Script" id=3]
[ext_resource path="res://src/ui/HUD.tscn" type="PackedScene" id=4]
[ext_resource path="res://src/levels/TestBox.tscn" type="PackedScene" id=5]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 160, 90 )
[node name="World" type="Node2D"]
[node name="UI_Layer" parent="." instance=ExtResource( 4 )]
[node name="TestBox" parent="." instance=ExtResource( 5 )]
[node name="PlayerE" parent="." instance=ExtResource( 2 )]
[node name="Camera2D" type="Camera2D" parent="."]
unique_name_in_owner = true
position = Vector2( 160, 90 )
current = true
script = ExtResource( 3 )
tracking_node_path = NodePath("../CameraGuide")
[node name="CameraGuide" type="KinematicBody2D" parent="."]
unique_name_in_owner = true
position = Vector2( 160, 90 )
collision_layer = 0
collision_mask = 256
script = ExtResource( 1 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="CameraGuide"]
shape = SubResource( 1 )
one_way_collision = true

View File

@ -15,7 +15,7 @@ func _ready():
#func _process(delta): #func _process(delta):
# pass # pass
#func _on_state_change_hurt(): func _on_state_change_hurt():
# print ("<---- Hey you called me to get hurt. Bruh.") print ("<---- Hey you called me to get hurt. Bruh.")
# transform = transform.translated(Vector2(-10,10)) transform = transform.translated(Vector2(-10,10))
# pass pass

View File

@ -28,24 +28,19 @@ const state_damage_amount :Dictionary = {
var player_info_index :int var player_info_index :int
var player_data :PlayerData var player_data :PlayerData
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
# PlayerInfo.player_health = health_component.health # PlayerInfo.player_health = health_component.health
PlayerInfo.player_inventory = player_inventory PlayerInfo.player_inventory = player_inventory
# PlayerInfo.player_stamina = stamina_component.stamina # PlayerInfo.player_stamina = stamina_component.stamina
# I think we only want to do this for network master players now player_info_index = PlayerInfo.register_player()
if is_network_master(): print ("Registered as player: ", player_info_index)
player_info_index = PlayerInfo.register_player() player_data = PlayerInfo.get_player_data(player_info_index)
print ("Registered as player: ", player_info_index) PlayerInfo.get_player_data(player_info_index).player_health = health_component.health
player_data = PlayerInfo.get_player_data(player_info_index) print ("My health is: ", player_data.player_health)
PlayerInfo.get_player_data(player_info_index).player_health = health_component.health player_data.player_inventory = player_inventory
print ("My health is: ", player_data.player_health) player_data.player_stamina = stamina_component.stamina
player_data.player_inventory = player_inventory
player_data.player_stamina = stamina_component.stamina
else:
$Hurtbox_Component.hurtbox_entered_function = ''
# Set initial player position in world. # Set initial player position in world.
global_position = LevelInfo.player_start_position global_position = LevelInfo.player_start_position
@ -54,41 +49,40 @@ func _ready():
player_inventory.select_primary(punch_item) player_inventory.select_primary(punch_item)
movement_component.state_stamina_cost = state_stamina_cost movement_component.state_stamina_cost = state_stamina_cost
#var stamina_recovery :float = 0.0 #var stamina_recovery :float = 0.0
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta): func _process(delta):
if is_network_master(): #PlayerInfo.player_position = global_position.round()
#PlayerInfo.player_position = global_position.round() player_data.player_position = global_position.round()
player_data.player_position = global_position.round() # stamina_recovery += delta
# stamina_recovery += delta # if stamina_recovery > 1.0:
# if stamina_recovery > 1.0: # stamina_component.recover(1)
# stamina_component.recover(1) # stamina_recovery = 0.0
# stamina_recovery = 0.0 # #print("recover ", stamina_component.stamina)
# #print("recover ", stamina_component.stamina)
#PlayerInfo.player_stamina = stamina_component.stamina
#PlayerInfo.player_stamina = stamina_component.stamina player_data.player_stamina = stamina_component.stamina
player_data.player_stamina = stamina_component.stamina
##TODO: well I'm not sure I like this but making a whole state receiver is silly
if state_damage_amount.has(movement_state_machine.current_state.name):
$Hitbox_Component.damage_amount = state_damage_amount[movement_state_machine.current_state.name]
else:
$Hitbox_Component.damage_amount = 10
match movement_state_machine.current_state.name:
"idle":
if Input.is_action_just_released("switch_primary_item_" + str(player_number)):
var _selected_item = player_inventory.switch_primary()
if _selected_item:
print("Switched Primary item to: ", _selected_item.name)
elif Input.is_action_just_released("switch_secondary_item_" + str(player_number)):
var _selected_item = player_inventory.switch_secondary()
if _selected_item:
print("Switched Secondary item to: ", _selected_item.name)
##TODO: well I'm not sure I like this but making a whole state receiver is silly
if state_damage_amount.has(movement_state_machine.current_state.name):
$Hitbox_Component.damage_amount = state_damage_amount[movement_state_machine.current_state.name]
else:
$Hitbox_Component.damage_amount = 10
match movement_state_machine.current_state.name:
"idle":
if Input.is_action_just_released("switch_primary_item_" + str(player_number)):
var _selected_item = player_inventory.switch_primary()
if _selected_item:
print("Switched Primary item to: ", _selected_item.name)
elif Input.is_action_just_released("switch_secondary_item_" + str(player_number)):
var _selected_item = player_inventory.switch_secondary()
if _selected_item:
print("Switched Secondary item to: ", _selected_item.name)
func hit_Receiver(damage): func hit_Receiver(damage):
$Hurtbox_Component.set_hurtbox(false) $Hurtbox_Component.set_hurtbox(false)
@ -200,4 +194,3 @@ func _on_Movement_StateMachine_state_changed(old_state_name, new_state):
func _on_Health_Component_health_depleted(): func _on_Health_Component_health_depleted():
movement_state_machine.change_to_known_state('death') movement_state_machine.change_to_known_state('death')
NetworkManager.end_game()

View File

@ -37,6 +37,7 @@
[sub_resource type="Resource" id=3] [sub_resource type="Resource" id=3]
resource_local_to_scene = true resource_local_to_scene = true
resource_name = "hurt"
script = ExtResource( 18 ) script = ExtResource( 18 )
debug_state = false debug_state = false
timeout_seconds = 2.0 timeout_seconds = 2.0
@ -49,6 +50,7 @@ jerk_factor = 0.0
animation_sequence = [ "hurt" ] animation_sequence = [ "hurt" ]
[sub_resource type="Resource" id=4] [sub_resource type="Resource" id=4]
resource_name = "move_0"
script = ExtResource( 24 ) script = ExtResource( 24 )
state_name = "move" state_name = "move"
frame_number = 0 frame_number = 0
@ -56,6 +58,7 @@ sound_effect_type = 0
sound = ExtResource( 25 ) sound = ExtResource( 25 )
[sub_resource type="Resource" id=5] [sub_resource type="Resource" id=5]
resource_name = "move_4"
script = ExtResource( 24 ) script = ExtResource( 24 )
state_name = "move" state_name = "move"
frame_number = 4 frame_number = 4
@ -63,6 +66,7 @@ sound_effect_type = 0
sound = ExtResource( 25 ) sound = ExtResource( 25 )
[sub_resource type="Resource" id=6] [sub_resource type="Resource" id=6]
resource_name = "land_0"
script = ExtResource( 24 ) script = ExtResource( 24 )
state_name = "land" state_name = "land"
frame_number = 0 frame_number = 0

View File

@ -16,7 +16,6 @@ var entrances:Dictionary
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
add_to_group("world")
LevelInfo.player_start_position = player_start.transform.origin LevelInfo.player_start_position = player_start.transform.origin
if music_track: if music_track:
LevelInfo.change_music_track(music_track) LevelInfo.change_music_track(music_track)

View File

@ -1,83 +1,68 @@
class_name CameraGuide class_name CameraGuide
extends KinematicBody2D extends KinematicBody2D
export var debug_camera_guide :bool = false
var game_size :Vector2 # Declare member variables here. Examples:
onready var window_scale :float # var a = 2
onready var viewport = $"%Viewport" # var b = "text"
var game_size := Vector2(320,180)
onready var window_scale :float = (OS.window_size / game_size).x
var _is_tracking :bool = true var _is_tracking :bool = true
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
game_size = viewport.size pass # Replace with function body.
window_scale = (OS.window_size / game_size).x
assert(game_size != Vector2(0,0), str(get_path()) + " : No game_size set.")
if debug_camera_guide:
print(get_path(), "\n",
"\tSize:", game_size,
"\tScale:", window_scale)
## Do not track until told to
disable_tracking()
func enable_tracking() -> void: func enable_tracking() -> void:
##TODO: add extra collission checks here to make sure we aren't stuck maybe? ##TODO: add extra collission checks here to make sure we aren't stuck maybe?
_is_tracking = true _is_tracking = true
self.set_physics_process(true)
func disable_tracking() -> void: func disable_tracking() -> void:
_is_tracking = false _is_tracking = false
self.set_physics_process(false)
func reset_position() -> void:
## Set to half screen
global_position = game_size / 2
var flip_tracker = 0.0 var flip_tracker = 0.0
var stuck_check: bool var stuck_check: bool
func _physics_process(_delta): func _physics_process(delta):
var pos = global_position var pos = global_position
#pos = pos.move_toward(PlayerInfo.player_position, delta) #pos = pos.move_toward(PlayerInfo.player_position, delta)
#pos = lerp(pos, PlayerInfo.player_position, delta ) #pos = lerp(pos, PlayerInfo.player_position, delta )
var dir_to = Vector2(0,0) var dir_to = Vector2(0,0)
if (PlayerInfo.get_player_data(0)): var player_position = PlayerInfo.get_player_data(0).player_position
var player_position = PlayerInfo.get_player_data(0).player_position
# Calculate how far the player is from object # Calculate how far the player is from object
var diff_to = (player_position - pos) var diff_to = (player_position - pos)
var dist_to = (player_position - pos).length() var dist_to = (player_position - pos).length()
# Determine the chase direction of player is past the threshold # Determine the chase direction of player is past the threshold
# Try to prevent bounce # Try to prevent bounce
if (is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.x) > 10: if (is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.x) > 10:
dir_to = pos.direction_to(player_position) dir_to = pos.direction_to(player_position)
elif !(is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.y) > 10: elif !(is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.y) > 10:
dir_to = pos.direction_to(player_position) dir_to = pos.direction_to(player_position)
# UiManager.debug_text = ( UiManager.debug_text + # UiManager.debug_text = ( UiManager.debug_text +
# # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) + # # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) +
# "\n" + str(is_on_ceiling()) + str(is_on_floor()) + str(is_on_wall()) + # "\n" + str(is_on_ceiling()) + str(is_on_floor()) + str(is_on_wall()) +
# "\nPP: {0}, {1}".format({"0":"%7.2f" % PlayerInfo.player_position.x, "1":"%7.2f" % PlayerInfo.player_position.y}) + # "\nPP: {0}, {1}".format({"0":"%7.2f" % PlayerInfo.player_position.x, "1":"%7.2f" % PlayerInfo.player_position.y}) +
# #"\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) + # #"\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) +
# "\nKB: {0}, {1}".format({"0":"%7.2f" % global_position.x, "1":"%7.2f" % global_position.y}) + # "\nKB: {0}, {1}".format({"0":"%7.2f" % global_position.x, "1":"%7.2f" % global_position.y}) +
# "\nDir to: {0}, {1}".format({"0":"%7.2f" % dir_to.x, "1":"%7.2f" % dir_to.y}) + # "\nDir to: {0}, {1}".format({"0":"%7.2f" % dir_to.x, "1":"%7.2f" % dir_to.y}) +
# "\nPoint to: {0}, {1}".format({"0":"%7.2f" % diff_to.x, "1":"%7.2f" % diff_to.y}) # "\nPoint to: {0}, {1}".format({"0":"%7.2f" % diff_to.x, "1":"%7.2f" % diff_to.y})
# #"\nDT: %7.2f" % dist_to # #"\nDT: %7.2f" % dist_to
# ) # )
# "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114}) # "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114})
#"Hi, {0} v{1}".format(["Godette", "3.0"], "{_}") #"Hi, {0} v{1}".format(["Godette", "3.0"], "{_}")
move_and_slide(dir_to * 180.0 ) move_and_slide(dir_to * 180.0 )
# flip_tracker += delta # flip_tracker += delta
# if flip_tracker < 10: # if flip_tracker < 10:
# move_and_slide(Vector2(60.2,0)) # move_and_slide(Vector2(60.2,0))
# elif flip_tracker < 20: # elif flip_tracker < 20:
# move_and_slide(Vector2(-60.2,0)) # move_and_slide(Vector2(-60.2,0))
# else: # else:
# flip_tracker = 0.0 # flip_tracker = 0.0

View File

@ -10,32 +10,23 @@ extends Area2D
export var velocity_pps :float = 1 export var velocity_pps :float = 1
export var lifespan :float = -1 export var lifespan :float = -1
var direction_normal := Vector2(0,0) var direction_normal := Vector2(0,0)
puppet var puppet_direction_normal :Vector2
puppet var puppet_position
var time_alive :float = 0.0 var time_alive :float = 0.0
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
puppet_direction_normal = direction_normal pass # Replace with function body.
puppet_position = global_position
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta): func _process(delta):
if is_network_master():
position += direction_normal * velocity_pps * delta
rset("puppet_position", global_position)
else:
global_position = puppet_position
if lifespan != -1: if lifespan != -1:
time_alive += delta time_alive += delta
if time_alive > lifespan: if time_alive > lifespan:
queue_free() queue_free()
rotate(delta * 10) rotate(delta * 10)
position += direction_normal * velocity_pps * delta
##TODO: Haven't determined if I want to create a receiver for projectiles or just inherit from an
## interactable for projectiles.
func _on_body_entered(body): func _on_body_entered(body):
var colliding_node = body var colliding_node = body
if colliding_node.has_node("Projectile_Receiver"): if colliding_node.has_node("Projectile_Receiver"):

View File

@ -1,31 +0,0 @@
class_name SceneTransitions
extends CanvasLayer
signal done
#func change_scene(target: String, type: String = 'dissolve') -> void:
# if type == 'dissolve':
# transition_dissolve(target)
# else:
# transition_clouds(target)
onready var animation_player = $AnimationPlayer
var animation_name = ''
func reset():
animation_player.play_backwards(animation_name)
emit_signal("done")
func transition_dissolve() -> void:
animation_name = 'dissolve'
animation_player.play('dissolve')
yield(animation_player,'animation_finished')
emit_signal("done")
func transition_clouds() -> void:
animation_name = 'clouds_out'
animation_player.play('clouds_in')
yield(animation_player,'animation_finished')
emit_signal("done")

View File

@ -54,7 +54,6 @@ func shoot(direction = 1):
# else: # else:
# bullet.global_position = global_position - Vector2(position.x * 2, 0) # bullet.global_position = global_position - Vector2(position.x * 2, 0)
if bullet is Projectile: if bullet is Projectile:
print ("i'm a projectile")
bullet.global_position = global_position bullet.global_position = global_position
bullet.direction_normal = normal_vector bullet.direction_normal = normal_vector
@ -64,19 +63,5 @@ func shoot(direction = 1):
add_child(bullet) add_child(bullet)
# sound_shoot.play() # sound_shoot.play()
timer.start() timer.start()
NetworkManager.instance_on_peer_players(loaded_scene, self.get_path(), global_position , true)
return true return true
#var bomb_name = String(get_name()) + str(bomb_index)
#var bomb_pos = position
#rpc("setup_bomb", bomb_name, bomb_pos, get_tree().get_network_unique_id())
remotesync func setup_bomb(bomb_name, pos, by_who):
var bomb = loaded_scene.instance()
bomb.set_name(bomb_name) # Ensure unique name for the bomb
bomb.position = pos
bomb.from_player = by_who
# No need to set network master to bomb, will be owned by server by default
get_node("../..").add_child(bomb)

View File

@ -10,7 +10,7 @@ radius = 5.09902
[sub_resource type="RectangleShape2D" id=2] [sub_resource type="RectangleShape2D" id=2]
[node name="CloneBox" groups=["world"] instance=ExtResource( 1 )] [node name="CloneBox" instance=ExtResource( 1 )]
[node name="TileMap Collision" parent="." index="1"] [node name="TileMap Collision" parent="." index="1"]
tile_set = ExtResource( 2 ) tile_set = ExtResource( 2 )

View File

@ -47,7 +47,7 @@ points = PoolVector2Array( 20, 20, 0.326027, 20, 0.326027, 0.605103, 20, 0.60510
[sub_resource type="CircleShape2D" id=6] [sub_resource type="CircleShape2D" id=6]
[node name="TestBox" groups=["world"] instance=ExtResource( 1 )] [node name="TestBox" instance=ExtResource( 1 )]
music_track = ExtResource( 5 ) music_track = ExtResource( 5 )
[node name="TileMap Collision" parent="." index="1"] [node name="TileMap Collision" parent="." index="1"]
@ -64,7 +64,7 @@ tile_data = PoolIntArray( 524288, 0, 2, 524307, 0, 3 )
position = Vector2( 80, 131 ) position = Vector2( 80, 131 )
[node name="Hitbox_Component" parent="." index="4" instance=ExtResource( 3 )] [node name="Hitbox_Component" parent="." index="4" instance=ExtResource( 3 )]
damage_amount = 90 damage_amount = 10
[node name="ColorRect" type="ColorRect" parent="Hitbox_Component" index="0"] [node name="ColorRect" type="ColorRect" parent="Hitbox_Component" index="0"]
margin_left = 266.0 margin_left = 266.0

View File

@ -7,7 +7,7 @@
radius = 6.0 radius = 6.0
height = 2.0 height = 2.0
[node name="MushroomPew" groups=["world"] instance=ExtResource( 1 )] [node name="MushroomPew" instance=ExtResource( 1 )]
velocity_pps = 300.0 velocity_pps = 300.0
lifespan = 0.5 lifespan = 0.5

View File

@ -1,108 +0,0 @@
extends Control
func _ready():
# Called every time the node is added to the scene.
NetworkManager.connect("connection_failed", self, "_on_connection_failed")
NetworkManager.connect("connection_succeeded", self, "_on_connection_success")
NetworkManager.connect("player_list_changed", self, "refresh_lobby")
NetworkManager.connect("game_ended", self, "_on_game_ended")
NetworkManager.connect("game_error", self, "_on_game_error")
# Set the player name according to the system username. Fallback to the path.
if OS.has_environment("USERNAME"):
$Connect/Name.text = OS.get_environment("USERNAME")
else:
var desktop_path = OS.get_system_dir(0).replace("\\", "/").split("/")
$Connect/Name.text = desktop_path[desktop_path.size() - 2]
$Connect/Join.grab_focus()
func _on_host_pressed():
if $Connect/Name.text == "":
$Connect/ErrorLabel.text = "Invalid name!"
return
$Connect.hide()
$Players.show()
$Connect/ErrorLabel.text = ""
var player_name = $Connect/Name.text
NetworkManager.host_game(player_name)
refresh_lobby()
$Players/Start.grab_focus()
func _on_join_pressed():
if $Connect/Name.text == "":
$Connect/ErrorLabel.text = "Invalid name!"
return
var ip = $Connect/IPAddress.text
if not ip.is_valid_ip_address():
$Connect/ErrorLabel.text = "Invalid IP address!"
return
$Connect/ErrorLabel.text = ""
$Connect/Host.disabled = true
$Connect/Join.disabled = true
$Players/Start.grab_focus()
var player_name = $Connect/Name.text
NetworkManager.join_game(ip, player_name)
func _on_connection_success():
$Connect.hide()
$Players.show()
func _on_connection_failed():
$Connect/Host.disabled = false
$Connect/Join.disabled = false
$Connect/ErrorLabel.set_text("Connection failed.")
func _on_game_ended():
show()
$Connect.show()
$Players.hide()
$Connect/Host.disabled = false
$Connect/Join.disabled = false
func _on_game_error(errtxt):
$ErrorDialog.dialog_text = errtxt
$ErrorDialog.popup_centered_minsize()
$Connect/Host.disabled = false
$Connect/Join.disabled = false
func refresh_lobby():
var players = NetworkManager.get_player_list()
players.sort()
$Players/List.clear()
$Players/List.add_item(NetworkManager.get_player_name() + " (You)")
for p in players:
$Players/List.add_item(p)
## Only Server is allowed to press the start game button.
$Players/Start.disabled = not get_tree().is_network_server()
func _on_start_pressed():
NetworkManager.begin_game()
func _on_find_public_ip_pressed():
OS.shell_open("https://icanhazip.com/")
func _on_Lobby_focus_entered():
if visible:
$Connect/Join.grab_focus()
func _on_Lobby_visibility_changed():
if visible:
$Connect/Join.grab_focus()

View File

@ -1,177 +0,0 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://src/ui/lobby.gd" type="Script" id=1]
[ext_resource path="res://assets/Fonts/QuinqueFive.tres" type="DynamicFont" id=2]
[node name="Lobby" type="Control"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -160.0
margin_top = -90.0
margin_right = 160.0
margin_bottom = 90.0
size_flags_horizontal = 2
size_flags_vertical = 2
script = ExtResource( 1 )
[node name="Players" type="Panel" parent="."]
visible = false
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -135.0
margin_top = -87.5
margin_right = 135.0
margin_bottom = 87.5
size_flags_horizontal = 2
size_flags_vertical = 2
[node name="Label" type="Label" parent="Players"]
margin_left = 16.0
margin_top = 17.5
margin_right = 132.0
margin_bottom = 31.5
size_flags_horizontal = 2
size_flags_vertical = 0
custom_fonts/font = ExtResource( 2 )
text = "Awaiting Players..."
[node name="Start" type="Button" parent="Players"]
margin_left = 26.0
margin_top = 140.5
margin_right = 78.0
margin_bottom = 158.5
size_flags_horizontal = 2
size_flags_vertical = 2
custom_fonts/font = ExtResource( 2 )
text = "START!"
[node name="List" type="ItemList" parent="Players"]
margin_left = 11.0
margin_top = 37.0
margin_right = 136.0
margin_bottom = 129.0
size_flags_horizontal = 2
size_flags_vertical = 2
custom_fonts/font = ExtResource( 2 )
[node name="PortForward" type="Label" parent="Players"]
margin_left = 164.0
margin_top = 23.5
margin_right = 257.0
margin_bottom = 128.5
custom_constants/line_spacing = 6
custom_fonts/font = ExtResource( 2 )
text = "If you want non-LAN clients to connect,
make sure the port 10567 in UDP
is forwarded on your router."
align = 1
autowrap = true
[node name="FindPublicIP" type="LinkButton" parent="Players"]
margin_left = 90.0
margin_top = 141.5
margin_right = 263.0
margin_bottom = 155.5
custom_fonts/font = ExtResource( 2 )
text = "Find your public IP address"
[node name="Connect" type="Panel" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -135.0
margin_top = -75.0
margin_right = 135.0
margin_bottom = 75.0
size_flags_horizontal = 2
size_flags_vertical = 2
[node name="NameLabel" type="Label" parent="Connect"]
margin_left = 14.0
margin_top = 11.0
margin_right = 56.0
margin_bottom = 25.0
size_flags_horizontal = 2
size_flags_vertical = 0
custom_fonts/font = ExtResource( 2 )
text = "Name:"
[node name="Name" type="LineEdit" parent="Connect"]
margin_left = 17.0
margin_top = 30.0
margin_right = 173.0
margin_bottom = 54.0
size_flags_horizontal = 2
size_flags_vertical = 2
custom_fonts/font = ExtResource( 2 )
text = "The Warrior"
[node name="IPLabel" type="Label" parent="Connect"]
margin_left = 15.0
margin_top = 66.0
margin_right = 57.0
margin_bottom = 80.0
size_flags_horizontal = 2
size_flags_vertical = 0
custom_fonts/font = ExtResource( 2 )
text = "IP:"
[node name="IPAddress" type="LineEdit" parent="Connect"]
margin_left = 17.0
margin_top = 85.0
margin_right = 173.0
margin_bottom = 109.0
size_flags_horizontal = 2
size_flags_vertical = 2
custom_fonts/font = ExtResource( 2 )
text = "192.168.0.133"
[node name="Host" type="Button" parent="Connect"]
margin_left = 181.0
margin_top = 31.0
margin_right = 246.0
margin_bottom = 51.0
focus_neighbour_bottom = NodePath("../Join")
size_flags_horizontal = 2
size_flags_vertical = 2
custom_fonts/font = ExtResource( 2 )
text = "Host"
[node name="Join" type="Button" parent="Connect"]
margin_left = 181.0
margin_top = 87.0
margin_right = 246.0
margin_bottom = 107.0
focus_neighbour_top = NodePath("../Host")
size_flags_horizontal = 2
size_flags_vertical = 2
custom_fonts/font = ExtResource( 2 )
text = "Join"
[node name="ErrorLabel" type="Label" parent="Connect"]
margin_left = 15.0
margin_top = 125.0
margin_right = 257.0
margin_bottom = 139.0
size_flags_horizontal = 2
size_flags_vertical = 0
custom_colors/font_color = Color( 0.820312, 0.291595, 0.291595, 1 )
align = 1
[node name="ErrorDialog" type="AcceptDialog" parent="."]
margin_right = 55.0
margin_bottom = 58.0
size_flags_horizontal = 2
size_flags_vertical = 2
[connection signal="focus_entered" from="." to="." method="_on_Lobby_focus_entered"]
[connection signal="visibility_changed" from="." to="." method="_on_Lobby_visibility_changed"]
[connection signal="pressed" from="Players/Start" to="." method="_on_start_pressed"]
[connection signal="pressed" from="Players/FindPublicIP" to="." method="_on_find_public_ip_pressed"]
[connection signal="pressed" from="Connect/Host" to="." method="_on_host_pressed"]
[connection signal="pressed" from="Connect/Join" to="." method="_on_join_pressed"]

View File

@ -0,0 +1,31 @@
extends CanvasLayer
signal done
#func change_scene(target: String, type: String = 'dissolve') -> void:
# if type == 'dissolve':
# transition_dissolve(target)
# else:
# transition_clouds(target)
var animation_name = ''
func reset():
$AnimationPlayer.play_backwards(animation_name)
emit_signal("done")
func transition_dissolve(target: String) -> void:
animation_name = 'dissolve'
$AnimationPlayer.play('dissolve')
yield($AnimationPlayer,'animation_finished')
emit_signal("done")
#get_tree().change_scene(target)
#$AnimationPlayer.play_backwards('dissolve')
func transition_clouds(target: String) -> void:
animation_name = 'clouds_out'
$AnimationPlayer.play('clouds_in')
yield($AnimationPlayer,'animation_finished')
emit_signal("done")
#get_tree().change_scene(target)
#$AnimationPlayer.play('clouds_out')

View File

@ -1,6 +1,6 @@
[gd_scene load_steps=7 format=2] [gd_scene load_steps=7 format=2]
[ext_resource path="res://src/classes/scene_transition.gd" type="Script" id=1] [ext_resource path="res://src/ui/scene_transition.gd" type="Script" id=1]
[ext_resource path="res://assets/UI/transition_screen.png" type="Texture" id=2] [ext_resource path="res://assets/UI/transition_screen.png" type="Texture" id=2]
[sub_resource type="Animation" id=1] [sub_resource type="Animation" id=1]