void ApplyToTile(int tile, Effect effect) { // Get list of valid tiles List <int> targetTiles; if (areaOfEffect) { targetTiles = Battleground.Instance.GetTilesFromShape(targetArea, tile); } else { targetTiles = new List <int> { tile } }; Debug.Log("tiles number: " + targetTiles.Count); switch (effect.effectType) { case EffectType.Miasma: // Spawn miasma on tiles foreach (int t in targetTiles) { MiasmaFieldEffect miasma = new MiasmaFieldEffect(effect.effectValue, effect.duration, owner, t); Battleground.Instance.AddFieldEffect(t, miasma); } break; case EffectType.Damage: float mult = 1.00f; for (int i = owner.Statuses.Count - 1; i >= 0; i--) { BaseStatus status = owner.Statuses[i]; if (status.GetType() == typeof(DamageMultiplierStatus)) { mult += status.Multiplier; // Remove multiplier status // TODO change if the status can have more than 1 use } } foreach (int t in targetTiles) { BaseUnit target = Battleground.Instance.GetUnitOnTile(t); if (target == null) { continue; } if (ParseTargetType(TargetType.Enemy, target.IsPlayer())) { int damage = (int)Math.Round(effect.effectValue * mult); target.DealDamage(damage, owner); owner.RemoveStatusOfType(typeof(DamageMultiplierStatus)); owner.UpdateUI(); // Add threat to player units if (owner.IsPlayer()) { PartyManager.Instance.ChangeThreat(owner, damage * 0.01f); } } } break; } } void ApplyToTargets(BaseUnit[] targets, Effect effect) { Debug.Log("Applying effects"); // Apply effects to specifically targeted units (dragged card onto or put AoE targeter on). switch (effect.effectType) { case EffectType.Damage: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { float mult = 1.00f; for (int i = owner.Statuses.Count - 1; i >= 0; i--) { BaseStatus status = owner.Statuses[i]; if (status.GetType() == typeof(DamageMultiplierStatus)) { mult += status.Multiplier; // Remove multiplier status // TODO change if the status can have more than 1 use owner.RemoveStatusOfType(status.GetType()); owner.UpdateUI(); } } int damage = (int)Math.Round(effect.effectValue * mult); target.DealDamage(damage, owner); // Add threat to player units if (owner.IsPlayer()) { PartyManager.Instance.ChangeThreat(owner, damage * 0.01f); } } } break; case EffectType.Block: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { BlockStatus blockStatus = new BlockStatus(effect.effectValue, effect.duration, owner, owner); target.AddStatus(blockStatus); } } break; case EffectType.Taunt: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { TauntStatus taunt = new TauntStatus(effect.duration, owner, target); target.AddStatus(taunt); } } break; case EffectType.Stun: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { StunStatus stun = new StunStatus(effect.duration, owner, target); target.AddStatus(stun); } } break; case EffectType.Push: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { // check if not on last col List <int> pushTiles = Battleground.Instance.FindEmptyTileNear(target.GetGridPosition()); if (pushTiles.Count < 1) { return; } int nextPos = pushTiles[UnityEngine.Random.Range(0, pushTiles.Count)]; target.MoveToTile(nextPos); if (owner.IsPlayer()) { PartyManager.Instance.ChangeThreat(owner, 0.05f); } } } break; case EffectType.SummonVoodoo: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { // Create voodoo unit GameObject voodooPrefab = Resources.Load <GameObject>("Prefabs/Units/Voodoo"); Debug.Log(voodooPrefab); BaseUnit voodoo = Instantiate(voodooPrefab).GetComponent <BaseUnit>(); List <int> voodooTiles = Battleground.Instance.FindEmptyTileNear(target.GetGridPosition()); int voodooPos = voodooTiles[UnityEngine.Random.Range(0, voodooTiles.Count)]; Battleground.Instance.PlaceUnitAt(voodoo, voodooPos); // Add status to transfer damage HealthLinkStatus healthLinkstatus = new HealthLinkStatus(1.0f, owner, target); voodoo.AddStatus(healthLinkstatus); } } break; case EffectType.Weakness: foreach (BaseUnit target in targets) { if (ParseTargetType(effect.targetType, target.IsPlayer())) { WeaknessStatus weaknessStatus = new WeaknessStatus(0.01f * effect.effectValue, effect.duration, owner, target); target.AddStatus(weaknessStatus); } } break; } }
public void DealDamage(int damage, BaseUnit attacker) { // Check attacker multiplicative debuff malus if (attacker) { WeaknessStatus weaknessStatus = attacker.SearchStatusLike(typeof(WeaknessStatus)) as WeaknessStatus; if (weaknessStatus != null) { damage = (int)((1.0f - weaknessStatus.Multiplier) * damage); } } // Check if switching target if linked HealthLinkStatus healthLink = SearchStatusLike(typeof(HealthLinkStatus)) as HealthLinkStatus; if (healthLink != null) { int newdamage = (int)healthLink.Multiplier * damage; healthLink.Target.DealDamage(newdamage, healthLink.Owner); // If health link is less than 100% continue with the remaining damage if (newdamage < damage) { damage -= newdamage; } else { return; } } // Apply global damage modifiers damage = GlobalsManager.Instance.ApplyDamageModifiers(damage, attacker, this); // Calculate multiplicative debuffs bonus VulnerableStatus vulnerableStatus = SearchStatusLike(typeof(VulnerableStatus)) as VulnerableStatus; if (vulnerableStatus != null) { damage = (int)((1.0f + vulnerableStatus.Multiplier) * damage); } // Calculate the unit's block stacks. int totalBlock = 0; foreach (BaseStatus status in _statuses) { if (status.GetType() == typeof(BlockStatus)) { totalBlock = status.Strength; goto damageCalc; } } // Damage calculation including block mitigation. damageCalc: // Add link damage if attacker has it if (attacker) { BaseStatus linkDamage = attacker.SearchStatusLike(typeof(LinkDamageStatus)); if (linkDamage != null) { damage += linkDamage.Strength; } // Execute Link event attacker.ExecuteLinkEvent(); } int totalDamage = damage - totalBlock; if (totalDamage < 0) { totalDamage = 0; SpawnBattleText("Blocked (-" + damage + ")"); } else { _actualHP -= totalDamage; if (totalBlock > 0) { // Partial Block SpawnBattleText(totalDamage.ToString() + " (-" + (damage - totalDamage) + ")"); // Shake Camera Camera.main.GetComponent <CameraRumble>().Rumble(); // Play Sound Effect _audioSource.clip = Resources.Load <AudioClip>("Sounds/fx/attackHitArmor01"); _audioSource.Play(); } else { // Clean Hit SpawnBattleText(totalDamage.ToString()); // Shake Camera Camera.main.GetComponent <CameraRumble>().Rumble(); // Play Sound Effect _audioSource.clip = Resources.Load <AudioClip>("Sounds/fx/attackHitFlesh"); _audioSource.Play(); } } // Recalculate block stacks here. DamageBlock(damage); Debug.Log(UnitName + " takes " + totalDamage + " Damage."); if (_actualHP > MaxHP) { _actualHP = MaxHP; } if (_actualHP < 1) { OnDeath(); } UpdateUI(); }