Example #1
0
 protected void OnEnablerViewportExited(Godot.Object viewport)
 {
     if (TargetPlayer != null && TargetPlayer.TargetMob == this)
     {
         TargetPlayer.ReleaseTarget();
     }
 }
Example #2
0
	protected void setStartVariables() {
		myTransform = transform;
		myRigidBody = GetComponent<Rigidbody>();
		roomController = transform.parent.GetComponent<RoomController> ();
		moveSpeed = GetComponent<EnemyStats>().moveSpeed;
		p1_Object = GameObject.Find ("P1");
		p2_Object = GameObject.Find ("P2");

		timer = Random.Range(1, 50);

		foreach (Transform child in transform) {
			if (child.name != "SpawnParticles" && child.tag != "Hitspark") {
				enemyAnimator = child.GetComponent<Animator> ();
			}
		}
		Vector3 predictedPlayerPos1 = p1_Object.transform.position + p1_Object.GetComponent<Rigidbody>().velocity * Time.deltaTime;
    	Vector3 predictedPlayerPos2 = p2_Object.transform.position + p2_Object.GetComponent<Rigidbody>().velocity * Time.deltaTime;
    	Transform p1_Transform = p1_Object.transform;
    	Transform p2_Transform = p2_Object.transform;
		// Predicted distance
    	float dist_1 = Vector3.Distance(myTransform.position, predictedPlayerPos1);
		float dist_2 = Vector3.Distance(myTransform.position, predictedPlayerPos2);
		if (dist_1 < dist_2) {
			targetPlayer = new TargetPlayer(GameObject.Find ("P1"), p1_Transform, dist_1);
		} else {
			targetPlayer = new TargetPlayer(GameObject.Find ("P2"), p2_Transform, dist_2);
		}
	}
Example #3
0
    protected void setStartVariables()
    {
        myTransform    = transform;
        myRigidBody    = GetComponent <Rigidbody>();
        roomController = transform.parent.GetComponent <RoomController> ();
        moveSpeed      = GetComponent <EnemyStats>().moveSpeed;
        p1_Object      = GameObject.Find("P1");
        p2_Object      = GameObject.Find("P2");

        timer = Random.Range(1, 50);

        foreach (Transform child in transform)
        {
            if (child.name != "SpawnParticles" && child.tag != "Hitspark")
            {
                enemyAnimator = child.GetComponent <Animator> ();
            }
        }
        Vector3   predictedPlayerPos1 = p1_Object.transform.position + p1_Object.GetComponent <Rigidbody>().velocity *Time.deltaTime;
        Vector3   predictedPlayerPos2 = p2_Object.transform.position + p2_Object.GetComponent <Rigidbody>().velocity *Time.deltaTime;
        Transform p1_Transform        = p1_Object.transform;
        Transform p2_Transform        = p2_Object.transform;
        // Predicted distance
        float dist_1 = Vector3.Distance(myTransform.position, predictedPlayerPos1);
        float dist_2 = Vector3.Distance(myTransform.position, predictedPlayerPos2);

        if (dist_1 < dist_2)
        {
            targetPlayer = new TargetPlayer(GameObject.Find("P1"), p1_Transform, dist_1);
        }
        else
        {
            targetPlayer = new TargetPlayer(GameObject.Find("P2"), p2_Transform, dist_2);
        }
    }
Example #4
0
        void CheckIfHitTarget(string hitInfo, bool bLastHit = false)
        {
            string          pattern = @"([\w\s]+)\\+(\d+\.?\d+)\\+(\d+\.?\d+)\\+(\d+\.?\d+)\\+(\d+\.?\d+)\\+(\d+)";
            MatchCollection matches = Regex.Matches(hitInfo, pattern);
            AttackInfo      info    = new AttackInfo(
                matches[0].Groups[1].Value,
                float.Parse(matches[0].Groups[2].Value),
                float.Parse(matches[0].Groups[3].Value),
                float.Parse(matches[0].Groups[4].Value),
                float.Parse(matches[0].Groups[5].Value),
                (EKnockBackDirection)(int.Parse(matches[0].Groups[6].Value))
                );

#if UNITY_EDITOR
            bDraw  = true;
            pos    = bones[info.BoneName].position;
            radius = info.Radius;
#endif
            Collider[] cols = Physics.OverlapSphere(bones[info.BoneName].position, info.Radius);
            if (cols.Length != 0)
            {
                foreach (Collider c in cols)
                {
                    if (c.name != this.name && c.tag == "Player")
                    {
                        if (TargetPlayer)
                        {
                            bHit = true;
                            TargetPlayer.TakeDamage(info.Damage, bLastHit, info.KnockBackDis, info.KnockBackDur, info.Direction);
                        }
                    }
                }
            }
        }
    /// <summary>
    /// Update the enemy's target list
    /// </summary>
    private void UpdateTargetList()
    {
        // Check if any players are missing from list
        foreach (GameObject player in PlayerManager.Instance.Players)
        {
            if (_targets.Count(p => p.Player == player) == 0)
            {
                TargetPlayer target = new TargetPlayer {
                    Player = player, Stats = player.GetComponent <EntityStatsController>()
                };
                _targets.Add(target);
            }
        }

        foreach (TargetPlayer target in _targets)
        {
            if (CanSee(target))
            {
                // Set player to known state
                target.IsKnown = true;
            }
            else if (target.IsKnown)
            {
                // Reset player target's state if out of sight
                target.IsKnown = false;
                target.Aggro   = 0f;
            }
        }
    }
Example #6
0
 /// <summary>
 /// Checks whether an enemy can see a target or not
 /// </summary>
 /// <returns>True if the enemy can see the target</returns>
 private bool CanSee(TargetPlayer target)
 {
     if (Physics.Linecast(transform.position + Vector3.up, target.Player.transform.position + Vector3.up, out RaycastHit hit))
     {
         return((target.Player.transform.position - transform.position).sqrMagnitude <= aggroRadius * aggroRadius && hit.transform.gameObject == target.Player);
     }
     return(false);
 }
Example #7
0
    /// <summary>
    /// Update the aggro value of a certain target
    /// </summary>
    /// <param name="player">Player GameObject that is attacking the enemy</param>
    /// <param name="damageAmount">Amount to update the targets aggro value by</param>
    public void OnDamageTaken(GameObject player, float damageAmount)
    {
        // Update aggro value with amount of damage taken
        TargetPlayer target = _targets.Find(t => t.Player == player);

        target.Aggro  += damageAmount;
        target.IsKnown = true;
    }
Example #8
0
 private void Start()
 {
     // Initialize target array
     _targets = new List <TargetPlayer>();
     foreach (GameObject player in PlayerManager.Players)
     {
         TargetPlayer target = new TargetPlayer {
             Player = player, Stats = player.GetComponent <EntityStatsController>()
         };
         _targets.Add(target);
     }
 }
Example #9
0
        private void btnHeal_Click(object sender, EventArgs e)
        {
            if (!CanDoHeal())
            {
                return;
            }

            Arena.Self.AddActionPoints(-3);

            TargetPlayer.AddHealth(3);
            this.Refresh();
        }
Example #10
0
    void OnTriggerEnter2D(Collider2D col)
    {
        TargetPlayer player = col.GetComponent <TargetPlayer>();

        if (player != null)
        {
            player.TakeDamagePlayer(damage);
        }
        GameObject newObject = Instantiate(explosion, transform.position, Quaternion.identity) as GameObject;  // instatiate the object

        newObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        Destroy();
    }
Example #11
0
    public bool IsInVisionOfPlayer(Transform transform)
    {
        TargetPlayer = null;

        foreach (var p in Manager.Players)
        {
            if (Vector3.Distance(transform.position, p.transform.position) < PlayerVisionRadius)
            {
                TargetPlayer         = p;
                TargetPlayerCollider = TargetPlayer.GetComponent <Collider>();
                TargetPlayerCamera   = TargetPlayer.GetComponentInChildren <Camera>();
                return(true);
            }
        }
        return(false);
    }
Example #12
0
    /// <summary>
    /// Find the nearest player to the enemy
    /// </summary>
    /// <returns>A target player object instance</returns>
    private TargetPlayer GetClosestTarget()
    {
        TargetPlayer targetPlayer = null;
        float        minDist      = Mathf.Infinity;

        foreach (TargetPlayer target in _targets)
        {
            float distance = (target.Player.transform.position - transform.position).sqrMagnitude;
            if (target.IsKnown && distance < minDist && CanSee(target))
            {
                minDist      = distance;
                targetPlayer = target;
            }
        }

        return(targetPlayer);
    }
Example #13
0
    /// <summary>
    /// Update the target player by prioritizing any attacking players
    /// </summary>
    /// <returns>A target player object instance</returns>
    private TargetPlayer GetTopAggroTarget()
    {
        TargetPlayer targetPlayer = null;
        float        maxAggro     = 0f;

        foreach (TargetPlayer target in _targets)
        {
            // Ensure the target is known, and has an aggro value over zero
            if (target.IsKnown && target.Aggro > maxAggro && CanSee(target))
            {
                maxAggro     = target.Aggro;
                targetPlayer = target;
            }
        }

        return(targetPlayer);
    }
Example #14
0
    // Update is called once per frame
    void Update()
    {
        if (CurrentReloadTimer < ReloadTimer && !reloaded)
        {
            CurrentReloadTimer += Time.deltaTime;
        }
        else
        {
            Reload();
            CurrentReloadTimer = 0;
        }

        TargetPlayer.UpdatePosition();
        if (ownPositionTimer <= 0)
        {
            ownPositionTimer = ownPositionFrequency;
            StartCoroutine(BlinkPlayer());
        }
        else
        {
            ownPositionTimer -= Time.deltaTime;
        }

        MapCoordinates coordinates = MapCoordinates.ToMapCoordinates(GetPosition());

        LocalPlayer.data.latitude  = coordinates.Latitude;
        LocalPlayer.data.longitude = coordinates.Longitude;
        DebugText.text             = coordinates.ToString();

        if (Time.time > nextActionTime)
        {
            nextActionTime = Time.time + period;
            if (!waitingResponse && !string.IsNullOrEmpty(TargetPlayer.data.id))
            {
                StartCoroutine(GetOpponentPosition(coordinates));
            }
        }
        if (Input.GetMouseButtonDown(0))
        {
            Tapped();
        }
    }
    private TargetPlayer GetClosestInFrontAndInRange()
    {
        TargetPlayer targetPlayer = null;
        float        minDist      = Mathf.Infinity;

        foreach (TargetPlayer target in AliveTargets)
        {
            float distance = (target.Player.transform.position - transform.position).sqrMagnitude;
            float angle    = Vector3.SignedAngle(transform.forward, target.Player.transform.position - transform.position, Vector3.up);
            if (distance <= attackRadius * attackRadius &&
                Mathf.Abs(angle) < 60f &&
                distance < minDist)
            {
                minDist      = distance;
                targetPlayer = target;
            }
        }

        return(targetPlayer);
    }
Example #16
0
    /// <summary>
    /// Decide which player to target
    /// </summary>
    private void MakeTargetDecision()
    {
        // 1. Prioritize top aggro value
        TargetPlayer newTarget = GetTopAggroTarget();

        if (newTarget != null)
        {
            _currentTarget = newTarget;
            return;
        }

        // 2. Choose closest player
        newTarget = GetClosestTarget();
        if (newTarget != null)
        {
            _currentTarget = newTarget;
            return;
        }

        // 3. No target
        _currentTarget = null;
    }
Example #17
0
        public MissionLogEventKill(MissionLogEventHeader header)
            : base(header)
        {
            AttackerId = RawParameters.GetInt("AID");
            TargetId   = RawParameters.GetInt("TID");
            Position   = RawParameters.GetVector3D("POS");

            AttackerPlayer = Server.Players[AttackerId];
            AttackerObject = Server.GameObjects[AttackerId];

            TargetPlayer = Server.Players[TargetId];
            TargetObject = Server.GameObjects[TargetId];

            if (AttackerPlayer == null &&
                AttackerObject == null &&
                TargetPlayer != null && TargetPlayer.HitsSources.Count > 0)
            {
                AttackerPlayer = TargetPlayer.MostDamageByPlayer();
                if (AttackerPlayer == null)
                {
                    AttackerObject = TargetPlayer.MostDamageByObject();
                }
            }
        }
Example #18
0
    public P_HuaMulan() : base("花木兰")
    {
        Sex   = PSex.Female;
        Age   = PAge.Renaissance;
        Index = 23;
        Cost  = 20;
        Tips  = "定位:爆发\n" +
                "难度:简单\n" +
                "史实:出自经典诗歌《木兰辞》。中国古代替父从军的女英雄。\n" +
                "攻略:\n花木兰是一名拥有不俗爆发能力的武将。【枭姬】的存在使得花木兰极度依赖装备牌,因此能够与唐寅、时迁等武将配合,同时也能够对这些武将形成强大的威慑力。【枭姬】往往能够提供绝地反杀的能力,或能使花木兰东山再起,因此在针对花木兰时必须注意其队伍的研究所或给牌武将,同时慎用【落凤弓】、【借刀杀人】等牌,从一定程度上来说提供了花木兰一定的防御力。【易装】是一个强大的爆发技能,不仅能与队友交换装备达成爆发,还能抢夺敌方的大量装备,形成局势逆转,因此可在一定程度上克制关羽。【易装】还可用来转换性别,从而使敌方的【百花裙】等装备失效。针对花木兰必须阻止其装备成形,因此吕蒙是一个不错的选择。";

        PSkill XiaoJi = new PSkill("枭姬")
        {
            SoftLockOpen = true
        };

        SkillList.Add(XiaoJi
                      .AddTrigger((PPlayer Player, PSkill Skill) => {
            return(new PTrigger(XiaoJi.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = PTime.Card.LeaveAreaTime,
                AIPriority = 200,
                Condition = (PGame Game) => {
                    PMoveCardTag MoveCardTag = Game.TagManager.FindPeekTag <PMoveCardTag>(PMoveCardTag.TagName);
                    return Player.Area.EquipmentCardArea.Equals(MoveCardTag.Source) && !Player.Equals(MoveCardTag.Destination.Owner);
                },
                Effect = (PGame Game) => {
                    XiaoJi.AnnouceUseSkill(Player);
                    Game.GetCard(Player);
                    Game.GetMoney(Player, 1500);
                }
            });
        }));

        PPlayer YiZhuangTarget(PGame Game, PPlayer Player)
        {
            return(PMath.Max(Game.AlivePlayers(Player), (PPlayer TargetPlayer) => {
                int Profit = 0;
                PSex OriginalSex = Player.Sex;
                Player.Sex = PSex.Male;
                foreach (PCardType CardType in new PCardType[] {
                    PCardType.WeaponCard, PCardType.DefensorCard, PCardType.TrafficCard
                })
                {
                    PCard Card = Player.GetEquipment(CardType);
                    PCard TargetCard = TargetPlayer.GetEquipment(CardType);
                    if (Card != null)
                    {
                        Profit += 2000;
                        Profit -= Card.Model.AIInEquipExpectation(Game, Player);
                        Profit += Card.Model.AIInEquipExpectation(Game, TargetPlayer) * (Player.TeamIndex == TargetPlayer.TeamIndex ? 1 : -1);
                    }
                    if (TargetCard != null)
                    {
                        Profit += TargetCard.Model.AIInEquipExpectation(Game, Player);
                        Profit -= TargetCard.Model.AIInEquipExpectation(Game, TargetPlayer) * (Player.TeamIndex == TargetPlayer.TeamIndex ? 1 : -1);
                    }
                }
                Player.Sex = OriginalSex;
                return Profit - 7500;
            }, true).Key);
        }

        PSkill YiZhuang = new PSkill("易装")
        {
            Initiative = true
        };

        SkillList.Add(YiZhuang
                      .AnnounceGameOnce()
                      .AddTimeTrigger(
                          new PTime[] {
            PPeriod.FirstFreeTime.During,
            PPeriod.SecondFreeTime.During
        },
                          (PTime Time, PPlayer Player, PSkill Skill) => {
            return(new PTrigger(YiZhuang.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = Time,
                AIPriority = 280,
                CanRepeat = true,
                Condition = (PGame Game) => {
                    return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Player.RemainLimit(YiZhuang.Name);
                },
                AICondition = (PGame Game) => {
                    if (Game.Teammates(Player).Exists((PPlayer _Player) => _Player.General is P_WuZhao))
                    {
                        PPlayer _Player = Game.PlayerList.Find((PPlayer __Player) => __Player.General is P_WuZhao);
                        if (_Player.RemainLimit("女权"))
                        {
                            return false;
                        }
                        else if (Player.Tags.ExistTag(P_WuZhao.NvQuanTag.Name))
                        {
                            return false;
                        }
                    }
                    return YiZhuangTarget(Game, Player) != null;
                },
                Effect = (PGame Game) => {
                    YiZhuang.AnnouceUseSkill(Player);
                    PPlayer Target = null;
                    if (Player.IsAI)
                    {
                        Target = YiZhuangTarget(Game, Player);
                    }
                    else
                    {
                        Target = PNetworkManager.NetworkServer.ChooseManager.AskForTargetPlayer(Player, PTrigger.Except(Player), YiZhuang.Name);
                    }
                    if (Target != null)
                    {
                        List <PCard> MulanEquipments = new List <PCard>();
                        foreach (PCard Card in Player.Area.EquipmentCardArea.CardList)
                        {
                            MulanEquipments.Add(Card);
                        }
                        List <PCard> TargetEquipements = new List <PCard>();
                        foreach (PCard Card in Target.Area.EquipmentCardArea.CardList)
                        {
                            TargetEquipements.Add(Card);
                        }
                        foreach (PCard Card in MulanEquipments)
                        {
                            Game.CardManager.MoveCard(Card, Player.Area.EquipmentCardArea, Game.CardManager.SettlingArea);
                        }
                        foreach (PCard Card in TargetEquipements)
                        {
                            Game.CardManager.MoveCard(Card, Target.Area.EquipmentCardArea, Game.CardManager.SettlingArea);
                        }
                        foreach (PCard Card in MulanEquipments)
                        {
                            Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Target.Area.EquipmentCardArea);
                        }
                        foreach (PCard Card in TargetEquipements)
                        {
                            Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Player.Area.EquipmentCardArea);
                        }
                        Player.Sex = PSex.Male;
                        Player.Tags.CreateTag(new PTag(YiZhuang.Name));
                        YiZhuang.DeclareUse(Player);
                    }
                }
            });
        }));
    }
Example #19
0
        public void ProcessEffect(ActiveGame game)
        {
            switch (EffectType)
            {
            case EffectTypes.CombineHandAndGraveyardToLibrary:
                if (TargetPlayer != null)
                {
                    TargetPlayer.CombineToLibrary(true, true);
                }
                break;

            case EffectTypes.CombineGraveyardToLibrary:
                if (TargetPlayer != null)
                {
                    TargetPlayer.CombineToLibrary(false, true);
                }
                break;

            case EffectTypes.CombineHandToLibrary:
                if (TargetPlayer != null)
                {
                    TargetPlayer.CombineToLibrary(true, false);
                }
                break;

            case EffectTypes.Damage:
                if (TargetPlayer != null)
                {
                    TargetPlayer.AddDamage(game, Value, OriginCard);
                }
                else if (TargetCard != null)
                {
                    TargetCard.AddDamage(game, Value, OriginCard);
                }
                break;

            case EffectTypes.Destroy:
                if (TargetCard != null)
                {
                    Player player = game.Players.First(o => o.Id == TargetCard.ControllerId);
                    player.Battlefield.Remove(TargetCard, TargetZone.Graveyard);
                }
                break;

            case EffectTypes.DiscardCard:
                if (TargetPlayer != null && TargetCard != null)
                {
                    TargetPlayer.Hand.Remove(TargetCard, TargetZone.Graveyard);
                }
                break;

            case EffectTypes.DrawCard:
                if (TargetPlayer != null)
                {
                    TargetPlayer.Library.Draw(Value);
                }
                break;

            case EffectTypes.PlaceCardInLibrary_Bottom:
                if (TargetPlayer != null && TargetCard != null)
                {
                    TargetPlayer.Library.Insert(TargetCard, InsertLocation.Bottom);
                }
                break;

            case EffectTypes.PlaceCardInLibrary_Top:
                if (TargetPlayer != null && TargetCard != null)
                {
                    TargetPlayer.Library.Insert(TargetCard, InsertLocation.Top);
                }
                break;

            case EffectTypes.ShuffleLibrary:
                if (TargetPlayer != null)
                {
                    TargetPlayer.Library.Shuffle();
                }
                break;

            case EffectTypes.TopCardOfLibraryFaceUp:
                if (TargetPlayer != null)
                {
                    TargetPlayer.Library.ShowTopCard = Boolean;
                }
                break;

            case EffectTypes.RemoveFromGame:

                if (TargetCard != null)
                {
                    Player player = game.Players.First(o => o.Id == TargetCard.ControllerId);
                    player.Battlefield.Remove(TargetCard, TargetZone.None);
                    player.Graveyard.Remove(TargetCard, TargetZone.None);
                    player.Hand.Remove(TargetCard, TargetZone.None);
                }
                break;

            case EffectTypes.Exile:
                if (TargetCard != null)
                {
                    Player player = game.Players.First(o => o.Id == TargetCard.ControllerId);
                    player.Battlefield.Remove(TargetCard, TargetZone.None);
                    game.Stack.Remove(TargetCard, TargetZone.None);
                }
                break;
            }
            throw new NotImplementedException("Effect.ProcessEffect");
        }
 public static KeyValuePair <PPlayer, int> AIExpect(PGame Game, PPlayer Player, int BaseValue = 4000)
 {
     return(PMath.Max(Game.PlayerList.FindAll((PPlayer TargetPlayer) => TargetPlayer.IsAlive && !TargetPlayer.Equals(Player) /* && !(TargetPlayer.General is P_ShiQian)*/), (PPlayer TargetPlayer) => {
         return PAiCardExpectation.FindMostValuableToGet(Game, Player, TargetPlayer, true, true, true).Value - BaseValue;
     }, true));
 }
    /// <summary>
    /// Decide which player to target
    /// </summary>
    private void MakeTargetDecision()
    {
        TargetPlayer newTarget;

        // If no players are alive, no target possible
        if (AliveTargets.Count == 0)
        {
            _currentTarget = null;
            return;
        }

        switch (targetStrategy)
        {
        case TargetStrategy.AggroTable:
            // 1. Prioritize top aggro value
            newTarget = GetTopAggroTarget();
            if (newTarget != null)
            {
                _currentTarget = newTarget;
                return;
            }

            // 2. Choose closest player
            newTarget = GetClosestViewableTarget();
            if (newTarget != null)
            {
                _currentTarget = newTarget;
                return;
            }

            // 3. If we should always have a target, select a player randomly (if there are any)
            if (alwaysHaveTarget)
            {
                _currentTarget = AliveTargets[Random.Range(0, AliveTargets.Count)];
                return;
            }

            // 4. No target
            _currentTarget = null;
            break;

        case TargetStrategy.ClosestEasiest:
            // 1. Player within view and attack range
            newTarget = GetClosestInFrontAndInRange();
            if (newTarget != null)
            {
                _currentTarget = newTarget;
                return;
            }

            // 2. Choose closest player
            newTarget = GetClosestTarget();
            if (newTarget != null)
            {
                _currentTarget = newTarget;
                return;
            }

            // 3. No target
            _currentTarget = null;
            break;

        case TargetStrategy.Random:
            // Select living target randomly
            _currentTarget = AliveTargets.Count > 0 ? AliveTargets[Random.Range(0, AliveTargets.Count)] : null;
            break;
        }
    }