// Update is called once per frame public override CRCombatResult execute(CRController source, CRController target) { CRCombatResult result = new CRCombatResult(); result.combatEvent = CRCombatEvent.EFFECT; result.combatType = CRCombatType.MAGIC; result.attacker = source; result.defender = target; GameObject obj = Instantiate(effect, target.transform.position, Quaternion.identity) as GameObject; obj.transform.parent = target.transform; CREffect e = obj.GetComponent<CREffect>(); target.creature.effectManager.AddEffect(source, e); CROverTime[] timed = (CROverTime[])e.GetComponents<CROverTime>(); foreach (CROverTime time in timed) { time.Begin(source, target); } result.singularMessage = e.singularMessage; result.message = e.message; result.threat = e.threat; return result; }
// Update is called once per frame public override CRCombatResult execute(CRController source, CRController target) { CRCombatResult result = new CRCombatResult(); result.combatEvent = CRCombatEvent.HIT; result.combatType = CRCombatType.MAGIC; result.attacker = source; result.defender = target; CRResource resource = target.creature.attributeManager.GetResource(type); if (resource) { float bonus = 0; if (source.offence) { bonus = Mathf.Clamp(source.offence.magic / 14.0f * coefficient, 0, amount); } float damage = Mathf.CeilToInt(amount + bonus); result.amount = damage; result.threat = damage * threatMultipler; if (type != CRResourceType.HEALTH) resource.Consume(damage); } return result; }
// Update is called once per frame public override CRCombatResult execute(CRController source, CRController target) { CRCombatResult result = new CRCombatResult(); result.combatEvent = CRCombatEvent.EFFECT; result.combatType = CRCombatType.MAGIC; result.attacker = source; result.defender = target; /// if source does not have a minion if (null == source.minion) { GameObject go = GameObject.Instantiate(minionPrefab, transform.position, Quaternion.identity) as GameObject; ((NetworkNPCSpawner)FindObjectOfType(typeof(NetworkNPCSpawner))).ServerSpawn(go); NPCMinion minion = go.GetComponent<NPCMinion>(); minion.master = source; source.minion = minion; UIMinion ui = GameObject.FindWithTag("UI Root").GetComponentInChildren<UIMinion>(); if (ui) ui.SetMinion(minion); } else { NetworkChat.instance.send(source.GetComponent<NetworkPlayerInit>().owner, "You already have a minion.", 0); } return result; }
void NetworkCombatResult(NetworkViewID attacker, NetworkViewID defender, int combatEvent, int combatType, float damage, float threat, string message, string singularMessage, Vector3 position) { CRCombatResult result = new CRCombatResult(); result.attacker = NetworkView.Find(attacker).GetComponent<CRController>(); result.defender = NetworkView.Find(defender).GetComponent<CRController>(); result.combatEvent = (CRCombatEvent)combatEvent; result.combatType = (CRCombatType)combatType; result.amount = damage; result.threat = threat; result.message = message; result.singularMessage = singularMessage; CRCombatManager.Print(result); }
void NotifyOthers(CRCombatResult result) { Vector3 position = result.attacker.transform.position; NetworkViewID attacker = result.attacker.networkView.viewID; NetworkViewID defender = result.defender.networkView.viewID; int combatEvent = (int)result.combatEvent; int combatType = (int)result.combatType; float damage = result.amount; float threat = result.threat; string message = (null != result.message) ? result.message : ""; string singularMessage = (null != result.singularMessage) ? result.singularMessage : "";; networkView.RPC("NetworkCombatResult", RPCMode.Others, attacker, defender, combatEvent, combatType, damage, threat, message, singularMessage, position); }
// Update is called once per frame public override CRCombatResult execute(CRController source, CRController target) { CRCombatResult result = new CRCombatResult(); result.combatType = CRCombatType.MAGIC; result.combatEvent = CRCombatEvent.EFFECT; result.threat = amount; result.attacker = source; result.defender = target; result.message = message; result.singularMessage = singularMessage; return result; }
void NotifyPlayer(NetworkPlayer player, CRCombatResult result) { if (player == new NetworkPlayer()) return; NetworkViewID attacker = result.attacker.networkView.viewID; NetworkViewID defender = result.defender.networkView.viewID; Vector3 position = result.attacker.transform.position; int combatEvent = (int)result.combatEvent; int combatType = (int)result.combatType; float damage = result.amount; float threat = result.threat; string message = result.message; string singularMessage = result.singularMessage; networkView.RPC("NetworkCombatResult", player, attacker, defender, combatEvent, combatType, damage, threat, message, singularMessage, position); }
/// <summary> /// Melee Attack Solver. Given two parties a CombatResult will be generated /// </summary> public static CRCombatResult ResolveMelee(CROffence offence, CRWeaponItem weapon, float multiplier, float bonus, CRDefence defence, Dictionary<CRCombatEvent, float> chances = null) { if (null == defence) { defence = CRCombatManager.defaultDefence; } // Create the Combat Table CRCombatTable combatTable = new CRCombatTable(); if (null != chances) { foreach (KeyValuePair<CRCombatEvent, float> chance in chances) { combatTable.AddChance(chance.Key, chance.Value); } } // Add attack parameters combatTable.AddChance(CRCombatEvent.MISS, offence.missChance(defence.level)); combatTable.AddChance(CRCombatEvent.CRIT, offence.critChance(defence.level)); combatTable.AddChance(CRCombatEvent.CRUSH, offence.crushChance(defence.level)); // Add defend parameters combatTable.AddChance(CRCombatEvent.MISS, defence.avoidChance(offence.level)); combatTable.AddChance(CRCombatEvent.DODGE, defence.dodgeChance(offence.level)); combatTable.AddChance(CRCombatEvent.PARRY, defence.parryChance(offence.level)); combatTable.AddChance(CRCombatEvent.BLOCK, defence.blockChance(offence.level)); combatTable.AddChance(CRCombatEvent.DEFLECT, defence.deflectChance(offence.level)); combatTable.AddChance(CRCombatEvent.REFLECT, defence.reflectChance(offence.level)); // Do the combat roll CRCombatEvent combatEvent = combatTable.Roll(CRCombatType.MELEE); // Generate the attack results CRCombatResult result = new CRCombatResult(); result.combatEvent = combatEvent; // Is there a potential for damage to be done if (combatEvent == CRCombatEvent.HIT || combatEvent == CRCombatEvent.CRIT || combatEvent == CRCombatEvent.CRUSH || combatEvent == CRCombatEvent.BLOCK) { // Yes we need to perform a damage calculation float min = (weapon.minDamage / weapon.speed + offence.attack / 14.0f) * weapon.speed * multiplier + bonus; // * (penalty) dual weild etc float max = (weapon.maxDamage / weapon.speed + offence.attack / 14.0f) * weapon.speed * multiplier + bonus; // * (penalty) dual weild etc float damage = Random.Range(min, max); damage *= 0.01f * offence.damage; //apply crit modifier if (combatEvent == CRCombatEvent.CRIT) { damage += damage * offence.critDamage * 0.01f; } else if (combatEvent == CRCombatEvent.CRUSH) { damage += damage * offence.crushDamage * 0.01f; } else if (combatEvent == CRCombatEvent.BLOCK) { // Remove blocked amount } // Remove any absorbtion // Calculate mitigation based on defenders armor and the attackers level float mitigation = defence.armor / (50 * offence.level + defence.armor); // Add any raw mitigation the defender has mitigation += defence.mitigation; // Remove any mitigation from armor penetration // Mitigation can not be more than 100%, however it can be negative making the defender take more than normal damage mitigation = 1 - Mathf.Min(1, mitigation); result.amount = Mathf.CeilToInt(damage * mitigation); result.threat = result.amount; } return result; }
public static void PrintMelee(CRCombatResult result) { string attacker = result.attacker.creature.displayName; string defender = result.defender.creature.displayName; string offensive_action = "hit"; string defensive_action = "miss"; bool singular_attacker = (attacker == "YOU"); bool singular_defender = (defender == "YOU"); bool defender_did_take_action = false; string try_action = (singular_attacker) ? "try" : "trys"; bool success = false; Color color = (singular_defender) ? Color.red : Color.white; switch (result.combatEvent) { case CRCombatEvent.HIT: success = true; offensive_action = (singular_attacker) ? "hit" : "hits"; break; case CRCombatEvent.CRIT: success = true; offensive_action = (singular_attacker) ? "CRIT" : "CRITS"; break; case CRCombatEvent.CRUSH: success = true; offensive_action = (singular_attacker) ? "CRUSH" : "CRUSHES"; break; case CRCombatEvent.MISS: offensive_action = "hit"; defensive_action = (singular_attacker) ? "MISS" : "MISSES"; break; case CRCombatEvent.DODGE: defender_did_take_action = true; offensive_action = "hit"; defensive_action = (singular_defender) ? "DODGE" : "DODGES"; break; default: defender_did_take_action = true; offensive_action = "hit"; defensive_action = (singular_defender) ? "do something unknown" : "does something unknown"; break; } if (result.message != null && result.message != "") { offensive_action = (singular_attacker) ? result.singularMessage : result.message; } string s = ""; if (success) { s += attacker + " " + offensive_action + " " + defender + " for " + result.amount + " points of damage."; } else { s += attacker + " " + try_action + " to " + offensive_action + " " + defender + " but "; if (defender_did_take_action) s += defender + " "; s += defensive_action + "."; } Chat.instance.log(s, color); }
public static void PrintMagic(CRCombatResult result) { string attacker = result.attacker.creature.displayName; string defender = result.defender.creature.displayName; string offensive_action = "hit"; string defensive_action = "miss"; bool singular_attacker = (attacker == "YOU"); bool singular_defender = (defender == "YOU"); bool defender_did_take_action = false; string try_action = (singular_attacker) ? "try" : "trys"; bool success = false; Color color = (singular_defender) ? Color.blue : Color.blue; switch (result.combatEvent) { case CRCombatEvent.HIT: success = true; offensive_action = (singular_defender) ? "are hit" : "is hit"; break; case CRCombatEvent.HEAL: success = true; offensive_action = (singular_defender) ? "are healed" : "is healed"; break; case CRCombatEvent.CRIT: success = true; offensive_action = (singular_defender) ? "are CRIT" : "is CRIT"; break; default: defender_did_take_action = true; offensive_action = "hit"; defensive_action = (singular_defender) ? "do something unknown" : "does something unknown"; break; } string s = ""; if (result.combatEvent == CRCombatEvent.EFFECT) { string message = (singular_defender) ? result.singularMessage : result.message; s += defender + " " + message + "."; if (message == "") return; } else { s += defender + " " + offensive_action + " for " + result.amount + " points of damage."; } Chat.instance.log(s, color); }
public static void Print(CRCombatResult result) { switch (result.combatType) { case CRCombatType.MELEE: PrintMelee(result); break; case CRCombatType.MAGIC: PrintMagic(result); break; } }
void OnCombatResult(CRCombatResult result) { NotifyOthers(result); CRCombatManager.Print(result); }
public void takeDamage(CRCombatResult result) { if (null != _attributeManager) { CRResource health = _attributeManager.GetResource(CRResourceType.HEALTH); if (null != health) { _conditionManager.RemoveAllConditionsOfType(CRConditionType.MESMERIZED); _conditionManager.RemoveAllConditionsOfType(CRConditionType.STEALTHED); health.Consume(result.amount); if (health.IsEmpty()) { transform.parent.BroadcastMessage("die", SendMessageOptions.DontRequireReceiver); } } } }