diff options
| -rw-r--r-- | client/game.gd | 37 | ||||
| -rw-r--r-- | client/game.tscn | 1 | ||||
| -rw-r--r-- | client/map/map.gd | 7 | ||||
| -rw-r--r-- | client/menu/menu_manager.tscn | 1 | ||||
| -rw-r--r-- | client/menu/scene_transition.gd | 23 | ||||
| -rw-r--r-- | client/multiplayer.gd | 4 | ||||
| -rw-r--r-- | server/src/game.rs | 2 | ||||
| -rw-r--r-- | server/src/protocol.rs | 3 | ||||
| -rw-r--r-- | test-client/protocol.ts | 1 | 
9 files changed, 53 insertions, 26 deletions
| diff --git a/client/game.gd b/client/game.gd index b36b40a0..756ff978 100644 --- a/client/game.gd +++ b/client/game.gd @@ -21,22 +21,20 @@ extends Node3D  @onready var mp: Multiplayer = $Multiplayer  @onready var map: Map = $Map  @onready var marker: Marker = $Marker - -var marker_target = Vector3(0,0,0) +@onready var environment = $WorldEnvironment +@onready var transition: SceneTransition = $SceneTransition  var player_id: int = -1  var item_names: Array = [] +var item_index_by_name: Dictionary = {}  var tile_names: Array = [] -var tile_id_by_name: Dictionary = {} +var tile_index_by_name: Dictionary = {}  var tile_collide: Array = []  var tile_interact: Array = [] -var item_idx_from_name: Dictionary = {} - +var marker_target = Vector3(0,0,0)  var players := {} -@onready var environment = $WorldEnvironment -  func _ready():  	if !Global.on_vulkan():  		environment.environment.tonemap_exposure = 0.5 @@ -58,13 +56,13 @@ func _ready():  			tile_names = tile_names_  			tile_collide = tile_collide_  			tile_interact = tile_interact_ -			tile_id_by_name = {} +			tile_index_by_name = {}  			for id in tile_names.size(): -				tile_id_by_name[tile_names[id]] = id +				tile_index_by_name[tile_names[id]] = id -			item_idx_from_name.clear() +			item_index_by_name.clear()  			for i in range(item_names.size()): -				item_idx_from_name[item_names[i]] = i +				item_index_by_name[item_names[i]] = i  	)  	await mp.init @@ -83,7 +81,7 @@ func _ready():  	)  	mp.set_tile.connect(set_tile) -	mp.remove_tile.connect(set_tile) +	mp.remove_tile.connect(func (pos): map.clear_tile(pos))  	mp.position.connect(func(player: int, pos: Vector2, rot: float):  		var player_instance: Player = players[player] @@ -166,18 +164,29 @@ func _ready():  	mp.send_join(Global.profile["username"], Global.profile["character"]) +	mp.set_ingame.connect(func (state): +		if state:  +			await transition.fade_out() +			map.gi_bake() +			await transition.fade_in() +			map.autobake = true +		else: +			map.autobake = false  +			await transition.fade_out() +	) +  func _process(delta):  	marker.position = lerp(marker.position, marker_target, delta * 40.0)  func get_tile_collision(pos: Vector2i) -> bool:  	var t = map.get_tile_name(pos)  	if t == null: return true -	else: return tile_collide[tile_id_by_name[t]] +	else: return tile_collide[tile_index_by_name[t]]  func get_tile_interactive(pos: Vector2i) -> bool:  	var t = map.get_tile_name(pos)  	if t == null: return false -	else: return tile_interact[tile_id_by_name[t]] +	else: return tile_interact[tile_index_by_name[t]]  func set_tile(tile: Vector2i, kind = null, neighbors = null):  	if neighbors != null: neighbors = neighbors.map(func (x): return tile_names[x] if x != null else null) diff --git a/client/game.tscn b/client/game.tscn index ff6b8da5..7c90d833 100644 --- a/client/game.tscn +++ b/client/game.tscn @@ -44,5 +44,6 @@ visible = false  [node name="SceneTransition" parent="." instance=ExtResource("5_yg6cl")]  ingame = true +auto_fade_in = false  [node name="Map" parent="." instance=ExtResource("6_prg6t")] diff --git a/client/map/map.gd b/client/map/map.gd index 32b267d7..7e09e969 100644 --- a/client/map/map.gd +++ b/client/map/map.gd @@ -2,7 +2,7 @@ class_name Map  extends Node3D  var tile_by_pos: Dictionary = {} -var baking = false +var autobake = false  func get_tile_name(pos: Vector2i):  	var e = tile_by_pos.get(str(pos)) @@ -18,10 +18,10 @@ func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,n  	add_child(tile)  	tile.position = Vector3(pos.x, 0, pos.y)  	tile_by_pos[str(pos)] = [pos, name_, tile, neighbors] -	if not baking: voxelgi_timer.start(1) +	if autobake: voxelgi_timer.start(1)  	return tile -func remove_tile_if_exists(pos: Vector2i): +func clear_tile(pos: Vector2i):  	var tile = get_tile_instance(pos)  	if tile == null: return  	if tile.item != null: tile.item.queue_free() @@ -33,7 +33,6 @@ func remove_tile_if_exists(pos: Vector2i):  @onready var voxelgi: VoxelGI = $VoxelGI  func _ready(): -	if baking: return  	voxelgi_timer.connect("timeout", gi_bake)  func gi_bake(): diff --git a/client/menu/menu_manager.tscn b/client/menu/menu_manager.tscn index 18e13282..56cc6442 100644 --- a/client/menu/menu_manager.tscn +++ b/client/menu/menu_manager.tscn @@ -32,4 +32,3 @@ layout_mode = 1  [node name="SceneTransition" parent="." instance=ExtResource("6_p4u45")]  visible = false  layout_mode = 1 -auto_fade_in = false diff --git a/client/menu/scene_transition.gd b/client/menu/scene_transition.gd index 30c7e1df..66b6c4e4 100644 --- a/client/menu/scene_transition.gd +++ b/client/menu/scene_transition.gd @@ -16,20 +16,29 @@  class_name SceneTransition  extends ColorRect -@onready var anim = $animation +@onready var anim: AnimationPlayer = $animation  @export var ingame = false  @export var auto_fade_in := true +var black = true +var fading = false +  func _ready(): -	if auto_fade_in: -		fade_in() -	else: -		visible = false +	visible = true +	if auto_fade_in: fade_in()  func fade_in(): -	visible = true -	anim.play("fade_in") +	if black: anim.play("fade_in"); fading = true +	black = false +	if fading: await anim.animation_finished +	fading = false + +func fade_out(): +	if not black: anim.play("fade_out"); fading = true +	black = true +	if fading: await anim.animation_finished +	fading = false  func transition_to(path: String):  	await out() diff --git a/client/multiplayer.gd b/client/multiplayer.gd index 0d9697e8..ecb987d6 100644 --- a/client/multiplayer.gd +++ b/client/multiplayer.gd @@ -41,6 +41,7 @@ signal set_player_item(player: int, item: int)  signal remove_player_item(player: int)  signal set_progress(tile: Vector2i, progress: float, warn: bool)  signal set_finished(tile: Vector2i, warn: bool) +signal set_ingame(state: bool)  signal connection_closed(reason: String) @@ -164,6 +165,9 @@ func handle_packet(bytes: PackedByteArray):  					push_error("neither text nor item provided")  			else:  				emit_signal("clear_message", player) +		"set_ingame": +			var state = decoded["state"] +			emit_signal("set_ingame", state)  		"error":  			var message = decoded["message"]  			push_warning("server error: %s" % message) diff --git a/server/src/game.rs b/server/src/game.rs index 4cb5c450..23900559 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -79,6 +79,7 @@ impl Game {      }      fn unload(&mut self) { +        self.packet_out.push_back(PacketC::SetIngame { state: false });          for (id, _) in self.players.drain() {              self.packet_out.push_back(PacketC::RemovePlayer { id })          } @@ -196,6 +197,7 @@ impl Game {                  .map(|d| d.completed)                  .unwrap_or_default(),          }); +        out.push(PacketC::SetIngame { state: true });          out      } diff --git a/server/src/protocol.rs b/server/src/protocol.rs index 92e2a639..16c379b9 100644 --- a/server/src/protocol.rs +++ b/server/src/protocol.rs @@ -134,6 +134,9 @@ pub enum PacketC {          demands_failed: usize,          demands_completed: usize,      }, +    SetIngame { +        state: bool, +    },      Error {          message: String,      }, diff --git a/test-client/protocol.ts b/test-client/protocol.ts index 41ab518d..ba6a630c 100644 --- a/test-client/protocol.ts +++ b/test-client/protocol.ts @@ -49,6 +49,7 @@ export type PacketC =      | { type: "update_map", tile: Vec2, kind: TileIndex | null, neighbors: [TileIndex | null] } // A map tile was changed      | { type: "communicate", player: PlayerID, message?: Message } // A player wants to communicate something, message is null when cleared      | { type: "score", demands_failed: number, demands_completed: number, } // Supplies information for score OSD +    | { type: "set_ingame", state: boolean } // Set to false when entering the game or switching maps      | { type: "error", message?: Message } // Your client did something wrong.  export type Message = | 
