Search in sources :

Example 1 with Preparation

use of com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation in project shattered-pixel-dungeon-gdx by 00-Evan.

the class Char method attack.

public boolean attack(Char enemy) {
    if (enemy == null || !enemy.isAlive())
        return false;
    boolean visibleFight = Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[enemy.pos];
    if (hit(this, enemy, false)) {
        int dr = enemy.drRoll();
        if (this instanceof Hero) {
            Hero h = (Hero) this;
            if (h.belongings.weapon instanceof MissileWeapon && h.subClass == HeroSubClass.SNIPER) {
                dr = 0;
            }
        }
        int dmg;
        Preparation prep = buff(Preparation.class);
        if (prep != null) {
            dmg = prep.damageRoll(this, enemy);
        } else {
            dmg = damageRoll();
        }
        int effectiveDamage = Math.max(dmg - dr, 0);
        effectiveDamage = attackProc(enemy, effectiveDamage);
        effectiveDamage = enemy.defenseProc(this, effectiveDamage);
        if (visibleFight) {
            Sample.INSTANCE.play(Assets.SND_HIT, 1, 1, Random.Float(0.8f, 1.25f));
        }
        if (enemy == Dungeon.hero) {
            Dungeon.hero.interrupt();
        }
        // This matters as defence procs can sometimes inflict self-damage, such as armor glyphs.
        if (!enemy.isAlive()) {
            return true;
        }
        // TODO: consider revisiting this and shaking in more cases.
        float shake = 0f;
        if (enemy == Dungeon.hero)
            shake = effectiveDamage / (enemy.HT / 4);
        if (shake > 1f)
            Camera.main.shake(GameMath.gate(1, shake, 5), 0.3f);
        enemy.damage(effectiveDamage, this);
        if (buff(FireImbue.class) != null)
            buff(FireImbue.class).proc(enemy);
        if (buff(EarthImbue.class) != null)
            buff(EarthImbue.class).proc(enemy);
        enemy.sprite.bloodBurstA(sprite.center(), effectiveDamage);
        enemy.sprite.flash();
        if (!enemy.isAlive() && visibleFight) {
            if (enemy == Dungeon.hero) {
                Dungeon.fail(getClass());
                GLog.n(Messages.capitalize(Messages.get(Char.class, "kill", name)));
            } else if (this == Dungeon.hero) {
                GLog.i(Messages.capitalize(Messages.get(Char.class, "defeat", enemy.name)));
            }
        }
        return true;
    } else {
        if (visibleFight) {
            String defense = enemy.defenseVerb();
            enemy.sprite.showStatus(CharSprite.NEUTRAL, defense);
            Sample.INSTANCE.play(Assets.SND_MISS);
        }
        return false;
    }
}
Also used : FireImbue(com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue) Preparation(com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation) EarthImbue(com.shatteredpixel.shatteredpixeldungeon.actors.buffs.EarthImbue) Hero(com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero) MissileWeapon(com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon)

Aggregations

EarthImbue (com.shatteredpixel.shatteredpixeldungeon.actors.buffs.EarthImbue)1 FireImbue (com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue)1 Preparation (com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation)1 Hero (com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero)1 MissileWeapon (com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon)1