diff options
| author | nokoe <nokoe@mailbox.org> | 2024-06-25 22:31:17 +0200 | 
|---|---|---|
| committer | nokoe <nokoe@mailbox.org> | 2024-06-25 23:39:19 +0200 | 
| commit | 8bb065604fbd12b14a7605cfa265ebf38890f628 (patch) | |
| tree | 811866aec6093924694605155d9962261c57cb17 /client/game.gd | |
| parent | ab6279e726ac7e10a4c5211a3d3827471fd35ccf (diff) | |
| download | hurrycurry-8bb065604fbd12b14a7605cfa265ebf38890f628.tar hurrycurry-8bb065604fbd12b14a7605cfa265ebf38890f628.tar.bz2 hurrycurry-8bb065604fbd12b14a7605cfa265ebf38890f628.tar.zst | |
multiplayer refactor
Diffstat (limited to 'client/game.gd')
| -rw-r--r-- | client/game.gd | 116 | 
1 files changed, 88 insertions, 28 deletions
| diff --git a/client/game.gd b/client/game.gd index f3c2f81c..4b90f00c 100644 --- a/client/game.gd +++ b/client/game.gd @@ -18,25 +18,51 @@ class_name Game  extends Node3D  @onready var camera: FollowCamera = $FollowCamera -@onready var map: Map = $Map  @onready var mp: Multiplayer = $Multiplayer  @onready var marker: Marker = $Marker  var marker_target = Vector3(0,0,0) +var player_id: int = -1 +var item_names: Array = [] +var tile_names: Array = [] +var tile_collide: Array = [] +var tile_interact: Array = [] + +var item_idx_from_name: Dictionary = {} +var tile_by_pos: Dictionary = {} +  var players := {}  func _ready(): -	mp.connect("connection_closed", func(reason: String): +	mp.connection_closed.connect(func(reason: String):  		Global.error_message = reason;  		$SceneTransition.instant_to("res://menu/error_menu.tscn")  	) +	mp.init.connect(func(player_id_: int): player_id = player_id_) + +	mp.data.connect(func( +			item_names_: Array, +			tile_names_: Array, +			tile_collide_: Array, +			tile_interact_: Array +		): +			item_names = item_names_ +			tile_names = tile_names_ +			tile_collide = tile_collide_ +			tile_interact = tile_interact_ + +			item_idx_from_name.clear() +			for i in range(item_names.size()): +				item_idx_from_name[item_names[i]] = i +	)  	await mp.init -	if mp.player_id == -1: + +	if player_id == -1:  		push_error("multiplayer has not been initialized") -	mp.connect("add_player", func(player: int, player_name: String, pos: Vector2, character: int): +	mp.add_player.connect(func(player: int, player_name: String, pos: Vector2, character: int):  		var player_instance: Player -		if player == mp.player_id: +		if player == player_id:  			player_instance = ControllablePlayer.new(player, player_name, pos, character, self)  			camera.target = player_instance  		else: @@ -45,15 +71,19 @@ func _ready():  		add_child(player_instance)  	) -	mp.connect("update_map", map.update) +	mp.set_tile.connect(set_tile) + +	mp.remove_tile.connect(remove_tile_if_exists) -	mp.connect("position", func(player: int, pos: Vector2, rot: float): +	mp.position.connect(func(player: int, pos: Vector2, rot: float):  		var player_instance: Player = players[player]  		player_instance.update_position(pos, rot)  	) -	mp.connect("remove_player", func(id: int): +	mp.remove_player.connect(func(id: int):  		var player: Player = players.get(id) +		if id == player_id: +			camera.target = self  		if player != null:  			if player.hand != null:  				player.hand.queue_free() @@ -61,56 +91,86 @@ func _ready():  			player.queue_free()  	) -	mp.connect("set_tile_item", func(tile: Vector2i, item: int): -		var t: Tile = map.tile_by_pos[str(tile)] -		var i = ItemFactory.produce(mp.item_names[item], t.item_base) +	mp.set_tile_item.connect(func(tile: Vector2i, item: int): +		var t: Tile = tile_by_pos[str(tile)][1] +		var i = ItemFactory.produce(item_names[item], t.item_base)  		add_child(i) -		i.name = mp.item_names[item] +		i.name = item_names[item]  		t.set_item(i)  	) -	mp.connect("remove_tile_item", func(tile: Vector2i): -		var t: Tile = map.tile_by_pos[str(tile)] +	mp.remove_tile_item.connect(func(tile: Vector2i): +		var t: Tile = tile_by_pos[str(tile)][1]  		t.take_item().queue_free()  	) -	mp.connect("set_player_item", func(player: int, item: int): +	mp.set_player_item.connect(func(player: int, item: int):  		var p: Player = players[player] -		var i = ItemFactory.produce(mp.item_names[item], p.hand_base) +		var i = ItemFactory.produce(item_names[item], p.hand_base)  		add_child(i) -		i.name = mp.item_names[item] +		i.name = item_names[item]  		p.set_item(i)  	) -	mp.connect("remove_player_item", func(player: int): +	mp.remove_player_item.connect(func(player: int):  		var p: Player = players[player]  		p.remove_item().queue_free()  	) -	mp.connect("take_item", func(tile: Vector2i, player: int): -		var t: Tile = map.tile_by_pos[str(tile)] +	mp.take_item.connect(func(tile: Vector2i, player: int): +		var t: Tile = tile_by_pos[str(tile)][1]  		var p: Player = players[player]  		p.take_item(t)  	) -	mp.connect("put_item", func(tile: Vector2i, player: int): -		var t: Tile = map.tile_by_pos[str(tile)] +	mp.put_item.connect(func(tile: Vector2i, player: int): +		var t: Tile = tile_by_pos[str(tile)][1]  		var p: Player = players[player]  		p.put_item(t)  	) -	mp.connect("set_progress", func(tile: Vector2i, progress: float, warn: bool): -		var t: Tile = map.tile_by_pos[str(tile)] +	mp.set_progress.connect(func(tile: Vector2i, progress: float, warn: bool): +		var t: Tile = tile_by_pos[str(tile)][1]  		t.progress(progress, warn)  	) -	mp.connect("set_finished", func(tile: Vector2i, warn: bool): -		var t: Tile = map.tile_by_pos[str(tile)] +	mp.set_finished.connect(func(tile: Vector2i, warn: bool): +		var t: Tile = tile_by_pos[str(tile)][1]  		t.finish(warn)  	) -  	mp.send_join(Global.username, Global.character) -  func _process(delta):  	marker.position = lerp(marker.position, marker_target, delta * 40.0) + +func get_tile_collision(pos: Vector2i) -> bool: +	var t: Array = tile_by_pos.get(str(pos)) +	if t == null: return false +	else: return tile_collide[t[0]] + +func get_tile_interactive(pos: Vector2i) -> bool: +	var t: Array = tile_by_pos.get(str(pos)) +	if t == null: return false +	else: return tile_interact[t[0]] + +func set_tile(tile: Vector2i, kind: int, neighbors: Array): +	remove_tile_if_exists(tile) +	var node_name = str(tile) +	var tile_name: String = tile_names[kind] +	neighbors = neighbors.map(func (x): return tile_names[x] if x != null else null) +	var instance: Tile = TileFactory.produce(tile_name, node_name, neighbors) + +	instance.position = Vector3(tile[0], 0, tile[1]) +	tile_by_pos[node_name] = [kind, instance] +	add_child(instance) + +func remove_tile_if_exists(pos: Vector2i): +	var node_name = str(pos) +	var current = tile_by_pos.get(node_name) +	if current != null: +		var tile: Tile = current[1] +		if tile.item != null: +			tile.item.queue_free() +		tile_by_pos.erase(node_name) +		tile.name += "_queued_free" +		tile.queue_free() | 
