示例#1
0
    // 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;
    }
示例#2
0
    // 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;
    }
示例#3
0
    // 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);
    }
示例#6
0
    // 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);
    }
示例#8
0
    /// <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;
    }
示例#9
0
    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);
    }
示例#10
0
    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);
    }
示例#11
0
 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);
    }
示例#13
0
    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);
                }
            }
        }
    }