Home > Software design >  Formula to deal damage - armor
Formula to deal damage - armor

Time:10-14

I'm just starting to learn c# and got stuck in this exercise. I need to create a formula to deal damage - armor. The armor is reduced with each hit. If I write float damage = hp armor-(physicalDamage-damageStrength)it doesn't damage the enemy. The task says I should change only `float damage = ...' for this code to work. So, the mistake can be only in this line float damage =


[RequireComponent(typeof(Animator))]
public class Goblin : MonoBehaviour, IDamagable {

    static private string hitTriggerName = "Hit";

    [SerializeField] private float hp = 800;                   // health
    [SerializeField] private float armor = 100;                // armor
    [SerializeField] private float armorStrength = 5;    // armor decrease each time
    [SerializeField] private int n = 0; // number of hits
    private Animator selfAnimator;

    private void Awake() {
        selfAnimator = GetComponent<Animator>();
    }

    public void ApplyDamage(float physicalDamage, float damageStrength) {
        float damage = hp armor-physicalDamage-damageStrength;
        
        if (damage < 0) {
            hp  = damage;
        }
        n  = 1;
        armor -= armorStrength;
        selfAnimator.SetTrigger(hitTriggerName);
    }

    public void onHitAnimationEnd() {
        if (hp <= 0) {
            Kill();
        }
    }

    private void Kill() {
        Destroy(gameObject);
    }
}```

***Corersponding part of a "player" object***


```using System;
using UnityEngine;

[RequireComponent(typeof(Animator))]
public class Player : MonoBehaviour {

    static private string attackTriggerName = "Attack";

    [SerializeField] private float attackCooldown = 0.1f;
    [SerializeField] private Goblin aim;
    
    private float timeToNextAttack = 0f;
    private Animator selfAnimator;

    private void Awake() {
        selfAnimator = GetComponent<Animator>();
    }

    [Serializable] private class Staff {
        [SerializeField] private float physicalDamage = 100;   // staff damage
        [SerializeField] private float damageStrength = 5;       // damage reduction each time

        public void Use(IDamagable aim) {
            if (aim != null) {
                aim.ApplyDamage(physicalDamage, damageStrength);
            }
        }
    }

    [SerializeField] private Staff weapon;


    private void Attack() {
        selfAnimator.SetTrigger(attackTriggerName);
        weapon.Use(aim);
        timeToNextAttack = attackCooldown;
    }

    private void Update() {
        if (Input.GetKeyDown(KeyCode.Space) && timeToNextAttack <= 0) {
            Attack();
        }

        timeToNextAttack -= Time.deltaTime;
    }

}```

CodePudding user response:

I may be wrong or didn't understand, but by quickly looking at the code, I'd suggest you declare the damage variable above the Awake function. And give it a 0.0f value by default.

CodePudding user response:

I think you made two unrelated mistakes:

  • damage sould be only: float damage = armor-physicalDamage
  • damageStrength should not be a parameter of the method because it should be applied to the staff physicalDamage after the hit, like you did to the armor.
  • Related