예제 #1
0
파일: AsterYo.cs 프로젝트: odmiex/NKM
        public override void Use(List <HexCell> cells)
        {
            List <Character> characters = cells.GetCharacters();

            try
            {
                ItadakiNoKura passiveAbility = ParentCharacter.Abilities.OfType <ItadakiNoKura>().SingleOrDefault();
                if (passiveAbility == null)
                {
                    throw new Exception("Pasywna umiejętność nie znaleziona!");
                }

                characters = characters.Where(c => c.Owner != ParentCharacter.Owner).ToList();
//				AnimationPlayer.Instance.AsterYo(ParentCharacter.CharacterObject.transform, characters.Select(c => c.CharacterObject.transform).ToList());
                AnimationPlayer.Add(new Animations.AsterYo(ParentCharacter.CharacterObject.transform, characters.Select(c => c.CharacterObject.transform).ToList()));
                characters.ForEach(targetCharacter =>
                {
                    var damage = new Damage(AbilityDamage, DamageType.Magical);
                    ParentCharacter.Attack(targetCharacter, damage);
                    passiveAbility.TryCollectingEnergy(targetCharacter);
                });
                OnUseFinish();
            }
            catch (Exception e)
            {
                MessageLogger.DebugLog(e.Message);
                OnFailedUseFinish();
            }
        }
예제 #2
0
        public void Use(List <HexCell> cells)
        {
            HexCell cell = cells[0];

            if (cell.Type == HexTileType.Wall)
            {
//                _moveCells = GetMoveTargets(cell);
//                Active.Prepare(this, _moveCells);
                _theWall = cell;
                Active.Prepare(this, GetMoveTargets(cell));
                AnimationPlayer.Add(new MoveTo(ParentCharacter.CharacterObject.transform, cell.transform.position, 0.13f));
            }
            else
            {
//                int removeAfterIndex = _moveCells.FindIndex(c => c == cell);
//                List<HexCell> realMoveCells = _moveCells.GetRange(0, removeAfterIndex);
                ParentCharacter.MoveTo(cell);
                List <HexCell> realMoveCells = _theWall.GetLine(_theWall.GetDirection(cell), _theWall.GetDistance(cell));

                List <Character> targets = realMoveCells.SelectMany(c => ParentCharacter.DefaultGetBasicAttackCells(c))
                                           .ToList().WhereOnlyEnemiesOf(Owner).GetCharacters().Distinct().ToList();
                targets.ForEach(t => ParentCharacter.Attack(this, t, new Damage(ParentCharacter.AttackPoints.Value, DamageType.Physical)));
                Finish();
            }
        }
예제 #3
0
    public void PerFrameUpdate()
    {
        if (ParentCharacter.MyAI.BlackBoard.TargetEnemy != null)
        {
            //check if is in range
            _dist = Vector3.Distance(ParentCharacter.transform.position, ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position);

            if (_dist > 1.5f && _biteState != BiteState.Bite)
            {
                //go to target enemy
                ParentCharacter.MyAI.BlackBoard.NavTarget = ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position - ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.forward * 0.5f;
                ParentCharacter.Destination   = ParentCharacter.MyAI.BlackBoard.NavTarget;
                ParentCharacter.CurrentStance = HumanStances.Run;
                ParentCharacter.SendCommand(CharacterCommands.GoToPosition);
            }
            else if (_dist > 1.5f && _biteState == BiteState.Bite)
            {
                ParentCharacter.GetComponent <MutantCharacter>().OnCancelStrangle();
                StopAction();
                ParentCharacter.MyEventHandler.TriggerOnActionCompletion();
            }
            else
            {
                if (_biteState != BiteState.Bite)
                {
                    //Debug.Log("Ready to bite");
                    ParentCharacter.SendCommand(CharacterCommands.Bite);
                    _biteState = BiteState.Bite;
                }
            }
        }
    }
예제 #4
0
 public override void StopAction()
 {
     Debug.Log("Stopping executing Hide in Cover");
     ParentCharacter.MyEventHandler.OnActionUpdateTimer -= UpdateAction;
     ParentCharacter.SendCommand(CharacterCommands.StopCrouch);
     ParentCharacter.MyAI.TargetingSystem.SetTargetingMode(AITargetingModes.LookAhead, Vector3.zero);
 }
예제 #5
0
        private void MoveOverride(List <HexCell> moveCells)
        {
//			bool isLost = UnityEngine.Random.Range(0, 2) == 0;
            bool isLost = NKMRandom.Get(Name, 0, 2) == 0;

            if (!isLost)
            {
                ParentCharacter.DefaultBasicMove(moveCells);
            }
            else
            {
                Active.RemoveMoveCells();
                int movementPoints = ParentCharacter.Speed.Value;
                Active.MoveCells.Add(ParentCharacter.ParentCell);
                HexCell        lastCell    = ParentCharacter.ParentCell;
                List <HexCell> moveTargets = ParentCharacter.GetBasicMoveCells();
                while (movementPoints-- > 0 || !lastCell.IsFreeToStand)
                {
//					List<HexCell> neighborMoveCells = lastCell.GetNeighbors(1,
//						SearchFlags.StopAtEnemyCharacters | SearchFlags.StopAtFriendlyCharacters | SearchFlags.StopAtWalls);
                    List <HexCell> neighborMoveCells = lastCell.GetNeighbors(1).Intersect(moveTargets).ToList();
//					int r = UnityEngine.Random.Range(0, neighborMoveCells.Count);
//					lastCell = neighborMoveCells[r];
                    lastCell = neighborMoveCells.GetRandom();
                    Active.AddMoveCell(lastCell);
                }
                ParentCharacter.DefaultBasicMove(Active.MoveCells);
                Console.Log($"{ParentCharacter.FormattedFirstName()}: Cholera, znowu się zgubili?");
//				int rand = UnityEngine.Random.Range(1, 4);
                int soundID = NKMRandom.Get($"{Name} - ID", 1, 4);
                Active.PlayAudio("op wtf " + soundID);
            }
        }
예제 #6
0
파일: PreciseShot.cs 프로젝트: odmiex/NKM
        public override void Use(Character character)
        {
            var damage = new Damage(AbilityDamage, DamageType.Physical);

            ParentCharacter.Attack(character, damage);
            OnUseFinish();
        }
예제 #7
0
        public override void Use(List <HexCell> cells)
        {
            try
            {
                ItadakiNoKura passiveAbility = ParentCharacter.Abilities.OfType <ItadakiNoKura>().SingleOrDefault();
                if (passiveAbility == null)
                {
                    throw new Exception("Pasywna umiejętność nie znaleziona!");
                }

                List <Character> enemyCharactersOnMap = Game.Players.Where(p => p != Active.GamePlayer).SelectMany(p => p.Characters).Where(c => c.IsOnMap).ToList();
                var damageValue = passiveAbility.CollectedEnergy / enemyCharactersOnMap.Count;
                //Animations.Instance.SonzaiNoChikara(enemyCharactersOnMap.Select(c=>c.CharacterObject.transform).ToList());
                var damage = new Damage(damageValue, DamageType.Magical);
                enemyCharactersOnMap.ForEach(c => ParentCharacter.Attack(c, damage));

                passiveAbility.CollectedEnergyCharacters.Clear();
                OnUseFinish();
            }
            catch (Exception e)
            {
                MessageLogger.DebugLog(e.Message);
                OnFailedUseFinish();
            }
        }
예제 #8
0
파일: UrbRefuge.cs 프로젝트: tojatos/NKM
        public override string GetDescription() =>
        $@"{ParentCharacter.FirstName()} zabiera ze sobą wskazanego sojusznika i przeskakuje we wskazany obszar o promieniu {Radius}.
Wszyscy wrogowie, jak i zabrany sojusznik otrzymują {Damage} obrażeń fizycznych.

Zasięg zabrania sojusznika: {CharacterGrabRange}
Zasięg skoku: {Range}
Czas odnowienia; {Cooldown}";
예제 #9
0
	public void UpdateAction()
	{
		if(!CheckAvailability() || _executionStopped)
		{
			return;
		}

		ParentCharacter.MyAI.Bark("Fire in the hole!");

		if(ParentCharacter.MyAI.BlackBoard.InvisibleEnemy != null)
		{
			ParentCharacter.AimPoint = ParentCharacter.MyAI.BlackBoard.LastKnownEnemyPosition;
			ParentCharacter.SendCommand(CharacterCommands.ThrowGrenade);
		}



		StopAction();
		ParentCharacter.MyEventHandler.TriggerOnActionCompletion();

		/*
		if(CheckActionCompletion())
		{
			StopAction();

		}
		*/
	}
예제 #10
0
        public override void Use(List <HexCell> cells)
        {
            List <Character> characters = cells.GetCharacters();
            var killedSomething         = false;

            characters.ForEach(targetCharacter =>
            {
                if (targetCharacter.Owner == Active.GamePlayer)
                {
                    return;
                }

                var damage = new Damage(AbilityDamage, DamageType.Physical);

                ParentCharacter.Attack(targetCharacter, damage);
                _wasUsedOnceThisTurn = true;
                if (!targetCharacter.IsAlive)
                {
                    killedSomething = true;
                }
            });
            if (killedSomething)
            {
                Use();
            }
            else
            {
                OnUseFinish();
            }
        }
예제 #11
0
파일: PreciseShot.cs 프로젝트: tojatos/NKM
        private void Use(Character character)
        {
            var damage = new Damage(Damage, DamageType.Physical);

            ParentCharacter.Attack(this, character, damage);
            Finish();
        }
예제 #12
0
 public KamuiSenketsu() : base(AbilityType.Ultimatum, "Kamui Senketsu", 5)
 {
     OnAwake += () =>
     {
         Validator.ToCheck.Remove(Validator.IsNotOnCooldown);
         Validator.ToCheck.Remove(Validator.IsCharacterNotSilenced);
         Validator.ToCheck.Add(() => Validator.IsNotOnCooldown() || IsEnabled);
         Validator.ToCheck.Add(() => Validator.IsCharacterNotSilenced() || IsEnabled);
         Active.Turn.TurnFinished += (character) =>
         {
             if (character != ParentCharacter)
             {
                 return;
             }
             if (!IsEnabled)
             {
                 return;
             }
             ParentCharacter.Attack(this, ParentCharacter, new Damage(Damage, DamageType.True));
             var effect = ParentCharacter.Effects.SingleOrDefault(e => e.Name == Name && e.GetType() == typeof(StatModifier)) as StatModifier;
             if (effect == null)
             {
                 return;
             }
             effect.Modifier.Value += 2;
         };
     };
 }
예제 #13
0
    public void PerFrameUpdate()
    {
        if (ParentCharacter.MyAI.BlackBoard.TargetEnemy != null)
        {
            //check if is in range
            float   dist           = Vector3.Distance(ParentCharacter.transform.position, ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position);
            Vector3 targetVelocity = ParentCharacter.MyAI.BlackBoard.TargetEnemy.GetCharacterVelocity();

            if (targetVelocity.magnitude >= 0.25f)
            {
                if (dist > _weaponReach * 0.75f)
                {
                    //go to target enemy

                    ParentCharacter.MyAI.BlackBoard.NavTarget = ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position + targetVelocity * 0.1f;
                    ParentCharacter.Destination   = ParentCharacter.MyAI.BlackBoard.NavTarget;
                    ParentCharacter.CurrentStance = HumanStances.Run;
                    ParentCharacter.SendCommand(CharacterCommands.GoToPosition);
                }
                else
                {
                    if (_attackTimer >= _attackWaitTimeout)
                    {
                        ParentCharacter.SendCommand(CharacterCommands.RunningAttack);
                        _attackTimer       = -1;
                        _attackWaitTimeout = UnityEngine.Random.Range(0.5f, 1.5f);
                    }
                }
            }
            else
            {
                if (dist <= _weaponReach)
                {
                    ParentCharacter.SendCommand(CharacterCommands.Idle);
                    if (_attackTimer >= _attackWaitTimeout)
                    {
                        float attackType = UnityEngine.Random.value;
                        if (attackType < 0.5f)
                        {
                            ParentCharacter.SendCommand(CharacterCommands.LeftAttack);
                        }
                        else
                        {
                            ParentCharacter.SendCommand(CharacterCommands.RightAttack);
                        }

                        _attackTimer       = -1;
                        _attackWaitTimeout = UnityEngine.Random.Range(0.5f, 1.5f);
                    }
                }
                else
                {
                    ParentCharacter.MyAI.BlackBoard.NavTarget = ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position;
                    ParentCharacter.Destination   = ParentCharacter.MyAI.BlackBoard.NavTarget;
                    ParentCharacter.CurrentStance = HumanStances.Run;
                    ParentCharacter.SendCommand(CharacterCommands.GoToPosition);
                }
            }
        }
    }
    public void UpdateAction()
    {
        //continue to check if body is locked, i.e. wait till it's not locked
        if (!CheckAvailability())
        {
            return;
        }

        if (ParentCharacter.MyAI.BlackBoard.TargetEnemy != null &&
            Vector3.Distance(ParentCharacter.transform.position, ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position) > 8 &&
            ParentCharacter.MyAI.BlackBoard.TargetEnemyThreat >= 0.33f &&
            !ParentCharacter.MyJobs.Contains(NPCJobs.Guard) &&
            Vector3.Distance(ParentCharacter.MyAI.BlackBoard.DefensePoint, ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position) < ParentCharacter.MyAI.BlackBoard.DefenseRadius * 2f)
        {
            ParentCharacter.Destination = ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position;
            ParentCharacter.SendCommand(CharacterCommands.StopAim);
            ParentCharacter.SendCommand(CharacterCommands.GoToPosition);
        }
        else
        {
            ParentCharacter.SendCommand(CharacterCommands.Idle);
            ParentCharacter.SendCommand(CharacterCommands.Aim);
        }



        if (CheckActionCompletion())
        {
            StopAction();

            ParentCharacter.MyEventHandler.TriggerOnActionCompletion();
        }
    }
예제 #15
0
    public void UpdateAction()
    {
        if (!CheckAvailability() || _executionStopped)
        {
            return;
        }



        if (ParentCharacter.MyAI.BlackBoard.TargetEnemy != null)
        {
            float dist = Vector3.Distance(ParentCharacter.transform.position, ParentCharacter.MyAI.BlackBoard.TargetEnemy.transform.position);

            if (dist >= 5)
            {
                ParentCharacter.SendCommand(CharacterCommands.GoToPosition);
                ParentCharacter.CurrentStance = HumanStances.Run;
            }
        }


        if (_attackTimer >= 0 && _attackTimer < _attackWaitTimeout)
        {
            _attackTimer += 1;
        }

        if (CheckActionCompletion())
        {
            StopAction();

            ParentCharacter.MyEventHandler.TriggerOnActionCompletion();
        }
    }
예제 #16
0
 public override void StopAction()
 {
     Debug.Log("Stop executing Take attack cover " + ParentCharacter.name);
     ParentCharacter.SendCommand(CharacterCommands.Idle);
     ParentCharacter.MyEventHandler.OnActionUpdateTimer -= UpdateAction;
     ParentCharacter.MyAI.BlackBoard.IsNavTargetSet      = false;
 }
예제 #17
0
    public override void Update()
    {
        float targetVSpeed = 0;
        float velocity     = ParentCharacter.GetCharacterVelocity().magnitude;

        if (this.ParentCharacter.CurrentStance == HumanStances.Run)
        {
            targetVSpeed = 1.5f * ParentCharacter.MyStatus.RunSpeedModifier;
            ParentCharacter.Stealth.SetNoiseLevel(10, 0.6f);
        }
        else if (this.ParentCharacter.CurrentStance == HumanStances.Walk)
        {
            targetVSpeed = 0.5f * ParentCharacter.MyStatus.WalkSpeedModifier;


            ParentCharacter.Stealth.SetNoiseLevel(8, 0.6f);
        }


        _vSpeed = Mathf.Lerp(_vSpeed, targetVSpeed, 6 * Time.deltaTime);
        //Debug.Log("VSpeed " + _vSpeed + " target speed " + targetVSpeed);
        this.ParentCharacter.MyAnimator.SetFloat("VSpeed", _vSpeed);

        HandleNavAgentMovement();
    }
예제 #18
0
파일: Fuiuchi.cs 프로젝트: tojatos/NKM
        public override string GetDescription() =>
        $@"{ParentCharacter.FirstName()} przywołuje słup płomieni, zadając {Damage} obrażeń magicznych
i spowalniając trafionych wrogów do {SlowTo}.

Zasięg: {Range}
Czas trwania spowolnienia: {SlowDuration}
Czas odnowienia: {Cooldown}";
예제 #19
0
    public override bool ExecuteAction()
    {
        CsDebug.Inst.CharLog(ParentCharacter, "Start executing Ranged Attack action " + ParentCharacter.name);

        if (ParentCharacter.MyAI.BlackBoard.TargetEnemy == null)
        {
            CsDebug.Inst.CharLog(ParentCharacter, "There is NO target enemy");
            return(false);
        }

        _executionStopped   = false;
        _readyForCompletion = false;
        _exitDelayTimer     = 0;

        ParentCharacter.SendCommand(CharacterCommands.Aim);
        ((HumanCharacter)ParentCharacter).CurrentStance = HumanStances.Walk;
        _maneuverState = ManeuverState.MoveTowards;



        ParentCharacter.MyEventHandler.OnActionUpdateTimer -= UpdateAction;
        ParentCharacter.MyEventHandler.OnActionUpdateTimer += UpdateAction;

        UpdateAction();

        return(true);
    }
예제 #20
0
파일: ElohimGibor.cs 프로젝트: tojatos/NKM
 public ElohimGibor() : base(AbilityType.Passive, "Elohim Gibor")
 {
     OnAwake += () =>
     {
         Active.Phase.PhaseFinished += () =>
         {
             if (_wasDamagedThisTurn)
             {
                 _wasDamagedThisTurn = false;
                 return;
             }
             ++_turnsWithoutBeingHurt;
             if (_turnsWithoutBeingHurt < 2)
             {
                 return;
             }
             ParentCharacter.Heal(ParentCharacter, _amountToHeal);
             _turnsWithoutBeingHurt = 0;
             _amountToHeal          = 0;
         };
         ParentCharacter.AfterBeingDamaged += damage =>
         {
             _amountToHeal         += (int)(damage.Value * Percent / 100f);
             _turnsWithoutBeingHurt = 0;
         };
     };
 }
예제 #21
0
        private void TryToActivateDemonicForm()
        {
            if (!IsEnabled)
            {
                return;
            }

            Active.CharacterOnMap.Deselect();
            if (ParentCharacter.Name != "Demonic Rem")
            {
                ParentCharacter.Name = "Demonic Rem";
            }
            if (ParentCharacter.Effects.All(e => e.Name != "Demonic Form Speed Boost"))
            {
                var speedBoost = new StatModifier(-1, AdditionalSpeed, ParentCharacter, StatType.Speed, "Demonic Form Speed Boost");
                speedBoost.OnRemove += TryToActivateDemonicForm;
                ParentCharacter.Effects.Add(speedBoost);
            }
            if (ParentCharacter.Effects.All(e => e.Name != "Demonic Form Attack Boost"))
            {
                var attackBoost = new StatModifier(-1, AdditionalAttack, ParentCharacter, StatType.AttackPoints, "Demonic Form Attack Boost");
                attackBoost.OnRemove += TryToActivateDemonicForm;
                ParentCharacter.Effects.Add(attackBoost);
            }
            ParentCharacter.Select();
        }
예제 #22
0
        private void Hien(Character character)
        {
            List <HexCell> cells     = new List <HexCell>();
            HexDirection   direction = ParentCharacter.ParentCell.GetDirection(character.ParentCell);
            HexCell        lastCell  = ParentCharacter.ParentCell;
            HexCell        neighbor;

            do
            {
                neighbor = lastCell.GetCell(direction, 1);
                if (neighbor == null)
                {
                    break;
                }
                cells.Add(neighbor);
                lastCell = neighbor;
            } while (neighbor != character.ParentCell);
            foreach (HexCell c in cells)
            {
                if (c.CharacterOnCell == null || c.CharacterOnCell.Owner == ParentCharacter.Owner)
                {
                    continue;
                }
                var damage = new Damage(FlameDamage, DamageType.Magical);
                ParentCharacter.Attack(c.CharacterOnCell, damage);
            }
        }
예제 #23
0
    public void UpdateAction()
    {
        if (!CheckAvailability())
        {
            return;
        }

        if (ParentCharacter.MyReference.CurrentWeapon == null)
        {
            ParentCharacter.SendCommand(ParentCharacter.MyAI.WeaponSystem.GetBestWeaponChoice());
        }

        if (_isCoverFound)
        {
            ParentCharacter.SendCommand(CharacterCommands.StopAim);
            ParentCharacter.SendCommand(CharacterCommands.StopCrouch);
            ParentCharacter.GetComponent <HumanCharacter>().CurrentStance = HumanStances.Sprint;


            ParentCharacter.MyAI.BlackBoard.NavTarget = ParentCharacter.MyAI.BlackBoard.SelectedCoverLoc;
            //GameObject.Find("Marker1").transform.position = ParentCharacter.MyAI.BlackBoard.SelectedCoverLoc;
            //GameObject.Find("Sphere").transform.position = ParentCharacter.MyAI.BlackBoard.SelectedCover.transform.position;
            ParentCharacter.Destination = ParentCharacter.MyAI.BlackBoard.NavTarget;
            ParentCharacter.SendCommand(CharacterCommands.GoToPosition);

            ParentCharacter.MyAI.TargetingSystem.SetTargetingMode(AITargetingModes.LookAround, ParentCharacter.MyAI.BlackBoard.AvgPersonalThreatDir);
        }


        if (CheckActionCompletion())
        {
            StopAction();
            ParentCharacter.MyEventHandler.TriggerOnActionCompletion();
        }
    }
    public override void Update()
    {
        float targetVSpeed = 0;
        float velocity     = ParentCharacter.GetCharacterVelocity().magnitude;

        if (velocity > 0 && velocity <= 1.5f)       //(this.ParentCharacter.CurrentStance == HumanStances.Crouch)
        {
            targetVSpeed = 0.9f;
        }
        else if (velocity > 1.5f)       //(this.ParentCharacter.CurrentStance == HumanStances.CrouchRun)
        {
            targetVSpeed = 1.3f;
        }

        _vSpeed = Mathf.Lerp(_vSpeed, targetVSpeed, 6 * Time.deltaTime);
        //Debug.Log("VSpeed " + _vSpeed);
        this.ParentCharacter.MyAnimator.SetFloat("VSpeed", _vSpeed);


        if (ParentCharacter.MyNavAgent != null)
        {
            HandleNavAgentMovement();
        }


        HandleTurnMovement();
    }
예제 #25
0
        public override string GetDescription() =>
        $@"{ParentCharacter.FirstName()} tworzy falę płomieni i mieczy, na której przemieszcza się w wybrany punkt.
Fala zadaje {Damage} obrażeń magicznych i ucisza na {SilentDuration} tury wszystkich wrogów którzy zostali nią trafieni.

Zasięg: {Range}
Szerokość: {Width}
Czas odnowienia: {Cooldown}";
예제 #26
0
        public void Use(List <HexCell> cells)
        {
            List <Character> characters    = cells.GetCharacters();
            bool             killedSomeone = false;

            characters.ForEach(targetCharacter =>
            {
                if (targetCharacter.Owner == Active.GamePlayer)
                {
                    return;
                }

                var damage = new Damage(Damage, DamageType.Physical);

                ParentCharacter.Attack(this, targetCharacter, damage);
                _wasUsedOnceThisTurn = true;
                if (!targetCharacter.IsAlive)
                {
                    killedSomeone = true;
                }
            });
            if (killedSomeone)
            {
                PrepareImpulse();
            }
            else
            {
                Finish();
            }
        }
예제 #27
0
파일: UrbRefuge.cs 프로젝트: tojatos/NKM
        public void Use(List <HexCell> cells)
        {
            HexCell targetCell = cells[0];

            if (targetCell.CharacterOnCell != null)
            {
                _characterToTake = targetCell.CharacterOnCell;
                Active.Prepare(this, GetTargetCells());
            }
            else if (_targetCell == null)
            {
                _targetCell = targetCell;
                Active.Prepare(this, _targetCell.GetNeighbors(Radius).FindAll(c => c.IsFreeToStand));
            }
            else
            {
                ParentCharacter.MoveTo(_targetCell);
                _characterToTake.MoveTo(targetCell);

                ParentCharacter.Attack(this, _characterToTake, new Damage(Damage, DamageType.Physical));
                _targetCell.GetNeighbors(Radius).WhereOnlyEnemiesOf(Owner).GetCharacters()
                .ForEach(c => ParentCharacter.Attack(this, c, new Damage(Damage, DamageType.Physical)));

                _targetCell = null;
                Finish();
            }
        }
예제 #28
0
    public void UpdateAction()
    {
        if (!CheckAvailability() || _executionStopped)
        {
            return;
        }

        if (ParentCharacter.MyAI.BlackBoard.TargetCorpse != null)
        {
            Vector3 distance = ParentCharacter.MyAI.BlackBoard.TargetCorpse.LastKnownPos - ParentCharacter.transform.position;
            if (distance.magnitude > 2)
            {
                ParentCharacter.CurrentStance = HumanStances.Run;
                ParentCharacter.MyAI.TargetingSystem.SetTargetingMode(AITargetingModes.LookAhead, Vector3.zero);
                Vector3 dest = ParentCharacter.MyAI.BlackBoard.TargetCorpse.LastKnownPos - distance.normalized * 0.5f;
                ParentCharacter.Destination = dest;
                ParentCharacter.SendCommand(CharacterCommands.GoToPosition);
            }
            else
            {
                if (ParentCharacter.MyAI.IsCharacterFriendly((Character)ParentCharacter.MyAI.BlackBoard.TargetCorpse.Target))
                {
                    //if corpse and I are friendly, then I'll check corpse and then raise alert
                    if (ParentCharacter.GetCharacterVelocity().magnitude <= 0.1f)
                    {
                        ParentCharacter.MyAnimator.SetBool("IsChecking", true);
                    }

                    _checkTimer++;

                    if (_checkTimer > 3)
                    {
                        //notify everyone on the team to draw weapon and do random patrol
                        ParentCharacter.MyAI.Bark("Somebody killed him! Search perimeter!");
                        ParentCharacter.MyAI.BlackBoard.GuardLevel = 3;
                        ParentCharacter.SendDelayCallBack(2, ParentCharacter.MyAI.Squad.SetSquadAlertLevel, 3);
                        ParentCharacter.MyAI.Squad.BroadcastMemoryFact(ParentCharacter.MyAI.BlackBoard.TargetCorpse);
                        StopAction();

                        ParentCharacter.MyEventHandler.TriggerOnActionCompletion();
                        return;
                    }
                }
                else
                {
                    //not in same faction, will consider it as a container to loot
                }
            }
        }



        if (CheckActionCompletion())
        {
            StopAction();

            ParentCharacter.MyEventHandler.TriggerOnActionCompletion();
        }
    }
예제 #29
0
파일: DragonTail.cs 프로젝트: tojatos/NKM
 public void Click()
 {
     Active.MakeAction();
     GetTargetsInRange().GetCharacters().ForEach(c => ParentCharacter.Heal(c, (int)(c.HealthPoints.BaseValue * HealPercent / 100f)));
     ParentCharacter.Effects.Add(new StatModifier(BonusDuration, BasicAttackRangeBonus, ParentCharacter, StatType.BasicAttackRange, Name));
     ParentCharacter.Attack(this, ParentCharacter, new Damage(ParentCharacter.HealthPoints.BaseValue / 2, DamageType.True));
     Finish();
 }
예제 #30
0
        private void ShinpanAndDanzai(Character character)
        {
            int charactersNearParent = ParentCharacter.ParentCell.GetNeighbors(ShinpanAndDanzaiRange).Count(c => c.CharacterOnCell != null);
            var damageValue          = ShinpanAndDanzaiDamage * charactersNearParent;
            var damage = new Damage(damageValue, DamageType.True);

            ParentCharacter.Attack(this, character, damage);
        }