diff --git a/Assets/TcgEngine/Scripts/GameLogic/GameLogic.cs b/Assets/TcgEngine/Scripts/GameLogic/GameLogic.cs index b4b6aa1..9c46f95 100644 --- a/Assets/TcgEngine/Scripts/GameLogic/GameLogic.cs +++ b/Assets/TcgEngine/Scripts/GameLogic/GameLogic.cs @@ -174,6 +174,9 @@ namespace TcgEngine.Gameplay game_data.turn_timer = GameplayData.Get().turn_duration; player.history_list.Clear(); + //清除本回合已上场的卡牌数量 + player.cards_played_this_turn = 0; + //Player poison if (player.HasStatus(StatusType.Poisoned)) player.hp -= player.GetStatusValue(StatusType.Poisoned); @@ -997,6 +1000,81 @@ namespace TcgEngine.Gameplay cards_to_clear.Add(card); //Will be Clear() in the next UpdateOngoing, so that simultaneous damage effects work onCardDiscarded?.Invoke(card); + + // 检查场上是否为空,如果为空则强制召唤角色牌 + if (was_on_board) + { + CheckAndForceSummonCharacter(player); + } + } + + // 检查并强制召唤角色牌 + public virtual void CheckAndForceSummonCharacter(Player player) + { + // 检查场上是否为空 + if (player.cards_board.Count > 0) + return; // 场上还有牌,不需要强制召唤 + + // 检查手牌中是否有角色牌 + Card characterCard = GetRandomCharacterFromHand(player); + if (characterCard != null) + { + // 从手牌强制上场角色牌 + ForceSummonCharacterFromHand(player, characterCard); + } + else if (player.cards_hand.Count == 0 && player.cards_deck.Count > 0) + { + // 没有手牌但卡组还有牌,判为输 + EndGame(GetOpponentId(player.player_id)); + } + } + + // 从手牌中获取随机角色牌 + private Card GetRandomCharacterFromHand(Player player) + { + List characterCards = new List(); + foreach (Card card in player.cards_hand) + { + if (card.CardData.IsCharacter()) + { + characterCards.Add(card); + } + } + + if (characterCards.Count > 0) + { + return characterCards[random.Next(0, characterCards.Count)]; + } + + return null; + } + + // 强制从手牌召唤角色牌,设置为疲劳状态,不消耗mana + private void ForceSummonCharacterFromHand(Player player, Card characterCard) + { + // 找到一个空的卡槽 + Slot emptySlot = player.GetRandomEmptySlot(random); + if (emptySlot.IsValid()) + { + // 不消耗mana强制上场 + PlayCard(characterCard, emptySlot, true); // skip_cost = true + + // 设置为疲劳状态 + characterCard.exhausted = true; + } + } + + // 获取对手ID + private int GetOpponentId(int playerId) + { + foreach (Player player in game_data.players) + { + if (player.player_id != playerId) + { + return player.player_id; + } + } + return -1; // 找不到对手时返回-1 } public int RollRandomValue(int dice) diff --git a/Assets/TcgEngine/Scripts/GameLogic/Player.cs b/Assets/TcgEngine/Scripts/GameLogic/Player.cs index b49c73b..51db653 100644 --- a/Assets/TcgEngine/Scripts/GameLogic/Player.cs +++ b/Assets/TcgEngine/Scripts/GameLogic/Player.cs @@ -26,7 +26,7 @@ namespace TcgEngine public int mana = 0; public int mana_max = 0; public int kill_count = 0; - + public int cards_played_this_turn = 0; // 本回合已上场的卡牌数量 public Dictionary cards_all = new Dictionary(); //Dictionnary for quick access to any card by UID public Card hero = null; @@ -556,10 +556,18 @@ namespace TcgEngine public virtual bool IsDead() { - if (cards_hand.Count == 0 && cards_board.Count == 0 && cards_deck.Count == 0) - return true; + // 原有的死亡判定:血量为0 if (hp <= 0) return true; + + // 新增的死亡判定:无手牌、无场上卡牌,且卡组中还有牌 + if (cards_hand.Count == 0 && cards_board.Count == 0 && cards_deck.Count > 0) + return true; + + // 原有的死亡判定:所有牌都没有了 + if (cards_hand.Count == 0 && cards_board.Count == 0 && cards_deck.Count == 0) + return true; + return false; }