private Dictionary <ActorSpellType, Dictionary <ActorSpellName, ActorSpell> > LoadSpellsFromConfig() { Dictionary <ActorSpellType, Dictionary <ActorSpellName, ActorSpell> > dictionary = new Dictionary <ActorSpellType, Dictionary <ActorSpellName, ActorSpell> >(); string spellStr; switch (this.ActorType) { case ActorType.Infantry: { spellStr = GlobalConfig.TerranActorInfantrySpell; break; } case ActorType.Supporter: { spellStr = GlobalConfig.TerranActorSupporterSpell; break; } case ActorType.Sniper: { spellStr = GlobalConfig.TerranActorSniperSpell; break; } case ActorType.Marksman: { spellStr = GlobalConfig.TerranActorMarksmanSpell; break; } case ActorType.HeavyGunner: { spellStr = GlobalConfig.TerranActorHeavyGunnerSpell; break; } case ActorType.MortarTeam: { spellStr = GlobalConfig.TerranActorMortarTeamSpell; break; } case ActorType.Warlock: { spellStr = GlobalConfig.TerranActorWarlockSpell; break; } case ActorType.GryphonRider: { spellStr = GlobalConfig.TerranActorGryphonRiderSpell; break; } case ActorType.SeniorGryphonRider: { spellStr = GlobalConfig.TerranActorSeniorGryphonRiderSpell; break; } case ActorType.Crusader: { spellStr = GlobalConfig.TerranActorCrusaderSpell; break; } case ActorType.TemplarWarrior: { spellStr = GlobalConfig.TerranActorTemplarWarriorSpell; break; } default: { spellStr = string.Empty; break; } } string[] spellArr = spellStr.Split('/'); int length = spellArr.Length; for (int i = 0; i < length; i++) { ActorSpell actorSpell; string spell = spellArr[i]; switch (spell) { case "None": actorSpell = new ActorSpell(ActorSpellName.None, this.ActorType); break; case "Dodge": actorSpell = new ActorSpell(ActorSpellName.Dodge, this.ActorType); break; case "CirticalStrike": actorSpell = new ActorSpell(ActorSpellName.CirticalStrike, this.ActorType); break; case "HeadShot": actorSpell = new ActorSpell(ActorSpellName.HeadShot, this.ActorType); break; case "SplashDamage": actorSpell = new ActorSpell(ActorSpellName.SplashDamage, this.ActorType); break; case "MortarAttack": actorSpell = new ActorSpell(ActorSpellName.MortarAttack, this.ActorType); break; case "ArcaneExplosion": actorSpell = new ActorSpell(ActorSpellName.ArcaneExplosion, this.ActorType); break; case "Bash": actorSpell = new ActorSpell(ActorSpellName.Bash, this.ActorType); break; case "ChainLightning": actorSpell = new ActorSpell(ActorSpellName.ChainLightning, this.ActorType); break; case "GodBless": actorSpell = new ActorSpell(ActorSpellName.GodBless, this.ActorType); break; case "HolyLight": actorSpell = new ActorSpell(ActorSpellName.HolyLight, this.ActorType); break; default: actorSpell = new ActorSpell(ActorSpellName.None, this.ActorType); break; } if (!dictionary.ContainsKey(actorSpell.ActorSpellType)) { dictionary.Add(actorSpell.ActorSpellType, new Dictionary <ActorSpellName, ActorSpell>()); } dictionary[actorSpell.ActorSpellType].Add(actorSpell.ActorSpellName, actorSpell); } return(dictionary); }
public void ReleaseActiveSpell(ActorController entityType, ActorSpell actorSpell) { switch (actorSpell.ActorSpellName) { case ActorSpellName.MortarAttack: { List <GameObject> enemies = entityType.SeekAndGetEnemiesInDistance(120); if (enemies != null && enemies.Count != 0) { Damage motarAttackDamage = new Damage(); motarAttackDamage.DamageValue = 21; motarAttackDamage.ShowCrit = true; enemies.ForEach( enemy => { GameObject maEffect = (GameObject)Object.Instantiate(Resources.Load("GameScene/ActorSkillEffect")); maEffect.transform.parent = enemy.transform; maEffect.transform.localPosition = new Vector3(0, 0, 0); tk2dSpriteAnimator animator = maEffect.GetComponent <tk2dSpriteAnimator>(); animator.Play("Bombard"); animator.AnimationCompleted = delegate { if (enemy != null) { ActorController actorCtrl = enemy.GetComponent <ActorController>(); entityType.SendDamage(actorCtrl, motarAttackDamage); Object.Destroy(maEffect); } }; }); } break; } case ActorSpellName.ArcaneExplosion: { List <GameObject> enemies = entityType.SeekAndGetEnemiesInDistance(120); if (enemies != null && enemies.Count != 0) { Damage motarAttackDamage = new Damage(); motarAttackDamage.DamageValue = 27; motarAttackDamage.ShowCrit = true; enemies.ForEach( enemy => { GameObject aeEffect = (GameObject)Object.Instantiate(Resources.Load("GameScene/ActorSkillEffect")); aeEffect.transform.parent = enemy.transform; aeEffect.transform.localPosition = new Vector3(0, 0, 0); tk2dSpriteAnimator animator = aeEffect.GetComponent <tk2dSpriteAnimator>(); animator.Play("ArcaneExplosion"); animator.AnimationCompleted = delegate { if (enemy != null) { ActorController actorCtrl = enemy.GetComponent <ActorController>(); entityType.SendDamage(actorCtrl, motarAttackDamage); Object.Destroy(aeEffect); } }; }); } break; } case ActorSpellName.HolyLight: { List <GameObject> myActors = ActorsManager.GetInstance().GetActorsOfFaction(entityType.MyActor.FactionType); if (myActors != null && myActors.Count != 0) { GameObject targetActor = myActors[Random.Range(0, myActors.Count)]; Damage zapDamage = new Damage(); zapDamage.DamageValue = -300; zapDamage.ShowCrit = true; GameObject hlEffect = (GameObject)Object.Instantiate(Resources.Load("GameScene/ActorSkillEffect")); hlEffect.transform.parent = targetActor.transform; hlEffect.transform.localPosition = new Vector3(11, 38, 0); tk2dSpriteAnimator animator = hlEffect.GetComponent <tk2dSpriteAnimator>(); animator.Play("HolyLight"); animator.AnimationCompleted = delegate { if (targetActor != null) { ActorController actorCtrl = targetActor.GetComponent <ActorController>(); entityType.SendDamage(targetActor.GetComponent <ActorController>(), zapDamage); Object.Destroy(hlEffect); } }; } break; } case ActorSpellName.ShamanBless: { List <GameObject> myActors = ActorsManager.GetInstance().GetActorsOfFaction(entityType.MyActor.FactionType); if (myActors != null && myActors.Count != 0) { GameObject targetActor = myActors[Random.Range(0, myActors.Count)]; ActorController actorCtrl = targetActor.GetComponent <ActorController>(); actorCtrl.IsShamanBlessing = true; } break; } case ActorSpellName.Ensnare: { List <GameObject> airForceActors = ActorsManager.GetInstance().GetEnemyAirForceActorsOfFactionInDistance(entityType, 70); if (airForceActors != null && airForceActors.Count != 0) { GameObject targetActor = airForceActors[Random.Range(0, airForceActors.Count)]; ActorController actorCtrl = targetActor.GetComponent <ActorController>(); GameObject ensnareEffectA = (GameObject)Object.Instantiate(Resources.Load("GameScene/ActorSkillEffect")); ensnareEffectA.transform.localPosition = entityType.myTransform.position; float scale = Vector3.Distance(entityType.myTransform.position, targetActor.transform.position) / 60f; ensnareEffectA.transform.localScale = new Vector3(scale, 1f, 1f); tk2dSpriteAnimator animator = ensnareEffectA.GetComponent <tk2dSpriteAnimator>(); animator.Play("EnsnareA"); animator.AnimationCompleted = delegate { Object.Destroy(ensnareEffectA.gameObject); }; actorCtrl.IsCaught = true; } break; } case ActorSpellName.GodBless: { List <GameObject> myActors = ActorsManager.GetInstance() .GetFriendlyActorsInDistance( entityType.MyActor.FactionType, entityType.myTransform.position, actorSpell.AttackRange); if (myActors != null && myActors.Count != 0) { myActors.ForEach( actor => { ActorController actorCtrl = actor.GetComponent <ActorController>(); actorCtrl.MyActor.ActorArmor.ArmorAmount += actorSpell.IncreaseFriendlyForcesArmor; }); } break; } } }
public override void Execute(ActorController entityType) { if (entityType.IsStun) { entityType.StunDuration -= Time.deltaTime; if (entityType.StunDuration <= 0) { entityType.IsStun = false; entityType.StunDuration = 0; } return; } if (entityType.IsBleed) { entityType.BleedDuration -= Time.deltaTime; Damage bleedDamage = new Damage(); bleedDamage.DamageValue = entityType.BleedDps * Time.deltaTime; entityType.TakeDamage(bleedDamage); if (entityType.BleedDuration <= 0) { entityType.IsBleed = false; entityType.BleedDps = 0; entityType.BleedDuration = 0; } } if (entityType.IsRaging) { entityType.RagingDuration -= Time.deltaTime; if (entityType.RagingDuration <= 0) { entityType.IsRaging = false; entityType.RagingDuration = 0; } } if (entityType.IsShamanBlessing) { entityType.ShamanBlessingDuration -= Time.deltaTime; this.shamanBlessCounter += Time.deltaTime; if (this.shamanBlessCounter >= 1) { Damage blessDamage = new Damage(); blessDamage.DamageValue = -3; blessDamage.ShowCrit = true; entityType.TakeDamage(blessDamage); this.shamanBlessCounter = 0f; } if (entityType.ShamanBlessingDuration <= 0) { entityType.IsShamanBlessing = false; this.shamanBlessCounter = 0f; } } if (entityType.IsCaught) { entityType.CaughtDuration -= Time.deltaTime; if (entityType.CaughtDuration <= 0) { entityType.IsCaught = false; } } if (entityType.IsPoisioning) { this.poisionCounter += Time.deltaTime; if (this.poisionCounter >= 1f) { Damage poisionDamage = new Damage(); poisionDamage.DamageValue = entityType.PoisionDps; poisionDamage.ShowCrit = true; entityType.TakeDamage(poisionDamage); this.poisionCounter = 0f; } } if (entityType.IsBurningOilAttacked) { this.burningOilCounter += Time.deltaTime; if (this.burningOilCounter >= 1f) { Damage burningOilDamage = new Damage(); burningOilDamage.DamageValue = entityType.BurningOilDps; burningOilDamage.ShowCrit = true; entityType.TakeDamage(burningOilDamage); this.burningOilCounter = 0f; } entityType.BurningOilDuration -= Time.deltaTime; if (entityType.BurningOilDuration <= 0) { entityType.IsBurningOilAttacked = false; this.burningOilCounter = 0f; } } if (this.releaseCounterDictionary != null && this.activeSpellDictionary != null) { //foreach (KeyValuePair<ActorSpellName, float> kv in this.releaseCounterDictionary) ActorSpellName[] actorSpellArray = new ActorSpellName[this.releaseCounterDictionary.Keys.Count]; float[] counterArray = new float[this.releaseCounterDictionary.Keys.Count]; this.releaseCounterDictionary.Keys.CopyTo(actorSpellArray, 0); this.releaseCounterDictionary.Values.CopyTo(counterArray, 0); for (int i = 0; i < counterArray.Length; i++) { float temp = counterArray[i] + Time.deltaTime; ActorSpell spell = this.activeSpellDictionary[actorSpellArray[i]]; if (temp >= spell.ReleaseInterval) { this.ReleaseActiveSpell(entityType, spell); temp = 0f; } this.releaseCounterDictionary[actorSpellArray[i]] = temp; } } }
public Damage CalculateCommonAttackDamage(BaseGameEntity targetEntity) { Damage damage = new Damage(); damage.DamageValue = this.MyActor.ActorAttack.Dps / this.AttackInterval; //Debug.Log("Damage " + damage.DamageValue); damage.DamageValue *= this.AttackPlusRatio; //Debug.Log("After plus Ratio " + damage.DamageValue); if (!(targetEntity is ActorController)) { return(damage); } ActorController targetActor = (ActorController)targetEntity; ActorSpell dodgeSpell = targetActor.MyActor.GetSpell(ActorSpellName.Dodge); if (dodgeSpell != null) { int randomIndex = Random.Range(1, 101); if (targetActor.MyActor.ActorType == ActorType.Supporter && randomIndex <= 15) { this.ShowTip("Miss"); damage.DamageValue = 0; return(damage); } } Dictionary <ActorSpellName, ActorSpell> passiveSpellDictionary = this.MyActor.GetSpellsByType(ActorSpellType.PassiveSpell); if (passiveSpellDictionary != null) { foreach (KeyValuePair <ActorSpellName, ActorSpell> kv in passiveSpellDictionary) { switch (kv.Key) { case ActorSpellName.None: break; case ActorSpellName.CirticalStrike: { if (Random.Range(1, 101) <= 10) { //Debug.Log("致命一击"); damage.DamageValue *= 1.5f; damage.ShowCrit = true; damage.ActorSpellName = ActorSpellName.CirticalStrike; //Debug.Log("After Cirtical Strike " + damage.DamageValue); } break; } case ActorSpellName.HeadShot: { if (Random.Range(1, 101) <= 40) { damage.DamageValue *= 3f; damage.ShowCrit = true; damage.ActorSpellName = ActorSpellName.HeadShot; //Debug.Log("After HeadShot" + damage.DamageValue); } break; } case ActorSpellName.SplashDamage: { List <GameObject> enemies = targetActor.SeekAndGetFriendlyActorsInDistance(100); if (enemies != null && enemies.Count != 0) { Damage splashDamage = new Damage(); splashDamage.DamageValue = 0.5f * damage.DamageValue; //Debug.Log("splash Damage " + splashDamage.DamageValue); enemies.ForEach( enemy => { if (enemy != null && enemy != targetActor.gameObject) { ActorController actorCtrl = enemy.GetComponent <ActorController>(); if (actorCtrl != null && actorCtrl.gameObject != this.TargetEnemy.gameObject) { this.SendDamage(actorCtrl, splashDamage); } } }); } break; } case ActorSpellName.Bleed: { if (this.MyActor.ActorType == ActorType.GryphonRider) { if (Random.Range(1, 101) <= 25) { //Debug.Log("Bleed"); damage.Bleed = true; damage.BleedDuration = 3; damage.BleedDps = 15; } } else if (this.MyActor.ActorType == ActorType.SeniorGryphonRider) { if (Random.Range(1, 101) <= 30) { damage.Bleed = true; damage.BleedDuration = 5; damage.BleedDps = 20; } } break; } case ActorSpellName.Bash: { if (this.MyActor.ActorType == ActorType.Crusader) { if (Random.Range(1, 101) <= 20) { //Debug.Log("重击"); damage.Stun = true; damage.StunDuration = 2; damage.DamageValue += 25; damage.ShowCrit = true; } } else if (this.MyActor.ActorType == ActorType.TemplarWarrior) { if (Random.Range(1, 101) <= 25) { //Debug.Log("重击"); damage.Stun = true; damage.StunDuration = 2; damage.DamageValue += 30; damage.ShowCrit = true; } } break; } case ActorSpellName.ChainLightning: { if (this.MyActor.ActorType == ActorType.Sage) { if (Random.Range(1, 101) <= 25 && targetActor != null) { //Debug.Log("闪电链"); List <GameObject> enemies = this.SeekAndGetEnemiesInDistance(150); if (enemies != null && enemies.Count != 0) { int attackCount = Mathf.Min(enemies.Count, 4); for (int i = 0; i < attackCount; i++) { GameObject enemy = enemies[i]; if (enemy != null) { GameObject chainLightningEffectA = (GameObject) Instantiate(Resources.Load("GameScene/ActorSkillEffect")); chainLightningEffectA.name = "ChainLightningEffectA"; chainLightningEffectA.transform.position = this.myTransform.position; this.SetRotation(chainLightningEffectA, enemy.transform.position); float scale = Vector3.Distance( this.myTransform.position, enemy.transform.position) / 32f; chainLightningEffectA.transform.localScale = new Vector3(scale, 1, 1); tk2dSpriteAnimator animator = chainLightningEffectA.GetComponent <tk2dSpriteAnimator>(); animator.Play("ChainLightningA"); animator.AnimationCompleted = delegate { Destroy(chainLightningEffectA); if (enemy != null) { Damage chainLightningDamage = new Damage(); chainLightningDamage.DamageValue = 200; chainLightningDamage.ShowCrit = true; this.SendDamage(enemy.GetComponent <ActorController>(), chainLightningDamage); } }; } } } } } break; } case ActorSpellName.FireBomb: { //Debug.Log("燃烧弹 " + targetActor); if (targetActor != null && !targetActor.FireBombAttacked) { if (this.MyActor.ActorType == ActorType.BatRider) { targetActor.AttackInterval *= 1.6f; targetActor.MyActor.ActorArmor.ArmorAmount = Mathf.Max(targetActor.MyActor.ActorArmor.ArmorAmount - 3, 0); targetActor.FireBombAttacked = true; } else if (this.MyActor.ActorType == ActorType.SeniorBatRider) { targetActor.AttackInterval *= 1.6f; targetActor.MyActor.ActorArmor.ArmorAmount = Mathf.Max(targetActor.MyActor.ActorArmor.ArmorAmount - 6, 0); targetActor.FireBombAttacked = true; } } break; } case ActorSpellName.PoisonAttack: { //Debug.Log("毒液攻击" + targetActor); if (targetActor != null && !targetActor.IsPoisioning) { if (this.MyActor.ActorType == ActorType.Wyvern) { targetActor.PoisionDps = 3; targetActor.IsPoisioning = true; } else if (this.MyActor.ActorType == ActorType.WindRider) { targetActor.PoisionDps = 5; targetActor.IsPoisioning = true; } } break; } case ActorSpellName.BurningOil: { //Debug.Log("燃烧之油" + targetActor); if (targetActor != null && !targetActor.isBurningOilAttacked) { if (this.MyActor.ActorType == ActorType.Catapult) { targetActor.BurningOilDps = 48; targetActor.BurningOilDuration = 3; targetActor.IsBurningOilAttacked = true; } } break; } case ActorSpellName.Smash: { //Debug.Log("粉碎 " + targetActor); if (targetActor != null) { if (this.MyActor.ActorType == ActorType.Tauren && Random.Range(1, 101) <= 25) { List <GameObject> enemies = targetActor.SeekAndGetFriendlyActorsInDistance(120); if (enemies != null && enemies.Count != 0) { Damage splashDamage = new Damage(); splashDamage.DamageValue = 0.6f * damage.DamageValue; splashDamage.ShowCrit = true; //Debug.Log("splash Damage " + splashDamage.DamageValue); enemies.ForEach( enemy => { if (enemy != null && enemy != targetActor.gameObject) { ActorController actorCtrl = enemy.GetComponent <ActorController>(); if (actorCtrl != null) { this.SendDamage(actorCtrl, splashDamage); } } }); } } } break; } } } } ActorAttackType actorAttackType = this.MyActor.ActorAttack.ActorAttackType; switch (actorAttackType) { case ActorAttackType.Normal: { if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.LightArmor) { damage.DamageValue *= 0.9f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeavyArmor) { damage.DamageValue *= 0.8f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeroArmor) { damage.DamageValue *= 1; } break; } case ActorAttackType.Pierce: { ActorSpell parrySpell = targetActor.MyActor.GetSpell(ActorSpellName.Parry); if (parrySpell != null) { damage.DamageValue *= 0.7f; } if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.LightArmor) { damage.DamageValue *= 2f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeavyArmor) { damage.DamageValue *= 0.35f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeroArmor) { damage.DamageValue *= 0.5f; } break; } case ActorAttackType.Siege: { if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.LightArmor) { damage.DamageValue *= 1f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeavyArmor) { damage.DamageValue *= 1.5f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeroArmor) { damage.DamageValue *= 0.5f; } break; } case ActorAttackType.Magic: { if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.LightArmor) { damage.DamageValue *= 1.25f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeavyArmor) { damage.DamageValue *= 2f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeroArmor) { damage.DamageValue *= 0.35f; } break; } case ActorAttackType.Confuse: { if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.LightArmor) { damage.DamageValue *= 1f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeavyArmor) { damage.DamageValue *= 1f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeroArmor) { damage.DamageValue *= 1f; } break; } case ActorAttackType.HeroAttack: { if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.LightArmor) { damage.DamageValue *= 1.2f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeavyArmor) { damage.DamageValue *= 1.2f; } else if (targetActor.MyActor.ActorArmor.ActorArmorType == ActorArmorType.HeroArmor) { damage.DamageValue *= 1f; } break; } } //Debug.Log("After armor " + damage.DamageValue); return(damage); }