Пример #1
0
	// Provides the expected damage resulting the attack.
	private int calculateExpectedDamage(Unit atk, Unit def) {
		float damage;
		Attack simulator = new Attack(atk, def);

		// Chance of hitting * (chance of normal damage * normal damage + chance of critical hit * cricical damage)
		damage = simulator.getDamage() * (1 - simulator.getCritChance()) + 3 * simulator.getDamage() * simulator.getCritChance();
		damage *= simulator.getHitChance();

		return Mathf.RoundToInt(damage);
	}
Пример #2
0
	// Takes the attack from an enemy unit, returning the counter-attack and attack results.
    // TODO: fix this weird attack problem
    // on counters it attacks itself?
	public List<AttackResult> takeAttackFrom(Unit enemy, int distance, bool firstAttack)
    {
        Attack atk = new Attack(enemy, this);

        List<AttackResult> attacks = new List<AttackResult>();
		AttackResult result = new AttackResult(HitType.Miss, 0, false, atk);
		AttackResult counter = new AttackResult(HitType.CannotCounter, 0, false);

        string statStr = "stats1 this " + ident() + ", clay: " + clay + ", endurance: " + currentWater;
        statStr += "\nstats1 enemy " + enemy.ident() + ", clay: " + enemy.clay + ", endurance: " + currentWater;
        statStr += "\nAttack info: " + atk;
        Debug.Log(statStr);

        Debug.Log("taking attack from: " + ident() + ", enemy doing this: " + enemy.ident());
        string playType = (isEnemy()) ? "enemy" : "player";

        if (Random.value <= atk.getHitChance())
        {
            result.setType(HitType.Hit);
            result.setDamageTaken(atk.getDamage());

            Debug.Log(playType + " was Hit!");

            if (Random.value <= atk.getCritChance())
            {
                clay -= (3 * atk.getDamage());

                result.setType(HitType.Crit);
                result.setDamageTaken(3 * atk.getDamage());
                Debug.Log("Crit!");
            }
            else
                clay -= atk.getDamage();
        }
        else
            Debug.Log(playType + " was Missed!");

		if(clay <= 0)
			result.setKilled(true);
		// Only counter if it is the first attack in a set and the enemy's range allows it
		else if(firstAttack && enemy.getMinAttackRange() <= distance && enemy.getMaxAttackRange() >= distance)
			counter = enemy.takeAttackFrom(this, distance, false)[0];

		// Add this enemy's result first, then the counter result
		attacks.Add(result);
		attacks.Add(counter);

        statStr = "\nstats2 this " + ident() + ", clay: " + clay + ", endurance: " + currentWater;
        statStr += "\nstats2 enemy " + enemy.ident() + ", clay: " + enemy.clay + ", endurance: " + currentWater;
        Debug.Log(statStr);
        return attacks;
	}