public void UpgradeByExp(System.Action then) { if (_baseCharacter == null || _baseCharacter is Object && _baseCharacter.Equals(null)) { return; } _currency.PurchaseByExperencePoint(upgradedCost.ExperencePoint, () => { _baseCharacter.attackPower *= (1 + upgradedAttackRate); _baseCharacter.hp *= (1 + upgradedHpRate); ++_baseCharacter.level; _baseCharacter.AssignUpgradedDisplay(); attackPower = _baseCharacter.attackPower; hp = _baseCharacter.hp; level = _baseCharacter.level; display = _baseCharacter.displayPrefab; var upgradedGoldRate = GetUpgradedCostRate(); _baseCharacter.upgradedCost.Gold *= (1 + upgradedGoldRate); upgradedCost = _baseCharacter.upgradedCost; if (then != null) { then(); } }); }
public override void Event_MoveFxToOpponent(AnimationEvent animEvent) { if (currentSkill == null || currentSkill is Object && currentSkill.Equals(null)) { return; } if (!_opponents.Any()) { return; } currentOpponent = _opponents[animEvent.intParameter]; if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null)) { return; } var fx = currentSkill.GetEffect(animEvent.stringParameter, _baseCharacter); if (fx == null || fx is Object && fx.Equals(null)) { return; } var frameRate = animEvent.animatorClipInfo.clip.frameRate; var length = CalculatorUtility.TimeByFrame(animEvent.floatParameter, frameRate); StartCoroutine(TransformUtility.MoveToTarget(fx, fx.transform.position, currentOpponent.hitPoint.transform.position, length, () => { Destroy(fx.gameObject); })); }
public override void Event_ActivateFxAtOpponent(AnimationEvent animEvent) { if (currentSkill == null || currentSkill is Object && currentSkill.Equals(null)) { return; } if (!_opponents.Any()) { return; } currentOpponent = _opponents[animEvent.intParameter]; if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null)) { return; } var evtFxName = string.IsNullOrEmpty(animEvent.stringParameter) ? currentSkill.effectName : animEvent.stringParameter; currentSkill.ActivateEffect(evtFxName, _baseCharacter, currentOpponent, (_fx) => { if (currentOpponent != null) { _fx.SetParent(null); _fx.position = currentOpponent.hitPoint.position; } }); }
IEnumerator Spell(BaseCharacter owner, AbilityInfo info, Vector3 position) { owner.Audio.play(LoadManager.Instance.GetSFXData(SFXType.BossSkill).clip, 1F, 0F, 1F); owner.caster.abilityCast = true; info.isUse = true; owner.Order = order; owner.SetAnim( ); owner.Anim_Event = false; while (owner.Anim_Event == false) { if (owner.Order != order || owner.IsDeath) { break; } yield return(null); } int cnt = info.amount[0]; LayerMask layerMask = GameLayerHelper.Layer(GameLayer.Actor); var col = new Collider2D[MAX_COUNT]; var actors = Physics2D.OverlapCircleNonAlloc(position, Range, col, layerMask); List <BaseCharacter> targets = new List <BaseCharacter> ( ); for (int i = 0; i < actors; ++i) { BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( ); if (character == null || character.Equals(owner) || owner.Owner.IsAlliance(character.Owner) || character.IsDeath) { continue; } targets.Insert(Random.Range(0, targets.Count + 1), character); } GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill); foreach (var t in targets) { Instantiate(vfx, t.Position, Quaternion.identity); DamageCalculator.DamageInfo damageInfo = new DamageCalculator.DamageInfo(DamageCalculator.DamageType.Magic); damageInfo.damage = 99999999; owner.damageCalculator.Damaged(t, damageInfo); if (--cnt == 0) { break; } } if (owner.Order == order || owner.Order == AbilityOrder.Idle) { owner.Order = AbilityOrder.Idle; owner.AddAnim( ); } info.isUse = false; owner.caster.abilityCast = false; }
private void Owner_Damaged(BaseCharacter source, BaseCharacter target, DamageCalculator.DamageInfo info) { if (info.type != DamageCalculator.DamageType.Normal) { return; } var abilityInfo = source.caster.Get(index); if (abilityInfo.isUse) { return; } abilityInfo.isUse = true; int cnt = abilityInfo.amount[0]; LayerMask layerMask = GameLayerHelper.Layer(GameLayer.Actor); var col = new Collider2D[MAX_COUNT]; var actors = Physics2D.OverlapCircleNonAlloc(target.Position, Range, col, layerMask); List <BaseCharacter> targets = new List <BaseCharacter> ( ); for (int i = 0; i < actors; ++i) { BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( ); if (character == null || character.Equals(source) || character.Equals(target) || source.Owner.IsAlliance(character.Owner) || character.IsDeath) { continue; } targets.Insert(Random.Range(0, targets.Count + 1), character); } GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill); foreach (var t in targets) { Instantiate(vfx, t.Position, Quaternion.identity); source.damageCalculator.Damaged(t, info); if (--cnt == 0) { break; } } abilityInfo.isUse = false; }
public override void Event_MoveBack(AnimationEvent animEvent) { if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null)) { return; } var frameRate = animEvent.animatorClipInfo.clip.frameRate; var length = CalculatorUtility.TimeByFrame(animEvent.floatParameter, frameRate); StartCoroutine(TransformUtility.MoveToTarget(transform, currentOpponent.impactPoint.transform.position, _originalPosition, length)); }
void CreateHitEffect(BaseCharacter baseCharacter, BaseCharacter target) { if (target == null || target is Object && target.Equals(null)) { return; } var hitFx = Instantiate <Transform>(hitEffectPrefab, target.hitPoint.transform.position, Quaternion.identity, baseCharacter.transform); hitFx.gameObject.SetActive(true); hitFx.transform.position = target.hitPoint.position; var hitFxAnim = hitFx.GetComponent <Animator>(); var length = hitFxAnim.GetCurrentAnimatorStateInfo(0).length; Destroy(hitFxAnim.gameObject, length); }
public void Event_ActiveHurtAnimation(AnimationEvent animEvent) { if (currentSkill == null || currentSkill is Object && currentSkill.Equals(null)) { return; } if (!_opponents.Any()) { return; } currentOpponent = _opponents[animEvent.intParameter]; if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null)) { return; } StartCoroutine(currentSkill.ActiveHurtAnimation(currentOpponent)); }
public static string SimulateBattlesBetween(long enemyId = -1, long combatantId = 0, int simulations = 1000) { BaseCharacter combatant = GetCharacterClone(combatantId); BaseCharacter enemy = enemyId > 0 ? GetCharacterClone(combatantId) : (BaseCharacter)MeasureStickJoe.Instance.Clone(); int wins = 0; int losses = 0; double percentWon; double averageHealthLeft = 0; double enemyAverageHealthLeft = 0; int initialHitPoints = combatant.CurHitPoints; int enemyInitialHitPoints = enemy.CurHitPoints; string initialName = combatant.Name; string enemyInitialName = enemy.Name; for (int i = 0; i < simulations; i++) { combatant.DamageTaken = 0; enemy.DamageTaken = 0; Battle simulation = new Battle(combatant, enemy); if (combatant.Equals(simulation.Winner)) { wins++; averageHealthLeft += simulation.CombatantStatistics.Character.CurHitPoints; } else if (enemy.Equals(simulation.Winner)) { losses++; enemyAverageHealthLeft += simulation.OpponentStatistics.Character.CurHitPoints; } else { throw new Exception("Unknown winner!"); } combatant.Name = initialName; enemy.Name = enemyInitialName; } combatant.CurHitPoints = initialHitPoints; enemy.CurHitPoints = enemyInitialHitPoints; averageHealthLeft /= wins; enemyAverageHealthLeft /= losses; percentWon = wins / ((double)wins + losses); return($"{percentWon*100}% winrate | AverageHealthLeft: {averageHealthLeft} | EnemyAverageHealthLeft: {enemyAverageHealthLeft}"); }
IEnumerator FindEnemy() { while (pawn.IsDeath == false) { var col = new Collider2D[FIND_ENEMY_MAX]; LayerMask layerMask = GameLayerHelper.Layer(GameLayer.Actor); var actors = Physics2D.OverlapCircleNonAlloc(pawn.Center, AttackDistance, col, layerMask); holdCharacters.Clear( ); for (int i = 0; i < actors; ++i) { BaseCharacter character = col[i].transform.GetComponentInParent <BaseCharacter> ( ); if (character == null || character.Equals(pawn) || character.IsDeath) { continue; } holdCharacters.Add(character); } yield return(new WaitForSeconds(FIND_ENEMY_TICK)); } }
public List <BaseCharacter> AttackRange(float range, FilterType filter) { LayerMask layer = GameLayerHelper.Layer(GameLayer.Actor); var col = new Collider2D[OVERLAP_MAX_ACTOR]; var actors = Physics2D.OverlapCircleNonAlloc(Owner.Center, range, col, layer); List <BaseCharacter> targets = new List <BaseCharacter> ( ); for (int i = 0; i < actors; ++i) { BaseCharacter character = col[i].transform.GetComponentInParent <BaseCharacter> ( ); if (character == null || character.Equals(Owner)) { continue; } switch (filter) { case FilterType.Alliance: if (Owner.Owner.IsEnemy(character.Owner)) { continue; } break; case FilterType.Enemy: if (Owner.Owner.IsAlliance(character.Owner)) { continue; } break; } targets.Add(character); } return(targets); }
public bool Exists(BaseCharacter baseCharacter) { return(list.Any(x => baseCharacter.Equals(x))); }