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(); } }
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(); } }
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; } } } }
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); }
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); } }
public override void Use(Character character) { var damage = new Damage(AbilityDamage, DamageType.Physical); ParentCharacter.Attack(character, damage); OnUseFinish(); }
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(); } }
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}";
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(); } */ }
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(); } }
private void Use(Character character) { var damage = new Damage(Damage, DamageType.Physical); ParentCharacter.Attack(this, character, damage); Finish(); }
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; }; }; }
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(); } }
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(); } }
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; }
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(); }
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}";
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); }
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; }; }; }
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(); }
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); } }
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(); }
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}";
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(); } }
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(); } }
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(); } }
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(); }
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); }