Пример #1
0
    public void addThreat(CRController source, float threat)
    {
        int i=0;
        for (; i<_enemies.Count; i++)
        {
            Enemy enemy = _enemies[i];
            if (enemy.controller == source)
            {
                enemy.threat = enemy.threat + threat;
                _enemies[i] = enemy;
                break;
            }
        }

        if (i >= _enemies.Count)
        {
            Enemy enemy = new Enemy();
            enemy.controller = source;
            enemy.threat = threat;

            _enemies.Add(enemy);
        }
        else
        {
            if (i > 0 && _enemies[i].threat > _enemies[i-1].threat)
            {
                Enemy tmp = _enemies[i];
                _enemies[i] = _enemies[i-1];
                _enemies[i-1] = tmp;
            }
        }

        updateTarget();
    }
Пример #2
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;
    }
Пример #3
0
        public void IndexTest()
        {
            var controller = new CRController();
            var result     = controller.Index();

            Assert.IsInstanceOfType(result, typeof(ViewResult));
        }
Пример #4
0
    // Update is called once per frame
    public override CRCombatResult execute(CRController source, CRController target)
    {
        CRWeaponItem weapon = null;

        CRItem item = source.creature.equipment.GetItem((int)CREquipSlot.PRIMARY);

        if (item is CRWeaponItem)
        {
            weapon = (CRWeaponItem)item;
        }

        Dictionary<CRCombatEvent, float> chances = new Dictionary<CRCombatEvent, float>();
        chances.Add(CRCombatEvent.MISS, -25.0f);

        CRCombatResult result = CRCombatManager.ResolveMelee(source.creature.offence, weapon, multiplier, bonus, target.creature.defence, chances);

        result.threat = result.amount * threatMultipler;

        result.attacker = source;
        result.defender = target;

        result.message = message;
        result.singularMessage = singularMessage;

        return result;
    }
Пример #5
0
    public override void use(CRController source, CRAbility ability, CRController target)
    {
        _source = source;
        _target = target;

        _ability = ability;
    }
Пример #6
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;
    }
Пример #7
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;
    }
Пример #8
0
    public void AddEffect(CRController source, CREffect effect)
    {
        if (effect.rolling)
        {
            effect.Apply(_creature);
            return;
        }

        if (effect.category == CREffectCategory.UNIQUE)
        {
            string key = effect.name;

            if (_uniqueEffects.ContainsKey(source))
            {
                Dictionary<string, CREffect> effects = _uniqueEffects[source];

                if (effects.ContainsKey(key))
                {
                    CREffect e = effects[key];
                    if (e)
                    {
                        e.SendMessage("Expire", CRExpirationReason.OVERWRITE, SendMessageOptions.DontRequireReceiver);
                    }

                    effects.Remove(key);
                    effects.Add(key, effect);
                }
                else
                {
                    effects.Add(key, effect);
                }
            }
            else
            {
                Dictionary<string, CREffect> effects = new Dictionary<string, CREffect>();
                effects.Add(key, effect);

                _uniqueEffects.Add(source, effects);
            }

            effect.Apply(_creature);
        }

        /// temp, keep our array clean

        List<string> expired = new List<string>();

        foreach (KeyValuePair<string, CREffect> kv in _uniqueEffects[source])
        {
            if (kv.Value.expired())
                expired.Add(kv.Key);
        }

        foreach (string ex in expired)
        {
            _uniqueEffects[source].Remove(ex);
        }
    }
Пример #9
0
    void Awake()
    {
        _animator = GetComponentInChildren<Animator>();
        _agent = GetComponentInChildren<Agent>();
        _controller = GetComponent<CRController>();

        if(_animator && _animator.layerCount >= 2)
            _animator.SetLayerWeight(1, 1);
    }
Пример #10
0
    public override void use(CRController source, CRAbility ability, CRController target)
    {
        _source = source;
        _target = target;

        _ability = ability;

        transform.parent = _source.transform;
    }
Пример #11
0
    public void attack(CRController target)
    {
        if (target == _controller)
            return;

        _auto = true;

        _target = target;
    }
Пример #12
0
    public void attack(CRController target)
    {
        stop();

        _commands.Enqueue(new CRSpawn( new ICRCommand[] {
                                            new CRFollow(_movementBehaviour, target.transform),
                                            new CRAttack(_attackBehaviour, target)
                                       }
        ));
    }
Пример #13
0
    void Update()
    {
        if (_controller.isIdle())
        {
            if (_target)
                _target.deaggro(this);

            _target = null;
        }
    }
Пример #14
0
    void Start()
    {
        _slider = GetComponent<UISlider>();
        _controller = CRUtility.GetComponentInParent<CRController>(transform);
        _health = _controller.creature.attributeManager.GetResource(CRResourceType.HEALTH);

        _foreground = transform.FindChild("Foreground").GetComponent<UISlicedSprite>();

        _conditionManager = _controller.creature.conditionManager;
    }
Пример #15
0
    void OnDisable()
    {
        foreach (NPCBehaviour behaviour in GetComponents<NPCBehaviour>())
            behaviour.enabled = false;

        if (_target)
            _target.deaggro(this);

        _target = null;
    }
Пример #16
0
    void BindUI(CRController controller)
    {
        UIResource[] uiresources = (UIResource[])GameObject.FindWithTag("UI Root").GetComponentsInChildren<UIResource>();

        foreach (UIResource uiresource in uiresources)
        {
            CRResource resource = controller.creature.attributeManager.GetResource(uiresource.type);

            if (resource)
                uiresource.SetResource(resource);
            else
                uiresource.gameObject.SetActive(false);
        }

        UIExperience uiexperience = (UIExperience)GameObject.FindWithTag("UI Root").GetComponentInChildren<UIExperience>();

        if (uiexperience)
        {
            uiexperience.SetController(controller);
        }

        UICastBar uicastbar = (UICastBar)GameObject.FindWithTag("UI Root").GetComponentInChildren<UICastBar>();

        if (uicastbar)
        {
            uicastbar.SetController(controller);
        }

        UIButtonMessage respawnbutton = (UIButtonMessage)GameObject.FindWithTag("UI Root").transform.FindChild("Root/Dead/Button").GetComponent<UIButtonMessage>();

        if (respawnbutton)
        {
            respawnbutton.target = controller.gameObject;
            respawnbutton.functionName = "NetworkRespawn";
        }

        UIAbilityBar abilitybar = (UIAbilityBar)GameObject.FindWithTag("UI Root").GetComponentInChildren<UIAbilityBar>();

        if (abilitybar)
        {
            CRAbilityManager abilityManager = controller.creature.abilityManager;
            CRAbility[] abilities = abilityManager.GetAbilities();

            abilitybar.SetAbilityBehaviour(controller.abilityBehaviour);

            for (int i=0; i<abilities.Length; i++)
            {
                if (null != abilities[i])
                {
                    abilitybar.SetAbility(i, abilities[i]);
                }
            }
        }
    }
Пример #17
0
    public override bool satisfied(CRController controller, CRController target)
    {
        CRResource resource = controller.creature.attributeManager.GetResource(type);

        if (!resource || resource.currentValue < amount)
        {
            NetworkChat.instance.send(controller.GetComponent<CRControllerBinding>().owner, "Not enough " + type.ToString().ToLower() + ".", 0);
            return false;
        }

        return true;
    }
Пример #18
0
    public override bool satisfied(CRController controller, CRController target)
    {
        bool result = controller.creature.conditionManager.hasCondition(type);

        if (!result)
        {
            NetworkChat.instance.send(controller.GetComponent<CRControllerBinding>().owner, "You must be " + type.ToString().ToLower() + ".", 0);
            return false;
        }

        return true;
    }
Пример #19
0
    void die()
    {
        _controller.stop();

        foreach (NPCBehaviour behaviour in GetComponents<NPCBehaviour>())
            behaviour.enabled = false;

        if (_target)
            _target.deaggro(this);

        _target = null;
    }
Пример #20
0
    // Use this for initialization
    void Start()
    {
        _creature = GetComponentInChildren<CRCreature>();
        _binding = GetComponent<CRControllerBinding>();
        _controller = GetComponent<CRController>();

        _guiInventory = GetComponentInChildren<GUIInventory>();
        _guiEquipment = GetComponentInChildren<GUIEquipment>();

        _guiInventory.enabled = toggleInventory;
        _guiEquipment.enabled = toggleInventory;
    }
Пример #21
0
    void foundTarget(CRController other)
    {
        if (other)
        {
            if (_target)
                _target.deaggro(this);

            _target = other;
            _target.aggro(this);
            _controller.attack(_target);
        }
    }
Пример #22
0
    public void stop()
    {
        if (Network.isServer)
        {
            if (_animator)
            {
                _animator.SetBool("Attack", false);
                _animator.SetBool("CancelAttack", true);
            }
        }

        _auto = false;
        _target = null;
    }
Пример #23
0
    public static void Attack(CRController attacker, CRWeaponItem weapon, float multiplier, CRController defender)
    {
        // can't attack if we have no offence
        if (!attacker.creature.offence)
            return;

        int n = 1;

        float trip = attacker.creature.offence.tripleChance(attacker.creature.level) * 0.01f;
        float dbl = attacker.creature.offence.doubleChance(attacker.creature.level)  * 0.01f;

        float v = Random.Range(0, 1.0f);

        if ( v < trip)
        {
            n = 3;
        }
        else if ( v < trip + dbl)
        {
            n = 2;
        }

        for (int i=0; i<n; i++)
        {
            CRCombatResult result = CRCombatManager.ResolveMelee(attacker.creature.offence, weapon, multiplier, 0, defender.creature.defence);

            result.attacker = attacker;
            result.defender = defender;

            Messenger<CRCombatResult>.Broadcast("CombatResult", result);

            if (result.amount > 0)
            {
                defender.BroadcastMessage("takeDamage", result);

                if (defender.creature.isDead())
                {
                    attacker.SendMessage("gainExperience", defender.creature.level * defender.creature.level * 500);

                    break;
                }
            }

            NPCThreat threat = result.defender.GetComponent<NPCThreat>();

            if (threat)
                threat.addThreat(result.attacker, result.threat);
        }
    }
Пример #24
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;
    }
Пример #25
0
    public override bool satisfied(CRController controller, CRController target)
    {
        Vector3 cdir = (target.transform.position - controller.transform.position).normalized;
        Vector3 tdir = target.transform.forward;

        if (null != target.GetComponentInChildren<Agent>())
        {
            tdir = target.GetComponentInChildren<Agent>().transform.forward;
        }

        bool result = Vector3.Angle(cdir, tdir) < 60.0f;

        if (!result)
        {
            NetworkChat.instance.send(controller.GetComponent<CRControllerBinding>().owner, "You must be behind your target.", 0);
            return false;
        }

        return true;
    }
Пример #26
0
    public bool removeTarget(CRController target)
    {
        int i=0;
        for (; i<_enemies.Count; i++)
        {
            Enemy enemy = _enemies[i];

            if (enemy.controller == target)
            {
                _enemies.RemoveAt(i);

                updateTarget();

                return true;
            }
        }

        updateTarget();

        return false;
    }
Пример #27
0
 public CRLoot(CRController controller, CRController target)
 {
     _controller = controller;
     _target = target;
 }
Пример #28
0
 void Awake()
 {
     _controller = GetComponent<CRController>();
     _agent = GetComponentInChildren<Agent>();
 }
Пример #29
0
 public override void use(CRController source, CRAbility ability, CRController target)
 {
     CRCombatManager.Cast(source, ability, target);
     Destroy(gameObject);
 }
Пример #30
0
    public static void Cast(CRController source, CRAbility ability, CRController target)
    {
        GameObject go = GameObject.Instantiate(ability.action) as GameObject;

        go.transform.parent = target.transform;
        go.transform.localPosition = Vector3.zero;

        if (Network.isServer)
        {
            CRCombatAction[] actions = (CRCombatAction[])go.GetComponentsInChildren<CRCombatAction>();

            foreach (CRCombatAction action in actions)
            {
                ResloveCombatAction(source, action, target);
            }
        }
    }
Пример #31
0
    public static void ResloveCombatAction(CRController source, CRCombatAction action, CRController target)
    {
        CRCombatResult result = action.execute(source, target);

        if (result.threat == Mathf.NegativeInfinity)
        {
            target.wipeThreat();
        }

        Messenger<CRCombatResult>.Broadcast("CombatResult", result);

        NPCThreat threat = result.defender.GetComponent<NPCThreat>();

        if (threat)
        {
            threat.addThreat(result.attacker, result.threat);
        }

        if (result.combatEvent == CRCombatEvent.HIT)
        {
            if (result.amount > 0)
            {
                result.defender.BroadcastMessage("takeDamage", result);
                if (result.defender.creature.isDead())
                {
                    result.attacker.SendMessage("gainExperience", result.defender.creature.level * result.defender.creature.level * 500);
                }
            }
        }
        else if (result.combatEvent == CRCombatEvent.HEAL)
        {
            target.passThreat(source, result.threat);
        }
    }