예제 #1
0
    private void OnTriggerEnter2D(Collider2D collider)
    {
        //If bullet is rebounding then don't detect collisions
        if (rebounded + reboundTime > Time.time)
        {
            return;
        }
        //If an object has been hit first, destroy the bullet
        if (collider.transform.gameObject.tag == "Object")
        {
            if (!collider.isTrigger)
            {
                this.gameObject.SetActive(false);
            }
            //Add destoryed particle effect here
        }

        CHitable        targetHit = collider.GetComponentInParent <CHitable>();
        CMoveCombatable enemy     = collider.GetComponentInParent <CMoveCombatable>();

        //If object hit is hitable, and this bullet hasn't already hit the target
        if (targetHit != null && !targetsHit.Contains(enemy))
        {
            if (targetHit.isInvuln() || targetHit.isKnockedback())
            {
                return;
            }

            if (enemy != null && enemy.parrying)
            {
                this.gameObject.SetActive(false);
            }

            //Apply damage and knockback
            targetHit.setAttacker(caster);
            //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
            targetHit.loseHealth(damage);

            //Apply stun to the target
            targetHit.applyStun(stunTime);

            //TODO: Play audio sound
            caster.attackHit();
            durability--;

            if (durability <= 0)
            {
                this.gameObject.SetActive(false);
            }
            else
            {
                targetsHit.Add(enemy);
                findNewTarget();
                if (target == null)
                {
                    this.gameObject.SetActive(false);
                }
            }
        }
    }
예제 #2
0
    public void parriedEnemy(CMoveCombatable enemy)
    {
        //Apply stun to the target
        enemy.applyStun(stunTime);

        enemy.knockback(pos, abilityKnockback, enemy.objectHeight);
    }
예제 #3
0
    private void OnTriggerEnter2D(Collider2D collider)
    {
        //If bullet is rebounding then don't detect collisions
        if (rebounded + reboundTime > Time.time)
        {
            return;
        }
        //If an object has been hit first, destroy the bullet
        if (collider.transform.gameObject.tag == "Object")
        {
            if (!collider.isTrigger)
            {
                this.gameObject.SetActive(false);
            }
            //Add destoryed particle effect here
        }

        CHitable targetHit = collider.GetComponentInParent <CHitable>();

        //If object hit is hitable, and this bullet hasn't hit anything else this life
        if (targetHit != null && !hitTarget)
        {
            if (targetHit.isInvuln() || targetHit.isKnockedback())
            {
                return;
            }

            CMoveCombatable enemy = collider.GetComponentInParent <CMoveCombatable>();

            if (enemy != null && !FactionManager.instance.isHostile(enemy.faction, faction))
            {
                return;
            }
            else if (enemy != null && enemy.parrying)
            {
                dir      *= -1;
                rebounded = Time.time;

                //Change the bullets caster and faction so the ricochet bullet can hit enemies of the parrying target
                faction = enemy.faction;
                caster  = enemy;
                return;
            }

            hitTarget = true;

            //Apply damage and knockback
            targetHit.setAttacker(caster);
            //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
            targetHit.loseHealth(damage);

            //Apply stun to the target
            targetHit.applyStun(stunTime);

            //TODO: Play audio sound
            caster.attackHit();

            this.gameObject.SetActive(false);
        }
    }
예제 #4
0
    private void setupDeathScreen()
    {
        //Set up text
        characterName.text = Player.instance.firstName + " " + Player.instance.lastName;
        player.setSpriteController(Player.instance.getSpriteController());
        causeOfDeath.text = Player.instance.causeOfDeath;

        //Set up revenge Target
        CMoveCombatable newRevengeTarget = Player.instance.getAttacker();

        revengeTarget.setSpriteController(newRevengeTarget.getSpriteController());

        //Set up name
        revengeName.text = Player.instance.getAttacker().getName();

        //Setup class
        revengeClass.text = newRevengeTarget.getClass().name;

        //set up faction
        revengeFaction.text = newRevengeTarget.faction.ToString();

        revengeStats[0].text = "Level: " + newRevengeTarget.level;
        revengeStats[1].text = "Strength: " + newRevengeTarget.getStats()[0];
        revengeStats[2].text = "Agility: " + newRevengeTarget.getStats()[1];
        revengeStats[3].text = "Endurance: " + newRevengeTarget.getStats()[2];


        for (int i = 0; i < 4; i++)
        {
            revengeStatChanges[i].text = "+" + newRevengeTarget.levelupChanges[i];
        }

        revengeAbilities[0].sprite = newRevengeTarget.getClass().abilities[0].getIcon();
        revengeAbilities[1].sprite = newRevengeTarget.getClass().abilities[1].getIcon();
    }
예제 #5
0
    void generateNPC(CMoveCombatable npc)
    {
        //Change the new NPCs look
        npc.setSpriteController(getSpriteController(npc));

        //Set NPC stats and details
        npc.firstName = getFirstName();
        npc.lastName  = getLastName();
    }
    public void setTarget(CMoveCombatable caster, Vector2 pos)
    {
        this.caster = caster;
        this.pos    = pos;

        //Get direction based on caster facing direction
        direction = new Vector2(caster.transform.localScale.x, 0);

        abilityDamage = (int)(caster.attackDamage * 1.2f);
    }
예제 #7
0
    public void setup(CMoveCombatable boss)
    {
        boss.setHealthbar(hpBar);
        nameBox.text = boss.firstName + " " + boss.lastName;

        hpBar.recoverHealth(1f);
        hpBar.setActive(true);

        bossGUIWrappper.SetActive(true);
    }
예제 #8
0
    public void createNewNPC(Transform parent, Vector2 spawnPoint)
    {
        CMoveCombatable npc = Instantiate(npcBase, spawnPoint, Quaternion.identity);

        //Set Parent and then reset position in relation to parent
        npc.transform.SetParent(parent);
        npc.transform.localPosition = spawnPoint;

        generateNPC(npc);
    }
예제 #9
0
    // Use this for initialization
    public void Setup(CMoveCombatable caster, Vector3 dir)
    {
        rb2D = GetComponent <Rigidbody2D>();

        this.caster = caster;
        this.dir    = dir;

        timeShot = Time.time;

        Vector3 spawnPos = new Vector3(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2, caster.transform.position.z);

        transform.position = spawnPos + (dir * 0.4f);
    }
예제 #10
0
    public override void setTarget(CMoveCombatable caster, Vector2 pos)
    {
        base.setTarget(caster, pos);

        //Direction is either walking direction of caster or facing direction if not moving
        if (caster.rb2D.velocity == Vector2.zero)
        {
            direction = Vector2.right * caster.transform.localScale.x;
        }
        else
        {
            direction = caster.rb2D.velocity.normalized;
        }
    }
예제 #11
0
    public virtual void setTarget(CMoveCombatable caster, Vector2 pos)
    {
        this.caster = caster;
        this.pos    = pos;

        //Get direction based on caster facing direction
        direction = new Vector2(caster.transform.localScale.x, 0);

        //Reset combo on caster
        caster.canCombo = false;

        newCooldownTime = cooldownTime - (caster.agility * agilityMod);

        abilityDamage = getDamage(caster.strength);
    }
예제 #12
0
    //Initialise here
    public override void setTarget(CMoveCombatable caster, Vector2 pos)
    {
        base.setTarget(caster, pos);

        //---- Setup ability stats ----
        //Setup looks
        icon = AbilitySprite.DASHSTRIKE;
        name = "Heavy Strike";

        //Setup cooldown
        cooldownTime = 0f;

        //Setup force
        abilityKnockback = 1000;
        abilityKnockUp   = 300;
        abilityVelocity  = 640;
    }
예제 #13
0
    private void findNewTarget()
    {
        target = null;
        Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, 5f, CMoveCombatable.attackMask);

        int i = 0;

        while (i < hitColliders.Length && target == null)
        {
            CMoveCombatable character = hitColliders[i].GetComponentInParent <CMoveCombatable>();
            if (character != null && FactionManager.instance.isHostile(character.faction, caster.faction) && !targetsHit.Contains(character))
            {
                target = character;
            }
            i++;
        }
        Debug.Log(target);
    }
예제 #14
0
    // Use this for initialization
    public void Setup(CMoveCombatable caster, int damage, float stunTime, Vector3 dir)
    {
        rb2D      = GetComponent <Rigidbody2D>();
        renderer  = GetComponent <SpriteRenderer>();
        hitTarget = false;

        this.caster   = caster;
        this.damage   = damage;
        this.stunTime = stunTime;
        this.dir      = dir;
        faction       = caster.faction;

        timeShot = Time.time;

        Vector3 spawnPos = new Vector3(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2, caster.transform.position.z);

        transform.position = spawnPos + (dir * 0.4f);
    }
예제 #15
0
    //Initialise here
    public override void setTarget(CMoveCombatable caster, Vector2 pos)
    {
        base.setTarget(caster, pos);

        //---- Setup ability stats ----
        //Setup looks
        icon = AbilitySprite.DASHSTRIKE;
        name = "Basic Strike";

        //Setup cooldown
        cooldownTime = 0f;

        //Setup force
        abilityVelocity = 45;

        //Setup stun
        stunTime = 0.1f;
    }
예제 #16
0
    private void OnTriggerEnter2D(Collider2D collider)
    {
        //If an object has been hit first, destroy the bullet
        if (collider.transform.gameObject.tag == "Object")
        {
            if (!collider.isTrigger)
            {
                this.gameObject.SetActive(false);
            }
            //Add destoryed particle effect here
        }

        CHitable targetHit = collider.GetComponentInParent <CHitable>();

        //If object hit is hitable, and this bullet hasn't hit anything else this life
        if (targetHit != null && !targetsHit.Contains(targetHit))
        {
            if (targetHit.isInvuln() || targetHit.isKnockedback())
            {
                return;
            }

            CMoveCombatable enemy = collider.GetComponentInParent <CMoveCombatable>();

            if (enemy != null && !FactionManager.instance.isHostile(enemy.faction, faction))
            {
                return;
            }

            targetsHit.Add(targetHit);

            //Apply damage and knockback
            targetHit.setAttacker(caster);
            //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
            targetHit.loseHealth(damage);

            //Apply stun to the target
            targetHit.applyStun(stunTime);

            //TODO: Play audio sound
            caster.attackHit();
        }
    }
예제 #17
0
    // Use this for initialization
    public void Setup(CMoveCombatable caster, int damage, float stunTime, Vector3 dir)
    {
        rb2D     = GetComponent <Rigidbody2D>();
        renderer = GetComponent <SpriteRenderer>();

        this.caster   = caster;
        this.damage   = damage;
        this.stunTime = stunTime;
        this.dir      = dir;

        durability = 3;

        transform.rotation = Quaternion.Euler(0, 0, 0);
        target             = null;
        targetsHit         = new List <CMoveCombatable>();

        Vector3 spawnPos = new Vector3(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2, caster.transform.position.z);

        transform.position = spawnPos + (dir * 0.4f);
    }
예제 #18
0
    /// <summary>
    /// Gets all characters on the hitable layer within aggro range and finds the closest enemy (if any) and sets them as the target
    /// </summary>
    /// <returns></returns>
    protected bool enemyNearby()
    {
        Collider2D[] hitColliders = new Collider2D[10];

        int collidersLength = Physics2D.OverlapCircleNonAlloc(character.transform.position, character.aggroRange, hitColliders, CMoveCombatable.attackMask);
        int i = 0;

        Transform closestEnemy = null;

        while (i < collidersLength)
        {
            //Try and get the component from the collider to check if its actually a character
            CMoveCombatable target = hitColliders[i].GetComponent <CMoveCombatable>();

            //if the target is actually an Enemy and is hostile to the character
            if (target != null && FactionManager.instance.isHostile(character.faction, target.faction))
            {
                //If there is no closer enemy. assign the new target as the closest
                if (closestEnemy == null)
                {
                    closestEnemy = target.transform;
                }
                //If the new target is closer than the previous closeset enemy
                else if ((target.transform.position - character.transform.position).magnitude < (closestEnemy.position - character.transform.position).magnitude)
                {
                    closestEnemy = target.transform;
                }
            }

            i++;
        }
        if (closestEnemy == null)
        {
            return(false);
        }

        character.target = closestEnemy;
        return(true);
    }
예제 #19
0
    //Returns a random sprite[]
    public RuntimeAnimatorController getSpriteController(CMoveCombatable character)
    {
        RuntimeAnimatorController[] spriteControllers;

        //If class is null
        if (character.getClass() == null)
        {
            character.chooseRandomClass();
        }

        switch (character.faction)
        {
        case (Faction.Player):
            spriteControllers = playerControllers;
            break;

        case (Faction.None):
            spriteControllers = NPCControllers;
            break;

        default:
            if (character.getClass().name == "Sharpshooter")
            {
                spriteControllers = shooterControllers;
            }
            else
            {
                spriteControllers = duelistControllers;
            }
            break;
        }


        int spriteSet = Random.Range(0, spriteControllers.Length); //Will never be 2

        return(spriteControllers[spriteSet]);
    }
예제 #20
0
    protected override IEnumerator abilityActionSequence()
    {
        cooldownStartTime = Time.time;

        //Wait until the attack frame in the animation has been reached
        while (!caster.getAttackTrigger().hasAttackTriggered())
        {
            yield return(null);
        }

        caster.getAttackTrigger().resetTrigger();

        //After shot nudge caster back a tad
        caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale);

        //Instantiate Bullet
        LanceBullet b = ObjectPool.instance.getLanceBullet();

        //Setup and turn on bullet
        b.gameObject.SetActive(true);
        b.Setup(caster, direction);

        //Play sound
        caster.audioSource.clip = abilitySound;
        caster.audioSource.Play();

        RaycastHit2D[] hitObject = Physics2D.RaycastAll(pos, direction, abilityRange, CMoveCombatable.attackMask, -10, 10);
        Debug.DrawRay(pos, direction * abilityRange, Color.blue, 3f);

        //If the Raycast hits an object on the layer Enemy
        foreach (RaycastHit2D r in hitObject)
        {
            if (r && r.transform.gameObject != caster.gameObject && caster.attacking)
            {
                //If an object has been hit first
                if (r.transform.gameObject.tag == "Object")
                {
                    continue;
                }

                //Hit attack
                CHitable        objectHit = r.transform.gameObject.GetComponentInParent <CHitable>();
                CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent <CMoveCombatable>();

                if (objectHit.isInvuln() || targetHit.faction == caster.faction || targetHit.isDead())
                {
                    continue;
                }

                //Apply damage and knockback
                objectHit.setAttacker(caster);
                objectHit.loseHealth(abilityDamage);
                objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
                objectHit.knockUp(pos, abilityKnockback, abilityKnockUp, objectHit.objectHeight);



                if (targetHit != null)
                {
                    targetHit.causeOfDeath = causeOfDeath;
                }

                //caster.audioSource.clip = abilitySound;
                //caster.audioSource.Play();
            }
        }


        caster.canCombo  = false;
        caster.canMove   = true;
        caster.attacking = false;
    }
예제 #21
0
 /// <summary>
 /// Sets the character that landed the last hit on this object
 /// </summary>
 /// <param name="attacker"></param>
 public void setAttacker(CMoveCombatable attacker)
 {
     lastAttacker = attacker;
 }
예제 #22
0
 public void applyEffect(CMoveCombatable character)
 {
     character.addToStat(blessedStat, blessingStrength);
 }
예제 #23
0
    protected override IEnumerator abilityActionSequence()
    {
        caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale);

        while (!caster.getAttackTrigger().hasAttackTriggered())
            yield return null;

        caster.getAttackTrigger().resetTrigger();

        //Check if attack can go through
        if (!caster.isDead())
        {

            Vector2 newPos = new Vector2(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2);

            RaycastHit2D[] hitObject = Physics2D.RaycastAll(newPos, direction, abilityRange, CMoveCombatable.attackMask, -10, 10);
            Debug.DrawRay(newPos, direction * abilityRange, Color.red, 3f);

            bool hitTarget = false;

            //If the Raycast hits an object on the layer Enemy
            foreach (RaycastHit2D r in hitObject)
            {

                if (r && r.transform.gameObject != caster.gameObject)
                {
                    //If an object has been hit first
                    if (r.transform.gameObject.tag == "Object")
                    {
                        if (r.collider.isTrigger)
                            continue;
                        else
                            break;
                    }

                    //Hit attack
                    CHitable objectHit = r.transform.gameObject.GetComponentInParent<CHitable>();

                    if (objectHit.tag == caster.tag)
                        continue;

                    //Apply damage and knockback
                    objectHit.setAttacker(caster);
                    objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
                    objectHit.knockUp(pos, abilityKnockback, abilityKnockUp, objectHit.objectHeight);
                    objectHit.loseHealth(abilityDamage);

                    CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent<CMoveCombatable>();

                    if (targetHit != null)
                    {
                        targetHit.causeOfDeath = causeOfDeath;
                    }

                    caster.audioSource.clip = caster.attackSound;
                    caster.audioSource.Play();
                    caster.attackHit();

                    hitTarget = true;
                    break;
                }
            }

            if (!hitTarget)
            {
                caster.audioSource.clip = caster.missSound;
                caster.audioSource.Play();
            }

            if (caster.pauseAfterAttack < 0.5f)
                yield return new WaitForSeconds(0.5f);
            else
                yield return new WaitForSeconds(caster.pauseAfterAttack);
        }
        caster.canMove = true;
        caster.attacking = false;
        caster.canCombo = false;
    }
예제 #24
0
 public override void setTarget(CMoveCombatable caster, Vector2 pos)
 {
     base.setTarget(caster, pos);
 }
예제 #25
0
 public void applyTrait(CMoveCombatable character)
 {
     traitEffect.applyEffect(character);
 }
예제 #26
0
 public void newBossGUI(CMoveCombatable boss)
 {
     bossGUI.setup(boss);
 }
예제 #27
0
    protected override IEnumerator abilityActionSequence()
    {
        //Start Cooldown
        cooldownStartTime = Time.time;

        string oldLayer = LayerMask.LayerToName(caster.gameObject.layer);

        caster.gameObject.layer = C.noCollisionLayer;

        caster.setInvulnerable(timeBeforeRay);

        caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale);

        yield return(new WaitForSeconds(timeBeforeRay));

        //Check if attack can go through
        if (!caster.isDead())
        {
            //Actual distance travelled by caster
            float distanceCovered = Mathf.Abs(caster.transform.position.x - pos.x);

            RaycastHit2D[] hitObject = Physics2D.RaycastAll(pos, direction, distanceCovered, CMoveCombatable.attackMask, -10, 10);
            Debug.DrawRay(pos, direction * distanceCovered, Color.blue, 3f);

            bool hitTarget = false;

            //If the Raycast hits an object on the layer Enemy
            foreach (RaycastHit2D r in hitObject)
            {
                if (r && r.transform.gameObject != caster.gameObject && caster.attacking)
                {
                    //If an object has been hit first
                    if (r.transform.gameObject.tag == "Object")
                    {
                        continue;
                    }

                    //Hit attack
                    CHitable        objectHit = r.transform.gameObject.GetComponentInParent <CHitable>();
                    CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent <CMoveCombatable>();

                    if (objectHit.isInvuln() || targetHit.faction == caster.faction || targetHit.isDead())
                    {
                        continue;
                    }

                    //Apply damage and knockback
                    objectHit.setAttacker(caster);
                    objectHit.loseHealth(abilityDamage);
                    objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
                    objectHit.knockUp(pos, abilityKnockback, abilityKnockUp, objectHit.objectHeight);



                    if (targetHit != null)
                    {
                        targetHit.causeOfDeath = causeOfDeath;
                    }

                    caster.audioSource.clip = abilitySound;
                    caster.audioSource.Play();

                    hitTarget = true;
                }
            }

            if (!hitTarget)
            {
                caster.audioSource.clip = abilitySound;
                caster.audioSource.Play();
            }


            caster.gameObject.layer = LayerMask.NameToLayer(oldLayer);
            yield return(new WaitForSeconds(caster.pauseAfterAttack));
        }

        caster.getAttackTrigger().resetTrigger();
        caster.canMove   = true;
        caster.attacking = false;
    }
예제 #28
0
 private void Start()
 {
     character = GetComponentInParent <CMoveCombatable>();
 }
예제 #29
0
    protected override IEnumerator abilityActionSequence()
    {
        //Wait until the attack frame in the animation has been reached
        while (!caster.getAttackTrigger().hasAttackTriggered())
        {
            yield return(null);
        }

        caster.rb2D.AddForce(direction * abilityVelocity / Time.timeScale);
        caster.getAttackTrigger().resetTrigger();

        //Check if attack can go through
        if (!caster.isDead())
        {
            Vector2 newPos = new Vector2(caster.transform.position.x, caster.transform.position.y + caster.objectHeight / 2);

            RaycastHit2D[] hitObject = Physics2D.RaycastAll(newPos, direction, abilityRange, CMoveCombatable.attackMask, -10, 10);
            Debug.DrawRay(newPos, direction * abilityRange, Color.black, 3f);

            bool hitTarget = false;

            //If the Raycast hits an object on the layer Enemy
            foreach (RaycastHit2D r in hitObject)
            {
                if (r && r.transform.gameObject != caster.gameObject && caster.attacking)
                {
                    //If an object has been hit first
                    if (r.transform.gameObject.tag == "Object")
                    {
                        if (r.collider.isTrigger)
                        {
                            continue;
                        }
                        else
                        {
                            break;
                        }
                    }

                    //Hit attack
                    CHitable        objectHit = r.transform.gameObject.GetComponentInParent <CHitable>();
                    CMoveCombatable targetHit = r.transform.gameObject.GetComponentInParent <CMoveCombatable>();

                    if (objectHit.isInvuln() || targetHit.faction == caster.faction || objectHit.isKnockedback() || targetHit.isDead()) //Add faction to hitables to use here instead of tags
                    {
                        continue;
                    }

                    //Set attacker and info on hit
                    objectHit.setAttacker(caster);
                    objectHit.lastAttackInfo = "A basic hit";
                    //objectHit.knockback(pos, abilityKnockback, objectHit.objectHeight); //Need to use original pos for knockback so the position of where you attacked from is the knockback
                    objectHit.loseHealth(abilityDamage);

                    //Apply stun to the target
                    //objectHit.applyStun(stunTime);

                    caster.audioSource.clip = caster.attackSound;
                    caster.audioSource.Play();
                    caster.attackHit();



                    if (targetHit != null)
                    {
                        targetHit.causeOfDeath = causeOfDeath;
                    }

                    lastAttack = Time.time;
                    //caster.canCombo = true;
                    caster.setComboAnimation(true);

                    hitTarget = true;
                    break;
                }
            }

            if (!hitTarget)
            {
                caster.audioSource.clip = caster.missSound;
                caster.audioSource.Play();
            }

            //Wait till attack animation is over
            while (!caster.getAttackTrigger().isAttackOver())
            {
                yield return(null);
            }

            caster.getAttackTrigger().resetAttack();
        }

        if (caster.canCombo)
        {
            caster.attack(comboAttack);
            yield break;
        }
        else
        {
            //Pause for caster
            yield return(new WaitForSeconds(caster.pauseAfterAttack));

            caster.setComboAnimation(false);
        }
        caster.canCombo  = false;
        caster.canMove   = true;
        caster.attacking = false;
    }
예제 #30
0
 public void applyEffect(CMoveCombatable character)
 {
     character.addToStat(cursedStat, -curseStrength);
 }