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;
}
}
Aggregations