@Override public boolean act() { if (target.isAlive()) { if ((level = Random.NormalIntRange(level / 2, level)) > 0) { target.damage(level, this); if (target.sprite.visible) { Splash.at( target.sprite.center(), -PointF.PI / 2, PointF.PI / 6, target.sprite.blood(), Math.min(10 * level / target.HT, 10)); } if (target == Dungeon.hero && !target.isAlive()) { Dungeon.fail(getClass()); GLog.n(Messages.get(this, "ondeath")); } spend(TICK); } else { detach(); } } else { detach(); } return true; }
@Override protected boolean getFurther(int target) { int step = Dungeon.flee(this, pos, target, Level.water, Level.fieldOfView); if (step != -1) { move(step); return true; } else { return false; } }
@Override public void apply(Hero hero) { setKnown(); Buff.affect(hero, MindVision.class, MindVision.DURATION); Dungeon.observe(); if (Dungeon.level.mobs.size() > 0) { GLog.i("You can somehow feel the presence of other creatures' minds!"); } else { GLog.i("You can somehow tell that you are alone on this level at the moment."); } }
public boolean checkOwner(Char owner) { if (!owner.isAlive() && owner instanceof Hero) { Dungeon.fail(Utils.format(ResultDescriptions.GLYPH, name())); GLog.n("%s killed you...", name()); Badges.validateDeathFromGlyph(); return true; } else { return false; } }
@Override protected boolean getCloser(int target) { if (rooted) { return false; } int step = Dungeon.findStep(this, pos, target, Level.water, Level.fieldOfView); if (step != -1) { move(step); return true; } else { return false; } }
public static void teleportHero(Hero hero) { int count = 10; int pos; do { pos = Dungeon.level.randomRespawnCell(); if (count-- <= 0) { break; } } while (pos == -1); if (pos == -1) { GLog.w(TXT_NO_TELEPORT); } else { appear(hero, pos); Dungeon.level.press(pos, hero); Dungeon.observe(); GLog.i(TXT_TELEPORTED); } }