/// <summary> /// 检测是否在使用范围内 /// </summary> /// <param name="user"></param> /// <param name="target"></param> /// <returns></returns> public bool IsInRange(AbstractPlayer user, AbstractPlayer target) { int p2p = user.GetFunction().GetDistance(target); int att = user.GetFunction().GetAttackDistance(); int def = target.GetFunction().GetDefenceDistance(); return((att - def) >= p2p); }
/// <summary> /// 玩家扣血 -- 调用扣血触发事件 /// </summary> /// <param name="num">扣血数量</param> /// <param name="murderer">凶手</param> public void LoseHP(int num, AbstractPlayer murderer) { int hp = player.GetState().GetCurHP(); hp -= num; player.GetState().SetCurHP(hp); //ViewManagement.getInstance().printMsg( // player.getInfo().getName() + "受到" + num + "点伤害"); player.RefreshView(); // TODO 如果血量不足,则开始求桃 hp: while (player.GetState().GetCurHP() <= 0) { // 先求自己 if (player.GetRequest().RequestYao()) { player.GetAction().TaoSave(player); if (player.GetState().GetCurHP() > 0) { return; } else { continue; } } // 再求其他人 List <AbstractPlayer> list = player.GetFunction().GetAllPlayers(); for (int i = 0; i < list.Count(); i++) { // 因为有卡死bug,暂时不问凶手求桃 // 经研究为swing中的多线程问题 2013-4-5已解决 // if(list.get(i)==murderer)continue; if (list.ElementAt(i).GetRequest().RequestYao()) { player.GetAction().TaoSave(player); if (player.GetState().GetCurHP() > 0) { break; } } } player.GetAction().Dead(murderer); return; } // 调用触发事件 this.player.GetTrigger().AfterLoseHP(murderer); player.RefreshView(); if (murderer != null) { murderer.RefreshView(); } }
/// <summary> /// 根据准备出的牌 /// 获得可以对其使用的目标列表 </summary> /// <param name="player"> </param> /// <param name="c"> /// @return </param> public static IList <AbstractPlayer> getEnableTargets(AbstractPlayer player, AbstractCard c) { IList <AbstractPlayer> list = player.GetFunction().GetAllPlayers(); IList <AbstractPlayer> result = new List <AbstractPlayer>(); for (int i = 0; i < list.Count; i++) { if (c.TargetCheck4SinglePlayer(player, list[i])) { result.Add(list[i]); } } return(result); }