cleaned up formatting:

- removed trailing whitespace
- changed all leading whitespace to tabs
- removed IDE created author comments
This commit is contained in:
Evan Debenham
2015-06-12 16:22:26 -04:00
parent baa83b7e43
commit cebdff0221
335 changed files with 8555 additions and 8714 deletions
@@ -48,9 +48,9 @@ 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.";
}
@Override
public String description() {
return
"This is a rare breed of marsupial rat, with pure white fur and jagged teeth.";
}
}
@@ -37,8 +37,8 @@ public class Bandit extends Thief {
name = "crazy bandit";
spriteClass = BanditSprite.class;
//1 in 30 chance to be a crazy bandit, equates to overall 1/90 chance.
lootChance = 0.333f;
//1 in 30 chance to be a crazy bandit, equates to overall 1/90 chance.
lootChance = 0.333f;
}
@Override
@@ -46,8 +46,8 @@ public class Bandit extends Thief {
if (super.steal( hero )) {
Buff.prolong( hero, Blindness.class, Random.Int( 5, 12 ) );
Buff.affect( hero, Poison.class ).set(Random.Int(5, 7) * Poison.durationFactor(enemy));
Buff.prolong( hero, Cripple.class, Cripple.DURATION );
Buff.affect( hero, Poison.class ).set(Random.Int(5, 7) * Poison.durationFactor(enemy));
Buff.prolong( hero, Cripple.class, Cripple.DURATION );
Dungeon.observe();
return true;
@@ -80,18 +80,18 @@ public class Bat extends Mob {
return damage;
}
@Override
public void die( Object cause ){
//sets drop chance
lootChance = 1f/((6 + Dungeon.limitedDrops.batHP.count ));
super.die( cause );
}
@Override
public void die( Object cause ){
//sets drop chance
lootChance = 1f/((6 + Dungeon.limitedDrops.batHP.count ));
super.die( cause );
}
@Override
protected Item createLoot(){
Dungeon.limitedDrops.batHP.count++;
return super.createLoot();
}
@Override
protected Item createLoot(){
Dungeon.limitedDrops.batHP.count++;
return super.createLoot();
}
@Override
public String description() {
@@ -49,23 +49,23 @@ public class Bee extends Mob {
private int potHolder;
private static final String LEVEL = "level";
private static final String POTPOS = "potpos";
private static final String POTHOLDER = "potholder";
private static final String POTPOS = "potpos";
private static final String POTHOLDER = "potholder";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( LEVEL, level );
bundle.put( POTPOS, potPos );
bundle.put( POTHOLDER, potHolder );
bundle.put( POTPOS, potPos );
bundle.put( POTHOLDER, potHolder );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
spawn( bundle.getInt( LEVEL ) );
potPos = bundle.getInt( POTPOS );
potHolder = bundle.getInt( POTHOLDER );
potPos = bundle.getInt( POTPOS );
potHolder = bundle.getInt( POTHOLDER );
}
public void spawn( int level ) {
@@ -103,37 +103,37 @@ public class Bee extends Mob {
@Override
protected Char chooseEnemy() {
//if the pot is no longer present, target the hero
//if the pot is no longer present, target the hero
if (potHolder == -1 && potPos == -1)
return Dungeon.hero;
//if something is holding the pot, target that
//if something is holding the pot, target that
else if (Actor.findById(potHolder) != null)
return (Char)Actor.findById(potHolder);
//if the pot is on the ground
//if the pot is on the ground
else {
//if already targeting something, and that thing is still alive and near the pot, keeping targeting it.
if (enemy != null && enemy.isAlive() && Level.distance(enemy.pos, potPos) <= 3) return enemy;
//if already targeting something, and that thing is still alive and near the pot, keeping targeting it.
if (enemy != null && enemy.isAlive() && Level.distance(enemy.pos, potPos) <= 3) return enemy;
//find all mobs near the pot
HashSet<Char> enemies = new HashSet<Char>();
for (Mob mob : Dungeon.level.mobs)
if (!(mob instanceof Bee) && Level.distance(mob.pos, potPos) <= 3 && (mob.hostile || mob.ally))
enemies.add(mob);
//find all mobs near the pot
HashSet<Char> enemies = new HashSet<Char>();
for (Mob mob : Dungeon.level.mobs)
if (!(mob instanceof Bee) && Level.distance(mob.pos, potPos) <= 3 && (mob.hostile || mob.ally))
enemies.add(mob);
//pick one, if there are none, check if the hero is near the pot, go for them, otherwise go for nothing.
if (enemies.size() > 0) return Random.element(enemies);
else return (Level.distance(Dungeon.hero.pos, potPos) <= 3) ? Dungeon.hero : null ;
}
//pick one, if there are none, check if the hero is near the pot, go for them, otherwise go for nothing.
if (enemies.size() > 0) return Random.element(enemies);
else return (Level.distance(Dungeon.hero.pos, potPos) <= 3) ? Dungeon.hero : null ;
}
}
@Override
protected boolean getCloser(int target) {
if (enemy != null && Actor.findById(potHolder) == enemy) {
target = enemy.pos;
} else if (potPos != -1 && (state == WANDERING || Level.distance(target, potPos) > 3))
if (enemy != null && Actor.findById(potHolder) == enemy) {
target = enemy.pos;
} else if (potPos != -1 && (state == WANDERING || Level.distance(target, potPos) > 3))
this.target = target = potPos;
return super.getCloser( target );
}
@@ -148,7 +148,7 @@ public class Bee extends Mob {
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
static {
IMMUNITIES.add( Poison.class );
IMMUNITIES.add( Amok.class );
IMMUNITIES.add( Amok.class );
}
@Override
@@ -58,7 +58,7 @@ public class Brute extends Mob {
@Override
public int damageRoll() {
return enraged ?
Random.NormalIntRange( 10, 40 ) :
Random.NormalIntRange( 10, 40 ) :
Random.NormalIntRange( 8, 18 );
}
@@ -98,10 +98,10 @@ public class DM300 extends Mob {
}
int[] cells = {
step-1, step+1, step-Level.WIDTH, step+Level.WIDTH,
step-1-Level.WIDTH,
step-1+Level.WIDTH,
step+1-Level.WIDTH,
step-1, step+1, step-Level.WIDTH, step+Level.WIDTH,
step-1-Level.WIDTH,
step-1+Level.WIDTH,
step+1-Level.WIDTH,
step+1+Level.WIDTH
};
int cell = cells[Random.Int( cells.length )];
@@ -172,7 +172,7 @@ public class DM300 extends Mob {
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
static {
IMMUNITIES.add( ToxicGas.class );
IMMUNITIES.add( Terror.class );
IMMUNITIES.add( Terror.class );
}
@Override
@@ -82,13 +82,13 @@ public class Elemental extends Mob {
sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 );
}
} else if (buff instanceof Frost || buff instanceof Chill) {
if (Level.water[this.pos])
damage( Random.NormalIntRange( HT / 2, HT ), buff );
else
damage( Random.NormalIntRange( 1, HT * 2 / 3 ), buff );
if (Level.water[this.pos])
damage( Random.NormalIntRange( HT / 2, HT ), buff );
else
damage( Random.NormalIntRange( 1, HT * 2 / 3 ), buff );
} else {
super.add( buff );
}
super.add( buff );
}
}
@Override
@@ -63,13 +63,13 @@ public class Goo extends Mob {
@Override
public int damageRoll() {
if (pumpedUp > 0) {
pumpedUp = 0;
for (int i = 0; i < Level.NEIGHBOURS9DIST2.length; i++) {
int j = pos + Level.NEIGHBOURS9DIST2[i];
if (Level.insideMap(j) && Level.passable[j])
CellEmitter.get(j).burst(ElmoParticle.FACTORY, 10);
}
Sample.INSTANCE.play( Assets.SND_BURNING );
pumpedUp = 0;
for (int i = 0; i < Level.NEIGHBOURS9DIST2.length; i++) {
int j = pos + Level.NEIGHBOURS9DIST2[i];
if (Level.insideMap(j) && Level.passable[j])
CellEmitter.get(j).burst(ElmoParticle.FACTORY, 10);
}
Sample.INSTANCE.play( Assets.SND_BURNING );
return Random.NormalIntRange( 5, 30 );
} else {
return Random.NormalIntRange( 2, 12 );
@@ -118,35 +118,35 @@ public class Goo extends Mob {
@Override
protected boolean doAttack( Char enemy ) {
if (pumpedUp == 1) {
((GooSprite)sprite).pumpUp();
for (int i = 0; i < Level.NEIGHBOURS9DIST2.length; i++) {
int j = pos + Level.NEIGHBOURS9DIST2[i];
if (Level.insideMap(j) && Level.passable[j])
GameScene.add(Blob.seed(j, 2, GooWarn.class));
}
pumpedUp++;
if (pumpedUp == 1) {
((GooSprite)sprite).pumpUp();
for (int i = 0; i < Level.NEIGHBOURS9DIST2.length; i++) {
int j = pos + Level.NEIGHBOURS9DIST2[i];
if (Level.insideMap(j) && Level.passable[j])
GameScene.add(Blob.seed(j, 2, GooWarn.class));
}
pumpedUp++;
spend( attackDelay() );
spend( attackDelay() );
return true;
} else if (pumpedUp >= 2 || Random.Int( 3 ) > 0) {
return true;
} else if (pumpedUp >= 2 || Random.Int( 3 ) > 0) {
boolean visible = Dungeon.visible[pos];
boolean visible = Dungeon.visible[pos];
if (visible) {
if (pumpedUp >= 2) {
((GooSprite) sprite).pumpAttack();
}
else
sprite.attack( enemy.pos );
} else {
attack( enemy );
}
if (visible) {
if (pumpedUp >= 2) {
((GooSprite) sprite).pumpAttack();
}
else
sprite.attack( enemy.pos );
} else {
attack( enemy );
}
spend( attackDelay() );
spend( attackDelay() );
return !visible;
return !visible;
} else {
@@ -154,18 +154,18 @@ public class Goo extends Mob {
((GooSprite)sprite).pumpUp();
for (int i=0; i < Level.NEIGHBOURS9.length; i++) {
int j = pos + Level.NEIGHBOURS9[i];
GameScene.add( Blob.seed( j , 2, GooWarn.class ));
for (int i=0; i < Level.NEIGHBOURS9.length; i++) {
int j = pos + Level.NEIGHBOURS9[i];
GameScene.add( Blob.seed( j , 2, GooWarn.class ));
}
}
if (Dungeon.visible[pos]) {
sprite.showStatus( CharSprite.NEGATIVE, "!!!" );
GLog.n( "Goo is pumping itself up!" );
}
spend( attackDelay() );
spend( attackDelay() );
return true;
}
@@ -216,28 +216,28 @@ public class Goo extends Mob {
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.";
"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.";
}
private final String PUMPEDUP = "pumpedup";
private final String PUMPEDUP = "pumpedup";
@Override
public void storeInBundle( Bundle bundle ) {
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
super.storeInBundle( bundle );
bundle.put( PUMPEDUP , pumpedUp );
}
bundle.put( PUMPEDUP , pumpedUp );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
super.restoreFromBundle( bundle );
pumpedUp = bundle.getInt( PUMPEDUP );
}
pumpedUp = bundle.getInt( PUMPEDUP );
}
private static final HashSet<Class<?>> RESISTANCES = new HashSet<Class<?>>();
static {
@@ -101,15 +101,15 @@ public class King extends Mob {
@Override
protected boolean getCloser( int target ) {
return canTryToSummon() ?
super.getCloser( CityBossLevel.pedestal( nextPedestal ) ) :
return canTryToSummon() ?
super.getCloser( CityBossLevel.pedestal( nextPedestal ) ) :
super.getCloser( target );
}
@Override
protected boolean canAttack( Char enemy ) {
return canTryToSummon() ?
pos == CityBossLevel.pedestal( nextPedestal ) :
return canTryToSummon() ?
pos == CityBossLevel.pedestal( nextPedestal ) :
Level.adjacent( pos, enemy.pos );
}
@@ -163,7 +163,7 @@ public class King extends Mob {
nextPedestal = !nextPedestal;
sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 );
sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 );
Sample.INSTANCE.play( Assets.SND_CHALLENGE );
boolean[] passable = Level.passable.clone();
@@ -293,7 +293,7 @@ public class King extends Mob {
@Override
public void damage( int dmg, Object src ) {
super.damage( dmg, src );
if (src instanceof ToxicGas) {
if (src instanceof ToxicGas) {
((ToxicGas)src).clear( pos );
}
}
@@ -115,7 +115,7 @@ public class Mimic extends Mob {
}
public static Mimic spawnAt( int pos, List<Item> items ) {
Char ch = Actor.findChar( pos );
Char ch = Actor.findChar( pos );
if (ch != null) {
ArrayList<Integer> candidates = new ArrayList<Integer>();
for (int n : Level.NEIGHBOURS8) {
@@ -59,12 +59,12 @@ public abstract class Mob extends Char {
protected static final String TXT_RAGE = "#$%^";
protected static final String TXT_EXP = "%+dEXP";
public AiState SLEEPING = new Sleeping();
public AiState HUNTING = new Hunting();
public AiState WANDERING = new Wandering();
public AiState FLEEING = new Fleeing();
public AiState PASSIVE = new Passive();
public AiState state = SLEEPING;
public AiState SLEEPING = new Sleeping();
public AiState HUNTING = new Hunting();
public AiState WANDERING = new Wandering();
public AiState FLEEING = new Fleeing();
public AiState PASSIVE = new Passive();
public AiState state = SLEEPING;
public Class<? extends CharSprite> spriteClass;
@@ -85,7 +85,7 @@ public abstract class Mob extends Char {
public boolean ally = false;
private static final String STATE = "state";
private static final String SEEN = "seen";
private static final String SEEN = "seen";
private static final String TARGET = "target";
@Override
@@ -93,19 +93,19 @@ public abstract class Mob extends Char {
super.storeInBundle( bundle );
if (state == SLEEPING) {
bundle.put( STATE, Sleeping.TAG );
} else if (state == WANDERING) {
bundle.put( STATE, Wandering.TAG );
} else if (state == HUNTING) {
bundle.put( STATE, Hunting.TAG );
} else if (state == FLEEING) {
bundle.put( STATE, Fleeing.TAG );
} else if (state == PASSIVE) {
bundle.put( STATE, Passive.TAG );
}
if (state == SLEEPING) {
bundle.put( STATE, Sleeping.TAG );
} else if (state == WANDERING) {
bundle.put( STATE, Wandering.TAG );
} else if (state == HUNTING) {
bundle.put( STATE, Hunting.TAG );
} else if (state == FLEEING) {
bundle.put( STATE, Fleeing.TAG );
} else if (state == PASSIVE) {
bundle.put( STATE, Passive.TAG );
}
bundle.put( SEEN, enemySeen );
bundle.put( TARGET, target );
bundle.put( TARGET, target );
}
@Override
@@ -113,23 +113,23 @@ public abstract class Mob extends Char {
super.restoreFromBundle( bundle );
String state = bundle.getString( STATE );
if (state.equals( Sleeping.TAG )) {
this.state = SLEEPING;
} else if (state.equals( Wandering.TAG )) {
this.state = WANDERING;
} else if (state.equals( Hunting.TAG )) {
this.state = HUNTING;
} else if (state.equals( Fleeing.TAG )) {
this.state = FLEEING;
} else if (state.equals( Passive.TAG )) {
this.state = PASSIVE;
}
String state = bundle.getString( STATE );
if (state.equals( Sleeping.TAG )) {
this.state = SLEEPING;
} else if (state.equals( Wandering.TAG )) {
this.state = WANDERING;
} else if (state.equals( Hunting.TAG )) {
this.state = HUNTING;
} else if (state.equals( Fleeing.TAG )) {
this.state = FLEEING;
} else if (state.equals( Passive.TAG )) {
this.state = PASSIVE;
}
enemySeen = bundle.getBoolean( SEEN );
target = bundle.getInt( TARGET );
}
target = bundle.getInt( TARGET );
}
public CharSprite sprite() {
CharSprite sprite = null;
@@ -160,7 +160,7 @@ public abstract class Mob extends Char {
boolean enemyInFOV = enemy != null && enemy.isAlive() && Level.fieldOfView[enemy.pos] && enemy.invisible <= 0;
return state.act( enemyInFOV, justAlerted );
return state.act( enemyInFOV, justAlerted );
}
protected Char chooseEnemy() {
@@ -247,7 +247,7 @@ public abstract class Mob extends Char {
state = FLEEING;
} else if (buff instanceof Sleep) {
state = SLEEPING;
this.sprite().showSleep();
this.sprite().showSleep();
postpone( Sleep.SWS );
}
}
@@ -271,8 +271,8 @@ public abstract class Mob extends Char {
return false;
}
int step = Dungeon.findPath( this, pos, target,
Level.passable,
int step = Dungeon.findPath( this, pos, target,
Level.passable,
Level.fieldOfView );
if (step != -1) {
move( step );
@@ -283,8 +283,8 @@ public abstract class Mob extends Char {
}
protected boolean getFurther( int target ) {
int step = Dungeon.flee( this, pos, target,
Level.passable,
int step = Dungeon.flee( this, pos, target,
Level.passable,
Level.fieldOfView );
if (step != -1) {
move( step );
@@ -294,14 +294,14 @@ public abstract class Mob extends Char {
}
}
@Override
public void updateSpriteState() {
super.updateSpriteState();
if (Dungeon.hero.buff(TimekeepersHourglass.timeFreeze.class) != null)
sprite.add( CharSprite.State.PARALYSED );
}
@Override
public void updateSpriteState() {
super.updateSpriteState();
if (Dungeon.hero.buff(TimekeepersHourglass.timeFreeze.class) != null)
sprite.add( CharSprite.State.PARALYSED );
}
@Override
@Override
public void move( int step ) {
super.move( step );
@@ -337,18 +337,18 @@ public abstract class Mob extends Char {
@Override
public int defenseSkill( Char enemy ) {
if (enemySeen && !paralysed) {
int defenseSkill = this.defenseSkill;
int penalty = 0;
for (Buff buff : enemy.buffs(RingOfAccuracy.Accuracy.class)) {
penalty += ((RingOfAccuracy.Accuracy) buff).level;
}
if (penalty != 0 && enemy == Dungeon.hero)
defenseSkill *= Math.pow(0.75, penalty);
return defenseSkill;
} else {
return 0;
}
if (enemySeen && !paralysed) {
int defenseSkill = this.defenseSkill;
int penalty = 0;
for (Buff buff : enemy.buffs(RingOfAccuracy.Accuracy.class)) {
penalty += ((RingOfAccuracy.Accuracy) buff).level;
}
if (penalty != 0 && enemy == Dungeon.hero)
defenseSkill *= Math.pow(0.75, penalty);
return defenseSkill;
} else {
return 0;
}
}
@Override
@@ -382,9 +382,9 @@ public abstract class Mob extends Char {
Terror.recover( this );
if (state == SLEEPING) {
state = WANDERING;
}
if (state == SLEEPING) {
state = WANDERING;
}
alerted = true;
super.damage( dmg, src );
@@ -425,21 +425,21 @@ public abstract class Mob extends Char {
super.die( cause );
float lootChance = this.lootChance;
int bonus = 0;
for (Buff buff : Dungeon.hero.buffs(RingOfWealth.Wealth.class)) {
bonus += ((RingOfWealth.Wealth) buff).level;
}
float lootChance = this.lootChance;
int bonus = 0;
for (Buff buff : Dungeon.hero.buffs(RingOfWealth.Wealth.class)) {
bonus += ((RingOfWealth.Wealth) buff).level;
}
lootChance *= Math.pow(1.1, bonus);
lootChance *= Math.pow(1.1, bonus);
if (Random.Float() < lootChance && Dungeon.hero.lvl <= maxLvl + 2) {
Item loot = createLoot();
if (loot != null)
Dungeon.level.drop( loot , pos ).sprite.drop();
Item loot = createLoot();
if (loot != null)
Dungeon.level.drop( loot , pos ).sprite.drop();
}
if (Dungeon.hero.isAlive() && !Dungeon.visible[pos]) {
if (Dungeon.hero.isAlive() && !Dungeon.visible[pos]) {
GLog.i( TXT_DIED );
}
}
@@ -449,21 +449,21 @@ public abstract class Mob extends Char {
@SuppressWarnings("unchecked")
protected Item createLoot() {
Item item;
if (loot instanceof Generator.Category) {
Item item;
if (loot instanceof Generator.Category) {
item = Generator.random( (Generator.Category)loot );
item = Generator.random( (Generator.Category)loot );
} else if (loot instanceof Class<?>) {
} else if (loot instanceof Class<?>) {
item = Generator.random( (Class<? extends Item>)loot );
item = Generator.random( (Class<? extends Item>)loot );
} else {
} else {
item = (Item)loot;
item = (Item)loot;
}
return item;
}
return item;
}
public boolean reset() {
@@ -497,177 +497,177 @@ public abstract class Mob extends Char {
return enemySeen && (target == Dungeon.hero.pos);
}
public interface AiState {
public boolean act( boolean enemyInFOV, boolean justAlerted );
public String status();
}
public interface AiState {
public boolean act( boolean enemyInFOV, boolean justAlerted );
public String status();
}
private class Sleeping implements AiState {
private class Sleeping implements AiState {
public static final String TAG = "SLEEPING";
public static final String TAG = "SLEEPING";
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
if (enemyInFOV && Random.Int( distance( enemy ) + enemy.stealth() + (enemy.flying ? 2 : 0) ) == 0) {
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
if (enemyInFOV && Random.Int( distance( enemy ) + enemy.stealth() + (enemy.flying ? 2 : 0) ) == 0) {
enemySeen = true;
enemySeen = true;
notice();
state = HUNTING;
target = enemy.pos;
notice();
state = HUNTING;
target = enemy.pos;
if (Dungeon.isChallenged( Challenges.SWARM_INTELLIGENCE )) {
for (Mob mob : Dungeon.level.mobs) {
if (mob != Mob.this) {
mob.beckon( target );
}
}
}
if (Dungeon.isChallenged( Challenges.SWARM_INTELLIGENCE )) {
for (Mob mob : Dungeon.level.mobs) {
if (mob != Mob.this) {
mob.beckon( target );
}
}
}
spend( TIME_TO_WAKE_UP );
spend( TIME_TO_WAKE_UP );
} else {
} else {
enemySeen = false;
enemySeen = false;
spend( TICK );
spend( TICK );
}
return true;
}
}
return true;
}
@Override
public String status() {
return Utils.format( "This %s is sleeping", name );
}
}
@Override
public String status() {
return Utils.format( "This %s is sleeping", name );
}
}
private class Wandering implements AiState {
private class Wandering implements AiState {
public static final String TAG = "WANDERING";
public static final String TAG = "WANDERING";
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
if (enemyInFOV && (justAlerted || Random.Int( distance( enemy ) / 2 + enemy.stealth() ) == 0)) {
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
if (enemyInFOV && (justAlerted || Random.Int( distance( enemy ) / 2 + enemy.stealth() ) == 0)) {
enemySeen = true;
enemySeen = true;
notice();
state = HUNTING;
target = enemy.pos;
notice();
state = HUNTING;
target = enemy.pos;
} else {
} else {
enemySeen = false;
enemySeen = false;
int oldPos = pos;
if (target != -1 && getCloser( target )) {
spend( 1 / speed() );
return moveSprite( oldPos, pos );
} else {
target = Dungeon.level.randomDestination();
spend( TICK );
}
int oldPos = pos;
if (target != -1 && getCloser( target )) {
spend( 1 / speed() );
return moveSprite( oldPos, pos );
} else {
target = Dungeon.level.randomDestination();
spend( TICK );
}
}
return true;
}
}
return true;
}
@Override
public String status() {
return Utils.format( "This %s is wandering", name );
}
}
@Override
public String status() {
return Utils.format( "This %s is wandering", name );
}
}
private class Hunting implements AiState {
private class Hunting implements AiState {
public static final String TAG = "HUNTING";
public static final String TAG = "HUNTING";
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = enemyInFOV;
if (enemyInFOV && !isCharmedBy( enemy ) && canAttack( enemy )) {
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = enemyInFOV;
if (enemyInFOV && !isCharmedBy( enemy ) && canAttack( enemy )) {
return doAttack( enemy );
return doAttack( enemy );
} else {
} else {
if (enemyInFOV) {
target = enemy.pos;
}
if (enemyInFOV) {
target = enemy.pos;
}
int oldPos = pos;
if (target != -1 && getCloser( target )) {
int oldPos = pos;
if (target != -1 && getCloser( target )) {
spend( 1 / speed() );
return moveSprite( oldPos, pos );
spend( 1 / speed() );
return moveSprite( oldPos, pos );
} else {
} else {
spend( TICK );
state = WANDERING;
target = Dungeon.level.randomDestination();
return true;
}
}
}
spend( TICK );
state = WANDERING;
target = Dungeon.level.randomDestination();
return true;
}
}
}
@Override
public String status() {
return Utils.format( "This %s is hunting", name );
}
}
@Override
public String status() {
return Utils.format( "This %s is hunting", name );
}
}
protected class Fleeing implements AiState {
protected class Fleeing implements AiState {
public static final String TAG = "FLEEING";
public static final String TAG = "FLEEING";
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = enemyInFOV;
if (enemyInFOV) {
target = enemy.pos;
}
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = enemyInFOV;
if (enemyInFOV) {
target = enemy.pos;
}
int oldPos = pos;
if (target != -1 && getFurther( target )) {
int oldPos = pos;
if (target != -1 && getFurther( target )) {
spend( 1 / speed() );
return moveSprite( oldPos, pos );
spend( 1 / speed() );
return moveSprite( oldPos, pos );
} else {
} else {
spend( TICK );
nowhereToRun();
spend( TICK );
nowhereToRun();
return true;
}
}
return true;
}
}
protected void nowhereToRun() {
}
protected void nowhereToRun() {
}
@Override
public String status() {
return Utils.format( "This %s is fleeing", name );
}
}
@Override
public String status() {
return Utils.format( "This %s is fleeing", name );
}
}
private class Passive implements AiState {
private class Passive implements AiState {
public static final String TAG = "PASSIVE";
public static final String TAG = "PASSIVE";
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = false;
spend( TICK );
return true;
}
@Override
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
enemySeen = false;
spend( TICK );
return true;
}
@Override
public String status() {
return Utils.format( "This %s is passive", name );
}
}
@Override
public String status() {
return Utils.format( "This %s is passive", name );
}
}
}
@@ -114,8 +114,8 @@ public class Piranha extends Mob {
return false;
}
int step = Dungeon.findPath( this, pos, target,
Level.water,
int step = Dungeon.findPath( this, pos, target,
Level.water,
Level.fieldOfView );
if (step != -1) {
move( step );
@@ -127,8 +127,8 @@ public class Piranha extends Mob {
@Override
protected boolean getFurther( int target ) {
int step = Dungeon.flee( this, pos, target,
Level.water,
int step = Dungeon.flee( this, pos, target,
Level.water,
Level.fieldOfView );
if (step != -1) {
move( step );
@@ -92,10 +92,10 @@ public class Scorpio extends Mob {
@Override
protected Item createLoot() {
//5/count+5 total chance of getting healing, failing the 2nd roll drops mystery meat instead.
//5/count+5 total chance of getting healing, failing the 2nd roll drops mystery meat instead.
if (Random.Int( 5 + Dungeon.limitedDrops.scorpioHP.count ) <= 4) {
Dungeon.limitedDrops.scorpioHP.count++;
return (Item)loot;
Dungeon.limitedDrops.scorpioHP.count++;
return (Item)loot;
} else {
return new MysteryMeat();
}
@@ -84,7 +84,7 @@ public class Shaman extends Mob implements Callback {
} else {
boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos];
boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos];
if (visible) {
((ShamanSprite)sprite).zap( enemy.pos );
}
@@ -47,8 +47,8 @@ public class Skeleton extends Mob {
EXP = 5;
maxLvl = 10;
loot = Generator.Category.WEAPON;
lootChance = 0.2f;
loot = Generator.Category.WEAPON;
lootChance = 0.2f;
}
@Override
@@ -85,15 +85,15 @@ public class Skeleton extends Mob {
@Override
protected Item createLoot() {
Item loot = Generator.random( Generator.Category.WEAPON );
for (int i=0; i < 2; i++) {
Item l = Generator.random( Generator.Category.WEAPON );
if (l.level < loot.level) {
loot = l;
}
}
return loot;
}
Item loot = Generator.random( Generator.Category.WEAPON );
for (int i=0; i < 2; i++) {
Item l = Generator.random( Generator.Category.WEAPON );
if (l.level < loot.level) {
loot = l;
}
}
return loot;
}
@Override
public int attackSkill( Char target ) {
@@ -33,103 +33,103 @@ import com.watabou.utils.Random;
public class Spinner extends Mob {
{
name = "cave spinner";
spriteClass = SpinnerSprite.class;
{
name = "cave spinner";
spriteClass = SpinnerSprite.class;
HP = HT = 50;
defenseSkill = 14;
HP = HT = 50;
defenseSkill = 14;
EXP = 9;
maxLvl = 16;
EXP = 9;
maxLvl = 16;
loot = new MysteryMeat();
lootChance = 0.125f;
loot = new MysteryMeat();
lootChance = 0.125f;
FLEEING = new Fleeing();
}
FLEEING = new Fleeing();
}
@Override
public int damageRoll() {
return Random.NormalIntRange(12, 16);
}
@Override
public int damageRoll() {
return Random.NormalIntRange(12, 16);
}
@Override
public int attackSkill(Char target) {
return 20;
}
@Override
public int attackSkill(Char target) {
return 20;
}
@Override
public int dr() {
return 6;
}
@Override
public int dr() {
return 6;
}
@Override
protected boolean act() {
boolean result = super.act();
@Override
protected boolean act() {
boolean result = super.act();
if (state == FLEEING && buff( Terror.class ) == null &&
enemy != null && enemySeen && enemy.buff( Poison.class ) == null) {
state = HUNTING;
}
return result;
}
if (state == FLEEING && buff( Terror.class ) == null &&
enemy != null && enemySeen && enemy.buff( Poison.class ) == null) {
state = HUNTING;
}
return result;
}
@Override
public int attackProc(Char enemy, int damage) {
if (Random.Int(2) == 0) {
Buff.affect(enemy, Poison.class).set(Random.Int(7, 9) * Poison.durationFactor(enemy));
state = FLEEING;
}
@Override
public int attackProc(Char enemy, int damage) {
if (Random.Int(2) == 0) {
Buff.affect(enemy, Poison.class).set(Random.Int(7, 9) * Poison.durationFactor(enemy));
state = FLEEING;
}
return damage;
}
return damage;
}
@Override
public void move(int step) {
if (state == FLEEING) {
GameScene.add(Blob.seed(pos, Random.Int(5, 7), Web.class));
}
super.move(step);
}
@Override
public void move(int step) {
if (state == FLEEING) {
GameScene.add(Blob.seed(pos, Random.Int(5, 7), Web.class));
}
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.";
}
@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<Class<?>>();
static {
RESISTANCES.add(Poison.class);
}
static {
RESISTANCES.add(Poison.class);
}
@Override
public HashSet<Class<?>> resistances() {
return RESISTANCES;
}
@Override
public HashSet<Class<?>> resistances() {
return RESISTANCES;
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
static {
IMMUNITIES.add(Roots.class);
}
static {
IMMUNITIES.add(Roots.class);
}
@Override
public HashSet<Class<?>> immunities() {
return IMMUNITIES;
}
@Override
public HashSet<Class<?>> immunities() {
return IMMUNITIES;
}
private class Fleeing extends Mob.Fleeing {
@Override
protected void nowhereToRun() {
if (buff(Terror.class) == null) {
state = HUNTING;
} else {
super.nowhereToRun();
}
}
}
private class Fleeing extends Mob.Fleeing {
@Override
protected void nowhereToRun() {
if (buff(Terror.class) == null) {
state = HUNTING;
} else {
super.nowhereToRun();
}
}
}
}
@@ -50,8 +50,8 @@ public class Swarm extends Mob {
flying = true;
loot = new PotionOfHealing();
lootChance = 0.2f; //by default, see die()
loot = new PotionOfHealing();
lootChance = 0.2f; //by default, see die()
}
private static final float SPLIT_DELAY = 1f;
@@ -139,16 +139,16 @@ public class Swarm extends Mob {
@Override
public void die( Object cause ){
//sets drop chance
lootChance = 1f/((5 + Dungeon.limitedDrops.swarmHP.count ) * (generation+1) );
super.die( cause );
}
//sets drop chance
lootChance = 1f/((5 + Dungeon.limitedDrops.swarmHP.count ) * (generation+1) );
super.die( cause );
}
@Override
protected Item createLoot(){
Dungeon.limitedDrops.swarmHP.count++;
return super.createLoot();
}
@Override
protected Item createLoot(){
Dungeon.limitedDrops.swarmHP.count++;
return super.createLoot();
}
@Override
public String description() {
@@ -158,8 +158,8 @@ public class Tengu extends Mob {
do {
newPos = Random.Int( Level.LENGTH );
} while (
!Level.fieldOfView[newPos] ||
!Level.passable[newPos] ||
!Level.fieldOfView[newPos] ||
!Level.passable[newPos] ||
Level.adjacent( newPos, enemy.pos ) ||
Actor.findChar( newPos ) != null);
@@ -50,132 +50,132 @@ public class Thief extends Mob {
maxLvl = 10;
loot = new MasterThievesArmband().identify();
lootChance = 0.01f;
lootChance = 0.01f;
FLEEING = new Fleeing();
}
FLEEING = new Fleeing();
}
private static final String ITEM = "item";
private static final String ITEM = "item";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( ITEM, item );
}
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( ITEM, item );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
item = (Item)bundle.get( ITEM );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
item = (Item)bundle.get( ITEM );
}
@Override
public int damageRoll() {
return Random.NormalIntRange( 1, 7 );
}
@Override
public int damageRoll() {
return Random.NormalIntRange( 1, 7 );
}
@Override
protected float attackDelay() {
return 0.5f;
}
@Override
protected float attackDelay() {
return 0.5f;
}
@Override
public void die( Object cause ) {
@Override
public void die( Object cause ) {
super.die( cause );
super.die( cause );
if (item != null) {
Dungeon.level.drop( item, pos ).sprite.drop();
//updates position
if (item instanceof Honeypot.ShatteredPot) ((Honeypot.ShatteredPot)item).setHolder( this );
}
}
if (item != null) {
Dungeon.level.drop( item, pos ).sprite.drop();
//updates position
if (item instanceof Honeypot.ShatteredPot) ((Honeypot.ShatteredPot)item).setHolder( this );
}
}
@Override
protected Item createLoot(){
if (!Dungeon.limitedDrops.armband.dropped()) {
Dungeon.limitedDrops.armband.drop();
return super.createLoot();
} else
return new Gold(Random.NormalIntRange(100, 250));
}
@Override
protected Item createLoot(){
if (!Dungeon.limitedDrops.armband.dropped()) {
Dungeon.limitedDrops.armband.drop();
return super.createLoot();
} else
return new Gold(Random.NormalIntRange(100, 250));
}
@Override
public int attackSkill( Char target ) {
return 12;
}
@Override
public int attackSkill( Char target ) {
return 12;
}
@Override
public int dr() {
return 3;
}
@Override
public int dr() {
return 3;
}
@Override
public int attackProc( Char enemy, int damage ) {
if (item == null && enemy instanceof Hero && steal( (Hero)enemy )) {
state = FLEEING;
}
@Override
public int attackProc( Char enemy, int damage ) {
if (item == null && enemy instanceof Hero && steal( (Hero)enemy )) {
state = FLEEING;
}
return damage;
}
return damage;
}
@Override
public int defenseProc(Char enemy, int damage) {
if (state == FLEEING) {
Dungeon.level.drop( new Gold(), pos ).sprite.drop();
}
@Override
public int defenseProc(Char enemy, int damage) {
if (state == FLEEING) {
Dungeon.level.drop( new Gold(), pos ).sprite.drop();
}
return super.defenseProc(enemy, damage);
}
return super.defenseProc(enemy, damage);
}
protected boolean steal( Hero hero ) {
protected boolean steal( Hero hero ) {
Item item = hero.belongings.randomUnequipped();
if (item != null) {
Item item = hero.belongings.randomUnequipped();
if (item != null) {
GLog.w( TXT_STOLE, this.name, item.name() );
GLog.w( TXT_STOLE, this.name, item.name() );
if (item instanceof Honeypot){
this.item = ((Honeypot)item).shatter(this, this.pos);
item.detach( hero.belongings.backpack );
} else {
this.item = item;
if ( item instanceof Honeypot.ShatteredPot)
((Honeypot.ShatteredPot)item).setHolder(this);
item.detachAll( hero.belongings.backpack );
}
if (item instanceof Honeypot){
this.item = ((Honeypot)item).shatter(this, this.pos);
item.detach( hero.belongings.backpack );
} else {
this.item = item;
if ( item instanceof Honeypot.ShatteredPot)
((Honeypot.ShatteredPot)item).setHolder(this);
item.detachAll( hero.belongings.backpack );
}
return true;
} else {
return false;
}
}
return true;
} else {
return false;
}
}
@Override
public String description() {
String desc =
"Deeper levels of the dungeon have always been a hiding place for all kinds of criminals. " +
"Not all of them could keep a clear mind during their extended periods so far from daylight. Long ago, " +
"these crazy thieves and bandits have forgotten who they are and why they steal.";
@Override
public String description() {
String desc =
"Deeper levels of the dungeon have always been a hiding place for all kinds of criminals. " +
"Not all of them could keep a clear mind during their extended periods so far from daylight. Long ago, " +
"these crazy thieves and bandits have forgotten who they are and why they steal.";
if (item != null) {
desc += String.format( TXT_CARRIES, Utils.capitalize( this.name ), item.name() );
}
if (item != null) {
desc += String.format( TXT_CARRIES, Utils.capitalize( this.name ), item.name() );
}
return desc;
}
return desc;
}
private class Fleeing extends Mob.Fleeing {
@Override
protected void nowhereToRun() {
if (buff( Terror.class ) == null) {
sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE );
state = HUNTING;
} else {
super.nowhereToRun();
}
}
}
private class Fleeing extends Mob.Fleeing {
@Override
protected void nowhereToRun() {
if (buff( Terror.class ) == null) {
sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE );
state = HUNTING;
} else {
super.nowhereToRun();
}
}
}
}
@@ -85,7 +85,7 @@ public class Warlock extends Mob implements Callback {
} else {
boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos];
boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos];
if (visible) {
((WarlockSprite)sprite).zap( enemy.pos );
} else {
@@ -126,22 +126,22 @@ public class Warlock extends Mob implements Callback {
next();
}
@Override
public Item createLoot(){
Item loot = super.createLoot();
@Override
public Item createLoot(){
Item loot = super.createLoot();
if (loot instanceof PotionOfHealing){
if (loot instanceof PotionOfHealing){
//count/10 chance of not dropping potion
if (Random.Int(10)-Dungeon.limitedDrops.warlockHP.count < 0){
return null;
} else
Dungeon.limitedDrops.warlockHP.count++;
//count/10 chance of not dropping potion
if (Random.Int(10)-Dungeon.limitedDrops.warlockHP.count < 0){
return null;
} else
Dungeon.limitedDrops.warlockHP.count++;
}
}
return loot;
}
return loot;
}
@Override
public String description() {
@@ -133,11 +133,11 @@ public class Yog extends Mob {
Actor.addDelayed( new Pushing( larva, pos, larva.pos ), -1 );
}
for (Mob mob : Dungeon.level.mobs) {
if (mob instanceof BurningFist || mob instanceof RottingFist || mob instanceof Larva) {
mob.aggro( enemy );
}
}
for (Mob mob : Dungeon.level.mobs) {
if (mob instanceof BurningFist || mob instanceof RottingFist || mob instanceof Larva) {
mob.aggro( enemy );
}
}
return super.defenseProc(enemy, damage);
}
@@ -377,7 +377,7 @@ public class Yog extends Mob {
IMMUNITIES.add( Sleep.class );
IMMUNITIES.add( Terror.class );
IMMUNITIES.add( Burning.class );
IMMUNITIES.add( ScrollOfPsionicBlast.class );
IMMUNITIES.add( ScrollOfPsionicBlast.class );
IMMUNITIES.add( Vertigo.class );
}
@@ -75,7 +75,7 @@ public class Blacksmith extends NPC {
@Override
protected boolean act() {
throwItem();
throwItem();
return super.act();
}
@@ -86,7 +86,7 @@ public class Blacksmith extends NPC {
if (!Quest.given) {
GameScene.show( new WndQuest( this,
GameScene.show( new WndQuest( this,
Quest.alternative ? TXT_BLOOD_1 : TXT_GOLD_1 ) {
@Override
@@ -168,7 +168,7 @@ public class Blacksmith extends NPC {
return "Select 2 different items, not the same item twice!";
}
if (item1.getClass() != item2.getClass()) {
if (item1.getClass() != item2.getClass()) {
return "Select 2 items of the same type!";
}
@@ -244,7 +244,7 @@ public class Blacksmith extends NPC {
@Override
public String description() {
return
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.";
}
@@ -77,37 +77,37 @@ public class Ghost extends NPC {
}
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..._ ";
"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_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_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_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_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..._";
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();
@@ -156,69 +156,69 @@ public class Ghost extends NPC {
if (Quest.given) {
if (Quest.weapon != null) {
if (Quest.processed) {
GameScene.show(new WndSadGhost(this, Quest.type));
} else {
switch (Quest.type) {
case 1:
default:
GameScene.show(new WndQuest(this, TXT_RAT2));
break;
case 2:
GameScene.show(new WndQuest(this, TXT_GNOLL2));
break;
case 3:
GameScene.show(new WndQuest(this, TXT_CRAB2));
break;
}
if (Quest.processed) {
GameScene.show(new WndSadGhost(this, Quest.type));
} else {
switch (Quest.type) {
case 1:
default:
GameScene.show(new WndQuest(this, TXT_RAT2));
break;
case 2:
GameScene.show(new WndQuest(this, TXT_GNOLL2));
break;
case 3:
GameScene.show(new WndQuest(this, TXT_CRAB2));
break;
}
int newPos = -1;
for (int i = 0; i < 10; i++) {
newPos = Dungeon.level.randomRespawnCell();
if (newPos != -1) {
break;
}
}
if (newPos != -1) {
int newPos = -1;
for (int i = 0; i < 10; i++) {
newPos = Dungeon.level.randomRespawnCell();
if (newPos != -1) {
break;
}
}
if (newPos != -1) {
CellEmitter.get(pos).start(Speck.factory(Speck.LIGHT), 0.2f, 3);
pos = newPos;
sprite.place(pos);
sprite.visible = Dungeon.visible[pos];
}
}
}
CellEmitter.get(pos).start(Speck.factory(Speck.LIGHT), 0.2f, 3);
pos = newPos;
sprite.place(pos);
sprite.visible = Dungeon.visible[pos];
}
}
}
} else {
Mob questBoss;
String txt_quest;
Mob questBoss;
String txt_quest;
switch (Quest.type){
case 1: default:
questBoss = new FetidRat();
txt_quest = Utils.format(TXT_RAT1, Dungeon.hero.givenName()); break;
case 2:
questBoss = new GnollTrickster();
txt_quest = Utils.format(TXT_GNOLL1, Dungeon.hero.givenName()); break;
case 3:
questBoss = new GreatCrab();
txt_quest = Utils.format(TXT_CRAB1, Dungeon.hero.givenName()); break;
}
switch (Quest.type){
case 1: default:
questBoss = new FetidRat();
txt_quest = Utils.format(TXT_RAT1, Dungeon.hero.givenName()); break;
case 2:
questBoss = new GnollTrickster();
txt_quest = Utils.format(TXT_GNOLL1, Dungeon.hero.givenName()); break;
case 3:
questBoss = new GreatCrab();
txt_quest = Utils.format(TXT_CRAB1, Dungeon.hero.givenName()); break;
}
questBoss.pos = Dungeon.level.randomRespawnCell();
questBoss.pos = Dungeon.level.randomRespawnCell();
if (questBoss.pos != -1) {
GameScene.add(questBoss);
GameScene.show( new WndQuest( this, txt_quest ) );
Quest.given = true;
Journal.add( Journal.Feature.GHOST );
}
if (questBoss.pos != -1) {
GameScene.add(questBoss);
GameScene.show( new WndQuest( this, txt_quest ) );
Quest.given = true;
Journal.add( Journal.Feature.GHOST );
}
}
}
@Override
public String description() {
return
return
"The ghost is barely visible. It looks like a shapeless " +
"spot of faint light with a sorrowful face.";
}
@@ -240,7 +240,7 @@ public class Ghost extends NPC {
private static boolean spawned;
private static int type;
private static int type;
private static boolean given;
private static boolean processed;
@@ -251,7 +251,7 @@ public class Ghost extends NPC {
public static Armor armor;
public static void reset() {
spawned = false;
spawned = false;
weapon = null;
armor = null;
@@ -260,7 +260,7 @@ public class Ghost extends NPC {
private static final String NODE = "sadGhost";
private static final String SPAWNED = "spawned";
private static final String TYPE = "type";
private static final String TYPE = "type";
private static final String GIVEN = "given";
private static final String PROCESSED = "processed";
private static final String DEPTH = "depth";
@@ -294,9 +294,9 @@ public class Ghost extends NPC {
if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) {
type = node.getInt(TYPE);
given = node.getBoolean( GIVEN );
processed = node.getBoolean( PROCESSED );
type = node.getInt(TYPE);
given = node.getBoolean( GIVEN );
processed = node.getBoolean( PROCESSED );
depth = node.getInt( DEPTH );
@@ -317,32 +317,32 @@ public class Ghost extends NPC {
level.mobs.add( ghost );
spawned = true;
//dungeon depth determines type of quest.
//depth2=fetid rat, 3=gnoll trickster, 4=great crab
//dungeon depth determines type of quest.
//depth2=fetid rat, 3=gnoll trickster, 4=great crab
type = Dungeon.depth-1;
given = false;
processed = false;
depth = Dungeon.depth;
do {
weapon = Generator.randomWeapon(10);
} while (weapon instanceof MissileWeapon);
armor = Generator.randomArmor(10);
do {
weapon = Generator.randomWeapon(10);
} while (weapon instanceof MissileWeapon);
armor = Generator.randomArmor(10);
for (int i = 1; i <= 3; i++) {
Item another;
do {
another = Generator.randomWeapon(10+i);
} while (another instanceof MissileWeapon);
if (another.level >= weapon.level) {
weapon = (Weapon) another;
}
another = Generator.randomArmor(10+i);
if (another.level >= armor.level) {
armor = (Armor) another;
}
}
for (int i = 1; i <= 3; i++) {
Item another;
do {
another = Generator.randomWeapon(10+i);
} while (another instanceof MissileWeapon);
if (another.level >= weapon.level) {
weapon = (Weapon) another;
}
another = Generator.randomArmor(10+i);
if (another.level >= armor.level) {
armor = (Armor) another;
}
}
weapon.identify();
armor.identify();
@@ -352,9 +352,9 @@ 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...");
Sample.INSTANCE.play( Assets.SND_GHOST );
processed = true;
Generator.Category.ARTIFACT.probs[10] = 1; //flags the dried rose as spawnable.
Sample.INSTANCE.play( Assets.SND_GHOST );
processed = true;
Generator.Category.ARTIFACT.probs[10] = 1; //flags the dried rose as spawnable.
}
}
@@ -379,7 +379,7 @@ public class Ghost extends NPC {
EXP = 4;
state = WANDERING;
state = WANDERING;
}
@Override
@@ -392,14 +392,14 @@ public class Ghost extends NPC {
return 2;
}
@Override
public int attackProc( Char enemy, int damage ) {
if (Random.Int( 3 ) == 0) {
Buff.affect(enemy, Ooze.class);
}
@Override
public int attackProc( Char enemy, int damage ) {
if (Random.Int( 3 ) == 0) {
Buff.affect(enemy, Ooze.class);
}
return damage;
}
return damage;
}
@Override
public int defenseProc( Char enemy, int damage ) {
@@ -420,184 +420,184 @@ public class Ghost extends NPC {
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.";
"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<?>>();
static {
IMMUNITIES.add( StenchGas.class );
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
static {
IMMUNITIES.add( StenchGas.class );
}
@Override
public HashSet<Class<?>> immunities() {
return IMMUNITIES;
}
@Override
public HashSet<Class<?>> immunities() {
return IMMUNITIES;
}
}
public static class GnollTrickster extends Gnoll {
{
name = "gnoll trickster";
spriteClass = GnollTricksterSprite.class;
public static class GnollTrickster extends Gnoll {
{
name = "gnoll trickster";
spriteClass = GnollTricksterSprite.class;
HP = HT = 20;
defenseSkill = 5;
HP = HT = 20;
defenseSkill = 5;
EXP = 5;
EXP = 5;
state = WANDERING;
state = WANDERING;
loot = Generator.random(CurareDart.class);
lootChance = 1f;
}
loot = Generator.random(CurareDart.class);
lootChance = 1f;
}
private int combo = 0;
private int combo = 0;
@Override
public int attackSkill( Char target ) {
return 16;
}
@Override
public int attackSkill( Char target ) {
return 16;
}
@Override
protected boolean canAttack( Char enemy ) {
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE );
if (!Level.adjacent(pos, enemy.pos) && attack.collisionPos == enemy.pos){
combo++;
return true;
} else {
return false;
}
}
@Override
protected boolean canAttack( Char enemy ) {
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE );
if (!Level.adjacent(pos, enemy.pos) && attack.collisionPos == enemy.pos){
combo++;
return true;
} else {
return false;
}
}
@Override
public int attackProc( Char enemy, int damage ) {
//The gnoll's attacks get more severe the more the player lets it hit them
int effect = Random.Int(4)+combo;
@Override
public int attackProc( Char enemy, int damage ) {
//The gnoll's attacks get more severe the more the player lets it hit them
int effect = Random.Int(4)+combo;
if (effect > 2) {
if (effect > 2) {
if (effect >=6 && enemy.buff(Burning.class) == null){
if (effect >=6 && enemy.buff(Burning.class) == null){
if (Level.flamable[enemy.pos])
GameScene.add( Blob.seed( enemy.pos, 4, Fire.class ) );
Buff.affect( enemy, Burning.class ).reignite( enemy );
if (Level.flamable[enemy.pos])
GameScene.add( Blob.seed( enemy.pos, 4, Fire.class ) );
Buff.affect( enemy, Burning.class ).reignite( enemy );
} else
Buff.affect( enemy, Poison.class).set((effect-2) * Poison.durationFactor(enemy));
} else
Buff.affect( enemy, Poison.class).set((effect-2) * Poison.durationFactor(enemy));
}
return damage;
}
}
return damage;
}
@Override
protected boolean getCloser( int target ) {
combo = 0; //if he's moving, he isn't attacking, reset combo.
if (enemy != null && Level.adjacent(pos, enemy.pos)) {
return getFurther( target );
} else {
return super.getCloser( target );
}
}
@Override
protected boolean getCloser( int target ) {
combo = 0; //if he's moving, he isn't attacking, reset combo.
if (enemy != null && Level.adjacent(pos, enemy.pos)) {
return getFurther( target );
} else {
return super.getCloser( target );
}
}
@Override
public void die( Object cause ) {
super.die( cause );
@Override
public void die( Object cause ) {
super.die( cause );
Quest.process();
}
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.";
}
@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";
private static final String COMBO = "combo";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle(bundle);
bundle.put(COMBO, combo);
}
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle(bundle);
bundle.put(COMBO, combo);
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
combo = bundle.getInt( COMBO );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
combo = bundle.getInt( COMBO );
}
}
}
public static class GreatCrab extends Crab {
{
name = "great crab";
spriteClass = GreatCrabSprite.class;
public static class GreatCrab extends Crab {
{
name = "great crab";
spriteClass = GreatCrabSprite.class;
HP = HT = 30;
defenseSkill = 0; //see damage()
baseSpeed = 1f;
HP = HT = 30;
defenseSkill = 0; //see damage()
baseSpeed = 1f;
EXP = 6;
EXP = 6;
state = WANDERING;
}
state = WANDERING;
}
private int moving = 0;
private int moving = 0;
@Override
protected boolean getCloser( int target ) {
//this is used so that the crab remains slower, but still detects the player at the expected rate.
moving++;
if (moving < 3) {
return super.getCloser( target );
} else {
moving = 0;
return true;
}
@Override
protected boolean getCloser( int target ) {
//this is used so that the crab remains slower, but still detects the player at the expected rate.
moving++;
if (moving < 3) {
return super.getCloser( target );
} else {
moving = 0;
return true;
}
}
}
@Override
public void damage( int dmg, Object src ){
//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" );
} else {
super.damage( dmg, src );
}
}
@Override
public void damage( int dmg, Object src ){
//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" );
} else {
super.damage( dmg, src );
}
}
@Override
public void die( Object cause ) {
super.die( cause );
@Override
public void die( Object cause ) {
super.die( cause );
Quest.process();
Quest.process();
Dungeon.level.drop( new MysteryMeat(), pos );
Dungeon.level.drop( new MysteryMeat(), pos ).sprite.drop();
}
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.";
}
}
@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.";
}
}
}
@@ -62,11 +62,11 @@ public class Imp extends NPC {
"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?";
"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.";
"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!";
@@ -136,7 +136,7 @@ public class Imp extends NPC {
}
private void tell( String format, Object...args ) {
GameScene.show(
GameScene.show(
new WndQuest( this, Utils.format( format, args ) ) );
}
@@ -150,7 +150,7 @@ public class Imp extends NPC {
@Override
public String description() {
return
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.";
}
@@ -28,7 +28,7 @@ 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!";
public static final String TXT_THIEF = "I thought I could trust you!";
{
@@ -50,7 +50,7 @@ public class ImpShopkeeper extends Shopkeeper {
}
@Override
public void flee() {
public void flee() {
for (Heap heap: Dungeon.level.heaps.values()) {
if (heap.type == Heap.Type.FOR_SALE) {
CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 );
@@ -66,7 +66,7 @@ public class ImpShopkeeper extends Shopkeeper {
@Override
public String description() {
return
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.";
}
@@ -135,16 +135,16 @@ public class MirrorImage extends NPC {
Dungeon.hero.spend( 1 / Dungeon.hero.speed() );
Dungeon.hero.busy();
}
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
static {
IMMUNITIES.add( ToxicGas.class );
IMMUNITIES.add( Burning.class );
}
private static final HashSet<Class<?>> IMMUNITIES = new HashSet<Class<?>>();
static {
IMMUNITIES.add( ToxicGas.class );
IMMUNITIES.add( Burning.class );
}
@Override
public HashSet<Class<?>> immunities() {
return IMMUNITIES;
@Override
public HashSet<Class<?>> immunities() {
return IMMUNITIES;
}
}
@@ -25,28 +25,28 @@ import com.watabou.utils.Random;
public abstract class NPC extends Mob {
{
HP = HT = 1;
EXP = 0;
{
HP = HT = 1;
EXP = 0;
hostile = false;
state = PASSIVE;
}
hostile = false;
state = PASSIVE;
}
protected void throwItem() {
Heap heap = Dungeon.level.heaps.get( pos );
if (heap != null) {
int n;
do {
n = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
} while (!Level.passable[n] && !Level.avoid[n]);
Dungeon.level.drop( heap.pickUp(), n ).sprite.drop( pos );
}
}
protected void throwItem() {
Heap heap = Dungeon.level.heaps.get( pos );
if (heap != null) {
int n;
do {
n = pos + Level.NEIGHBOURS8[Random.Int( 8 )];
} while (!Level.passable[n] && !Level.avoid[n]);
Dungeon.level.drop( heap.pickUp(), n ).sprite.drop( pos );
}
}
@Override
public void beckon( int cell ) {
}
@Override
public void beckon( int cell ) {
}
abstract public void interact();
abstract public void interact();
}
@@ -31,7 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem;
public class Shopkeeper extends NPC {
public static final String TXT_THIEF = "Thief, Thief!";
public static final String TXT_THIEF = "Thief, Thief!";
{
name = "shopkeeper";
@@ -79,7 +79,7 @@ public class Shopkeeper extends NPC {
@Override
public String description() {
return
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.";
}
@@ -55,7 +55,7 @@ import com.watabou.utils.Random;
public class Wandmaker extends NPC {
{
{
name = "old wandmaker";
spriteClass = WandmakerSprite.class;
}
@@ -126,8 +126,8 @@ public class Wandmaker extends NPC {
Quest.placeItem();
if (Quest.given)
tell(Quest.alternative ? TXT_DUST1 : TXT_BERRY1);
if (Quest.given)
tell(Quest.alternative ? TXT_DUST1 : TXT_BERRY1);
Journal.add( Journal.Feature.WANDMAKER );
}
@@ -139,7 +139,7 @@ public class Wandmaker extends NPC {
@Override
public String description() {
return
return
"This old but hale gentleman wears a slightly confused " +
"expression. He is protected by a magic shield.";
}
@@ -241,19 +241,19 @@ public class Wandmaker extends NPC {
if (candidates.size() > 0) {
Random.element( candidates ).drop( new CorpseDust() );
given = true;
given = true;
} else {
int pos = Dungeon.level.randomRespawnCell();
while (Dungeon.level.heaps.get( pos ) != null) {
pos = Dungeon.level.randomRespawnCell();
}
if (pos != -1) {
Heap heap = Dungeon.level.drop(new CorpseDust(), pos);
heap.type = Heap.Type.SKELETON;
heap.sprite.link();
given = true;
}
if (pos != -1) {
Heap heap = Dungeon.level.drop(new CorpseDust(), pos);
heap.type = Heap.Type.SKELETON;
heap.sprite.link();
given = true;
}
}
} else {
@@ -263,10 +263,10 @@ public class Wandmaker extends NPC {
shrubPos = Dungeon.level.randomRespawnCell();
}
if (shrubPos != -1) {
Dungeon.level.plant(new Rotberry.Seed(), shrubPos);
given = true;
}
if (shrubPos != -1) {
Dungeon.level.plant(new Rotberry.Seed(), shrubPos);
given = true;
}
}
}
@@ -281,7 +281,7 @@ public class Wandmaker extends NPC {
public static class Rotberry extends Plant {
private static final String TXT_DESC =
private static final String TXT_DESC =
"Berries of this shrub taste like sweet, sweet death.";
{