v0.3.4: externalized all remaining actor strings

This commit is contained in:
Evan Debenham
2015-12-29 20:09:44 -05:00
committed by Evan Debenham
parent c3b964a8cc
commit 2c76c77360
53 changed files with 415 additions and 812 deletions
@@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Yog;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Door;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
@@ -44,15 +45,6 @@ import com.watabou.utils.Random;
import java.util.HashSet;
public abstract class Char extends Actor {
protected static final String TXT_HIT = "%s hit %s";
protected static final String TXT_KILL = "%s killed you...";
protected static final String TXT_DEFEAT = "%s defeated %s";
private static final String TXT_YOU_MISSED = "%s %s your attack";
private static final String TXT_SMB_MISSED = "%s %s %s's attack";
private static final String TXT_OUT_OF_PARALYSIS = "The pain snapped %s out of paralysis";
public int pos = 0;
@@ -72,7 +64,7 @@ public abstract class Char extends Actor {
public int viewDistance = 8;
private HashSet<Buff> buffs = new HashSet<Buff>();
private HashSet<Buff> buffs = new HashSet<>();
@Override
protected boolean act() {
@@ -121,7 +113,7 @@ public abstract class Char extends Actor {
if (hit( this, enemy, false )) {
if (visibleFight) {
GLog.i( TXT_HIT, name, enemy.name );
GLog.i( Messages.get(Char.class, "hit", name, enemy.name) );
}
// FIXME
@@ -173,10 +165,10 @@ public abstract class Char extends Actor {
Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name )) );
}
GLog.n( TXT_KILL, name );
GLog.n( Messages.get(Char.class, "kill", name) );
} else {
GLog.i( TXT_DEFEAT, name, enemy.name );
GLog.i( Messages.get(Char.class, "defeat", name, enemy.name) );
}
}
@@ -188,9 +180,9 @@ public abstract class Char extends Actor {
String defense = enemy.defenseVerb();
enemy.sprite.showStatus( CharSprite.NEUTRAL, defense );
if (this == Dungeon.hero) {
GLog.i( TXT_YOU_MISSED, enemy.name, defense );
GLog.i( Messages.get(Char.class, "you_missed", enemy.name, defense) );
} else {
GLog.i( TXT_SMB_MISSED, enemy.name, defense, name );
GLog.i( Messages.get(Char.class, "smb_missed", enemy.name, defense, name) );
}
Sample.INSTANCE.play(Assets.SND_MISS);
@@ -218,7 +210,7 @@ public abstract class Char extends Actor {
}
public String defenseVerb() {
return "dodged";
return Messages.get(this, "def_verb");
}
public int dr() {
@@ -264,7 +256,7 @@ public abstract class Char extends Actor {
if (Random.Int( dmg ) >= Random.Int( HP )) {
Buff.detach( this, Paralysis.class );
if (Dungeon.visible[pos]) {
GLog.i( TXT_OUT_OF_PARALYSIS, name );
GLog.i( Messages.get(Char.class, "out_of_paralysis", name) );
}
}
}
@@ -318,7 +310,7 @@ public abstract class Char extends Actor {
@SuppressWarnings("unchecked")
public <T extends Buff> HashSet<T> buffs( Class<T> c ) {
HashSet<T> filtered = new HashSet<T>();
HashSet<T> filtered = new HashSet<>();
for (Buff b : buffs) {
if (c.isInstance( b )) {
filtered.add( (T)b );
@@ -381,7 +373,7 @@ public abstract class Char extends Actor {
@Override
protected void onRemove() {
for (Buff buff : buffs.toArray( new Buff[0] )) {
for (Buff buff : buffs.toArray(new Buff[buffs.size()])) {
buff.detach();
}
}
@@ -440,7 +432,7 @@ public abstract class Char extends Actor {
next();
}
private static final HashSet<Class<?>> EMPTY = new HashSet<Class<?>>();
private static final HashSet<Class<?>> EMPTY = new HashSet<>();
public HashSet<Class<?>> resistances() {
return EMPTY;
@@ -28,7 +28,6 @@ import com.watabou.utils.Random;
public class Acidic extends Scorpio {
{
name = "acidic scorpio";
spriteClass = AcidicSprite.class;
}
@@ -30,7 +30,6 @@ import com.watabou.utils.Random;
public class Albino extends Rat {
{
name = "albino rat";
spriteClass = AlbinoSprite.class;
HP = HT = 15;
@@ -50,10 +49,4 @@ public class Albino extends Rat {
return damage;
}
@Override
public String description() {
return
"This is a rare breed of marsupial rat, with pure white fur and jagged teeth.";
}
}
@@ -37,7 +37,6 @@ public class Bandit extends Thief {
public Item item;
{
name = "crazy bandit";
spriteClass = BanditSprite.class;
//1 in 30 chance to be a crazy bandit, equates to overall 1/90 chance.
@@ -34,7 +34,6 @@ import com.watabou.utils.Random;
public class Bat extends Mob {
{
name = "vampire bat";
spriteClass = BatSprite.class;
HP = HT = 30;
@@ -65,11 +64,6 @@ public class Bat extends Mob {
return 4;
}
@Override
public String defenseVerb() {
return "evaded";
}
@Override
public int attackProc( Char enemy, int damage ) {
@@ -96,14 +90,7 @@ public class Bat extends Mob {
return super.createLoot();
}
@Override
public String description() {
return
"These brisk and tenacious inhabitants of cave domes may defeat much larger opponents by " +
"replenishing their health with each successful attack.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( Leech.class );
}
@@ -35,7 +35,6 @@ import com.watabou.utils.Random;
public class Bee extends Mob {
{
name = "golden bee";
spriteClass = BeeSprite.class;
viewDistance = 4;
@@ -126,7 +125,7 @@ public class Bee extends Mob {
return enemy;
//find all mobs near the pot
HashSet<Char> enemies = new HashSet<Char>();
HashSet<Char> enemies = new HashSet<>();
for (Mob mob : Dungeon.level.mobs)
if (!(mob instanceof Bee) && Level.distance(mob.pos, potPos) <= 3 && (mob.hostile || mob.ally))
enemies.add(mob);
@@ -145,15 +144,8 @@ public class Bee extends Mob {
this.target = target = potPos;
return super.getCloser( target );
}
@Override
public String description() {
return
"Despite their small size, golden bees tend " +
"to protect their home fiercely. This one is very mad, better keep your distance.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Poison.class );
IMMUNITIES.add( Amok.class );
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.BruteSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@@ -33,11 +34,8 @@ import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class Brute extends Mob {
private static final String TXT_ENRAGED = "%s becomes enraged!";
{
name = "gnoll brute";
spriteClass = BruteSprite.class;
HP = HT = 40;
@@ -83,20 +81,13 @@ public class Brute extends Mob {
enraged = true;
spend( TICK );
if (Dungeon.visible[pos]) {
GLog.w( TXT_ENRAGED, name );
sprite.showStatus( CharSprite.NEGATIVE, "enraged" );
GLog.w( Messages.get(this, "engraged_text") );
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "engraged") );
}
}
}
@Override
public String description() {
return
"Brutes are the largest, strongest and toughest of all gnolls. When severely wounded, " +
"they go berserk, inflicting even more damage to their enemies.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Terror.class );
}
@@ -29,7 +29,6 @@ import com.watabou.utils.Random;
public class Crab extends Mob {
{
name = "sewer crab";
spriteClass = CrabSprite.class;
HP = HT = 15;
@@ -57,17 +56,4 @@ public class Crab extends Mob {
public int dr() {
return 4;
}
@Override
public String defenseVerb() {
return "parried";
}
@Override
public String description() {
return
"These huge crabs are at the top of the food chain in the sewers. " +
"They are extremely fast and their thick carapace can withstand " +
"heavy blows.";
}
}
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.watabou.noosa.Camera;
import com.watabou.noosa.audio.Sample;
@@ -55,7 +56,6 @@ import com.watabou.utils.Random;
public class DM300 extends Mob {
{
name = "DM-300";
spriteClass = DM300Sprite.class;
HP = HT = 200;
@@ -101,7 +101,7 @@ public class DM300 extends Mob {
sprite.emitter().burst( ElmoParticle.FACTORY, 5 );
if (Dungeon.visible[step] && Dungeon.hero.isAlive()) {
GLog.n( "DM-300 repairs itself!" );
GLog.n( Messages.get(this, "repair") );
}
}
@@ -156,25 +156,17 @@ public class DM300 extends Mob {
GLog.p("Your beacon grows stronger!");
}
yell( "Mission failed. Shutting down." );
yell( Messages.get(this, "defeated") );
}
@Override
public void notice() {
super.notice();
BossHealthBar.assignBoss(this);
yell( "Unauthorised personnel detected." );
yell( Messages.get(this, "notice") );
}
@Override
public String description() {
return
"This machine was created by the Dwarves several centuries ago. Later, Dwarves started to replace machines with " +
"golems, elementals and even demons. Eventually it led their civilization to the decline. The DM-300 and similar " +
"machines were typically used for construction and mining, and in some cases, for city defense.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( Death.class );
RESISTANCES.add( ScrollOfPsionicBlast.class );
@@ -185,7 +177,7 @@ public class DM300 extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( ToxicGas.class );
IMMUNITIES.add( Terror.class );
@@ -38,7 +38,6 @@ import com.watabou.utils.Random;
public class Elemental extends Mob {
{
name = "fire elemental";
spriteClass = ElementalSprite.class;
HP = HT = 65;
@@ -96,14 +95,7 @@ public class Elemental extends Mob {
}
}
@Override
public String description() {
return
"Wandering fire elementals are a byproduct of summoning greater entities. " +
"They are too chaotic in their nature to be controlled by even the most powerful demonologist.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Burning.class );
IMMUNITIES.add( Fire.class );
@@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfDisintegration
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Death;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Leech;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.EyeSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@@ -43,10 +44,7 @@ import com.watabou.utils.Random;
public class Eye extends Mob {
private static final String TXT_DEATHGAZE_KILLED = "%s's deathgaze killed you...";
{
name = "evil eye";
spriteClass = EyeSprite.class;
HP = HT = 100;
@@ -131,7 +129,7 @@ public class Eye extends Mob {
if (!ch.isAlive() && ch == Dungeon.hero) {
Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name ) ) );
GLog.n( TXT_DEATHGAZE_KILLED, name );
GLog.n( Messages.get(this, "deathgaze_kill") );
}
} else {
ch.sprite.showStatus( CharSprite.NEUTRAL, ch.defenseVerb() );
@@ -141,14 +139,7 @@ public class Eye extends Mob {
return true;
}
@Override
public String description() {
return
"One of this demon's other names is \"orb of hatred\", because when it sees an enemy, " +
"it uses its deathgaze recklessly, often ignoring its allies and wounding them.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( WandOfDisintegration.class );
RESISTANCES.add( Death.class );
@@ -160,7 +151,7 @@ public class Eye extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Terror.class );
}
@@ -35,7 +35,6 @@ import java.util.HashSet;
public class FetidRat extends Rat {
{
name = "fetid rat";
spriteClass = FetidRatSprite.class;
HP = HT = 20;
@@ -83,17 +82,7 @@ public class FetidRat extends Rat {
Ghost.Quest.process();
}
@Override
public String description() {
return
"Something is clearly wrong with this rat. Its greasy black fur and rotting skin are very " +
"different from the healthy rats you've seen previously. It's pale green eyes " +
"make it seem especially menacing.\n\n" +
"The rat carries a cloud of horrible stench with it, it's overpoweringly strong up close.\n\n" +
"Dark ooze dribbles from the rat's mouth, it eats through the floor but seems to dissolve in water.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( StenchGas.class );
}
@@ -29,7 +29,6 @@ import com.watabou.utils.Random;
public class Gnoll extends Mob {
{
name = "gnoll scout";
spriteClass = GnollSprite.class;
HP = HT = 12;
@@ -56,11 +55,4 @@ public class Gnoll extends Mob {
public int dr() {
return 2;
}
@Override
public String description() {
return
"Gnolls are hyena-like humanoids. They dwell in sewers and dungeons, venturing up to raid the surface from time to time. " +
"Gnoll scouts are regular members of their pack, they are not as strong as brutes and not as intelligent as shamans.";
}
}
@@ -37,8 +37,8 @@ import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class GnollTrickster extends Gnoll {
{
name = "gnoll trickster";
spriteClass = GnollTricksterSprite.class;
HP = HT = 20;
@@ -105,16 +105,6 @@ public class GnollTrickster extends Gnoll {
Ghost.Quest.process();
}
@Override
public String description() {
return
"A strange looking creature, even by gnoll standards. It hunches forward with a wicked grin, " +
"almost cradling the satchel hanging over its shoulder. Its eyes are wide with a strange mix of " +
"fear and excitement.\n\n" +
"There is a large collection of poorly made darts in its satchel, they all seem to be " +
"tipped with various harmful substances.";
}
private static final String COMBO = "combo";
@Override
@@ -34,7 +34,6 @@ import com.watabou.utils.Random;
public class Golem extends Mob {
{
name = "golem";
spriteClass = GolemSprite.class;
HP = HT = 85;
@@ -63,28 +62,14 @@ public class Golem extends Mob {
public int dr() {
return 12;
}
@Override
public String defenseVerb() {
return "blocked";
}
@Override
public void die( Object cause ) {
Imp.Quest.process( this );
super.die( cause );
}
@Override
public String description() {
return
"The Dwarves tried to combine their knowledge of mechanisms with their newfound power of elemental binding. " +
"They used spirits of earth as the \"soul\" for the mechanical bodies of golems, which were believed to be " +
"most controllable of all. Despite this, the tiniest mistake in the ritual could cause an outbreak.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
}
@@ -93,7 +78,7 @@ public class Golem extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Amok.class );
IMMUNITIES.add( Terror.class );
@@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.watabou.noosa.Camera;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
@@ -52,8 +53,8 @@ import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class Goo extends Mob {
{
name = "Goo";
HP = HT = 100;
EXP = 10;
defenseSkill = 8;
@@ -184,8 +185,8 @@ public class Goo extends Mob {
}
if (Dungeon.visible[pos]) {
sprite.showStatus( CharSprite.NEGATIVE, "!!!" );
GLog.n( "Goo is pumping itself up!" );
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "!!!") );
GLog.n( Messages.get(this, "pumpup") );
}
spend( attackDelay() );
@@ -219,10 +220,10 @@ public class Goo extends Mob {
super.damage(dmg, src);
if ((HP*2 <= HT) && !bleeding){
BossHealthBar.bleed(true);
GLog.w("Goo Becomes Enraged!!");
sprite.showStatus(CharSprite.NEGATIVE, "enraged");
GLog.w( Messages.get(this, "enraged_text") );
sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this, "enraged"));
((GooSprite)sprite).spray(true);
yell("GLUUUURP!");
yell(Messages.get(this, "gluuurp"));
spend( TICK );
}
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
@@ -241,24 +242,14 @@ public class Goo extends Mob {
Badges.validateBossSlain();
yell( "glurp... glurp..." );
yell( Messages.get(this, "defeated") );
}
@Override
public void notice() {
super.notice();
BossHealthBar.assignBoss(this);
yell( "GLURP-GLURP!" );
}
@Override
public String description() {
return
"Little is known about The Goo. It's quite possible that it is not even a creature, but rather a " +
"conglomerate of vile substances from the sewers that somehow gained basic intelligence. " +
"Regardless, dark magic is certainly what has allowed Goo to exist.\n\n" +
"Its gelatinous nature has let it absorb lots of dark energy, you feel a chill just from being near. " +
"If goo is able to attack with this energy you won't live for long.";
yell( Messages.get(this, "notice") );
}
private final String PUMPEDUP = "pumpedup";
@@ -282,7 +273,7 @@ public class Goo extends Mob {
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( ToxicGas.class );
RESISTANCES.add( Death.class );
@@ -26,13 +26,14 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Ghost;
import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.LightningTrap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GreatCrabSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
public class GreatCrab extends Crab {
{
name = "great crab";
spriteClass = GreatCrabSprite.class;
HP = HT = 25;
@@ -66,8 +67,8 @@ public class GreatCrab extends Crab {
//crab blocks all attacks originating from the hero or enemy characters or traps if it is alerted.
//All direct damage from these sources is negated, no exceptions. blob/debuff effects go through as normal.
if (enemySeen && (src instanceof Wand || src instanceof LightningTrap.Electricity || src instanceof Char)){
GLog.n("The crab notices the attack and blocks with its massive claw.");
sprite.showStatus( CharSprite.NEUTRAL, "blocked" );
GLog.n( Messages.get(this, "noticed") );
sprite.showStatus( CharSprite.NEUTRAL, Messages.get(this, "blocked") );
} else {
super.damage( dmg, src );
}
@@ -82,15 +83,4 @@ public class GreatCrab extends Crab {
Dungeon.level.drop( new MysteryMeat(), pos );
Dungeon.level.drop( new MysteryMeat(), pos ).sprite.drop();
}
@Override
public String description() {
return
"This crab is gigantic, even compared to other sewer crabs. " +
"Its blue shell is covered in cracks and barnacles, showing great age. " +
"It lumbers around slowly, barely keeping balance with its massive claw.\n\n" +
"While the crab only has one claw, its size easily compensates. " +
"The crab holds the claw infront of itself whenever it sees a threat, shielding " +
"itself behind an impenetrable wall of carapace.";
}
}
@@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GuardSprite;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
@@ -42,7 +43,6 @@ public class Guard extends Mob {
private boolean chainsUsed = false;
{
name = "prison guard";
spriteClass = GuardSprite.class;
HP = HT = 30;
@@ -104,7 +104,7 @@ public class Guard extends Mob {
return false;
} else {
final int newPosFinal = newPos;
yell("get over here!");
yell( Messages.get(this, "scorpion") );
sprite.parent.add(new Chains(pos, enemy.pos, new Callback() {
public void call() {
Actor.addDelayed(new Pushing(enemy, enemy.pos, newPosFinal), -1);
@@ -134,11 +134,6 @@ public class Guard extends Mob {
return 7;
}
@Override
public String defenseVerb() {
return "blocked";
}
@Override
protected Item createLoot() {
//first see if we drop armor, chance is 1/8 (0.125f)
@@ -156,13 +151,6 @@ public class Guard extends Mob {
return null;
}
@Override
public String description() {
return "Once keepers of the prison, these guards have long since become no different than the inmates. " +
"They shamble like zombies, brainlessly roaming through the halls in search of anything out of place, like you!\n\n" +
"They carry chains around their hip, possibly used to pull in enemies to close range.";
}
private final String CHAINSUSED = "chainsused";
@Override
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
@@ -58,7 +59,6 @@ public class King extends Mob {
private static final int MAX_ARMY_SIZE = 5;
{
name = "King of Dwarves";
spriteClass = KingSprite.class;
HP = HT = 300;
@@ -103,11 +103,6 @@ public class King extends Mob {
return 14;
}
@Override
public String defenseVerb() {
return "parried";
}
@Override
protected boolean getCloser( int target ) {
return canTryToSummon() ?
@@ -168,7 +163,7 @@ public class King extends Mob {
GLog.p("Your beacon grows stronger!");
}
yell( "You cannot kill me, " + Dungeon.hero.givenName() + "... I am... immortal..." );
yell( Messages.get(this, "defeated") );
}
@Override
@@ -225,26 +220,17 @@ public class King extends Mob {
} while (dist < undeadsToSummon);
}
yell( "Arise, slaves!" );
yell( Messages.get(this, "arise") );
}
@Override
public void notice() {
super.notice();
BossHealthBar.assignBoss(this);
yell( "How dare you!" );
yell( Messages.get(this, "notice") );
}
@Override
public String description() {
return
"The last king of dwarves was known for his deep understanding of processes of life and death. " +
"He has persuaded members of his court to participate in a ritual, that should have granted them " +
"eternal youthfulness. In the end he was the only one, who got it - and an army of undead " +
"as a bonus.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( ToxicGas.class );
RESISTANCES.add( Death.class );
@@ -257,7 +243,7 @@ public class King extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Paralysis.class );
IMMUNITIES.add( Vertigo.class );
@@ -273,7 +259,6 @@ public class King extends Mob {
public static int count = 0;
{
name = "undead dwarf";
spriteClass = UndeadSprite.class;
HP = HT = 28;
@@ -338,20 +323,8 @@ public class King extends Mob {
public int dr() {
return 5;
}
@Override
public String defenseVerb() {
return "blocked";
}
@Override
public String description() {
return
"These undead dwarves, risen by the will of the King of Dwarves, were members of his court. " +
"They appear as skeletons with a stunning amount of facial hair.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Death.class );
IMMUNITIES.add( Paralysis.class );
@@ -48,7 +48,6 @@ public class Mimic extends Mob {
private int level;
{
name = "mimic";
spriteClass = MimicSprite.class;
properties.add(Property.DEMONIC);
@@ -69,7 +68,7 @@ public class Mimic extends Mob {
@SuppressWarnings("unchecked")
@Override
public void restoreFromBundle( Bundle bundle ) {
items = new ArrayList<Item>( (Collection<Item>) ((Collection<?>) bundle.getCollection( ITEMS ) ));
items = new ArrayList<>( (Collection<Item>) ((Collection<?>) bundle.getCollection( ITEMS ) ));
adjustStats( bundle.getInt( LEVEL ) );
super.restoreFromBundle(bundle);
}
@@ -112,17 +111,10 @@ public class Mimic extends Mob {
return true;
}
@Override
public String description() {
return
"Mimics are magical creatures which can take any shape they wish. In dungeons they almost always " +
"choose a shape of a treasure chest, because they know how to beckon an adventurer.";
}
public static Mimic spawnAt( int pos, List<Item> items ) {
Char ch = Actor.findChar( pos );
if (ch != null) {
ArrayList<Integer> candidates = new ArrayList<Integer>();
ArrayList<Integer> candidates = new ArrayList<>();
for (int n : Level.NEIGHBOURS8) {
int cell = pos + n;
if ((Level.passable[cell] || Level.avoid[cell]) && Actor.findChar( cell ) == null) {
@@ -146,7 +138,7 @@ public class Mimic extends Mob {
}
Mimic m = new Mimic();
m.items = new ArrayList<Item>( items );
m.items = new ArrayList<>( items );
m.adjustStats( Dungeon.depth );
m.pos = pos;
m.state = m.HUNTING;
@@ -174,7 +166,7 @@ public class Mimic extends Mob {
return m;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( ScrollOfPsionicBlast.class );
}
@@ -45,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfAccuracy;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfWealth;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level.Feeling;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
@@ -56,6 +57,7 @@ import java.util.HashSet;
public abstract class Mob extends Char {
{
name = Messages.get(this, "name");
actPriority = 2; //hero gets priority over mobs.
}
@@ -184,7 +186,7 @@ public abstract class Mob extends Char {
if ( enemy == null || !enemy.isAlive() || state == WANDERING ||
((buff( Amok.class ) != null || buff(Corruption.class) != null) && enemy == Dungeon.hero )) {
HashSet<Char> enemies = new HashSet<Char>();
HashSet<Char> enemies = new HashSet<>();
//if the mob is amoked or corrupted...
if ( buff(Amok.class) != null || buff(Corruption.class) != null) {
@@ -241,7 +243,7 @@ public abstract class Mob extends Char {
super.add( buff );
if (buff instanceof Amok) {
if (sprite != null) {
sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE );
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "rage") );
}
state = HUNTING;
} else if (buff instanceof Terror) {
@@ -257,7 +259,7 @@ public abstract class Mob extends Char {
public void remove( Buff buff ) {
super.remove( buff );
if (buff instanceof Terror) {
sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE );
sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "rage") );
state = HUNTING;
}
}
@@ -426,7 +428,7 @@ public abstract class Mob extends Char {
int exp = exp();
if (exp > 0) {
Dungeon.hero.sprite.showStatus( CharSprite.POSITIVE, TXT_EXP, exp );
Dungeon.hero.sprite.showStatus( CharSprite.POSITIVE, Messages.get(this, "exp", exp) );
Dungeon.hero.earnExp( exp );
}
}
@@ -456,7 +458,7 @@ public abstract class Mob extends Char {
}
if (Dungeon.hero.isAlive() && !Dungeon.visible[pos]) {
GLog.i( TXT_DIED );
GLog.i( Messages.get(this, "dead") );
}
}
@@ -497,7 +499,7 @@ public abstract class Mob extends Char {
}
public String description() {
return "Real description is coming soon!";
return Messages.get(this, "desc");
}
public void notice() {
@@ -514,8 +516,8 @@ public abstract class Mob extends Char {
}
public interface AiState {
public boolean act( boolean enemyInFOV, boolean justAlerted );
public String status();
boolean act( boolean enemyInFOV, boolean justAlerted );
String status();
}
protected class Sleeping implements AiState {
@@ -554,7 +556,7 @@ public abstract class Mob extends Char {
@Override
public String status() {
return Utils.format( "This %s is sleeping", name );
return Messages.get(this, "status", name );
}
}
@@ -591,7 +593,7 @@ public abstract class Mob extends Char {
@Override
public String status() {
return Utils.format( "This %s is wandering", name );
return Messages.get(this, "status", name );
}
}
@@ -630,7 +632,7 @@ public abstract class Mob extends Char {
@Override
public String status() {
return Utils.format( "This %s is hunting", name );
return Messages.get(this, "status", name );
}
}
@@ -668,7 +670,7 @@ public abstract class Mob extends Char {
@Override
public String status() {
return Utils.format( "This %s is fleeing", name );
return Messages.get(this, "status", name );
}
}
@@ -685,7 +687,7 @@ public abstract class Mob extends Char {
@Override
public String status() {
return Utils.format( "This %s is passive", name );
return Messages.get(this, "status", name );
}
}
}
@@ -31,17 +31,15 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp;
import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Knuckles;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MonkSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class Monk extends Mob {
public static final String TXT_DISARM = "%s has knocked the %s from your hands!";
{
name = "dwarf monk";
spriteClass = MonkSprite.class;
HP = HT = 70;
@@ -76,11 +74,6 @@ public class Monk extends Mob {
return 2;
}
@Override
public String defenseVerb() {
return "parried";
}
@Override
public void die( Object cause ) {
Imp.Quest.process( this );
@@ -106,7 +99,7 @@ public class Monk extends Mob {
Dungeon.quickslot.clearItem(weapon);
weapon.updateQuickslot();
Dungeon.level.drop(weapon, hero.pos).sprite.drop();
GLog.w(TXT_DISARM, name, weapon.name());
GLog.w(Messages.get(this, "diarm", weapon.name()));
}
}
}
@@ -114,14 +107,7 @@ public class Monk extends Mob {
return damage;
}
@Override
public String description() {
return
"These monks are fanatics, who devoted themselves to protecting their city's secrets from all aliens. " +
"They don't use any armor or weapons, relying solely on the art of hand-to-hand combat.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Amok.class );
IMMUNITIES.add( Terror.class );
@@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.NewbornElementalSprite;
public class NewbornElemental extends Elemental {
{
name = "newborn fire elemental";
spriteClass = NewbornElementalSprite.class;
HT = 65;
@@ -62,13 +61,4 @@ public class NewbornElemental extends Elemental {
super.die(cause);
Dungeon.level.drop( new Embers(), pos ).sprite.drop();
}
@Override
public String description() {
return "Fire elementals are a byproduct of summoning greater entities. " +
"They are too chaotic in their nature to be controlled by even the most powerful demonologist.\n\n" +
"This fire elemental is freshy summoned, and is weakened as a result. " +
"In this state is it especially vulnerable to the cold. " +
"Its offensive capabilities are still great though, caution is advised.";
}
}
@@ -39,7 +39,6 @@ import com.watabou.utils.Random;
public class Piranha extends Mob {
{
name = "giant piranha";
spriteClass = PiranhaSprite.class;
baseSpeed = 2f;
@@ -140,15 +139,8 @@ public class Piranha extends Mob {
return false;
}
}
@Override
public String description() {
return
"These carnivorous fish are not natural inhabitants of underground pools. " +
"They were bred specifically to protect flooded treasure vaults.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Burning.class );
IMMUNITIES.add( Paralysis.class );
@@ -28,7 +28,6 @@ import com.watabou.utils.Random;
public class Rat extends Mob {
{
name = "marsupial rat";
spriteClass = RatSprite.class;
HP = HT = 8;
@@ -51,11 +50,4 @@ public class Rat extends Mob {
public int dr() {
return 1;
}
@Override
public String description() {
return
"Marsupial rats are aggressive but rather weak denizens " +
"of the sewers. They have a nasty bite, but are only life threatening in large numbers.";
}
}
@@ -34,7 +34,6 @@ import java.util.HashSet;
public class RotHeart extends Mob {
{
name = "rot heart";
spriteClass = RotHeartSprite.class;
HP = HT = 80;
@@ -102,14 +101,6 @@ public class RotHeart extends Mob {
return 5;
}
@Override
public String description() {
return
"A Rotberry's fruit is very unique. Instead of rotting away and providing nutrients, the fruit grows, " +
"hardens, and encompasses the seed. It provides protection for the internal organs which grow " +
"inside the fruit. This giant orb is referred to as the heart of an adult rotberry plant.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( ToxicGas.class );
@@ -36,7 +36,6 @@ import java.util.HashSet;
public class RotLasher extends Mob {
{
name = "rot lasher";
spriteClass = RotLasherSprite.class;
HP = HT = 40;
@@ -101,14 +100,6 @@ public class RotLasher extends Mob {
return 8;
}
@Override
public String description() {
return
"The rot lasher is a part of a mature rotberry plant's root structure, and also their primary means of defence. " +
"Lashers are stuck into the ground, but will violently assault anything that gets near to them. " +
"When there is no nearby prey, they stand motionless, attempting to blend in with surrounding vegetation.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( ToxicGas.class );
@@ -119,10 +110,5 @@ public class RotLasher extends Mob {
return IMMUNITIES;
}
private class Waiting extends Mob.Wandering{
@Override
public String status() {
return Utils.format("This %s is idle", name);
}
}
private class Waiting extends Mob.Wandering{}
}
@@ -40,7 +40,6 @@ import com.watabou.utils.Random;
public class Scorpio extends Mob {
{
name = "scorpio";
spriteClass = ScorpioSprite.class;
HP = HT = 95;
@@ -106,14 +105,7 @@ public class Scorpio extends Mob {
}
}
@Override
public String description() {
return
"These huge arachnid-like demonic creatures avoid close combat by all means, " +
"firing crippling serrated spikes from long distances.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( Leech.class );
RESISTANCES.add( Poison.class );
@@ -30,7 +30,6 @@ import com.watabou.utils.Random;
public class Senior extends Monk {
{
name = "senior monk";
spriteClass = SeniorSprite.class;
}
@@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import java.util.HashSet;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.noosa.Camera;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions;
@@ -42,10 +43,7 @@ public class Shaman extends Mob implements Callback {
private static final float TIME_TO_ZAP = 1f;
private static final String TXT_LIGHTNING_KILLED = "%s's lightning bolt killed you...";
{
name = "gnoll shaman";
spriteClass = ShamanSprite.class;
HP = HT = 18;
@@ -89,7 +87,7 @@ public class Shaman extends Mob implements Callback {
boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos];
if (visible) {
((ShamanSprite)sprite).zap( enemy.pos );
sprite.zap( enemy.pos );
}
spend( TIME_TO_ZAP );
@@ -110,7 +108,7 @@ public class Shaman extends Mob implements Callback {
if (!enemy.isAlive()) {
Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name ) ) );
GLog.n( TXT_LIGHTNING_KILLED, name );
GLog.n( Messages.get(this, "zap_kill") );
}
}
} else {
@@ -125,16 +123,8 @@ public class Shaman extends Mob implements Callback {
public void call() {
next();
}
@Override
public String description() {
return
"The most intelligent gnolls can master shamanistic magic. Gnoll shamans prefer " +
"battle spells to compensate for lack of might, not hesitating to use them " +
"on those who question their status in a tribe.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( LightningTrap.Electricity.class );
}
@@ -26,7 +26,6 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ShieldedSprite;
public class Shielded extends Brute {
{
name = "shielded brute";
spriteClass = ShieldedSprite.class;
defenseSkill = 20;
@@ -37,11 +36,6 @@ public class Shielded extends Brute {
return 10;
}
@Override
public String defenseVerb() {
return "blocked";
}
@Override
public void die( Object cause ) {
super.die( cause );
@@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import java.util.HashSet;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@@ -41,7 +42,6 @@ public class Skeleton extends Mob {
private static final String TXT_HERO_KILLED = "You were killed by the explosion of bones...";
{
name = "skeleton";
spriteClass = SkeletonSprite.class;
HP = HT = 25;
@@ -84,7 +84,7 @@ public class Skeleton extends Mob {
if (heroKilled) {
Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name ) ) );
GLog.n( TXT_HERO_KILLED );
GLog.n( Messages.get(this, "explo_kill") );
}
}
@@ -110,20 +110,7 @@ public class Skeleton extends Mob {
return 5;
}
@Override
public String defenseVerb() {
return "blocked";
}
@Override
public String description() {
return
"Skeletons are composed of corpses bones from unlucky adventurers and inhabitants of the dungeon, " +
"animated by emanations of evil magic from the depths below. After they have been " +
"damaged enough, they disintegrate in an explosion of bones.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Death.class );
}
@@ -37,7 +37,6 @@ import com.watabou.utils.Random;
public class Spinner extends Mob {
{
name = "cave spinner";
spriteClass = SpinnerSprite.class;
HP = HT = 50;
@@ -96,14 +95,7 @@ public class Spinner extends Mob {
super.move(step);
}
@Override
public String description() {
return
"These greenish furry cave spiders try to avoid direct combat, preferring to wait in the distance " +
"while their victim, entangled in the spinner's excreted cobweb, slowly dies from their poisonous bite.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add(Poison.class);
@@ -114,7 +106,7 @@ public class Spinner extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add(Roots.class);
@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon.Enchantment;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Death;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Leech;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.StatueSprite;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
@@ -147,13 +148,11 @@ public class Statue extends Mob {
@Override
public String description() {
return
"You would think that it's just another one of this dungeon's ugly statues, but its red glowing eyes give it away." +
"\n\nWhile the statue itself is made of stone, the _" + weapon.name() + "_, it's wielding, looks real.";
return Messages.get(this, "desc", weapon.name());
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
RESISTANCES.add( ToxicGas.class );
RESISTANCES.add( Poison.class );
@@ -47,7 +47,6 @@ public class Succubus extends Mob {
private int delay = 0;
{
name = "succubus";
spriteClass = SuccubusSprite.class;
HP = HT = 80;
@@ -106,7 +105,7 @@ public class Succubus extends Mob {
cell = route.path.get(route.dist-1);
if (Level.avoid[ cell ]){
ArrayList<Integer> candidates = new ArrayList<Integer>();
ArrayList<Integer> candidates = new ArrayList<>();
for (int n : Level.NEIGHBOURS8) {
cell = route.collisionPos + n;
if (Level.passable[cell] && Actor.findChar( cell ) == null) {
@@ -136,14 +135,7 @@ public class Succubus extends Mob {
return 10;
}
@Override
public String description() {
return
"The succubi are demons that look like seductive (in a slightly gothic way) girls. Using its magic, the succubus " +
"can charm a hero, who will become unable to attack anything until the charm wears off.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( Leech.class );
}
@@ -153,7 +145,7 @@ public class Succubus extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Sleep.class );
}
@@ -43,7 +43,6 @@ import com.watabou.utils.Random;
public class Swarm extends Mob {
{
name = "swarm of flies";
spriteClass = SwarmSprite.class;
HP = HT = 50;
@@ -86,7 +85,7 @@ public class Swarm extends Mob {
public int defenseProc( Char enemy, int damage ) {
if (HP >= damage + 2) {
ArrayList<Integer> candidates = new ArrayList<Integer>();
ArrayList<Integer> candidates = new ArrayList<>();
boolean[] passable = Level.passable;
int[] neighbours = {pos + 1, pos - 1, pos + Level.WIDTH, pos - Level.WIDTH};
@@ -122,11 +121,6 @@ public class Swarm extends Mob {
return 10;
}
@Override
public String defenseVerb() {
return "evaded";
}
private Swarm split() {
Swarm clone = new Swarm();
clone.generation = generation + 1;
@@ -155,11 +149,4 @@ public class Swarm extends Mob {
Dungeon.limitedDrops.swarmHP.count++;
return super.createLoot();
}
@Override
public String description() {
return
"The deadly swarm of flies buzzes angrily. Every non-magical attack " +
"will split it into two smaller but equally dangerous swarms.";
}
}
@@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.SpearTrap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
@@ -54,7 +55,6 @@ import com.watabou.utils.Random;
public class Tengu extends Mob {
{
name = "Tengu";
spriteClass = TenguSprite.class;
HP = HT = 120;
@@ -116,7 +116,7 @@ public class Tengu extends Mob {
//phase 1 of the fight is over
if (beforeHitHP > HT/2 && HP <= HT/2){
HP = (HT/2)-1;
yell("Let's make this interesting...");
yell(Messages.get(this, "interesting"));
((PrisonBossLevel)Dungeon.level).progress();
BossHealthBar.bleed(true);
@@ -144,7 +144,7 @@ public class Tengu extends Mob {
GLog.p("Your beacon grows stronger!");
}
yell( "Free at last..." );
yell( Messages.get(this, "defeated") );
}
@Override
@@ -216,20 +216,12 @@ public class Tengu extends Mob {
BossHealthBar.assignBoss(this);
if (HP <= HT/2) BossHealthBar.bleed(true);
if (HP == HT) {
yell("You're mine, " + Dungeon.hero.givenName() + "!");
yell(Messages.get(this, "notice_mine", Dungeon.hero.givenName()));
} else {
yell("Face me, " + Dungeon.hero.givenName() + "!");
yell(Messages.get(this, "notice_face", Dungeon.hero.givenName()));
}
}
@Override
public String description() {
return
"A famous and enigmatic assassin, named for the mask grafted to his face.\n\n" +
"Tengu is held down with large clasps on his wrists and knees, though he seems to have gotten rid of his chains long ago.\n\n" +
"He will try to use traps, deceptive magic, and precise attacks to eliminate the only thing stopping his escape: you.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( ToxicGas.class );
@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Honeypot;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.MasterThievesArmband;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ThiefSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@@ -149,7 +150,7 @@ public class Thief extends Mob {
if (item != null && !item.unique && item.level() < 1 ) {
GLog.w( TXT_STOLE, this.name, item.name() );
GLog.w( Messages.get(this, "stole", item.name()) );
Dungeon.quickslot.clearItem( item );
item.updateQuickslot();
@@ -170,15 +171,10 @@ public class Thief extends Mob {
@Override
public String description() {
String desc =
"Though these inmates roam free of their cells, this place is still their prison. " +
"Over time, this place has taken their minds as well as their freedom. " +
"Long ago, these crazy thieves and bandits have forgotten who they are and why they steal.\n\n" +
"These enemies are more likely to steal and run than they are to fight. " +
"Make sure to keep them in sight, or you might never see your stolen item again.";
String desc = super.description();
if (item != null) {
desc += String.format( TXT_CARRIES, Utils.capitalize( this.name ), item.name() );
desc += Messages.get(this, "carries", item.name() );
}
return desc;
@@ -189,7 +185,7 @@ public class Thief extends Mob {
protected void nowhereToRun() {
if (buff( Terror.class ) == null && buff( Corruption.class ) == null) {
if (enemySeen) {
sprite.showStatus(CharSprite.NEGATIVE, TXT_RAGE);
sprite.showStatus(CharSprite.NEGATIVE, Messages.get(this, "rage"));
state = HUNTING;
} else {
@@ -212,7 +208,7 @@ public class Thief extends Mob {
}
if (item != null) GLog.n("The thief gets away with your " + item.name() + "!");
if (item != null) GLog.n( Messages.get(this, "escapes", item.name()));
item = null;
state = WANDERING;
}
@@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Death;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.WarlockSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@@ -44,10 +45,7 @@ public class Warlock extends Mob implements Callback {
private static final float TIME_TO_ZAP = 1f;
private static final String TXT_SHADOWBOLT_KILLED = "%s's shadow bolt killed you...";
{
name = "dwarf warlock";
spriteClass = WarlockSprite.class;
HP = HT = 70;
@@ -92,7 +90,7 @@ public class Warlock extends Mob implements Callback {
boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos];
if (visible) {
((WarlockSprite)sprite).zap( enemy.pos );
sprite.zap( enemy.pos );
} else {
zap();
}
@@ -114,7 +112,7 @@ public class Warlock extends Mob implements Callback {
if (!enemy.isAlive() && enemy == Dungeon.hero) {
Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name ) ) );
GLog.n( TXT_SHADOWBOLT_KILLED, name );
GLog.n( Messages.get(this, "bolt_kill") );
}
} else {
enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() );
@@ -147,16 +145,8 @@ public class Warlock extends Mob implements Callback {
return loot;
}
@Override
public String description() {
return
"When dwarves' interests have shifted from engineering to arcane arts, " +
"warlocks have come to power in the city. They started with elemental magic, " +
"but soon switched to demonology and necromancy.";
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( Death.class );
}
@@ -42,7 +42,6 @@ public class Wraith extends Mob {
private int level;
{
name = "wraith";
spriteClass = WraithSprite.class;
HP = HT = 1;
@@ -83,24 +82,12 @@ public class Wraith extends Mob {
defenseSkill = attackSkill( null ) * 5;
enemySeen = true;
}
@Override
public String defenseVerb() {
return "evaded";
}
@Override
public boolean reset() {
state = WANDERING;
return true;
}
@Override
public String description() {
return
"A wraith is a vengeful spirit of a sinner, whose grave or tomb was disturbed. " +
"Being an ethereal entity, it is very hard to hit with a regular weapon.";
}
public static void spawnAround( int pos ) {
for (int n : Level.NEIGHBOURS4) {
@@ -131,7 +118,7 @@ public class Wraith extends Mob {
}
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Death.class );
IMMUNITIES.add( Terror.class );
@@ -47,6 +47,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfPsionicBla
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Death;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.BurningFistSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
@@ -62,7 +63,6 @@ import com.watabou.utils.Random;
public class Yog extends Mob {
{
name = "Yog-Dzewa";
spriteClass = YogSprite.class;
HP = HT = 300;
@@ -76,11 +76,6 @@ public class Yog extends Mob {
properties.add(Property.DEMONIC);
}
private static final String TXT_DESC =
"Yog-Dzewa is an Old God, a powerful entity from the realms of chaos. A century ago, the ancient dwarves " +
"barely won the war against its army of demons, but were unable to kill the god itself. Instead, they then " +
"imprisoned it in the halls below their city, believing it to be too weak to rise ever again.";
public Yog() {
super();
}
@@ -133,7 +128,7 @@ public class Yog extends Mob {
@Override
public int defenseProc( Char enemy, int damage ) {
ArrayList<Integer> spawnPoints = new ArrayList<Integer>();
ArrayList<Integer> spawnPoints = new ArrayList<>();
for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
int p = pos + Level.NEIGHBOURS8[i];
@@ -177,23 +172,17 @@ public class Yog extends Mob {
Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop();
super.die( cause );
yell( "..." );
yell( Messages.get(this, "defeated") );
}
@Override
public void notice() {
super.notice();
BossHealthBar.assignBoss(this);
yell( "Hope is an illusion..." );
yell( Messages.get(this, "notice") );
}
@Override
public String description() {
return TXT_DESC;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Death.class );
@@ -223,7 +212,6 @@ public class Yog extends Mob {
private static final int REGENERATION = 4;
{
name = "rotting fist";
spriteClass = RottingFistSprite.class;
HP = HT = 300;
@@ -280,13 +268,7 @@ public class Yog extends Mob {
if (lock != null) lock.addTime(dmg*0.5f);
}
@Override
public String description() {
return TXT_DESC;
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( ToxicGas.class );
RESISTANCES.add( Death.class );
@@ -298,7 +280,7 @@ public class Yog extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Amok.class );
IMMUNITIES.add( Sleep.class );
@@ -366,7 +348,7 @@ public class Yog extends Mob {
if (!enemy.isAlive() && enemy == Dungeon.hero) {
Dungeon.fail( Utils.format( ResultDescriptions.UNIQUE, name ) );
GLog.n( TXT_KILL, name );
GLog.n( Messages.get(Char.class, "kill", name) );
}
return true;
@@ -397,13 +379,7 @@ public class Yog extends Mob {
if (lock != null) lock.addTime(dmg*0.5f);
}
@Override
public String description() {
return TXT_DESC;
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> RESISTANCES = new HashSet<>();
static {
RESISTANCES.add( ToxicGas.class );
RESISTANCES.add( Death.class );
@@ -415,7 +391,7 @@ public class Yog extends Mob {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Amok.class );
IMMUNITIES.add( Sleep.class );
@@ -434,7 +410,6 @@ public class Yog extends Mob {
public static class Larva extends Mob {
{
name = "god's larva";
spriteClass = LarvaSprite.class;
HP = HT = 25;
@@ -461,11 +436,6 @@ public class Yog extends Mob {
public int dr() {
return 8;
}
@Override
public String description() {
return TXT_DESC;
}
}
}
@@ -46,32 +46,8 @@ import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
public class Blacksmith extends NPC {
private static final String TXT_GOLD_1 =
"Hey human! Wanna be useful, eh? Take dis pickaxe and mine me some _dark gold ore_, _15 pieces_ should be enough. " +
"What do you mean, how am I gonna pay? You greedy...\n" +
"Ok, ok, I don't have money to pay, but I can do some smithin' for you. Consider yourself lucky, " +
"I'm the only blacksmith around.";
private static final String TXT_BLOOD_1 =
"Hey human! Wanna be useful, eh? Take dis pickaxe and _kill a bat_ wit' it, I need its blood on the head. " +
"What do you mean, how am I gonna pay? You greedy...\n" +
"Ok, ok, I don't have money to pay, but I can do some smithin' for you. Consider yourself lucky, " +
"I'm the only blacksmith around.";
private static final String TXT2 =
"Are you kiddin' me? Where is my pickaxe?!";
private static final String TXT3 =
"Dark gold ore. 15 pieces. Seriously, is it dat hard?";
private static final String TXT4 =
"I said I need bat blood on the pickaxe. Chop chop!";
private static final String TXT_COMPLETED =
"Oh, you have returned... Better late dan never.";
private static final String TXT_GET_LOST =
"I'm busy. Get lost!";
private static final String TXT_LOOKS_BETTER = "your %s certainly looks better now";
{
name = "troll blacksmith";
spriteClass = BlacksmithSprite.class;
}
@@ -89,7 +65,7 @@ public class Blacksmith extends NPC {
if (!Quest.given) {
GameScene.show( new WndQuest( this,
Quest.alternative ? TXT_BLOOD_1 : TXT_GOLD_1 ) {
Quest.alternative ? Messages.get(this, "blood_1") : Messages.get(this, "gold_1") ) {
@Override
public void onBackPressed() {
@@ -104,7 +80,7 @@ public class Blacksmith extends NPC {
} else {
Dungeon.level.drop( pick, Dungeon.hero.pos ).sprite.drop();
}
};
}
} );
Journal.add( Journal.Feature.TROLL );
@@ -114,15 +90,15 @@ public class Blacksmith extends NPC {
Pickaxe pick = Dungeon.hero.belongings.getItem( Pickaxe.class );
if (pick == null) {
tell( TXT2 );
tell( Messages.get(this, "lost_pick") );
} else if (!pick.bloodStained) {
tell( TXT4 );
tell( Messages.get(this, "blood_2") );
} else {
if (pick.isEquipped( Dungeon.hero )) {
pick.doUnequip( Dungeon.hero, false );
}
pick.detach( Dungeon.hero.belongings.backpack );
tell( TXT_COMPLETED );
tell( Messages.get(this, "completed") );
Quest.completed = true;
Quest.reforged = false;
@@ -133,16 +109,16 @@ public class Blacksmith extends NPC {
Pickaxe pick = Dungeon.hero.belongings.getItem( Pickaxe.class );
DarkGold gold = Dungeon.hero.belongings.getItem( DarkGold.class );
if (pick == null) {
tell( TXT2 );
tell( Messages.get(this, "lost_pick") );
} else if (gold == null || gold.quantity() < 15) {
tell( TXT3 );
tell( Messages.get(this, "gold_2") );
} else {
if (pick.isEquipped( Dungeon.hero )) {
pick.doUnequip( Dungeon.hero, false );
}
pick.detach( Dungeon.hero.belongings.backpack );
gold.detachAll( Dungeon.hero.belongings.backpack );
tell( TXT_COMPLETED );
tell( Messages.get(this, "completed") );
Quest.completed = true;
Quest.reforged = false;
@@ -155,7 +131,7 @@ public class Blacksmith extends NPC {
} else {
tell( TXT_GET_LOST );
tell( Messages.get(this, "get_lost") );
}
}
@@ -167,27 +143,27 @@ public class Blacksmith extends NPC {
public static String verify( Item item1, Item item2 ) {
if (item1 == item2) {
return "Select 2 different items, not the same item twice!";
return Messages.get(Blacksmith.class, "same_item");
}
if (item1.getClass() != item2.getClass()) {
return "Select 2 items of the same type!";
return Messages.get(Blacksmith.class, "diff_type");
}
if (!item1.isIdentified() || !item2.isIdentified()) {
return "I need to know what I'm working with, identify them first!";
return Messages.get(Blacksmith.class, "un_ided");
}
if (item1.cursed || item2.cursed) {
return "I don't work with cursed items!";
return Messages.get(Blacksmith.class, "cursed");
}
if (item1.level() < 0 || item2.level() < 0) {
return "It's a junk, the quality is too poor!";
return Messages.get(Blacksmith.class, "degraded");
}
if (!item1.isUpgradable() || !item2.isUpgradable()) {
return "I can't reforge these items!";
return Messages.get(Blacksmith.class, "cant_reforge");
}
return null;
@@ -212,7 +188,7 @@ public class Blacksmith extends NPC {
((EquipableItem)first).doUnequip( Dungeon.hero, true );
}
first.upgrade();
GLog.p( TXT_LOOKS_BETTER, first.name() );
GLog.p( ScrollOfUpgrade.TXT_LOOKS_BETTER, first.name() );
Dungeon.hero.spendAndNext( 2f );
Badges.validateItemLevelAquired( first );
@@ -243,13 +219,6 @@ public class Blacksmith extends NPC {
public boolean reset() {
return true;
}
@Override
public String description() {
return
"This troll blacksmith looks like all trolls look: he is tall and lean, and his skin resembles stone " +
"in both color and texture. The troll blacksmith is tinkering with unproportionally small tools.";
}
public static class Quest {
@@ -308,7 +277,7 @@ public class Blacksmith extends NPC {
public static boolean spawn( Collection<Room> rooms ) {
if (!spawned && Dungeon.depth > 11 && Random.Int( 15 - Dungeon.depth ) == 0) {
Room blacksmith = null;
Room blacksmith;
for (Room r : rooms) {
if (r.type == Type.STANDARD && r.width() > 4 && r.height() > 4) {
blacksmith = r;
@@ -39,10 +39,10 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndSadGhost;
import com.watabou.noosa.audio.Sample;
@@ -54,7 +54,6 @@ import java.util.HashSet;
public class Ghost extends NPC {
{
name = "sad ghost";
spriteClass = GhostSprite.class;
flying = true;
@@ -62,39 +61,6 @@ public class Ghost extends NPC {
state = WANDERING;
}
private static final String TXT_RAT1 =
"Hello %s... Once I was like you - strong and confident... " +
"But I was slain by a foul beast... I can't leave this place... Not until I have my revenge... " +
"Slay the _fetid rat_, that has taken my life...\n\n" +
"It stalks this floor... Spreading filth everywhere... " +
"_Beware its cloud of stink and corrosive bite, the acid dissolves in water..._ ";
private static final String TXT_RAT2 =
"Please... Help me... Slay the abomination...\n\n" +
"_Fight it near water... Avoid the stench..._";
private static final String TXT_GNOLL1 =
"Hello %s... Once I was like you - strong and confident... " +
"But I was slain by a devious foe... I can't leave this place... Not until I have my revenge... " +
"Slay the _gnoll trickster_, that has taken my life...\n\n" +
"It is not like the other gnolls... It hides and uses thrown weapons... " +
"_Beware its poisonous and incendiary darts, don't attack from a distance..._";
private static final String TXT_GNOLL2 =
"Please... Help me... Slay the trickster...\n\n" +
"_Don't let it hit you... Get near to it..._";
private static final String TXT_CRAB1 =
"Hello %s... Once I was like you - strong and confident... " +
"But I was slain by an ancient creature... I can't leave this place... Not until I have my revenge... " +
"Slay the _great crab_, that has taken my life...\n\n" +
"It is unnaturally old... With a massive single claw and a thick shell... " +
"_Beware its claw, you must surprise the crab or it will block with it..._";
private static final String TXT_CRAB2 =
"Please... Help me... Slay the Crustacean...\n\n" +
"_It will always block... When it sees you coming..._";
public Ghost() {
super();
@@ -106,11 +72,6 @@ public class Ghost extends NPC {
return 1000;
}
@Override
public String defenseVerb() {
return "evaded";
}
@Override
public float speed() {
return 0.5f;
@@ -148,13 +109,13 @@ public class Ghost extends NPC {
switch (Quest.type) {
case 1:
default:
GameScene.show(new WndQuest(this, TXT_RAT2));
GameScene.show(new WndQuest(this, Messages.get(this, "rat_2")));
break;
case 2:
GameScene.show(new WndQuest(this, TXT_GNOLL2));
GameScene.show(new WndQuest(this, Messages.get(this, "gnoll_2")));
break;
case 3:
GameScene.show(new WndQuest(this, TXT_CRAB2));
GameScene.show(new WndQuest(this, Messages.get(this, "crab_2")));
break;
}
@@ -181,13 +142,13 @@ public class Ghost extends NPC {
switch (Quest.type){
case 1: default:
questBoss = new FetidRat();
txt_quest = Utils.format(TXT_RAT1, Dungeon.hero.givenName()); break;
txt_quest = Messages.get(this, "rat_1", Dungeon.hero.givenName()); break;
case 2:
questBoss = new GnollTrickster();
txt_quest = Utils.format(TXT_GNOLL1, Dungeon.hero.givenName()); break;
txt_quest = Messages.get(this, "gnoll_1", Dungeon.hero.givenName()); break;
case 3:
questBoss = new GreatCrab();
txt_quest = Utils.format(TXT_CRAB1, Dungeon.hero.givenName()); break;
txt_quest = Messages.get(this, "crab_1", Dungeon.hero.givenName()); break;
}
questBoss.pos = Dungeon.level.randomRespawnCell();
@@ -201,15 +162,8 @@ public class Ghost extends NPC {
}
}
@Override
public String description() {
return
"The ghost is barely visible. It looks like a shapeless " +
"spot of faint light with a sorrowful face.";
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( Paralysis.class );
IMMUNITIES.add( Roots.class );
@@ -220,8 +174,6 @@ public class Ghost extends NPC {
return IMMUNITIES;
}
public static class Quest {
private static boolean spawned;
@@ -337,7 +289,7 @@ public class Ghost extends NPC {
public static void process() {
if (spawned && given && !processed && (depth == Dungeon.depth)) {
GLog.n("sad ghost: Thank you... come find me...");
GLog.n( Messages.get(Ghost.class, "find_me") );
for (Mob m : Dungeon.level.mobs){
if (m instanceof Ghost)
m.beckon(Dungeon.hero.pos);
@@ -22,7 +22,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Journal;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Golem;
@@ -32,10 +31,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.DwarfToken;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
import com.shatteredpixel.shatteredpixeldungeon.levels.CityLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Room;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ImpSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndImp;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
import com.watabou.utils.Bundle;
@@ -44,36 +42,9 @@ import com.watabou.utils.Random;
public class Imp extends NPC {
{
name = "ambitious imp";
spriteClass = ImpSprite.class;
}
private static final String TXT_GOLEMS1 =
"Are you an adventurer? I love adventurers! You can always rely on them " +
"if something needs to be killed. Am I right? For a bounty of course ;)\n" +
"In my case this is _golems_ who need to be killed. You see, I'm going to start a " +
"little business here, but these stupid golems are bad for business! " +
"It's very hard to negotiate with wandering lumps of granite, damn them! " +
"So please, kill... let's say _6 of them_ and a reward is yours.";
private static final String TXT_MONKS1 =
"Are you an adventurer? I love adventurers! You can always rely on them " +
"if something needs to be killed. Am I right? For a bounty of course ;)\n" +
"In my case this is _monks_ who need to be killed. You see, I'm going to start a " +
"little business here, but these lunatics don't buy anything themselves and " +
"will scare away other customers. " +
"So please, kill... let's say _8 of them_ and a reward is yours.";
private static final String TXT_GOLEMS2 =
"How is your golem safari going?";
private static final String TXT_MONKS2 =
"Oh, you are still alive! I knew that your kung-fu is stronger ;) " +
"Just don't forget to grab these monks' tokens.";
private static final String TXT_CYA = "See you, %s!";
private static final String TXT_HEY = "Psst, %s!";
private boolean seenBefore = false;
@Override
@@ -81,7 +52,7 @@ public class Imp extends NPC {
if (!Quest.given && Dungeon.visible[pos]) {
if (!seenBefore) {
yell( Utils.format( TXT_HEY, Dungeon.hero.givenName() ) );
yell( Messages.get(this, "hey", Dungeon.hero.givenName() ) );
}
seenBefore = true;
} else {
@@ -98,11 +69,6 @@ public class Imp extends NPC {
return 1000;
}
@Override
public String defenseVerb() {
return "evaded";
}
@Override
public void damage( int dmg, Object src ) {
}
@@ -126,11 +92,13 @@ public class Imp extends NPC {
if (tokens != null && (tokens.quantity() >= 8 || (!Quest.alternative && tokens.quantity() >= 6))) {
GameScene.show( new WndImp( this, tokens ) );
} else {
tell( Quest.alternative ? TXT_MONKS2 : TXT_GOLEMS2, Dungeon.hero.givenName() );
tell( Quest.alternative ?
Messages.get(this, "monks_2", Dungeon.hero.givenName())
: Messages.get(this, "golems_2", Dungeon.hero.givenName()) );
}
} else {
tell( Quest.alternative ? TXT_MONKS1 : TXT_GOLEMS1 );
tell( Quest.alternative ? Messages.get(this, "monks_1") : Messages.get(this, "golems_1") );
Quest.given = true;
Quest.completed = false;
@@ -138,26 +106,19 @@ public class Imp extends NPC {
}
}
private void tell( String format, Object...args ) {
private void tell( String text ) {
GameScene.show(
new WndQuest( this, Utils.format( format, args ) ) );
new WndQuest( this, text ));
}
public void flee() {
yell( Utils.format( TXT_CYA, Dungeon.hero.givenName() ) );
yell( Messages.get(this, "cya", Dungeon.hero.givenName()) );
destroy();
sprite.die();
}
@Override
public String description() {
return
"Imps are lesser demons. They are notable for neither their strength nor their magic talent, " +
"but they are quite smart and sociable. Many imps prefer to live among non-demons.";
}
public static class Quest {
private static boolean alternative;
@@ -25,17 +25,12 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ImpSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
public class ImpShopkeeper extends Shopkeeper {
private static final String TXT_GREETINGS = "Hello, %s!";
public static final String TXT_THIEF = "I thought I could trust you!";
{
name = "ambitious imp";
spriteClass = ImpSprite.class;
}
@@ -45,7 +40,7 @@ public class ImpShopkeeper extends Shopkeeper {
protected boolean act() {
if (!seenBefore && Dungeon.visible[pos]) {
yell( Utils.format( TXT_GREETINGS, Dungeon.hero.givenName() ) );
yell( Messages.get(this, "greetings", Dungeon.hero.givenName() ) );
seenBefore = true;
}
@@ -66,11 +61,4 @@ public class ImpShopkeeper extends Shopkeeper {
sprite.emitter().burst( Speck.factory( Speck.WOOL ), 15 );
sprite.killAndErase();
}
@Override
public String description() {
return
"Imps are lesser demons. They are notable for neither their strength nor their magic talent. " +
"But they are quite smart and sociable, and many of imps prefer to live and do business among non-demons.";
}
}
@@ -37,11 +37,9 @@ import com.watabou.utils.Random;
public class MirrorImage extends NPC {
{
name = "mirror image";
spriteClass = MirrorSprite.class;
state = HUNTING;
}
public int tier;
@@ -98,7 +96,7 @@ public class MirrorImage extends NPC {
protected Char chooseEnemy() {
if (enemy == null || !enemy.isAlive()) {
HashSet<Mob> enemies = new HashSet<Mob>();
HashSet<Mob> enemies = new HashSet<>();
for (Mob mob:Dungeon.level.mobs) {
if (mob.hostile && Level.fieldOfView[mob.pos]) {
enemies.add( mob );
@@ -111,13 +109,6 @@ public class MirrorImage extends NPC {
return enemy;
}
@Override
public String description() {
return
"This illusion bears a close resemblance to you, " +
"but it's paler and twitches a little.";
}
@Override
public CharSprite sprite() {
CharSprite s = super.sprite();
@@ -140,7 +131,7 @@ public class MirrorImage extends NPC {
Dungeon.hero.busy();
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<>();
static {
IMMUNITIES.add( ToxicGas.class );
IMMUNITIES.add( Burning.class );
@@ -24,12 +24,12 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.RatKingSprite;
public class RatKing extends NPC {
{
name = "rat king";
spriteClass = RatKingSprite.class;
state = SLEEPING;
@@ -68,19 +68,17 @@ public class RatKing extends NPC {
sprite.turnTo( pos, Dungeon.hero.pos );
if (state == SLEEPING) {
notice();
yell( "I'm not sleeping!" );
yell( Messages.get(this, "not_sleeping") );
state = WANDERING;
} else {
yell( "What is it? I have no time for this nonsense. My kingdom won't rule itself!" );
yell( Messages.get(this, "what_is_it") );
}
}
@Override
public String description() {
return ((RatKingSprite)sprite).festive ?
"This rat is a little bigger than a regular marsupial rat. " +
"It's wearing a tiny festive hat instead of its usual crown. Happy Holidays!"
: "This rat is a little bigger than a regular marsupial rat " +
"and it's wearing a tiny crown on its head.";
Messages.get(this, "desc_festive")
: super.description();
}
}
@@ -20,15 +20,15 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.SheepSprite;
import com.watabou.utils.Random;
public class Sheep extends NPC {
private static final String[] QUOTES = {"Baa!", "Baa?", "Baa.", "Baa..."};
private static final String[] LINE_KEYS = {"Baa!", "Baa?", "Baa.", "Baa..."};
{
name = "sheep";
spriteClass = SheepSprite.class;
}
@@ -55,15 +55,8 @@ public class Sheep extends NPC {
public void damage( int dmg, Object src ) {
}
@Override
public String description() {
return
"This is a magic sheep. What's so magical about it? You can't kill it. " +
"It will stand there until it magcially fades away, all the while chewing cud with a blank stare.";
}
@Override
public void interact() {
yell( Random.element( QUOTES ) );
yell( Messages.get(this, Random.element( LINE_KEYS )) );
}
}
@@ -34,11 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem;
public class Shopkeeper extends NPC {
public static final String TXT_THIEF = "Thief, Thief!";
private int startPos = -1;
{
name = "shopkeeper";
spriteClass = ShopkeeperSprite.class;
properties.add(Property.IMMOVABLE);
@@ -83,13 +79,6 @@ public class Shopkeeper extends NPC {
return true;
}
@Override
public String description() {
return
"This stout guy looks more appropriate for a trade district in some large city " +
"than for a dungeon. His prices explain why he prefers to do business here.";
}
public static WndBag sell() {
return GameScene.selectItem( itemSelector, WndBag.Mode.FOR_SALE, "Select an item to sell" );
}
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.CeremonialCandle;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Rotberry;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Journal;
@@ -48,60 +49,8 @@ import com.watabou.utils.Random;
public class Wandmaker extends NPC {
{
name = "old wandmaker";
spriteClass = WandmakerSprite.class;
}
private static final String INTRO_WARRIOR =
"Oh, what a pleasant surprise to meet a hero in such a depressing place! " +
"If you're up to helping an old man out, I may have a task for you.\n\n";
private static final String INTRO_ROGUE =
"Oh Goodness, you startled me! I haven't met a bandit from this place that still has his sanity, " +
"so you must be from the surface! If you're up to helping a stranger out, I may have a task for you.\n\n";
private static final String INTRO_MAGE =
"Oh, hello %s! I heard there was some ruckus regarding you and the wizards institute? " +
"Oh never mind, I never liked those stick-in-the-muds anyway. If you're willing, I may have a task for you.\n\n";
private static final String INTRO_HUNTRESS =
"Oh, hello miss! A friendly face is a pleasant surprise down here isn't it? " +
"In fact, I swear I've seen your face before, but I can't put my finger on it... " +
"Oh never mind, if you're here for adventure, I may have a task for you.\n\n";
private static final String INTRO_1 =
"I came here to find a rare ingredient for a wand, but I've gotten myself lost, " +
"and my magical shield is weakening. I'll need to leave soon, but can't bear to go without getting what I came for.";
private static final String INTRO_DUST =
"I'm looking for some _corpse dust_. It's a special kind of cursed bone meal that usually shows up in places like this. " +
"There should be a barricaded room around here somewhere, I'm sure some dust will turn up there. " +
"Do be careful though, the curse the dust carries is quite potent, _get back to me as fast as you can_ and I'll cleanse it for you.\n\n";
private static final String INTRO_EMBER =
"I'm looking for some _fresh embers_ from a newborn fire elemental. Elementals usually pop up when a summoning ritual isn't controlled, " +
"so just find some candles and a ritual site and I'm sure you can get one to pop up. " +
"You might want to _keep some sort of freezing item handy_ though, elementals are very powerful, but ice will take them down quite easily.\n\n";
private static final String INTRO_BERRY =
"The old warden of this prison kept a _rotberry plant_, and I'm after one of its seeds. The plant has probably gone wild by now though, " +
"so getting it to give up a seed might be tricky. Its garden should be somewhere around here. " +
"Try to _keep away from its vine lashers_ if you want to stay in one piece. Using fire might be tempting but please don't, you'll kill the plant and destroy its seeds.\n\n";
private static final String INTRO_2 =
"If you can get that for me, I'll be happy to pay you with one of my finely crafted wands! " +
"I brought two with me, so you can take whichever one you prefer.";
private static final String REMINDER_DUST =
"Any luck with corpse dust, %s? Look for some barricades.";
private static final String REMINDER_EMBER =
"Any luck with those embers, %s? You'll need to find four candles and the ritual site.";
private static final String REMINDER_BERRY =
"Any luck with a Rotberry seed, %s? Look for a room filled with vegetation.";
@Override
protected boolean act() {
@@ -114,11 +63,6 @@ public class Wandmaker extends NPC {
return 1000;
}
@Override
public String defenseVerb() {
return "absorbed";
}
@Override
public void damage( int dmg, Object src ) {
}
@@ -158,13 +102,13 @@ public class Wandmaker extends NPC {
String msg = "";
switch(Quest.type){
case 1:
msg = REMINDER_DUST;
msg = Messages.get(this, "reminder_dust", Dungeon.hero.givenName());
break;
case 2:
msg = REMINDER_EMBER;
msg = Messages.get(this, "reminder_ember", Dungeon.hero.givenName());
break;
case 3:
msg = REMINDER_BERRY;
msg = Messages.get(this, "reminder_berry", Dungeon.hero.givenName());
break;
}
GameScene.show(new WndQuest(this, Utils.format(msg, Dungeon.hero.givenName())));
@@ -176,42 +120,42 @@ public class Wandmaker extends NPC {
String msg2 = "";
switch(Dungeon.hero.heroClass){
case WARRIOR:
msg1 += INTRO_WARRIOR;
msg1 += Messages.get(this, "intro_warrior");
break;
case ROGUE:
msg1 += INTRO_ROGUE;
msg1 += Messages.get(this, "intro_rogue");
break;
case MAGE:
msg1 += INTRO_MAGE;
msg1 += Messages.get(this, "intro_mage", Dungeon.hero.givenName());
break;
case HUNTRESS:
msg1 += INTRO_HUNTRESS;
msg1 += Messages.get(this, "intro_huntress");
break;
}
msg1 += INTRO_1;
msg1 += Messages.get(this, "intro_1");
switch (Quest.type){
case 1:
msg2 += INTRO_DUST;
msg2 += Messages.get(this, "intro_dust");
break;
case 2:
msg2 += INTRO_EMBER;
msg2 += Messages.get(this, "intro_ember");
break;
case 3:
msg2 += INTRO_BERRY;
msg2 += Messages.get(this, "intro_berry");
break;
}
msg2 += INTRO_2;
msg2 += Messages.get(this, "intro_2");
final String msg2final = msg2;
final NPC wandmaker = this;
GameScene.show(new WndQuest(wandmaker, Utils.format(msg1, Dungeon.hero.givenName())){
GameScene.show(new WndQuest(wandmaker, msg1){
@Override
public void hide() {
super.hide();
GameScene.show(new WndQuest(wandmaker, Utils.format(msg2final, Dungeon.hero.givenName())));
GameScene.show(new WndQuest(wandmaker, msg2final));
}
});
@@ -220,13 +164,6 @@ public class Wandmaker extends NPC {
}
}
@Override
public String description() {
return
"This old yet hale gentleman wears a slightly confused " +
"expression. He is protected by a magic shield.";
}
public static class Quest {
private static int type;