diff --git a/README.md b/README.md index 7a136db..a5cb2c8 100644 --- a/README.md +++ b/README.md @@ -63,4 +63,4 @@ game/ - 除连接了信号或 HTTPRequest、MultiplayerAPI 的函数外,任何函数都不应该以下划线(`_`)开头。 -- 函数之间既可间隔一行,也可间隔两行。建议绑定 Godot 信号的函数间隔两行(自动空行),其余函数间隔一行,部分间隔一行的函数为遗留问题。 +- 函数之间既可间隔一行,也可间隔两行。建议函数间隔两行,部分间隔一行的函数为遗留问题。 diff --git a/scripts/autoload/DownloadManager.gd b/scripts/autoload/DownloadManager.gd index 72109c7..61c35f4 100644 --- a/scripts/autoload/DownloadManager.gd +++ b/scripts/autoload/DownloadManager.gd @@ -9,6 +9,7 @@ func create_file(file_path: String) -> void: var file: FileAccess = FileAccess.open(file_path, FileAccess.WRITE) file.close() + func download_file(server_path: String, local_path: String) -> void: var http: HTTPRequest = HTTPRequest.new() add_child(http) @@ -19,6 +20,7 @@ func download_file(server_path: String, local_path: String) -> void: http.request(server_path) await http.request_completed + func get_uuid() -> void: var index_file: FileAccess = FileAccess.open("user://download/sources/temp/index.json", FileAccess.READ) var index_text: String = index_file.get_as_text() @@ -26,6 +28,7 @@ func get_uuid() -> void: index_file.close() uuid = content["uuid"] + func download_defs(type: String, origin: String) -> void: var list_file: FileAccess = FileAccess.open("user://download/sources/%s/%ss/list.json" % [uuid, type], FileAccess.READ) var list_text: String = list_file.get_as_text() @@ -37,6 +40,7 @@ func download_defs(type: String, origin: String) -> void: var filename = list[k] await download_file("%s%s/id/%s" % [origin, type, k], "user://download/sources/%s/%ss/%s.json" % [uuid, type, filename]) + func download_assets(origin: String) -> void: var list_file: FileAccess = FileAccess.open("user://download/sources/%s/assets/list.json" % [uuid], FileAccess.READ) var list_text: String = list_file.get_as_text() @@ -51,6 +55,7 @@ func download_assets(origin: String) -> void: var filename = list["sounds"][k] await download_file("%sasset/sound/%s" % [origin, k], "user://download/sources/%s/assets/sounds/%s" % [uuid, filename]) + func download_from_origin() -> int: var origin: String = GameManager.data_origin var http: HTTPRequest = HTTPRequest.new() @@ -88,6 +93,7 @@ func download_from_origin() -> int: return 0 + func load_resource(): var card_file: FileAccess = FileAccess.open("user://download/sources/%s/cards/list.json" % [uuid], FileAccess.READ) GameManager.card_list = JSON.parse_string(card_file.get_as_text()) @@ -107,6 +113,7 @@ func load_resource(): GameManager.sound_list = asset_list["sounds"] asset_file.close() + func get_sources(): if !DirAccess.dir_exists_absolute("user://download/sources/"): DirAccess.make_dir_recursive_absolute("user://download/sources/") diff --git a/scripts/autoload/GameLoopManager.gd b/scripts/autoload/GameLoopManager.gd index 24a837c..16a3d76 100644 --- a/scripts/autoload/GameLoopManager.gd +++ b/scripts/autoload/GameLoopManager.gd @@ -7,16 +7,20 @@ signal end_game func _ready() -> void: end_game.connect(_on_end_game) + func start_game() -> void: game_round = 1 + func settle_round() -> void: game_round += 1 if check_game_end(): end_game.emit() + func check_game_end() -> bool: return false + func _on_end_game() -> void: game_round = -1 diff --git a/scripts/autoload/MultiGame.gd b/scripts/autoload/MultiGame.gd index 6aa3669..516b2d0 100644 --- a/scripts/autoload/MultiGame.gd +++ b/scripts/autoload/MultiGame.gd @@ -29,6 +29,7 @@ func add_player(id: int) -> void: player_turns[id] = 0 player_hp[id] = INITIAL_HP + func remove_player(id: int) -> void: if not players.has(id): return @@ -36,6 +37,7 @@ func remove_player(id: int) -> void: for dict in [player_cards, player_turns, player_hp, player_username]: dict.erase(id) + func create_server(playern: int) -> void: max_players = playern if peer.create_server(PORT, playern) != OK: @@ -43,24 +45,29 @@ func create_server(playern: int) -> void: _setup_multiplayer() add_player(1) + func create_client(ip: String) -> void: if peer.create_client(ip, PORT) != OK: return _setup_multiplayer() + func _setup_multiplayer() -> void: multiplayer.multiplayer_peer = peer multiplayer.peer_connected.connect(_on_peer_connected) multiplayer.peer_disconnected.connect(_on_peer_disconnected) + func _on_peer_connected(id: int) -> void: add_player(id) sync_players.rpc() + func _on_peer_disconnected(id: int) -> void: remove_player(id) sync_players.rpc() + func start_game() -> void: if not multiplayer.is_server() or players.size() != max_players: return @@ -69,6 +76,7 @@ func start_game() -> void: deal_cards() sync_game_state.rpc() + func extract() -> String: if cards.is_empty(): return "" @@ -77,10 +85,12 @@ func extract() -> String: cards.remove_at(index) return card + func deal_cards() -> void: for player_id in players: _draw_cards(player_id, MAX_HAND_SIZE) + func next_round() -> void: if not multiplayer.is_server(): return @@ -88,6 +98,7 @@ func next_round() -> void: server_round += 1 sync_game_state.rpc() + func settle_round() -> void: for player_id in players: var draw_count := DEFAULT_DRAW_COUNT @@ -95,6 +106,7 @@ func settle_round() -> void: draw_count = FIRST_ROUND_DRAW_COUNT _draw_cards(player_id, draw_count) + func _draw_cards(player_id: int, count: int) -> void: if not player_cards.has(player_id): return @@ -107,18 +119,22 @@ func _draw_cards(player_id: int, count: int) -> void: break hand.append(card) + func get_my_cards() -> void: request_cards.rpc_id(1) + @rpc("any_peer", "call_remote", "reliable") func request_cards() -> void: var sender_id := multiplayer.get_remote_sender_id() send_cards.rpc_id(sender_id, player_cards.get(sender_id, [])) + @rpc("authority", "call_remote", "reliable") func send_cards(data: Array) -> void: my_card = data + func sync_game_state() -> void: if not multiplayer.is_server(): return @@ -131,6 +147,7 @@ func sync_game_state() -> void: game_started = game_started }) + @rpc("authority", "call_remote", "reliable") func sync_game_state_rpc(data: Dictionary) -> void: cards = data.cards @@ -140,6 +157,7 @@ func sync_game_state_rpc(data: Dictionary) -> void: server_round = data.server_round game_started = data.game_started + func sync_players() -> void: if not multiplayer.is_server(): return @@ -149,6 +167,7 @@ func sync_players() -> void: player_hp = player_hp }) + @rpc("authority", "call_remote", "reliable") func sync_players_rpc(data: Dictionary) -> void: players = data.players diff --git a/scripts/autoload/SceneManager.gd b/scripts/autoload/SceneManager.gd index 431338d..f04d894 100644 --- a/scripts/autoload/SceneManager.gd +++ b/scripts/autoload/SceneManager.gd @@ -8,6 +8,7 @@ func _ready(): var root: Window = get_tree().root current_scene = root.get_child(root.get_child_count() - 1) + func goto_scene(path: String): get_tree().change_scene_to_file("res://scenes/%s.tscn" % [path]) var root: Window = get_tree().root diff --git a/scripts/game/card.gd b/scripts/game/card.gd index f40f042..88fcd4a 100644 --- a/scripts/game/card.gd +++ b/scripts/game/card.gd @@ -4,17 +4,21 @@ var description: String var type: String var card_name: String + func set_texture(pic: String) -> void: var image: Image = Image.new() image.load(pic) $Sprite.texture = ImageTexture.create_from_image(image) + func set_card(cname: String) -> void: card_name = cname set_texture("user://download/sources/%s/assets/pics/%s" % [DownloadManager.uuid, GameManager.pic_list[card_name]]) + func set_pos(x: int, y: int) -> void: $Sprite.position = Vector2(x, y) + func get_pos() -> Vector2: return $Sprite.position diff --git a/scripts/game/game.gd b/scripts/game/game.gd index a3291ed..f9d2e94 100644 --- a/scripts/game/game.gd +++ b/scripts/game/game.gd @@ -10,6 +10,7 @@ func _ready() -> void: card.set_pos(300, 300) print(card.get_pos()) + func init() -> void: # 设置 UI 展示文本 if multiplayer.is_server(): diff --git a/scripts/main_menu/main_menu.gd b/scripts/main_menu/main_menu.gd index 8978e02..1ba7bf1 100644 --- a/scripts/main_menu/main_menu.gd +++ b/scripts/main_menu/main_menu.gd @@ -4,11 +4,14 @@ extends Node2D func _on_join_game_pressed() -> void: $JoinGameUI.show() + func _on_start_game_pressed() -> void: $CreateGameUI.show() + func _on_setting_button_pressed() -> void: SceneManager.goto_scene("menus/settings") + func _on_quit_game_pressed() -> void: get_tree().quit() diff --git a/scripts/settings/settings.gd b/scripts/settings/settings.gd index b1c7b0e..9f92fe9 100644 --- a/scripts/settings/settings.gd +++ b/scripts/settings/settings.gd @@ -1,20 +1,24 @@ extends Node2D + func _ready() -> void: init_sources() init_text() + func init_text() -> void: $DataSetting/LineEdit.text = GameManager.data_origin $IPBeginSetting/LineEdit.text = GameManager.ip_begin $UsernameSetting/LineEdit.text = GameManager.username $LoadSource/ChooseSource.select(GameManager.source) + func init_sources() -> void: DownloadManager.get_sources() for source_name in GameManager.sources: $LoadSource/ChooseSource.add_item(source_name) + func _on_save_button_pressed() -> void: GameManager.data_origin = $DataSetting/LineEdit.text GameManager.ip_begin = $IPBeginSetting/LineEdit.text @@ -42,7 +46,6 @@ func _on_download_button_pressed() -> void: $Tips.text = "SETTINGS_TIP_LOADED" - func _on_load_button_pressed() -> void: if GameManager.sources.size() == 0 or GameManager.source == -1: $Tips.text = "SETTINGS_TIP_NOLOCALSOURCE"