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

View File

@ -5,20 +5,20 @@
android:versionName="0.3.0d"
android:installLocation="auto">
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21"/>
android:minSdkVersion="8"
android:targetSdkVersion="21"/>
<uses-feature
android:glEsVersion="0x00020000"/>
android:glEsVersion="0x00020000"/>
<supports-screens
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"/>
<!--android:xlargeScreens="true"-->
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"/>
<!--android:xlargeScreens="true"-->
<application
android:icon="@drawable/ic_launcher"

View File

@ -40,7 +40,7 @@ public class Assets {
public static final String ROGUE = "rogue.png";
public static final String HUNTRESS = "ranger.png";
public static final String AVATARS = "avatars.png";
public static final String PET = "pet.png";
public static final String PET = "pet.png";
public static final String SURFACE = "surface.png";

View File

@ -97,7 +97,7 @@ public class Badges {
BOSS_SLAIN_3_ASSASSIN,
BOSS_SLAIN_3_SNIPER,
BOSS_SLAIN_3_WARDEN,
BOSS_SLAIN_3_ALL_SUBCLASSES(
BOSS_SLAIN_3_ALL_SUBCLASSES(
"3rd boss slain by Gladiator, Berserker, Warlock, Battlemage, " +
"Freerunner, Assassin, Sniper & Warden", 33, true ),
RING_OF_HAGGLER( "Ring of Haggler obtained", 20 ),
@ -144,7 +144,7 @@ public class Badges {
GAMES_PLAYED_3( "500 games played", 62, true ),
GAMES_PLAYED_4( "2000 games played", 63, true ),
HAPPY_END( "Happy end", 38 ),
CHAMPION( "Challenge won", 39, true ),
CHAMPION( "Challenge won", 39, true ),
SUPPORTER( "Thanks for your support!", 31, true );
public boolean meta;
@ -402,7 +402,7 @@ public class Badges {
// 2) When an item is upgraded (ScrollOfUpgrade, ScrollOfWeaponUpgrade, ShortSword, WandOfMagicMissile)
// 3) When an item is identified
// Note that artifacts should never trigger this badge as they are alternatively upgraded
// Note that artifacts should never trigger this badge as they are alternatively upgraded
if (!item.levelKnown || item instanceof Artifact) {
return;
}
@ -429,7 +429,7 @@ public class Badges {
}
public static void validateAllPotionsIdentified() {
if (Dungeon.hero != null && Dungeon.hero.isAlive() &&
if (Dungeon.hero != null && Dungeon.hero.isAlive() &&
!local.contains( Badge.ALL_POTIONS_IDENTIFIED ) && Potion.allKnown()) {
Badge badge = Badge.ALL_POTIONS_IDENTIFIED;
@ -441,7 +441,7 @@ public class Badges {
}
public static void validateAllScrollsIdentified() {
if (Dungeon.hero != null && Dungeon.hero.isAlive() &&
if (Dungeon.hero != null && Dungeon.hero.isAlive() &&
!local.contains( Badge.ALL_SCROLLS_IDENTIFIED ) && Scroll.allKnown()) {
Badge badge = Badge.ALL_SCROLLS_IDENTIFIED;
@ -453,7 +453,7 @@ public class Badges {
}
public static void validateAllRingsIdentified() {
if (Dungeon.hero != null && Dungeon.hero.isAlive() &&
if (Dungeon.hero != null && Dungeon.hero.isAlive() &&
!local.contains( Badge.ALL_RINGS_IDENTIFIED ) && Ring.allKnown()) {
Badge badge = Badge.ALL_RINGS_IDENTIFIED;
@ -717,7 +717,7 @@ public class Badges {
}
}
//TODO: Replace this badge, delayed until an eventual badge rework
//TODO: Replace this badge, delayed until an eventual badge rework
public static void validateRingOfHaggler() {
if (!local.contains( Badge.RING_OF_HAGGLER )/* && new RingOfThorns().isKnown()*/) {
Badge badge = Badge.RING_OF_HAGGLER;
@ -726,7 +726,7 @@ public class Badges {
}
}
//TODO: Replace this badge, delayed until an eventual badge rework
//TODO: Replace this badge, delayed until an eventual badge rework
public static void validateRingOfThorns() {
if (!local.contains( Badge.RING_OF_THORNS )/* && new RingOfThorns().isKnown()*/) {
Badge badge = Badge.RING_OF_THORNS;
@ -854,9 +854,9 @@ public class Badges {
displayBadge( Badge.HAPPY_END );
}
public static void validateChampion() {
displayBadge(Badge.CHAMPION);
}
public static void validateChampion() {
displayBadge(Badge.CHAMPION);
}
private static void displayBadge( Badge badge ) {
@ -879,7 +879,7 @@ public class Badges {
GLog.h( "New super badge: %s", badge.description );
} else {
GLog.h( "New badge: %s", badge.description );
}
}
PixelScene.showBadge( badge );
}
}

View File

@ -46,13 +46,13 @@ public class Bones {
public static void leave() {
depth = Dungeon.depth;
depth = Dungeon.depth;
//heroes which have won the game, who die far above their farthest depth, or who are challenged drop no bones.
if (Statistics.amuletObtained || (Statistics.deepestFloor - 5) >= depth || Dungeon.challenges > 0) {
depth = -1;
return;
}
//heroes which have won the game, who die far above their farthest depth, or who are challenged drop no bones.
if (Statistics.amuletObtained || (Statistics.deepestFloor - 5) >= depth || Dungeon.challenges > 0) {
depth = -1;
return;
}
item = pickItem(Dungeon.hero);
@ -69,59 +69,59 @@ public class Bones {
}
}
private static Item pickItem(Hero hero){
Item item = null;
if (Random.Int(2) == 0) {
switch (Random.Int(5)) {
case 0:
item = hero.belongings.weapon;
break;
case 1:
item = hero.belongings.armor;
break;
case 2:
item = hero.belongings.misc1;
break;
case 3:
item = hero.belongings.misc2;
break;
case 4:
item = Dungeon.quickslot.randomNonePlaceholder();
break;
}
if (item != null && !item.bones)
return pickItem(hero);
} else {
private static Item pickItem(Hero hero){
Item item = null;
if (Random.Int(2) == 0) {
switch (Random.Int(5)) {
case 0:
item = hero.belongings.weapon;
break;
case 1:
item = hero.belongings.armor;
break;
case 2:
item = hero.belongings.misc1;
break;
case 3:
item = hero.belongings.misc2;
break;
case 4:
item = Dungeon.quickslot.randomNonePlaceholder();
break;
}
if (item != null && !item.bones)
return pickItem(hero);
} else {
Iterator<Item> iterator = hero.belongings.backpack.iterator();
Item curItem;
ArrayList<Item> items = new ArrayList<Item>();
while (iterator.hasNext()){
curItem = iterator.next();
if (curItem.bones)
items.add(curItem);
}
Iterator<Item> iterator = hero.belongings.backpack.iterator();
Item curItem;
ArrayList<Item> items = new ArrayList<Item>();
while (iterator.hasNext()){
curItem = iterator.next();
if (curItem.bones)
items.add(curItem);
}
if (Random.Int(3) < items.size()) {
item = Random.element(items);
if (item.stackable){
if (item instanceof MissileWeapon){
item.quantity(Random.NormalIntRange(1, item.quantity()));
} else {
item.quantity(Random.NormalIntRange(1, (item.quantity() + 1) / 2));
}
}
}
}
if (item == null) {
if (Dungeon.gold > 50) {
item = new Gold( Random.NormalIntRange( 50, Dungeon.gold ) );
} else {
item = new Gold( 50 );
}
}
return item;
}
if (Random.Int(3) < items.size()) {
item = Random.element(items);
if (item.stackable){
if (item instanceof MissileWeapon){
item.quantity(Random.NormalIntRange(1, item.quantity()));
} else {
item.quantity(Random.NormalIntRange(1, (item.quantity() + 1) / 2));
}
}
}
}
if (item == null) {
if (Dungeon.gold > 50) {
item = new Gold( Random.NormalIntRange( 50, Dungeon.gold ) );
} else {
item = new Gold( 50 );
}
}
return item;
}
public static Item get() {
if (depth == -1) {
@ -141,36 +141,36 @@ public class Bones {
}
} else {
//heroes who are challenged cannot find bones
//heroes who are challenged cannot find bones
if (depth == Dungeon.depth && Dungeon.challenges == 0) {
Game.instance.deleteFile( BONES_FILE );
depth = 0;
if (item instanceof Artifact){
if (Generator.removeArtifact((Artifact)item)) {
try {
Artifact artifact = (Artifact)item.getClass().newInstance();
artifact.cursed = true;
artifact.cursedKnown = true;
//caps displayed artifact level
artifact.transferUpgrade(Math.min(
item.visiblyUpgraded(),
1 + ((Dungeon.depth * 3) / 10)));
if (item instanceof Artifact){
if (Generator.removeArtifact((Artifact)item)) {
try {
Artifact artifact = (Artifact)item.getClass().newInstance();
artifact.cursed = true;
artifact.cursedKnown = true;
//caps displayed artifact level
artifact.transferUpgrade(Math.min(
item.visiblyUpgraded(),
1 + ((Dungeon.depth * 3) / 10)));
return item;
} catch (Exception e) {
return new Gold(item.price());
}
} else {
return new Gold(item.price());
}
}
return item;
} catch (Exception e) {
return new Gold(item.price());
}
} else {
return new Gold(item.price());
}
}
if (item.isUpgradable()) {
item.cursed = true;
item.cursedKnown = true;
if (item.isUpgradable()) {
//gain 1 level every 3.333 floors down plus one additional level.
//gain 1 level every 3.333 floors down plus one additional level.
int lvl = 1 + ((Dungeon.depth * 3) / 10);
if (lvl < item.level) {
item.degrade( item.level - lvl );
@ -186,5 +186,5 @@ public class Bones {
return null;
}
}
}
}
}

View File

@ -19,26 +19,26 @@ package com.shatteredpixel.shatteredpixeldungeon;
public class Challenges {
public static final int NO_FOOD = 1;
public static final int NO_ARMOR = 2;
public static final int NO_HEALING = 4;
public static final int NO_HERBALISM = 8;
public static final int SWARM_INTELLIGENCE = 16;
public static final int DARKNESS = 32;
public static final int NO_FOOD = 1;
public static final int NO_ARMOR = 2;
public static final int NO_HEALING = 4;
public static final int NO_HERBALISM = 8;
public static final int SWARM_INTELLIGENCE = 16;
public static final int DARKNESS = 32;
public static final int NO_SCROLLS = 64;
public static final String[] NAMES = {
"On diet",
"Faith is my armor",
"Pharmacophobia",
"Barren land",
"Swarm intelligence",
"Into darkness",
"Forbidden runes"
};
public static final String[] NAMES = {
"On diet",
"Faith is my armor",
"Pharmacophobia",
"Barren land",
"Swarm intelligence",
"Into darkness",
"Forbidden runes"
};
public static final int[] MASKS = {
NO_FOOD, NO_ARMOR, NO_HEALING, NO_HERBALISM, SWARM_INTELLIGENCE, DARKNESS, NO_SCROLLS
};
public static final int[] MASKS = {
NO_FOOD, NO_ARMOR, NO_HEALING, NO_HERBALISM, SWARM_INTELLIGENCE, DARKNESS, NO_SCROLLS
};
}

View File

@ -73,45 +73,45 @@ public class Dungeon {
public static int transmutation; // depth number for a well of transmutation
//enum of items which have limited spawns, records how many have spawned
//could all be their own separate numbers, but this allows iterating, much nicer for bundling/initializing.
//enum of items which have limited spawns, records how many have spawned
//could all be their own separate numbers, but this allows iterating, much nicer for bundling/initializing.
public static enum limitedDrops{
//limited world drops
strengthPotions,
upgradeScrolls,
arcaneStyli,
//limited world drops
strengthPotions,
upgradeScrolls,
arcaneStyli,
//all unlimited health potion sources
//all unlimited health potion sources
swarmHP,
batHP,
warlockHP,
scorpioHP,
cookingHP,
//blandfruit, which can technically be an unlimited health potion source
//blandfruit, which can technically be an unlimited health potion source
blandfruitSeed,
//doesn't use Generator, so we have to enforce one armband drop here
//doesn't use Generator, so we have to enforce one armband drop here
armband,
//containers
dewVial,
seedBag,
scrollBag,
potionBag,
wandBag;
//containers
dewVial,
seedBag,
scrollBag,
potionBag,
wandBag;
public int count = 0;
//for items which can only be dropped once, should directly access count otherwise.
public boolean dropped(){
return count != 0;
}
public void drop(){
count = 1;
}
//for items which can only be dropped once, should directly access count otherwise.
public boolean dropped(){
return count != 0;
}
public void drop(){
count = 1;
}
}
public static int challenges;
public static int challenges;
public static Hero hero;
public static Level level;
@ -130,17 +130,17 @@ public class Dungeon {
public static SparseArray<ArrayList<Item>> droppedItems;
public static int version;
public static int version;
public static void init() {
version = Game.versionCode;
challenges = ShatteredPixelDungeon.challenges();
challenges = ShatteredPixelDungeon.challenges();
Generator.initArtifacts();
Generator.initArtifacts();
Actor.clear();
Actor.resetNextID();
Actor.resetNextID();
PathFinder.setMapSize( Level.WIDTH, Level.HEIGHT );
@ -152,7 +152,7 @@ public class Dungeon {
Journal.reset();
quickslot.reset();
QuickSlotButton.reset();
QuickSlotButton.reset();
depth = 0;
gold = 0;
@ -160,7 +160,7 @@ public class Dungeon {
droppedItems = new SparseArray<ArrayList<Item>>();
for (limitedDrops a : limitedDrops.values())
a.count = 0;
a.count = 0;
transmutation = Random.IntRange( 6, 14 );
@ -181,9 +181,9 @@ public class Dungeon {
StartScene.curClass.initHero( hero );
}
public static boolean isChallenged( int mask ) {
return (challenges & mask) != 0;
}
public static boolean isChallenged( int mask ) {
return (challenges & mask) != 0;
}
public static Level newLevel() {
@ -315,12 +315,12 @@ public class Dungeon {
}
observe();
try {
saveAll();
} catch (IOException e) {
try {
saveAll();
} catch (IOException e) {
/*This only catches IO errors. Yes, this means things can go wrong, and they can go wrong catastrophically.
But when they do the user will get a nice 'report this issue' dialogue, and I can fix the bug.*/
}
}
}
public static void dropToChasm( Item item ) {
@ -372,23 +372,23 @@ public class Dungeon {
private static final String RN_DEPTH_FILE = "ranger%d.dat";
private static final String VERSION = "version";
private static final String CHALLENGES = "challenges";
private static final String CHALLENGES = "challenges";
private static final String HERO = "hero";
private static final String GOLD = "gold";
private static final String DEPTH = "depth";
private static final String DROPPED = "dropped%d";
private static final String LEVEL = "level";
private static final String LIMDROPS = "limiteddrops";
private static final String LIMDROPS = "limiteddrops";
private static final String DV = "dewVial";
private static final String WT = "transmutation";
private static final String CHAPTERS = "chapters";
private static final String QUESTS = "quests";
private static final String BADGES = "badges";
//TODO: to support pre-0.2.3 saves, remove when needed
private static final String POS = "potionsOfStrength";
private static final String SOU = "scrollsOfEnhancement";
private static final String AS = "arcaneStyli";
//TODO: to support pre-0.2.3 saves, remove when needed
private static final String POS = "potionsOfStrength";
private static final String SOU = "scrollsOfEnhancement";
private static final String AS = "arcaneStyli";
public static String gameFile( HeroClass cl ) {
switch (cl) {
@ -422,7 +422,7 @@ public class Dungeon {
version = Game.versionCode;
bundle.put( VERSION, version );
bundle.put( CHALLENGES, challenges );
bundle.put( CHALLENGES, challenges );
bundle.put( HERO, hero );
bundle.put( GOLD, gold );
bundle.put( DEPTH, depth );
@ -435,10 +435,10 @@ public class Dungeon {
bundle.put( WT, transmutation );
int[] dropValues = new int[limitedDrops.values().length];
for (limitedDrops value : limitedDrops.values())
dropValues[value.ordinal()] = value.count;
bundle.put ( LIMDROPS, dropValues );
int[] dropValues = new int[limitedDrops.values().length];
for (limitedDrops value : limitedDrops.values())
dropValues[value.ordinal()] = value.count;
bundle.put ( LIMDROPS, dropValues );
int count = 0;
int ids[] = new int[chapters.size()];
@ -458,13 +458,13 @@ public class Dungeon {
Statistics.storeInBundle( bundle );
Journal.storeInBundle( bundle );
Generator.storeInBundle( bundle );
Generator.storeInBundle( bundle );
Scroll.save( bundle );
Potion.save( bundle );
Ring.save( bundle );
Actor.storeNextID( bundle );
Actor.storeNextID( bundle );
Bundle badges = new Bundle();
Badges.saveLocal( badges );
@ -484,7 +484,7 @@ public class Dungeon {
Bundle bundle = new Bundle();
bundle.put( LEVEL, level );
OutputStream output = Game.instance.openFileOutput(
OutputStream output = Game.instance.openFileOutput(
Utils.format( depthFile( hero.heroClass ), depth ), Game.MODE_PRIVATE );
Bundle.write( bundle, output );
output.close();
@ -519,16 +519,16 @@ public class Dungeon {
Bundle bundle = gameBundle( fileName );
version = bundle.getInt( VERSION );
version = bundle.getInt( VERSION );
Generator.reset();
Actor.restoreNextID( bundle );
Actor.restoreNextID( bundle );
quickslot.reset();
QuickSlotButton.reset();
QuickSlotButton.reset();
Dungeon.challenges = bundle.getInt( CHALLENGES );
Dungeon.challenges = bundle.getInt( CHALLENGES );
Dungeon.level = null;
Dungeon.depth = -1;
@ -544,23 +544,23 @@ public class Dungeon {
quickslot.restorePlaceholders( bundle );
if (fullLoad) {
transmutation = bundle.getInt( WT );
transmutation = bundle.getInt( WT );
//TODO: adjust this when dropping support for pre-0.2.3 saves
if (bundle.contains( LIMDROPS )) {
int[] dropValues = bundle.getIntArray(LIMDROPS);
for (limitedDrops value : limitedDrops.values())
value.count = value.ordinal() < dropValues.length ?
dropValues[value.ordinal()] : 0;
} else {
for (limitedDrops value : limitedDrops.values())
value.count = 0;
limitedDrops.strengthPotions.count = bundle.getInt(POS);
limitedDrops.upgradeScrolls.count = bundle.getInt(SOU);
limitedDrops.arcaneStyli.count = bundle.getInt(AS);
}
//for pre-0.2.4 saves
if (bundle.getBoolean(DV)) limitedDrops.dewVial.drop();
//TODO: adjust this when dropping support for pre-0.2.3 saves
if (bundle.contains( LIMDROPS )) {
int[] dropValues = bundle.getIntArray(LIMDROPS);
for (limitedDrops value : limitedDrops.values())
value.count = value.ordinal() < dropValues.length ?
dropValues[value.ordinal()] : 0;
} else {
for (limitedDrops value : limitedDrops.values())
value.count = 0;
limitedDrops.strengthPotions.count = bundle.getInt(POS);
limitedDrops.upgradeScrolls.count = bundle.getInt(SOU);
limitedDrops.arcaneStyli.count = bundle.getInt(AS);
}
//for pre-0.2.4 saves
if (bundle.getBoolean(DV)) limitedDrops.dewVial.drop();
chapters = new HashSet<Integer>();
int ids[] = bundle.getIntArray( CHAPTERS );
@ -601,7 +601,7 @@ public class Dungeon {
Statistics.restoreFromBundle( bundle );
Journal.restoreFromBundle( bundle );
Generator.restoreFromBundle( bundle );
Generator.restoreFromBundle( bundle );
droppedItems = new SparseArray<ArrayList<Item>>();
for (int i=2; i <= Statistics.deepestFloor + 1; i++) {
@ -669,7 +669,7 @@ public class Dungeon {
public static void fail( String desc ) {
resultDescription = desc;
if (hero.belongings.getItem( Ankh.class ) == null) {
if (hero.belongings.getItem( Ankh.class ) == null) {
Rankings.INSTANCE.submit( false );
}
}
@ -678,9 +678,9 @@ public class Dungeon {
hero.belongings.identify();
if (challenges != 0) {
Badges.validateChampion();
}
if (challenges != 0) {
Badges.validateChampion();
}
resultDescription = desc;
Rankings.INSTANCE.submit( true );

View File

@ -32,8 +32,8 @@ public class DungeonTilemap extends Tilemap {
private static DungeonTilemap instance;
public DungeonTilemap() {
super(
Dungeon.level.tilesTex(),
super(
Dungeon.level.tilesTex(),
new TextureFilm( Dungeon.level.tilesTex(), SIZE, SIZE ) );
map( Dungeon.level.map, Level.WIDTH );
@ -76,8 +76,8 @@ public class DungeonTilemap extends Tilemap {
}
public static PointF tileCenterToWorld( int pos ) {
return new PointF(
(pos % Level.WIDTH + 0.5f) * SIZE,
return new PointF(
(pos % Level.WIDTH + 0.5f) * SIZE,
(pos / Level.WIDTH + 0.5f) * SIZE );
}

View File

@ -65,8 +65,8 @@ public class FogOfWar extends Image {
texture( new FogTexture() );
scale.set(
DungeonTilemap.SIZE,
scale.set(
DungeonTilemap.SIZE,
DungeonTilemap.SIZE );
x = y = -size / 2;
@ -84,16 +84,16 @@ public class FogOfWar extends Image {
for (int j=1; j < pWidth - 1; j++) {
pos++;
int c = INVISIBLE;
if (visible[pos] && visible[pos - (pWidth - 1)] &&
if (visible[pos] && visible[pos - (pWidth - 1)] &&
visible[pos - 1] && visible[pos - (pWidth - 1) - 1]) {
c = VISIBLE;
} else
if (visited[pos] && visited[pos - (pWidth - 1)] &&
} else
if (visited[pos] && visited[pos - (pWidth - 1)] &&
visited[pos - 1] && visited[pos - (pWidth - 1) - 1]) {
c = VISITED;
}
else
if (mapped[pos] && mapped[pos - (pWidth - 1)] &&
else
if (mapped[pos] && mapped[pos - (pWidth - 1)] &&
mapped[pos - 1] && mapped[pos - (pWidth - 1) - 1]) {
c = MAPPED;
}

View File

@ -26,17 +26,17 @@ enum Preferences {
INSTANCE;
public static final String KEY_LANDSCAPE = "landscape";
public static final String KEY_IMMERSIVE = "immersive";
public static final String KEY_IMMERSIVE = "immersive";
public static final String KEY_SCALE_UP = "scaleup";
public static final String KEY_MUSIC = "music";
public static final String KEY_SOUND_FX = "soundfx";
public static final String KEY_ZOOM = "zoom";
public static final String KEY_LAST_CLASS = "last_class";
public static final String KEY_CHALLENGES = "challenges";
public static final String KEY_CHALLENGES = "challenges";
public static final String KEY_QUICKSLOTS = "quickslots";
public static final String KEY_INTRO = "intro";
public static final String KEY_BRIGHTNESS = "brightness";
public static final String KEY_VERSION = "version";
public static final String KEY_VERSION = "version";
private SharedPreferences prefs;

View File

@ -8,123 +8,120 @@ import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.Collection;
/**
* Created by debenhame on 16/01/2015.
*/
public class QuickSlot {
/**
* Slots contain objects which are also in a player's inventory. The one exception to this is when quantity is 0,
* which can happen for a stackable item that has been 'used up', these are refered to a placeholders.
*/
/**
* Slots contain objects which are also in a player's inventory. The one exception to this is when quantity is 0,
* which can happen for a stackable item that has been 'used up', these are refered to a placeholders.
*/
//note that the current max size is coded at 4, due to UI constraints, but it could be much much bigger with no issue.
public static int SIZE = 4;
private Item[] slots = new Item[SIZE];
//note that the current max size is coded at 4, due to UI constraints, but it could be much much bigger with no issue.
public static int SIZE = 4;
private Item[] slots = new Item[SIZE];
//direct array interaction methods, everything should build from these methods.
public void setSlot(int slot, Item item){
clearItem(item); //we don't want to allow the same item in multiple slots.
slots[slot] = item;
}
//direct array interaction methods, everything should build from these methods.
public void setSlot(int slot, Item item){
clearItem(item); //we don't want to allow the same item in multiple slots.
slots[slot] = item;
}
public void clearSlot(int slot){
slots[slot] = null;
}
public void clearSlot(int slot){
slots[slot] = null;
}
public void reset(){
slots = new Item[SIZE];
}
public void reset(){
slots = new Item[SIZE];
}
public Item getItem(int slot){
return slots[slot];
}
public Item getItem(int slot){
return slots[slot];
}
//utility methods, for easier use of the internal array.
public int getSlot(Item item) {
for (int i = 0; i < SIZE; i++)
if (getItem(i) == item)
return i;
return -1;
}
//utility methods, for easier use of the internal array.
public int getSlot(Item item) {
for (int i = 0; i < SIZE; i++)
if (getItem(i) == item)
return i;
return -1;
}
public Boolean isPlaceholder(int slot){
return getItem(slot) != null && getItem(slot).quantity() == 0;
}
public Boolean isPlaceholder(int slot){
return getItem(slot) != null && getItem(slot).quantity() == 0;
}
public Boolean isNonePlaceholder(int slot){
return getItem(slot) != null && getItem(slot).quantity() > 0;
}
public void clearItem(Item item){
if (contains(item))
clearSlot(getSlot(item));
}
public void clearItem(Item item){
if (contains(item))
clearSlot(getSlot(item));
}
public boolean contains(Item item){
return getSlot(item) != -1;
}
public boolean contains(Item item){
return getSlot(item) != -1;
}
public void replaceSimilar(Item item){
for (int i = 0; i < SIZE; i++)
if (getItem(i) != null && item.isSimilar(getItem(i)))
setSlot( i , item );
}
public void replaceSimilar(Item item){
for (int i = 0; i < SIZE; i++)
if (getItem(i) != null && item.isSimilar(getItem(i)))
setSlot( i , item );
}
public void convertToPlaceholder(Item item){
Item placeholder = Item.virtual(item.getClass());
public void convertToPlaceholder(Item item){
Item placeholder = Item.virtual(item.getClass());
if (placeholder != null && contains(item))
for (int i = 0; i < SIZE; i++)
if (getItem(i) == item)
setSlot( i , placeholder );
}
if (placeholder != null && contains(item))
for (int i = 0; i < SIZE; i++)
if (getItem(i) == item)
setSlot( i , placeholder );
}
public Item randomNonePlaceholder(){
public Item randomNonePlaceholder(){
ArrayList<Item> result = new ArrayList<Item>();
for (int i = 0; i < SIZE; i ++)
if (getItem(i) != null && !isPlaceholder(i))
result.add(getItem(i));
ArrayList<Item> result = new ArrayList<Item>();
for (int i = 0; i < SIZE; i ++)
if (getItem(i) != null && !isPlaceholder(i))
result.add(getItem(i));
return Random.element(result);
}
return Random.element(result);
}
private final String PLACEHOLDERS = "placeholders";
private final String PLACEMENTS = "placements";
private final String PLACEHOLDERS = "placeholders";
private final String PLACEMENTS = "placements";
/**
* Placements array is used as order is preserved while bundling, but exact index is not, so if we
* bundle both the placeholders (which preserves their order) and an array telling us where the placeholders are,
* we can reconstruct them perfectly.
*/
/**
* Placements array is used as order is preserved while bundling, but exact index is not, so if we
* bundle both the placeholders (which preserves their order) and an array telling us where the placeholders are,
* we can reconstruct them perfectly.
*/
public void storePlaceholders(Bundle bundle){
ArrayList<Item> placeholders = new ArrayList<Item>(SIZE);
boolean[] placements = new boolean[SIZE];
public void storePlaceholders(Bundle bundle){
ArrayList<Item> placeholders = new ArrayList<Item>(SIZE);
boolean[] placements = new boolean[SIZE];
for (int i = 0; i < SIZE; i++)
if (isPlaceholder(i)) {
placeholders.add(getItem(i));
placements[i] = true;
}
bundle.put( PLACEHOLDERS, placeholders );
bundle.put( PLACEMENTS, placements );
}
for (int i = 0; i < SIZE; i++)
if (isPlaceholder(i)) {
placeholders.add(getItem(i));
placements[i] = true;
}
bundle.put( PLACEHOLDERS, placeholders );
bundle.put( PLACEMENTS, placements );
}
public void restorePlaceholders(Bundle bundle){
Collection<Bundlable> placeholders = bundle.getCollection(PLACEHOLDERS);
boolean[] placements = bundle.getBooleanArray( PLACEMENTS );
public void restorePlaceholders(Bundle bundle){
Collection<Bundlable> placeholders = bundle.getCollection(PLACEHOLDERS);
boolean[] placements = bundle.getBooleanArray( PLACEMENTS );
int i = 0;
for (Bundlable item : placeholders){
while (!placements[i]) i++;
setSlot( i, (Item)item );
i++;
}
int i = 0;
for (Bundlable item : placeholders){
while (!placements[i]) i++;
setSlot( i, (Item)item );
i++;
}
}
}
}
}

View File

@ -140,7 +140,7 @@ public enum Rankings {
for (Bundlable record : bundle.getCollection( RECORDS )) {
records.add( (Record)record );
}
}
lastRecord = bundle.getInt( LATEST );
totalNumber = bundle.getInt( TOTAL );

View File

@ -94,20 +94,20 @@ public class ShatteredPixelDungeon extends Game {
super.onCreate(savedInstanceState);
/* if (android.os.Build.VERSION.SDK_INT >= 19) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY );
}*/
updateImmersiveMode();
updateImmersiveMode();
DisplayMetrics metrics = new DisplayMetrics();
instance.getWindowManager().getDefaultDisplay().getMetrics( metrics );
boolean landscape = metrics.widthPixels > metrics.heightPixels;
DisplayMetrics metrics = new DisplayMetrics();
instance.getWindowManager().getDefaultDisplay().getMetrics( metrics );
boolean landscape = metrics.widthPixels > metrics.heightPixels;
if (Preferences.INSTANCE.getBoolean( Preferences.KEY_LANDSCAPE, false ) != landscape) {
landscape( !landscape );
@ -121,16 +121,16 @@ public class ShatteredPixelDungeon extends Game {
Assets.SND_BADGE,
Assets.SND_GOLD,
Assets.SND_STEP,
Assets.SND_WATER,
Assets.SND_OPEN,
Assets.SND_UNLOCK,
Assets.SND_ITEM,
Assets.SND_DEWDROP,
Assets.SND_HIT,
Assets.SND_MISS,
Assets.SND_STEP,
Assets.SND_WATER,
Assets.SND_OPEN,
Assets.SND_UNLOCK,
Assets.SND_ITEM,
Assets.SND_DEWDROP,
Assets.SND_HIT,
Assets.SND_MISS,
Assets.SND_DESCEND,
Assets.SND_DESCEND,
Assets.SND_EAT,
Assets.SND_READ,
Assets.SND_LULLABY,
@ -167,20 +167,20 @@ public class ShatteredPixelDungeon extends Game {
Assets.SND_MIMIC );
}
@Override
public void onWindowFocusChanged( boolean hasFocus ) {
@Override
public void onWindowFocusChanged( boolean hasFocus ) {
super.onWindowFocusChanged( hasFocus );
super.onWindowFocusChanged( hasFocus );
if (hasFocus) {
updateImmersiveMode();
}
}
if (hasFocus) {
updateImmersiveMode();
}
}
public static void switchNoFade( Class<? extends PixelScene> c ) {
PixelScene.noFade = true;
switchScene( c );
}
public static void switchNoFade( Class<? extends PixelScene> c ) {
PixelScene.noFade = true;
switchScene( c );
}
/*
* ---> Prefernces
@ -202,59 +202,59 @@ public class ShatteredPixelDungeon extends Game {
switchScene( TitleScene.class );
}
// *** IMMERSIVE MODE ****
// *** IMMERSIVE MODE ****
private static boolean immersiveModeChanged = false;
private static boolean immersiveModeChanged = false;
@SuppressLint("NewApi")
public static void immerse( boolean value ) {
Preferences.INSTANCE.put( Preferences.KEY_IMMERSIVE, value );
@SuppressLint("NewApi")
public static void immerse( boolean value ) {
Preferences.INSTANCE.put( Preferences.KEY_IMMERSIVE, value );
instance.runOnUiThread( new Runnable() {
@Override
public void run() {
updateImmersiveMode();
immersiveModeChanged = true;
}
} );
}
instance.runOnUiThread( new Runnable() {
@Override
public void run() {
updateImmersiveMode();
immersiveModeChanged = true;
}
} );
}
@Override
public void onSurfaceChanged( GL10 gl, int width, int height ) {
super.onSurfaceChanged( gl, width, height );
@Override
public void onSurfaceChanged( GL10 gl, int width, int height ) {
super.onSurfaceChanged( gl, width, height );
if (immersiveModeChanged) {
requestedReset = true;
immersiveModeChanged = false;
}
}
if (immersiveModeChanged) {
requestedReset = true;
immersiveModeChanged = false;
}
}
@SuppressLint("NewApi")
public static void updateImmersiveMode() {
if (android.os.Build.VERSION.SDK_INT >= 19) {
try {
// Sometime NullPointerException happens here
instance.getWindow().getDecorView().setSystemUiVisibility(
immersed() ?
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
:
0 );
} catch (Exception e) {
reportException( e );
}
}
}
@SuppressLint("NewApi")
public static void updateImmersiveMode() {
if (android.os.Build.VERSION.SDK_INT >= 19) {
try {
// Sometime NullPointerException happens here
instance.getWindow().getDecorView().setSystemUiVisibility(
immersed() ?
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
:
0 );
} catch (Exception e) {
reportException( e );
}
}
}
public static boolean immersed() {
return Preferences.INSTANCE.getBoolean( Preferences.KEY_IMMERSIVE, false );
}
public static boolean immersed() {
return Preferences.INSTANCE.getBoolean( Preferences.KEY_IMMERSIVE, false );
}
// *****************************
// *****************************
public static boolean scaleUp() {
return Preferences.INSTANCE.getBoolean( Preferences.KEY_SCALE_UP, true );
@ -305,13 +305,13 @@ public class ShatteredPixelDungeon extends Game {
return Preferences.INSTANCE.getInt( Preferences.KEY_LAST_CLASS, 0 );
}
public static void challenges( int value ) {
Preferences.INSTANCE.put( Preferences.KEY_CHALLENGES, value );
}
public static void challenges( int value ) {
Preferences.INSTANCE.put( Preferences.KEY_CHALLENGES, value );
}
public static int challenges() {
return Preferences.INSTANCE.getInt( Preferences.KEY_CHALLENGES, 0 );
}
public static int challenges() {
return Preferences.INSTANCE.getInt( Preferences.KEY_CHALLENGES, 0 );
}
public static void quickSlots( int value ){ Preferences.INSTANCE.put( Preferences.KEY_QUICKSLOTS, value ); }
@ -325,13 +325,13 @@ public class ShatteredPixelDungeon extends Game {
return Preferences.INSTANCE.getBoolean( Preferences.KEY_INTRO, true );
}
public static void version( int value) {
Preferences.INSTANCE.put( Preferences.KEY_VERSION, value );
}
public static void version( int value) {
Preferences.INSTANCE.put( Preferences.KEY_VERSION, value );
}
public static int version() {
return Preferences.INSTANCE.getInt( Preferences.KEY_VERSION, 0 );
}
public static int version() {
return Preferences.INSTANCE.getInt( Preferences.KEY_VERSION, 0 );
}
/*
* <--- Preferences

View File

@ -45,7 +45,7 @@ public class Statistics {
foodEaten = 0;
potionsCooked = 0;
piranhasKilled = 0;
nightHunt = 0;
nightHunt = 0;
ankhsUsed = 0;
duration = 0;

View File

@ -83,7 +83,7 @@ public abstract class Actor implements Bundlable {
id = bundle.getInt( ID );
}
private static int nextID = 1;
private static int nextID = 1;
public int id() {
if (id > 0) {
return id;
@ -144,25 +144,25 @@ public abstract class Actor implements Bundlable {
current = null;
}
private static final String NEXTID = "nextid";
private static final String NEXTID = "nextid";
public static void storeNextID( Bundle bundle){
bundle.put( NEXTID, nextID );
}
public static void storeNextID( Bundle bundle){
bundle.put( NEXTID, nextID );
}
public static void restoreNextID( Bundle bundle){
nextID = bundle.getInt( NEXTID );
}
public static void restoreNextID( Bundle bundle){
nextID = bundle.getInt( NEXTID );
}
public static void resetNextID(){
nextID = 1;
}
public static void resetNextID(){
nextID = 1;
}
/*protected*/public void next() {
if (current == this) {
current = null;
}
}
/*protected*/public void next() {
if (current == this) {
current = null;
}
}
public static void process() {
@ -190,12 +190,12 @@ public abstract class Actor implements Bundlable {
if (current != null) {
if (current instanceof Char && ((Char)current).sprite.isMoving) {
// If it's character's turn to act, but its sprite
// is moving, wait till the movement is over
current = null;
break;
}
if (current instanceof Char && ((Char)current).sprite.isMoving) {
// If it's character's turn to act, but its sprite
// is moving, wait till the movement is over
current = null;
break;
}
doNext = current.act();
if (doNext && !Dungeon.hero.isAlive()) {

View File

@ -121,7 +121,7 @@ public abstract class Char extends Actor {
// FIXME
int dr = this instanceof Hero && ((Hero)this).rangedWeapon != null && ((Hero)this).subClass ==
HeroSubClass.SNIPER ? 0 : Random.IntRange( 0, enemy.dr() );
HeroSubClass.SNIPER ? 0 : Random.IntRange( 0, enemy.dr() );
int dmg = damageRoll();
int effectiveDamage = Math.max( dmg - dr, 0 );
@ -242,11 +242,11 @@ public abstract class Char extends Actor {
return;
}
if (this.buff(Frost.class) != null){
Buff.detach( this, Frost.class );
}
if (this.buff(MagicalSleep.class) != null){
Buff.detach(this, MagicalSleep.class);
}
Buff.detach( this, Frost.class );
}
if (this.buff(MagicalSleep.class) != null){
Buff.detach(this, MagicalSleep.class);
}
Class<?> srcClass = src.getClass();
if (immunities().contains( srcClass )) {
@ -266,8 +266,8 @@ public abstract class Char extends Actor {
HP -= dmg;
if (dmg > 0 || src instanceof Char) {
sprite.showStatus( HP > HT / 2 ?
CharSprite.WARNING :
sprite.showStatus( HP > HT / 2 ?
CharSprite.WARNING :
CharSprite.NEGATIVE,
Integer.toString( dmg ) );
}

View File

@ -70,7 +70,7 @@ public class Alchemy extends Blob {
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
super.use( emitter );
emitter.start( Speck.factory( Speck.BUBBLE ), 0.4f, 0 );
}
}

View File

@ -94,7 +94,7 @@ public class Blob extends Actor {
int[] data = bundle.getIntArray( CUR );
if (data != null) {
int start = bundle.getInt( START );
int start = bundle.getInt( START );
for (int i=0; i < data.length; i++) {
cur[i + start] = data[i];
volume += data[i];

View File

@ -26,28 +26,28 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
public class ConfusionGas extends Blob {
@Override
protected void evolve() {
super.evolve();
@Override
protected void evolve() {
super.evolve();
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.prolong( ch, Vertigo.class, 2 );
}
}
}
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.prolong( ch, Vertigo.class, 2 );
}
}
}
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
emitter.pour( Speck.factory( Speck.CONFUSION, true ), 0.6f );
}
emitter.pour( Speck.factory( Speck.CONFUSION, true ), 0.6f );
}
@Override
public String tileDesc() {
return "A cloud of confusion gas is swirling here.";
}
@Override
public String tileDesc() {
return "A cloud of confusion gas is swirling here.";
}
}

View File

@ -75,7 +75,7 @@ public class Foliage extends Blob {
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
super.use( emitter );
emitter.start( ShaftParticle.FACTORY, 0.9f, 0 );
}

View File

@ -33,13 +33,13 @@ public class Freezing {
// Returns true, if this cell is visible
public static boolean affect( int cell, Fire fire ) {
Char ch = Actor.findChar( cell );
Char ch = Actor.findChar( cell );
if (ch != null) {
if (Level.water[ch.pos]){
Buff.prolong(ch, Frost.class, Frost.duration(ch) * Random.Float(5f, 7.5f));
} else {
Buff.prolong(ch, Frost.class, Frost.duration(ch) * Random.Float(1.0f, 1.5f));
}
if (Level.water[ch.pos]){
Buff.prolong(ch, Frost.class, Frost.duration(ch) * Random.Float(5f, 7.5f));
} else {
Buff.prolong(ch, Frost.class, Frost.duration(ch) * Random.Float(1.0f, 1.5f));
}
}
if (fire != null) {

View File

@ -5,52 +5,49 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GooSprite;
/**
* Created by Evan on 29/09/2014.
*/
public class GooWarn extends Blob {
//cosmetic blob, used to warn noobs that goo's pump up should, infact, be avoided.
//cosmetic blob, used to warn noobs that goo's pump up should, infact, be avoided.
{
//this one needs to act after the Goo
actPriority = 3;
}
{
//this one needs to act after the Goo
actPriority = 3;
}
protected int pos;
protected int pos;
@Override
protected void evolve() {
for (int i=0; i < LENGTH; i++) {
@Override
protected void evolve() {
for (int i=0; i < LENGTH; i++) {
int offv = cur[i] > 0 ? cur[i] - 1 : 0;
off[i] = offv;
int offv = cur[i] > 0 ? cur[i] - 1 : 0;
off[i] = offv;
if (offv > 0) {
volume += offv;
}
}
if (offv > 0) {
volume += offv;
}
}
}
}
public void seed( int cell, int amount ) {
int diff = amount - cur[cell];
if (diff > 0) {
cur[cell] = amount;
volume += diff;
}
}
public void seed( int cell, int amount ) {
int diff = amount - cur[cell];
if (diff > 0) {
cur[cell] = amount;
volume += diff;
}
}
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
emitter.pour(GooSprite.GooParticle.FACTORY, 0.03f );
}
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
emitter.pour(GooSprite.GooParticle.FACTORY, 0.03f );
}
@Override
public String tileDesc() {
return "Specs of dark energy are swarming here!";
}
@Override
public String tileDesc() {
return "Specs of dark energy are swarming here!";
}
}

View File

@ -33,8 +33,8 @@ public class ParalyticGas extends Blob {
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch ) );
if (!ch.immunities().contains(this.getClass()))
Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch ) );
}
}
}

View File

@ -7,33 +7,30 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
/**
* Created by debenhame on 08/10/2014.
*/
public class StenchGas extends Blob {
@Override
protected void evolve() {
super.evolve();
@Override
protected void evolve() {
super.evolve();
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar(i)) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch )/5 );
}
}
}
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar(i)) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch )/5 );
}
}
}
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
emitter.pour( Speck.factory(Speck.STENCH), 0.6f );
}
emitter.pour( Speck.factory(Speck.STENCH), 0.6f );
}
@Override
public String tileDesc() {
return "A cloud of fetid stench is swirling here.";
}
@Override
public String tileDesc() {
return "A cloud of fetid stench is swirling here.";
}
}

View File

@ -31,20 +31,20 @@ import com.watabou.utils.Random;
public class ToxicGas extends Blob implements Hero.Doom {
@Override
protected void evolve() {
super.evolve();
@Override
protected void evolve() {
super.evolve();
int levelDamage = 5 + Dungeon.depth * 5;
int levelDamage = 5 + Dungeon.depth * 5;
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
Char ch;
for (int i=0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) {
int damage = (ch.HT + levelDamage) / 40;
if (Random.Int( 40 ) < (ch.HT + levelDamage) % 40) {
damage++;
}
int damage = (ch.HT + levelDamage) / 40;
if (Random.Int( 40 ) < (ch.HT + levelDamage) % 40) {
damage++;
}
ch.damage( damage, this );
}

View File

@ -8,58 +8,55 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.watabou.utils.Bundle;
/**
* Created by Evan on 12/04/2015.
*/
public class VenomGas extends Blob {
private int strength = 0;
private int strength = 0;
@Override
protected void evolve() {
super.evolve();
@Override
protected void evolve() {
super.evolve();
if (volume == 0){
strength = 0;
} else {
Char ch;
for (int i = 0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar(i)) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.affect(ch, Venom.class).set(2f, strength);
}
}
}
}
if (volume == 0){
strength = 0;
} else {
Char ch;
for (int i = 0; i < LENGTH; i++) {
if (cur[i] > 0 && (ch = Actor.findChar(i)) != null) {
if (!ch.immunities().contains(this.getClass()))
Buff.affect(ch, Venom.class).set(2f, strength);
}
}
}
}
public void setStrength(int str){
if (str > strength)
strength = str;
}
public void setStrength(int str){
if (str > strength)
strength = str;
}
private static final String STRENGTH = "strength";
private static final String STRENGTH = "strength";
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
strength = bundle.getInt( STRENGTH );
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
strength = bundle.getInt( STRENGTH );
}
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put( STRENGTH, strength );
}
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put( STRENGTH, strength );
}
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
emitter.pour( Speck.factory(Speck.VENOM), 0.6f );
}
emitter.pour( Speck.factory(Speck.VENOM), 0.6f );
}
@Override
public String tileDesc() {
return "A could of foul acidic venom is swirling here.";
}
@Override
public String tileDesc() {
return "A could of foul acidic venom is swirling here.";
}
}

View File

@ -94,13 +94,13 @@ public class WaterOfAwareness extends WellWater {
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
super.use( emitter );
emitter.pour( Speck.factory( Speck.QUESTION ), 0.3f );
}
@Override
public String tileDesc() {
return
return
"Power of knowledge radiates from the water of this well. " +
"Take a sip from it to reveal all secrets of equipped items.";
}

View File

@ -70,13 +70,13 @@ public class WaterOfHealth extends WellWater {
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
super.use( emitter );
emitter.start( Speck.factory( Speck.HEALING ), 0.5f, 0 );
}
@Override
public String tileDesc() {
return
return
"Power of health radiates from the water of this well. " +
"Take a sip from it to heal your wounds and satisfy hunger.";
}

View File

@ -55,7 +55,7 @@ public class WaterOfTransmutation extends WellWater {
item = changeSeed( (Plant.Seed)item );
} else if (item instanceof Artifact) {
item = changeArtifact( (Artifact)item );
} else {
} else {
item = null;
}
@ -69,7 +69,7 @@ public class WaterOfTransmutation extends WellWater {
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
super.use( emitter );
emitter.start( Speck.factory( Speck.CHANGE ), 0.2f, 0 );
}
@ -149,18 +149,18 @@ public class WaterOfTransmutation extends WellWater {
return n;
}
private Artifact changeArtifact( Artifact a ) {
Artifact n = Generator.randomArtifact();
private Artifact changeArtifact( Artifact a ) {
Artifact n = Generator.randomArtifact();
if (n != null){
n.cursedKnown = a.cursedKnown;
n.cursed = a.cursed;
n.levelKnown = a.levelKnown;
if (n != null){
n.cursedKnown = a.cursedKnown;
n.cursed = a.cursed;
n.levelKnown = a.levelKnown;
n.transferUpgrade(a.visiblyUpgraded());
}
}
return n;
}
return n;
}
private Wand changeWand( Wand w ) {
@ -231,7 +231,7 @@ public class WaterOfTransmutation extends WellWater {
@Override
public String tileDesc() {
return
return
"Power of change radiates from the water of this well. " +
"Throw an item into the well to turn it into something else.";
}

View File

@ -132,9 +132,9 @@ public class WellWater extends Blob {
for (Class<?>waterClass : waters) {
WellWater water = (WellWater)Dungeon.level.blobs.get( waterClass );
if (water != null &&
water.volume > 0 &&
water.pos == cell &&
if (water != null &&
water.volume > 0 &&
water.pos == cell &&
water.affect()) {
Level.set( cell, Terrain.EMPTY_WELL );

View File

@ -31,14 +31,14 @@ public class Amok extends FlavourBuff {
return BuffIndicator.AMOK;
}
@Override
public void detach() {
super.detach();
if (target instanceof Mob)
((Mob)target).aggro( null );
}
@Override
public void detach() {
super.detach();
if (target instanceof Mob)
((Mob)target).aggro( null );
}
@Override
@Override
public String toString() {
return "Amok";
}

View File

@ -72,7 +72,7 @@ public class Bleeding extends Buff {
target.damage( level, this );
if (target.sprite.visible) {
Splash.at( target.sprite.center(), -PointF.PI / 2, PointF.PI / 6,
Splash.at( target.sprite.center(), -PointF.PI / 2, PointF.PI / 6,
target.sprite.blood(), Math.min( 10 * level / target.HT, 10 ) );
}

View File

@ -3,9 +3,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
/**
* Created by debenhame on 27/04/2015.
*/
public class Bless extends FlavourBuff {
{

View File

@ -37,9 +37,9 @@ public class Buff extends Actor {
public enum buffType {POSITIVE, NEGATIVE, NEUTRAL, SILENT};
public buffType type = buffType.SILENT;
public HashSet<Class<?>> resistances = new HashSet<Class<?>>();
public HashSet<Class<?>> resistances = new HashSet<Class<?>>();
public HashSet<Class<?>> immunities = new HashSet<Class<?>>();
public HashSet<Class<?>> immunities = new HashSet<Class<?>>();
public boolean attachTo( Char target ) {
@ -50,11 +50,11 @@ public class Buff extends Actor {
this.target = target;
target.add( this );
if (target.buffs().contains(this)){
if (target.buffs().contains(this)){
if (target.sprite != null) fx( true );
return true;
} else
return false;
return false;
}
public void detach() {

View File

@ -89,7 +89,7 @@ public class Burning extends Buff implements Hero.Doom {
} else if (item instanceof MysteryMeat) {
item = item.detach( hero.belongings.backpack );
ChargrilledMeat steak = new ChargrilledMeat();
ChargrilledMeat steak = new ChargrilledMeat();
if (!steak.collect( hero.belongings.backpack )) {
Dungeon.level.drop( steak, hero.pos ).sprite.drop();
}

View File

@ -15,9 +15,6 @@ import com.watabou.utils.Random;
import java.text.DecimalFormat;
/**
* Created by debenhame on 23/04/2015.
*/
public class Chill extends FlavourBuff {
private static final String TXT_FREEZES = "%s freezes!";

View File

@ -3,9 +3,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
/**
* Created by Evan on 14/05/2015.
*/
public class Corruption extends Buff {
{

View File

@ -23,43 +23,43 @@ import com.watabou.utils.Random;
public class Drowsy extends Buff {
{
type = buffType.NEUTRAL;
}
{
type = buffType.NEUTRAL;
}
@Override
public int icon() {
return BuffIndicator.DROWSY;
}
@Override
public int icon() {
return BuffIndicator.DROWSY;
}
public boolean attachTo( Char target ) {
if (!target.immunities().contains(Sleep.class) && super.attachTo(target)) {
if (cooldown() == 0)
spend(Random.Int(3, 6));
return true;
}
return false;
}
public boolean attachTo( Char target ) {
if (!target.immunities().contains(Sleep.class) && super.attachTo(target)) {
if (cooldown() == 0)
spend(Random.Int(3, 6));
return true;
}
return false;
}
@Override
public boolean act(){
Buff.affect(target, MagicalSleep.class);
@Override
public boolean act(){
Buff.affect(target, MagicalSleep.class);
detach();
return true;
}
detach();
return true;
}
@Override
public String toString() {
return "Drowsy";
}
@Override
public String toString() {
return "Drowsy";
}
@Override
public String desc() {
return "A magical force is making it difficult to stay awake.\n" +
"\n" +
"The hero can resist drowsiness by taking damage or by being at full health.\n" +
"\n" +
"After " + dispTurns(cooldown()+1) + ", the target will fall into a deep magical sleep.";
}
@Override
public String desc() {
return "A magical force is making it difficult to stay awake.\n" +
"\n" +
"The hero can resist drowsiness by taking damage or by being at full health.\n" +
"\n" +
"After " + dispTurns(cooldown()+1) + ", the target will fall into a deep magical sleep.";
}
}

View File

@ -8,40 +8,37 @@ import com.watabou.utils.Bundle;
import java.util.HashSet;
/**
* Created by debenhame on 19/11/2014.
*/
public class EarthImbue extends FlavourBuff {
public static final float DURATION = 30f;
public static final float DURATION = 30f;
public void proc(Char enemy){
Buff.affect(enemy, Roots.class, 2);
CellEmitter.bottom(enemy.pos).start(EarthParticle.FACTORY, 0.05f, 8);
}
public void proc(Char enemy){
Buff.affect(enemy, Roots.class, 2);
CellEmitter.bottom(enemy.pos).start(EarthParticle.FACTORY, 0.05f, 8);
}
@Override
public int icon() {
return BuffIndicator.ROOTS;
}
@Override
public int icon() {
return BuffIndicator.ROOTS;
}
@Override
public String toString() {
return "Imbued with Earth";
}
@Override
public String toString() {
return "Imbued with Earth";
}
@Override
public String desc() {
return "You are inbued with the power of earth!\n" +
"\n" +
"All physical attacks will command roots to lock the enemy in place while the effect lasts.\n" +
"\n" +
"You are imbued for " + dispTurns() + ".";
}
@Override
public String desc() {
return "You are inbued with the power of earth!\n" +
"\n" +
"All physical attacks will command roots to lock the enemy in place while the effect lasts.\n" +
"\n" +
"You are imbued for " + dispTurns() + ".";
}
{
immunities.add( Paralysis.class );
immunities.add( Roots.class );
immunities.add( Slow.class );
}
{
immunities.add( Paralysis.class );
immunities.add( Roots.class );
immunities.add( Slow.class );
}
}

View File

@ -11,77 +11,74 @@ import com.watabou.utils.Random;
import java.util.HashSet;
/**
* Created by debenhame on 19/11/2014.
*/
public class FireImbue extends Buff {
public static final float DURATION = 30f;
public static final float DURATION = 30f;
protected float left;
protected float left;
private static final String LEFT = "left";
private static final String LEFT = "left";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( LEFT, left );
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( LEFT, left );
}
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
left = bundle.getFloat( LEFT );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
left = bundle.getFloat( LEFT );
}
public void set( float duration ) {
this.left = duration;
};
public void set( float duration ) {
this.left = duration;
};
@Override
public boolean act() {
if (Dungeon.level.map[target.pos] == Terrain.GRASS) {
Dungeon.level.set(target.pos, Terrain.EMBERS);
GameScene.updateMap(target.pos);
}
@Override
public boolean act() {
if (Dungeon.level.map[target.pos] == Terrain.GRASS) {
Dungeon.level.set(target.pos, Terrain.EMBERS);
GameScene.updateMap(target.pos);
}
spend(TICK);
left -= TICK;
if (left <= 0)
detach();
spend(TICK);
left -= TICK;
if (left <= 0)
detach();
return true;
}
return true;
}
public void proc(Char enemy){
if (Random.Int(2) == 0)
Buff.affect( enemy, Burning.class ).reignite( enemy );
public void proc(Char enemy){
if (Random.Int(2) == 0)
Buff.affect( enemy, Burning.class ).reignite( enemy );
enemy.sprite.emitter().burst( FlameParticle.FACTORY, 2 );
}
enemy.sprite.emitter().burst( FlameParticle.FACTORY, 2 );
}
@Override
public int icon() {
return BuffIndicator.FIRE;
}
@Override
public int icon() {
return BuffIndicator.FIRE;
}
@Override
public String toString() {
return "Imbued with Fire";
}
@Override
public String toString() {
return "Imbued with Fire";
}
@Override
public String desc() {
return "You are imbued with the power of fire!\n" +
"\n" +
"All physical attacks will have a chance to light enemies ablaze. " +
"Additionally, you are completely immune to the effects of fire.\n" +
"\n" +
"You are imbued for " + dispTurns(left) + ".";
}
@Override
public String desc() {
return "You are imbued with the power of fire!\n" +
"\n" +
"All physical attacks will have a chance to light enemies ablaze. " +
"Additionally, you are completely immune to the effects of fire.\n" +
"\n" +
"You are imbued for " + dispTurns(left) + ".";
}
{
immunities.add( Burning.class );
}
{
immunities.add( Burning.class );
}
}

View File

@ -62,7 +62,7 @@ public class Frost extends FlavourBuff {
} else if (item instanceof MysteryMeat) {
item = item.detach( hero.belongings.backpack );
FrozenCarpaccio carpaccio = new FrozenCarpaccio();
FrozenCarpaccio carpaccio = new FrozenCarpaccio();
if (!carpaccio.collect( hero.belongings.backpack )) {
Dungeon.level.drop( carpaccio, target.pos ).sprite.drop();
}

View File

@ -39,10 +39,10 @@ public class GasesImmunity extends FlavourBuff {
}
{
immunities.add( ParalyticGas.class );
immunities.add( ToxicGas.class );
immunities.add( ConfusionGas.class );
immunities.add( StenchGas.class );
immunities.add( ParalyticGas.class );
immunities.add( ToxicGas.class );
immunities.add( ConfusionGas.class );
immunities.add( StenchGas.class );
immunities.add( VenomGas.class );
}

View File

@ -44,8 +44,8 @@ public class Invisibility extends FlavourBuff {
@Override
public void detach() {
if (target.invisible > 0)
target.invisible--;
if (target.invisible > 0)
target.invisible--;
super.detach();
}
@ -80,15 +80,15 @@ public class Invisibility extends FlavourBuff {
if (buff != null) {
buff.detach();
}
CloakOfShadows.cloakStealth cloakBuff = Dungeon.hero.buff( CloakOfShadows.cloakStealth.class );
if (cloakBuff != null) {
cloakBuff.act();
cloakBuff.detach();
}
//this isn't a form of invisibilty, but it is meant to dispel at the same time as it.
TimekeepersHourglass.timeFreeze timeFreeze = Dungeon.hero.buff( TimekeepersHourglass.timeFreeze.class );
if (timeFreeze != null) {
timeFreeze.detach();
}
CloakOfShadows.cloakStealth cloakBuff = Dungeon.hero.buff( CloakOfShadows.cloakStealth.class );
if (cloakBuff != null) {
cloakBuff.act();
cloakBuff.detach();
}
//this isn't a form of invisibilty, but it is meant to dispel at the same time as it.
TimekeepersHourglass.timeFreeze timeFreeze = Dungeon.hero.buff( TimekeepersHourglass.timeFreeze.class );
if (timeFreeze != null) {
timeFreeze.detach();
}
}
}

View File

@ -3,9 +3,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
/**
* Created by Evan on 04/04/2015.
*/
public class LockedFloor extends Buff {
//this buff is purely meant as a visual indicator that the gameplay implications of a level seal are in effect.

View File

@ -25,70 +25,70 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
public class MagicalSleep extends Buff {
private static final float STEP = 1f;
public static final float SWS = 1.5f;
private static final float STEP = 1f;
public static final float SWS = 1.5f;
@Override
public boolean attachTo( Char target ) {
if (super.attachTo( target ) && !target.immunities().contains(Sleep.class)) {
@Override
public boolean attachTo( Char target ) {
if (super.attachTo( target ) && !target.immunities().contains(Sleep.class)) {
if (target instanceof Hero)
if (target.HP == target.HT) {
GLog.i("You are too healthy, and resist the urge to sleep.");
detach();
return true;
} else {
GLog.i("You fall into a deep magical sleep.");
}
else if (target instanceof Mob)
((Mob)target).state = ((Mob)target).SLEEPING;
if (target instanceof Hero)
if (target.HP == target.HT) {
GLog.i("You are too healthy, and resist the urge to sleep.");
detach();
return true;
} else {
GLog.i("You fall into a deep magical sleep.");
}
else if (target instanceof Mob)
((Mob)target).state = ((Mob)target).SLEEPING;
target.paralysed = true;
target.paralysed = true;
return true;
} else {
return false;
}
}
return true;
} else {
return false;
}
}
@Override
public boolean act(){
if (target instanceof Hero) {
target.HP = Math.min(target.HP+1, target.HT);
((Hero) target).restoreHealth = true;
if (target.HP == target.HT) {
GLog.p("You wake up feeling refreshed and healthy.");
detach();
}
}
spend( STEP );
return true;
}
@Override
public boolean act(){
if (target instanceof Hero) {
target.HP = Math.min(target.HP+1, target.HT);
((Hero) target).restoreHealth = true;
if (target.HP == target.HT) {
GLog.p("You wake up feeling refreshed and healthy.");
detach();
}
}
spend( STEP );
return true;
}
@Override
public void detach() {
target.paralysed = false;
if (target instanceof Hero)
((Hero) target).restoreHealth = false;
super.detach();
}
@Override
public void detach() {
target.paralysed = false;
if (target instanceof Hero)
((Hero) target).restoreHealth = false;
super.detach();
}
@Override
public int icon() {
return BuffIndicator.MAGIC_SLEEP;
}
@Override
public int icon() {
return BuffIndicator.MAGIC_SLEEP;
}
@Override
public String toString() {
return "Magical Sleep";
}
@Override
public String toString() {
return "Magical Sleep";
}
@Override
public String desc() {
return "This character has fallen into a deep magical sleep which they will not wake from naturally.\n" +
"\n" +
"Magical sleep is similar to regular sleep, except that only damage will cause the target to wake up. \n" +
"\n" +
"For the hero, magical sleep has some restorative properties, allowing them to rapidly heal while resting.";
}
@Override
public String desc() {
return "This character has fallen into a deep magical sleep which they will not wake from naturally.\n" +
"\n" +
"Magical sleep is similar to regular sleep, except that only damage will cause the target to wake up. \n" +
"\n" +
"For the hero, magical sleep has some restorative properties, allowing them to rapidly heal while resting.";
}
}

View File

@ -55,10 +55,10 @@ public class Ooze extends Buff {
@Override
public boolean act() {
if (target.isAlive()) {
if (Dungeon.depth > 4)
target.damage( Dungeon.depth/5, this );
else if (Random.Int(2) == 0)
target.damage( 1, this );
if (Dungeon.depth > 4)
target.damage( Dungeon.depth/5, this );
else if (Random.Int(2) == 0)
target.damage( 1, this );
if (!target.isAlive() && target == Dungeon.hero) {
Dungeon.fail( ResultDescriptions.OOZE );
GLog.n( TXT_HERO_KILLED, toString() );

View File

@ -9,9 +9,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
/**
* Created by debenhame on 06/02/2015.
*/
public class PinCushion extends Buff {
private ArrayList<MissileWeapon> items = new ArrayList<MissileWeapon>();

View File

@ -31,7 +31,7 @@ public class Regeneration extends Buff {
if (target.HP < target.HT && !((Hero)target).isStarving()) {
if (target.HP < target.HT && !((Hero)target).isStarving()) {
target.HP += 1;
}
@ -42,8 +42,8 @@ public class Regeneration extends Buff {
spend( REGENERATION_DELAY * 1.5f );
else
spend( REGENERATION_DELAY - regenBuff.level()*0.9f );
else
spend( REGENERATION_DELAY );
else
spend( REGENERATION_DELAY );
} else {

View File

@ -8,69 +8,66 @@ import com.watabou.utils.Bundle;
import java.util.HashSet;
/**
* Created by debenhame on 19/11/2014.
*/
public class ToxicImbue extends Buff {
public static final float DURATION = 30f;
public static final float DURATION = 30f;
protected float left;
protected float left;
private static final String LEFT = "left";
private static final String LEFT = "left";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( LEFT, left );
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( LEFT, left );
}
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
left = bundle.getFloat( LEFT );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
left = bundle.getFloat( LEFT );
}
public void set( float duration ) {
this.left = duration;
};
public void set( float duration ) {
this.left = duration;
};
@Override
public boolean act() {
GameScene.add(Blob.seed(target.pos, 50, ToxicGas.class));
@Override
public boolean act() {
GameScene.add(Blob.seed(target.pos, 50, ToxicGas.class));
spend(TICK);
left -= TICK;
if (left <= 0)
detach();
spend(TICK);
left -= TICK;
if (left <= 0)
detach();
return true;
}
return true;
}
@Override
public int icon() {
return BuffIndicator.IMMUNITY;
}
@Override
public int icon() {
return BuffIndicator.IMMUNITY;
}
@Override
public String toString() {
return "Imbued with Toxicity";
}
@Override
public String toString() {
return "Imbued with Toxicity";
}
@Override
public String desc() {
return "You are imbued with poisonous energy!\n" +
"\n" +
"As you move around toxic gas will constantly billow forth from you, damaging your enemies. " +
"You are immune to toxic gas and poison for the duration of the effect.\n" +
"\n" +
"You are imbued for " + dispTurns(left) + ".";
}
@Override
public String desc() {
return "You are imbued with poisonous energy!\n" +
"\n" +
"As you move around toxic gas will constantly billow forth from you, damaging your enemies. " +
"You are immune to toxic gas and poison for the duration of the effect.\n" +
"\n" +
"You are imbued for " + dispTurns(left) + ".";
}
{
immunities.add( ToxicGas.class );
immunities.add( Poison.class );
}
{
immunities.add( ToxicGas.class );
immunities.add( Poison.class );
}
}

View File

@ -5,73 +5,70 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.utils.Bundle;
/**
* Created by Evan on 12/04/2015.
*/
public class Venom extends Poison implements Hero.Doom {
private int damage = 1;
private int damage = 1;
private static final String DAMAGE = "damage";
private static final String DAMAGE = "damage";
{
type = buffType.NEGATIVE;
}
{
type = buffType.NEGATIVE;
}
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( DAMAGE, damage );
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( DAMAGE, damage );
}
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
damage = bundle.getInt( DAMAGE );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
damage = bundle.getInt( DAMAGE );
}
public void set(float duration, int damage) {
set(duration);
this.damage = damage;
}
public void set(float duration, int damage) {
set(duration);
this.damage = damage;
}
@Override
public int icon() {
return BuffIndicator.POISON;
}
@Override
public int icon() {
return BuffIndicator.POISON;
}
@Override
public String toString() {
return "Venomed";
}
@Override
public String toString() {
return "Venomed";
}
@Override
public String desc() {
return "Venom is a extremely caustic and dangerous poison.\n" +
"\n" +
"Unlike poison, whose damage lowers over time, venom does increasing damage the longer it stays on a target.\n" +
"\n" +
"This venom will last for " + dispTurns(left) + ", and is currently dealing " + damage + " damage.";
}
@Override
public String desc() {
return "Venom is a extremely caustic and dangerous poison.\n" +
"\n" +
"Unlike poison, whose damage lowers over time, venom does increasing damage the longer it stays on a target.\n" +
"\n" +
"This venom will last for " + dispTurns(left) + ", and is currently dealing " + damage + " damage.";
}
@Override
public boolean act() {
if (target.isAlive()) {
target.damage(damage, this);
if (damage < ((Dungeon.depth+1)/2)+1)
damage++;
@Override
public boolean act() {
if (target.isAlive()) {
target.damage(damage, this);
if (damage < ((Dungeon.depth+1)/2)+1)
damage++;
//want it to act after the cloud of venom it came from.
spend( TICK+0.1f );
if ((left -= TICK) <= 0) {
detach();
}
} else {
detach();
}
//want it to act after the cloud of venom it came from.
spend( TICK+0.1f );
if ((left -= TICK) <= 0) {
detach();
}
} else {
detach();
}
return true;
}
return true;
}
}

View File

@ -22,34 +22,34 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
public class Vertigo extends FlavourBuff {
public static final float DURATION = 10f;
public static final float DURATION = 10f;
{
type = buffType.NEGATIVE;
}
{
type = buffType.NEGATIVE;
}
@Override
public int icon() {
return BuffIndicator.VERTIGO;
}
@Override
public int icon() {
return BuffIndicator.VERTIGO;
}
@Override
public String toString() {
return "Vertigo";
}
@Override
public String toString() {
return "Vertigo";
}
@Override
public String desc() {
return "Walking in a straight line can be difficult when the whole world is spinning.\n" +
"\n" +
"While under the effects of vertigo, characters who attempt to move will go in a random direction, " +
"instead of the one they intended to go in. \n" +
"\n" +
"This Vertigo effect with last for " + dispTurns() + ".";
}
@Override
public String desc() {
return "Walking in a straight line can be difficult when the whole world is spinning.\n" +
"\n" +
"While under the effects of vertigo, characters who attempt to move will go in a random direction, " +
"instead of the one they intended to go in. \n" +
"\n" +
"This Vertigo effect with last for " + dispTurns() + ".";
}
public static float duration( Char ch ) {
Resistance r = ch.buff( Resistance.class );
return r != null ? r.durationFactor() * DURATION : DURATION;
}
public static float duration( Char ch ) {
Resistance r = ch.buff( Resistance.class );
return r != null ? r.durationFactor() * DURATION : DURATION;
}
}

View File

@ -128,16 +128,16 @@ public class Belongings implements Iterable<Item> {
return null;
}
public void countIronKeys() {
public void countIronKeys() {
IronKey.curDepthQuantity = 0;
IronKey.curDepthQuantity = 0;
for (Item item : backpack) {
if (item instanceof IronKey && ((IronKey)item).depth == Dungeon.depth) {
IronKey.curDepthQuantity += item.quantity();
}
}
}
for (Item item : backpack) {
if (item instanceof IronKey && ((IronKey)item).depth == Dungeon.depth) {
IronKey.curDepthQuantity += item.quantity();
}
}
}
public void identify() {
for (Item item : this) {
@ -248,7 +248,7 @@ public class Belongings implements Iterable<Item> {
@Override
public Iterator<Item> iterator() {
return new ItemIterator();
return new ItemIterator();
}
private class ItemIterator implements Iterator<Item> {

View File

@ -124,7 +124,7 @@ public class Hero extends Char {
public static final int MAX_LEVEL = 30;
private static final String TXT_LEVEL_UP = "level up!";
private static final String TXT_NEW_LEVEL =
private static final String TXT_NEW_LEVEL =
"Welcome to level %d! Now you are healthier and more focused. " +
"It's easier for you to hit enemies and dodge their attacks.";
private static final String TXT_LEVEL_CAP =
@ -152,8 +152,8 @@ public class Hero extends Char {
private int defenseSkill = 5;
public boolean ready = false;
private boolean damageInterrupt = true;
public HeroAction curAction = null;
private boolean damageInterrupt = true;
public HeroAction curAction = null;
public HeroAction lastAction = null;
private Char enemy;
@ -162,7 +162,7 @@ public class Hero extends Char {
public boolean restoreHealth = false;
public MissileWeapon rangedWeapon = null;
public MissileWeapon rangedWeapon = null;
public Belongings belongings;
public int STR;
@ -173,7 +173,7 @@ public class Hero extends Char {
public int lvl = 1;
public int exp = 0;
private ArrayList<Mob> visibleEnemies;
private ArrayList<Mob> visibleEnemies;
public Hero() {
super();
@ -189,11 +189,11 @@ public class Hero extends Char {
}
public int STR() {
int STR = this.STR;
int STR = this.STR;
for (Buff buff : buffs(RingOfMight.Might.class)) {
STR += ((RingOfMight.Might)buff).level;
}
for (Buff buff : buffs(RingOfMight.Might.class)) {
STR += ((RingOfMight.Might)buff).level;
}
return weakened ? STR - 2 : STR;
}
@ -255,7 +255,7 @@ public class Hero extends Char {
}
public void live() {
Buff.affect( this, Regeneration.class );
Buff.affect( this, Regeneration.class );
Buff.affect( this, Hunger.class );
}
@ -263,29 +263,29 @@ public class Hero extends Char {
return belongings.armor == null ? 0 : belongings.armor.tier;
}
public boolean shoot( Char enemy, MissileWeapon wep ) {
public boolean shoot( Char enemy, MissileWeapon wep ) {
rangedWeapon = wep;
boolean result = attack( enemy );
Invisibility.dispel();
rangedWeapon = null;
rangedWeapon = wep;
boolean result = attack( enemy );
Invisibility.dispel();
rangedWeapon = null;
return result;
}
return result;
}
@Override
public int attackSkill( Char target ) {
float accuracy = 1;
if (rangedWeapon != null && Level.distance( pos, target.pos ) == 1) {
accuracy *= 0.5f;
}
float accuracy = 1;
if (rangedWeapon != null && Level.distance( pos, target.pos ) == 1) {
accuracy *= 0.5f;
}
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
if (wep != null) {
return (int)(attackSkill * accuracy * wep.acuracyFactor( this ));
} else {
return (int)(attackSkill * accuracy);
}
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
if (wep != null) {
return (int)(attackSkill * accuracy * wep.acuracyFactor( this ));
} else {
return (int)(attackSkill * accuracy);
}
}
@Override
@ -327,12 +327,12 @@ public class Hero extends Char {
@Override
public int damageRoll() {
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
int dmg;
int bonus = 0;
for (Buff buff : buffs( RingOfForce.Force.class )) {
bonus += ((RingOfForce.Force)buff).level;
}
int bonus = 0;
for (Buff buff : buffs( RingOfForce.Force.class )) {
bonus += ((RingOfForce.Force)buff).level;
}
if (wep != null) {
dmg = wep.damageRoll( this ) + bonus;
@ -351,15 +351,15 @@ public class Hero extends Char {
@Override
public float speed() {
float speed = super.speed();
float speed = super.speed();
int hasteLevel = 0;
for (Buff buff : buffs( RingOfHaste.Haste.class )) {
hasteLevel += ((RingOfHaste.Haste)buff).level;
}
int hasteLevel = 0;
for (Buff buff : buffs( RingOfHaste.Haste.class )) {
hasteLevel += ((RingOfHaste.Haste)buff).level;
}
if (hasteLevel != 0)
speed *= Math.pow(1.2, hasteLevel);
if (hasteLevel != 0)
speed *= Math.pow(1.2, hasteLevel);
int aEnc = belongings.armor != null ? belongings.armor.STR - STR() : 0;
if (aEnc > 0) {
@ -378,29 +378,29 @@ public class Hero extends Char {
}
public float attackDelay() {
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
if (wep != null) {
return wep.speedFactor( this );
} else {
//Normally putting furor speed on unarmed attacks would be unnecessary
//But there's going to be that one guy who gets a furor+force ring combo
//This is for that one guy, you shall get your fists of fury!
int bonus = 0;
for (Buff buff : buffs(RingOfFuror.Furor.class)) {
bonus += ((RingOfFuror.Furor)buff).level;
}
//Normally putting furor speed on unarmed attacks would be unnecessary
//But there's going to be that one guy who gets a furor+force ring combo
//This is for that one guy, you shall get your fists of fury!
int bonus = 0;
for (Buff buff : buffs(RingOfFuror.Furor.class)) {
bonus += ((RingOfFuror.Furor)buff).level;
}
return (float)(0.25 + (1 - 0.25)*Math.pow(0.8, bonus));
}
}
@Override
public void spend( float time ) {
TimekeepersHourglass.timeFreeze buff = buff(TimekeepersHourglass.timeFreeze.class);
if (!(buff != null && buff.processTime(time)))
super.spend( time );
}
@Override
public void spend( float time ) {
TimekeepersHourglass.timeFreeze buff = buff(TimekeepersHourglass.timeFreeze.class);
if (!(buff != null && buff.processTime(time)))
super.spend( time );
}
public void spendAndNext( float time ) {
busy();
@ -436,7 +436,7 @@ public class Hero extends Char {
}
ready();
return false;
return false;
} else {
@ -448,50 +448,50 @@ public class Hero extends Char {
return actMove( (HeroAction.Move)curAction );
} else
} else
if (curAction instanceof HeroAction.Interact) {
return actInteract( (HeroAction.Interact)curAction );
return actInteract( (HeroAction.Interact)curAction );
} else
} else
if (curAction instanceof HeroAction.Buy) {
return actBuy( (HeroAction.Buy)curAction );
return actBuy( (HeroAction.Buy)curAction );
}else
}else
if (curAction instanceof HeroAction.PickUp) {
return actPickUp( (HeroAction.PickUp)curAction );
return actPickUp( (HeroAction.PickUp)curAction );
} else
} else
if (curAction instanceof HeroAction.OpenChest) {
return actOpenChest( (HeroAction.OpenChest)curAction );
return actOpenChest( (HeroAction.OpenChest)curAction );
} else
} else
if (curAction instanceof HeroAction.Unlock) {
return actUnlock((HeroAction.Unlock) curAction);
return actUnlock((HeroAction.Unlock) curAction);
} else
} else
if (curAction instanceof HeroAction.Descend) {
return actDescend( (HeroAction.Descend)curAction );
return actDescend( (HeroAction.Descend)curAction );
} else
if (curAction instanceof HeroAction.Ascend) {
return actAscend( (HeroAction.Ascend)curAction );
return actAscend( (HeroAction.Ascend)curAction );
} else
if (curAction instanceof HeroAction.Attack) {
return actAttack( (HeroAction.Attack)curAction );
return actAttack( (HeroAction.Attack)curAction );
} else
if (curAction instanceof HeroAction.Cook) {
return actCook( (HeroAction.Cook)curAction );
return actCook( (HeroAction.Cook)curAction );
}
}
@ -506,10 +506,10 @@ public class Hero extends Char {
private void ready() {
sprite.idle();
curAction = null;
damageInterrupt = true;
damageInterrupt = true;
ready = true;
AttackIndicator.updateState();
AttackIndicator.updateState();
GameScene.ready();
}
@ -524,7 +524,7 @@ public class Hero extends Char {
public void resume() {
curAction = lastAction;
lastAction = null;
damageInterrupt = false;
damageInterrupt = false;
act();
}
@ -532,7 +532,7 @@ public class Hero extends Char {
if (getCloser( action.dst )) {
return true;
return true;
} else {
if (Dungeon.level.map[pos] == Terrain.SIGN) {
@ -540,7 +540,7 @@ public class Hero extends Char {
}
ready();
return false;
return false;
}
}
@ -553,17 +553,17 @@ public class Hero extends Char {
ready();
sprite.turnTo( pos, npc.pos );
npc.interact();
return false;
return false;
} else {
if (Level.fieldOfView[npc.pos] && getCloser( npc.pos )) {
return true;
return true;
} else {
ready();
return false;
return false;
}
}
@ -580,15 +580,15 @@ public class Hero extends Char {
GameScene.show( new WndTradeItem( heap, true ) );
}
return false;
return false;
} else if (getCloser( dst )) {
return true;
return true;
} else {
ready();
return false;
return false;
}
}
@ -598,15 +598,15 @@ public class Hero extends Char {
ready();
AlchemyPot.operate( this, dst );
return false;
return false;
} else if (getCloser( dst )) {
return true;
return true;
} else {
ready();
return false;
return false;
}
}
@ -615,13 +615,13 @@ public class Hero extends Char {
if (pos == dst) {
Heap heap = Dungeon.level.heaps.get( pos );
if (heap != null) {
if (heap != null) {
Item item = heap.pickUp();
if (item.doPickUp( this )) {
if (item instanceof Dewdrop
|| item instanceof TimekeepersHourglass.sandBag
|| item instanceof DriedRose.Petal) {
|| item instanceof TimekeepersHourglass.sandBag
|| item instanceof DriedRose.Petal) {
//Do Nothing
} else {
@ -645,17 +645,17 @@ public class Hero extends Char {
}
} else {
ready();
}
}
return false;
return false;
} else if (getCloser( dst )) {
} else if (getCloser( dst )) {
return true;
return true;
} else {
ready();
return false;
} else {
ready();
return false;
}
}
@ -685,7 +685,7 @@ public class Hero extends Char {
Camera.main.shake( 1, 0.5f );
break;
case SKELETON:
case REMAINS:
case REMAINS:
break;
default:
Sample.INSTANCE.play( Assets.SND_UNLOCK );
@ -696,18 +696,18 @@ public class Hero extends Char {
} else {
ready();
}
}
return false;
return false;
} else if (getCloser( dst )) {
} else if (getCloser( dst )) {
return true;
return true;
} else {
ready();
return false;
}
} else {
ready();
return false;
}
}
private boolean actUnlock( HeroAction.Unlock action ) {
@ -737,18 +737,18 @@ public class Hero extends Char {
} else {
GLog.w( TXT_LOCKED_DOOR );
ready();
}
}
return false;
return false;
} else if (getCloser( doorCell )) {
} else if (getCloser( doorCell )) {
return true;
return true;
} else {
ready();
return false;
}
} else {
ready();
return false;
}
}
private boolean actDescend( HeroAction.Descend action ) {
@ -760,22 +760,22 @@ public class Hero extends Char {
Buff buff = buff(TimekeepersHourglass.timeFreeze.class);
if (buff != null) buff.detach();
for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] ))
if (mob instanceof DriedRose.GhostHero) mob.destroy();
for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] ))
if (mob instanceof DriedRose.GhostHero) mob.destroy();
InterlevelScene.mode = InterlevelScene.Mode.DESCEND;
Game.switchScene( InterlevelScene.class );
Game.switchScene( InterlevelScene.class );
return false;
return false;
} else if (getCloser( stairs )) {
} else if (getCloser( stairs )) {
return true;
return true;
} else {
ready();
return false;
}
} else {
ready();
return false;
}
}
private boolean actAscend( HeroAction.Ascend action ) {
@ -788,7 +788,7 @@ public class Hero extends Char {
GameScene.show( new WndMessage( TXT_LEAVE ) );
ready();
} else {
Dungeon.win( ResultDescriptions.WIN );
Dungeon.win( ResultDescriptions.WIN );
Dungeon.deleteGame( Dungeon.hero.heroClass, true );
Game.switchScene( SurfaceScene.class );
}
@ -805,23 +805,23 @@ public class Hero extends Char {
Buff buff = buff(TimekeepersHourglass.timeFreeze.class);
if (buff != null) buff.detach();
for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] ))
if (mob instanceof DriedRose.GhostHero) mob.destroy();
for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] ))
if (mob instanceof DriedRose.GhostHero) mob.destroy();
InterlevelScene.mode = InterlevelScene.Mode.ASCEND;
Game.switchScene( InterlevelScene.class );
}
}
return false;
return false;
} else if (getCloser( stairs )) {
} else if (getCloser( stairs )) {
return true;
return true;
} else {
ready();
return false;
}
} else {
ready();
return false;
}
}
private boolean actAttack( HeroAction.Attack action ) {
@ -831,22 +831,22 @@ public class Hero extends Char {
if (Level.adjacent( pos, enemy.pos ) && enemy.isAlive() && !isCharmedBy( enemy )) {
spend( attackDelay() );
sprite.attack( enemy.pos );
sprite.attack( enemy.pos );
return false;
return false;
} else {
} else {
if (Level.fieldOfView[enemy.pos] && getCloser( enemy.pos )) {
if (Level.fieldOfView[enemy.pos] && getCloser( enemy.pos )) {
return true;
return true;
} else {
ready();
return false;
}
} else {
ready();
return false;
}
}
}
}
public void rest( boolean tillHealthy ) {
@ -859,7 +859,7 @@ public class Hero extends Char {
@Override
public int attackProc( Char enemy, int damage ) {
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
KindOfWeapon wep = rangedWeapon != null ? rangedWeapon : belongings.weapon;
if (wep != null) wep.proc( this, enemy, damage );
@ -889,10 +889,10 @@ public class Hero extends Char {
damage = armor.absorb( damage );
}
Sungrass.Health health = buff( Sungrass.Health.class );
if (health != null) {
health.absorb( damage );
}
Sungrass.Health health = buff( Sungrass.Health.class );
if (health != null) {
health.absorb( damage );
}
if (belongings.armor != null) {
damage = belongings.armor.proc( enemy, this, damage );
@ -909,24 +909,24 @@ public class Hero extends Char {
restoreHealth = false;
if (!(src instanceof Hunger || src instanceof Viscosity.DeferedDamage) && damageInterrupt)
interrupt();
interrupt();
if (this.buff(Drowsy.class) != null){
Buff.detach(this, Drowsy.class);
GLog.w("The pain helps you resist the urge to sleep.");
}
if (this.buff(Drowsy.class) != null){
Buff.detach(this, Drowsy.class);
GLog.w("The pain helps you resist the urge to sleep.");
}
CapeOfThorns.Thorns thorns = buff( CapeOfThorns.Thorns.class );
if (thorns != null) {
dmg = thorns.proc(dmg, (src instanceof Char ? (Char)src : null), this);
}
int tenacity = 0;
for (Buff buff : buffs(RingOfTenacity.Tenacity.class)) {
tenacity += ((RingOfTenacity.Tenacity)buff).level;
}
if (tenacity != 0) //(HT - HP)/HT = heroes current % missing health.
dmg = (int)Math.ceil((float)dmg * Math.pow(0.9, tenacity*((float)(HT - HP)/HT)));
int tenacity = 0;
for (Buff buff : buffs(RingOfTenacity.Tenacity.class)) {
tenacity += ((RingOfTenacity.Tenacity)buff).level;
}
if (tenacity != 0) //(HT - HP)/HT = heroes current % missing health.
dmg = (int)Math.ceil((float)dmg * Math.pow(0.9, tenacity*((float)(HT - HP)/HT)));
super.damage( dmg, src );
@ -979,9 +979,9 @@ public class Hero extends Char {
if (Actor.findChar( target ) == null) {
if (Level.pit[target] && !flying && !Chasm.jumpConfirmed) {
if (!Level.solid[target]) {
Chasm.heroJump(this);
interrupt();
}
Chasm.heroJump(this);
interrupt();
}
return false;
}
if (Level.passable[target] || Level.avoid[target]) {
@ -1005,9 +1005,9 @@ public class Hero extends Char {
if (step != -1) {
int oldPos = pos;
move(step);
sprite.move(oldPos, pos);
int oldPos = pos;
move(step);
sprite.move(oldPos, pos);
spend( 1 / speed() );
return true;
@ -1048,8 +1048,8 @@ public class Hero extends Char {
curAction = new HeroAction.PickUp( cell );
break;
case FOR_SALE:
curAction = heap.size() == 1 && heap.peek().price() > 0 ?
new HeroAction.Buy( cell ) :
curAction = heap.size() == 1 && heap.peek().price() > 0 ?
new HeroAction.Buy( cell ) :
new HeroAction.PickUp( cell );
break;
default:
@ -1137,9 +1137,9 @@ public class Hero extends Char {
}
void updateAwareness() {
awareness = (float)(1 - Math.pow(
(heroClass == HeroClass.ROGUE ? 0.85 : 0.90),
(1 + Math.min( lvl, 9 )) * 0.5
awareness = (float)(1 - Math.pow(
(heroClass == HeroClass.ROGUE ? 0.85 : 0.90),
(1 + Math.min( lvl, 9 )) * 0.5
));
}
@ -1182,13 +1182,13 @@ public class Hero extends Char {
} else if (buff instanceof Bleeding) {
GLog.w( "You are bleeding!" );
} else if (buff instanceof RingOfMight.Might){
if (((RingOfMight.Might)buff).level > 0) {
HT += ((RingOfMight.Might) buff).level * 5;
}
} else if (buff instanceof Vertigo) {
GLog.w("Everything is spinning around you!");
interrupt();
}
if (((RingOfMight.Might)buff).level > 0) {
HT += ((RingOfMight.Might) buff).level * 5;
}
} else if (buff instanceof Vertigo) {
GLog.w("Everything is spinning around you!");
interrupt();
}
}
@ -1200,11 +1200,11 @@ public class Hero extends Char {
super.remove( buff );
if (buff instanceof RingOfMight.Might){
if (((RingOfMight.Might)buff).level > 0){
HT -= ((RingOfMight.Might) buff).level * 5;
HP = Math.min(HT, HP);
}
}
if (((RingOfMight.Might)buff).level > 0){
HT -= ((RingOfMight.Might) buff).level * 5;
HP = Math.min(HT, HP);
}
}
BuffIndicator.refreshHero();
}
@ -1223,35 +1223,35 @@ public class Hero extends Char {
curAction = null;
Ankh ankh = null;
Ankh ankh = null;
//look for ankhs in player inventory, prioritize ones which are blessed.
for (Item item : belongings){
if (item instanceof Ankh) {
if (ankh == null || ((Ankh) item).isBlessed()) {
ankh = (Ankh) item;
}
}
}
//look for ankhs in player inventory, prioritize ones which are blessed.
for (Item item : belongings){
if (item instanceof Ankh) {
if (ankh == null || ((Ankh) item).isBlessed()) {
ankh = (Ankh) item;
}
}
}
if (ankh != null && ankh.isBlessed()) {
this.HP = HT/4;
if (ankh != null && ankh.isBlessed()) {
this.HP = HT/4;
//ensures that you'll get to act first in almost any case, to prevent reviving and then instantly dieing again.
Buff.detach(this, Paralysis.class);
spend(-cooldown());
//ensures that you'll get to act first in almost any case, to prevent reviving and then instantly dieing again.
Buff.detach(this, Paralysis.class);
spend(-cooldown());
new Flare(8, 32).color(0xFFFF66, true).show(sprite, 2f);
CellEmitter.get(this.pos).start(Speck.factory(Speck.LIGHT), 0.2f, 3);
new Flare(8, 32).color(0xFFFF66, true).show(sprite, 2f);
CellEmitter.get(this.pos).start(Speck.factory(Speck.LIGHT), 0.2f, 3);
ankh.detach(belongings.backpack);
ankh.detach(belongings.backpack);
Sample.INSTANCE.play( Assets.SND_TELEPORT );
GLog.w( ankh.TXT_REVIVE );
Statistics.ankhsUsed++;
Sample.INSTANCE.play( Assets.SND_TELEPORT );
GLog.w( ankh.TXT_REVIVE );
Statistics.ankhsUsed++;
return;
}
return;
}
Actor.fixTime();
super.die( cause );
@ -1384,7 +1384,7 @@ public class Hero extends Char {
theKey = null;
}
Heap heap = Dungeon.level.heaps.get( ((HeroAction.OpenChest)curAction).dst );
Heap heap = Dungeon.level.heaps.get( ((HeroAction.OpenChest)curAction).dst );
if (heap.type == Type.SKELETON || heap.type == Type.REMAINS) {
Sample.INSTANCE.play( Assets.SND_BONES );
}
@ -1429,7 +1429,7 @@ public class Hero extends Char {
by = Level.HEIGHT - 1;
}
TalismanOfForesight.Foresight foresight = buff( TalismanOfForesight.Foresight.class );
TalismanOfForesight.Foresight foresight = buff( TalismanOfForesight.Foresight.class );
//cursed talisman of foresight makes unintentionally finding things impossible.
if (foresight != null && foresight.isCursed()){
@ -1457,8 +1457,8 @@ public class Hero extends Char {
smthFound = true;
if (foresight != null && !foresight.isCursed())
foresight.charge();
if (foresight != null && !foresight.isCursed())
foresight.charge();
}
}
}
@ -1505,11 +1505,11 @@ public class Hero extends Char {
@Override
public HashSet<Class<?>> immunities() {
HashSet<Class<?>> immunities = new HashSet<Class<?>>();
HashSet<Class<?>> immunities = new HashSet<Class<?>>();
for (Buff buff : buffs()){
for (Class<?> immunity : buff.immunities)
immunities.add(immunity);
}
for (Class<?> immunity : buff.immunities)
immunities.add(immunity);
}
return immunities;
}

View File

@ -83,110 +83,110 @@ public enum HeroClass {
"Potions of Mind Vision are identified from the beginning."
};
public void initHero( Hero hero ) {
public void initHero( Hero hero ) {
hero.heroClass = this;
hero.heroClass = this;
initCommon( hero );
initCommon( hero );
switch (this) {
case WARRIOR:
initWarrior( hero );
break;
switch (this) {
case WARRIOR:
initWarrior( hero );
break;
case MAGE:
initMage( hero );
break;
case MAGE:
initMage( hero );
break;
case ROGUE:
initRogue( hero );
break;
case ROGUE:
initRogue( hero );
break;
case HUNTRESS:
initHuntress( hero );
break;
}
case HUNTRESS:
initHuntress( hero );
break;
}
if (Badges.isUnlocked( masteryBadge() )) {
new TomeOfMastery().collect();
}
if (Badges.isUnlocked( masteryBadge() )) {
new TomeOfMastery().collect();
}
hero.updateAwareness();
}
hero.updateAwareness();
}
private static void initCommon( Hero hero ) {
if (!Dungeon.isChallenged(Challenges.NO_ARMOR))
(hero.belongings.armor = new ClothArmor()).identify();
private static void initCommon( Hero hero ) {
if (!Dungeon.isChallenged(Challenges.NO_ARMOR))
(hero.belongings.armor = new ClothArmor()).identify();
if (!Dungeon.isChallenged(Challenges.NO_FOOD))
new Food().identify().collect();
}
if (!Dungeon.isChallenged(Challenges.NO_FOOD))
new Food().identify().collect();
}
public Badges.Badge masteryBadge() {
switch (this) {
case WARRIOR:
return Badges.Badge.MASTERY_WARRIOR;
case MAGE:
return Badges.Badge.MASTERY_MAGE;
case ROGUE:
return Badges.Badge.MASTERY_ROGUE;
case HUNTRESS:
return Badges.Badge.MASTERY_HUNTRESS;
}
return null;
}
public Badges.Badge masteryBadge() {
switch (this) {
case WARRIOR:
return Badges.Badge.MASTERY_WARRIOR;
case MAGE:
return Badges.Badge.MASTERY_MAGE;
case ROGUE:
return Badges.Badge.MASTERY_ROGUE;
case HUNTRESS:
return Badges.Badge.MASTERY_HUNTRESS;
}
return null;
}
private static void initWarrior( Hero hero ) {
hero.STR = hero.STR + 1;
private static void initWarrior( Hero hero ) {
hero.STR = hero.STR + 1;
(hero.belongings.weapon = new ShortSword()).identify();
Dart darts = new Dart( 8 );
darts.identify().collect();
(hero.belongings.weapon = new ShortSword()).identify();
Dart darts = new Dart( 8 );
darts.identify().collect();
Dungeon.quickslot.setSlot(0, darts);
Dungeon.quickslot.setSlot(0, darts);
new PotionOfStrength().setKnown();
}
new PotionOfStrength().setKnown();
}
private static void initMage( Hero hero ) {
MagesStaff staff = new MagesStaff(new WandOfMagicMissile());
(hero.belongings.weapon = staff).identify();
hero.belongings.weapon.activate(hero);
private static void initMage( Hero hero ) {
MagesStaff staff = new MagesStaff(new WandOfMagicMissile());
(hero.belongings.weapon = staff).identify();
hero.belongings.weapon.activate(hero);
Dungeon.quickslot.setSlot(0, staff);
Dungeon.quickslot.setSlot(0, staff);
new ScrollOfUpgrade().setKnown();
}
new ScrollOfUpgrade().setKnown();
}
private static void initRogue( Hero hero ) {
(hero.belongings.weapon = new Dagger()).identify();
private static void initRogue( Hero hero ) {
(hero.belongings.weapon = new Dagger()).identify();
CloakOfShadows cloak = new CloakOfShadows();
(hero.belongings.misc1 = cloak).identify();
hero.belongings.misc1.activate( hero );
CloakOfShadows cloak = new CloakOfShadows();
(hero.belongings.misc1 = cloak).identify();
hero.belongings.misc1.activate( hero );
Dart darts = new Dart( 8 );
darts.identify().collect();
Dart darts = new Dart( 8 );
darts.identify().collect();
Dungeon.quickslot.setSlot(0, cloak);
if (ShatteredPixelDungeon.quickSlots() > 1)
Dungeon.quickslot.setSlot(1, darts);
Dungeon.quickslot.setSlot(0, cloak);
if (ShatteredPixelDungeon.quickSlots() > 1)
Dungeon.quickslot.setSlot(1, darts);
new ScrollOfMagicMapping().setKnown();
}
new ScrollOfMagicMapping().setKnown();
}
private static void initHuntress( Hero hero ) {
private static void initHuntress( Hero hero ) {
hero.HP = (hero.HT -= 5);
hero.HP = (hero.HT -= 5);
(hero.belongings.weapon = new Dagger()).identify();
Boomerang boomerang = new Boomerang();
boomerang.identify().collect();
(hero.belongings.weapon = new Dagger()).identify();
Boomerang boomerang = new Boomerang();
boomerang.identify().collect();
Dungeon.quickslot.setSlot(0, boomerang);
Dungeon.quickslot.setSlot(0, boomerang);
new PotionOfMindVision().setKnown();
}
new PotionOfMindVision().setKnown();
}
public String title() {
return title;

View File

@ -23,30 +23,30 @@ public enum HeroSubClass {
NONE( null, null ),
GLADIATOR( "gladiator",
GLADIATOR( "gladiator",
"A successful attack with a melee weapon allows the _Gladiator_ to start a combo, " +
"in which every next successful hit inflicts more damage." ),
BERSERKER( "berserker",
BERSERKER( "berserker",
"When severely wounded, the _Berserker_ enters a state of wild fury " +
"significantly increasing his damage output." ),
WARLOCK( "warlock",
WARLOCK( "warlock",
"Normal food grants the _Warlock_ additional wand recharge, but does not satisfy his hunger. " +
"Instead, after killing an enemy, he consumes its soul to heal his wounds and satisfy hunger." ),
BATTLEMAGE( "battlemage",
BATTLEMAGE( "battlemage",
"When fighting with his staff, the _Battlemage_ conjures bonus effects depending on the wand " +
"his staff is imbued with. His staff will also gain charge through combat." ),
ASSASSIN( "assassin",
ASSASSIN( "assassin",
"When performing a surprise attack, the _Assassin_ inflicts additional damage to his target." ),
FREERUNNER( "freerunner",
FREERUNNER( "freerunner",
"The _Freerunner_ moves faster when he unencumbered and not starving, " +
"if he is invisible, this speed boost is much stronger." ),
SNIPER( "sniper",
SNIPER( "sniper",
"_Snipers_ are able to detect weak points in an enemy's armor, " +
"effectively ignoring it when using a missile weapon." ),
WARDEN( "warden",
WARDEN( "warden",
"Having a strong connection with forces of nature gives _Wardens_ an ability to gather dewdrops and " +
"seeds from plants. Also trampling a high grass grants them a temporary armor buff." );

View File

@ -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.";
}
}

View File

@ -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;

View File

@ -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() {

View File

@ -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

View File

@ -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 );
}

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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 );
}
}

View File

@ -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) {

View File

@ -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 );
}
}
}

View File

@ -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 );

View File

@ -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();
}

View File

@ -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 );
}

View File

@ -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 ) {

View File

@ -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();
}
}
}
}

View File

@ -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() {

View File

@ -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);

View File

@ -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();
}
}
}
}

View File

@ -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() {

View File

@ -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 );
}

View File

@ -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.";
}

View File

@ -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.";
}
}
}

View File

@ -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.";
}

View File

@ -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.";
}

View File

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

View File

@ -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();
}

View File

@ -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.";
}

View File

@ -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.";
{

View File

@ -208,9 +208,9 @@ public class BadgeBanner extends Image {
break;
case 38:
p.offset( 5, 5 );
break;
case 39:
p.offset( 5, 4 );
break;
case 39:
p.offset( 5, 4 );
break;
case 40:
case 41:
@ -256,10 +256,10 @@ public class BadgeBanner extends Image {
break;
}
p.x *= image.scale.x;
p.x *= image.scale.x;
p.y *= image.scale.y;
p.offset(
-image.origin.x * (image.scale.x - 1),
p.offset(
-image.origin.x * (image.scale.x - 1),
-image.origin.y * (image.scale.y - 1) );
p.offset( image.point() );

View File

@ -22,33 +22,33 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
public class BannerSprites {
public enum Type {
PIXEL_DUNGEON,
BOSS_SLAIN,
GAME_OVER,
SELECT_YOUR_HERO,
PIXEL_DUNGEON_SIGNS
};
public enum Type {
PIXEL_DUNGEON,
BOSS_SLAIN,
GAME_OVER,
SELECT_YOUR_HERO,
PIXEL_DUNGEON_SIGNS
};
public static Image get( Type type ) {
Image icon = new Image( Assets.BANNERS );
switch (type) {
case PIXEL_DUNGEON:
icon.frame( icon.texture.uvRect( 0, 0, 128, 70 ) );
break;
case BOSS_SLAIN:
icon.frame( icon.texture.uvRect( 0, 70, 128, 105 ) );
break;
case GAME_OVER:
icon.frame( icon.texture.uvRect( 0, 105, 128, 140 ) );
break;
case SELECT_YOUR_HERO:
icon.frame( icon.texture.uvRect( 0, 140, 128, 161 ) );
break;
case PIXEL_DUNGEON_SIGNS:
icon.frame( icon.texture.uvRect( 0, 161, 128, 218 ) );
break;
}
return icon;
}
public static Image get( Type type ) {
Image icon = new Image( Assets.BANNERS );
switch (type) {
case PIXEL_DUNGEON:
icon.frame( icon.texture.uvRect( 0, 0, 128, 70 ) );
break;
case BOSS_SLAIN:
icon.frame( icon.texture.uvRect( 0, 70, 128, 105 ) );
break;
case GAME_OVER:
icon.frame( icon.texture.uvRect( 0, 105, 128, 140 ) );
break;
case SELECT_YOUR_HERO:
icon.frame( icon.texture.uvRect( 0, 140, 128, 161 ) );
break;
case PIXEL_DUNGEON_SIGNS:
icon.frame( icon.texture.uvRect( 0, 161, 128, 218 ) );
break;
}
return icon;
}
}

View File

@ -7,9 +7,6 @@ import com.watabou.noosa.Image;
import com.watabou.utils.Callback;
import com.watabou.utils.PointF;
/**
* Created by Evan on 23/05/2015.
*/
public class Chains extends Group {
private static final double A = 180 / Math.PI;

View File

@ -31,8 +31,8 @@ public class CheckedCell extends Image {
origin.set( 0.5f );
point( DungeonTilemap.tileToWorld( pos ).offset(
DungeonTilemap.SIZE / 2,
point( DungeonTilemap.tileToWorld( pos ).offset(
DungeonTilemap.SIZE / 2,
DungeonTilemap.SIZE / 2 ) );
alpha = 0.8f;

View File

@ -6,9 +6,6 @@ import com.watabou.noosa.Game;
import com.watabou.noosa.Gizmo;
import com.watabou.noosa.audio.Sample;
/**
* Created by Evan on 14/05/2015.
*/
public class DarkBlock extends Gizmo{
private CharSprite target;

View File

@ -86,10 +86,10 @@ public class Fireball extends Component {
bLight.x = x - bLight.width / 2;
bLight.y = y - bLight.height / 2;
emitter.pos(
x - bLight.width / 4,
y - bLight.height / 4,
bLight.width / 2,
emitter.pos(
x - bLight.width / 4,
y - bLight.height / 4,
bLight.width / 2,
bLight.height / 2 );
fLight.x = x - fLight.width / 2;
@ -104,8 +104,8 @@ public class Fireball extends Component {
if (Random.Float() < Game.elapsed) {
PixelParticle spark = (PixelParticle)sparks.recycle( PixelParticle.Shrinking.class );
spark.reset( x, y, ColorMath.random( COLOR, 0x66FF66 ), 2, Random.Float( 0.5f, 1.0f ) );
spark.speed.set(
Random.Float( -40, +40 ),
spark.speed.set(
Random.Float( -40, +40 ),
Random.Float( -60, +20 ) );
spark.acc.set( 0, +80 );
sparks.add( spark );

View File

@ -157,8 +157,8 @@ public class Flare extends Visual {
texture.bind();
script.uModel.valueM4( matrix );
script.lighting(
rm, gm, bm, am,
script.lighting(
rm, gm, bm, am,
ra, ga, ba, aa );
script.camera( camera );

View File

@ -25,7 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
public class IceBlock extends Gizmo {
private float phase;
private float phase;
private CharSprite target;

View File

@ -175,7 +175,7 @@ public class MagicMissile extends Emitter {
public static class MagicParticle extends PixelParticle {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((MagicParticle)emitter.recycle( MagicParticle.class )).reset( x, y );
@ -214,7 +214,7 @@ public class MagicMissile extends Emitter {
public static class EarthParticle extends PixelParticle.Shrinking {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((EarthParticle)emitter.recycle( EarthParticle.class )).reset( x, y );
@ -246,7 +246,7 @@ public class MagicMissile extends Emitter {
public static class WhiteParticle extends PixelParticle {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((WhiteParticle)emitter.recycle( WhiteParticle.class )).reset( x, y );
@ -286,7 +286,7 @@ public class MagicMissile extends Emitter {
private Emitter emitter;
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((SlowParticle)emitter.recycle( SlowParticle.class )).reset( x, y, emitter );
@ -330,7 +330,7 @@ public class MagicMissile extends Emitter {
public static class ForceParticle extends PixelParticle {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((ForceParticle)emitter.recycle( ForceParticle.class )).reset( x, y );
@ -368,7 +368,7 @@ public class MagicMissile extends Emitter {
public static class ColdParticle extends PixelParticle.Shrinking {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((ColdParticle)emitter.recycle( ColdParticle.class )).reset( x, y );

View File

@ -58,9 +58,9 @@ public class Speck extends Image {
public static final int VENOM = 108;
public static final int PARALYSIS = 109;
public static final int DUST = 110;
public static final int STENCH = 111;
public static final int STENCH = 111;
public static final int FORGE = 112;
public static final int CONFUSION = 113;
public static final int CONFUSION = 113;
private static final int SIZE = 7;
@ -104,8 +104,8 @@ public class Speck extends Image {
case TOXIC:
case VENOM:
case PARALYSIS:
case STENCH:
case CONFUSION:
case STENCH:
case CONFUSION:
case DUST:
frame( film.get( STEAM ) );
break;
@ -218,7 +218,7 @@ public class Speck extends Image {
angularSpeed = Random.Float( -360, +360 );
break;
case ROCK:
case ROCK:
angle = Random.Float( 360 );
angularSpeed = Random.Float( -360, +360 );
scale.set( Random.Float( 1, 2 ) );
@ -287,28 +287,28 @@ public class Speck extends Image {
lifespan = Random.Float( 1f, 3f );
break;
case STENCH:
hardlight( 0x003300 );
angularSpeed = -30;
angle = Random.Float( 360 );
lifespan = Random.Float( 1f, 3f );
break;
case STENCH:
hardlight( 0x003300 );
angularSpeed = -30;
angle = Random.Float( 360 );
lifespan = Random.Float( 1f, 3f );
break;
case CONFUSION:
hardlight( Random.Int( 0x1000000 ) | 0x000080 );
angularSpeed = Random.Float( -20, +20 );
angle = Random.Float( 360 );
lifespan = Random.Float( 1f, 3f );
break;
case CONFUSION:
hardlight( Random.Int( 0x1000000 ) | 0x000080 );
angularSpeed = Random.Float( -20, +20 );
angle = Random.Float( 360 );
lifespan = Random.Float( 1f, 3f );
break;
case DUST:
hardlight( 0xFFFF66 );
angle = Random.Float( 360 );
speed.polar( Random.Float( 2 * 3.1415926f ), Random.Float( 16, 48 ) );
lifespan = 0.5f;
break;
case DUST:
hardlight( 0xFFFF66 );
angle = Random.Float( 360 );
speed.polar( Random.Float( 2 * 3.1415926f ), Random.Float( 16, 48 ) );
lifespan = 0.5f;
break;
case COIN:
case COIN:
speed.polar( -PointF.PI * Random.Float( 0.3f, 0.7f ), Random.Float( 48, 96 ) );
acc.y = 256;
lifespan = -speed.y / acc.y * 2;
@ -340,12 +340,12 @@ public class Speck extends Image {
am = p < 0.2f ? p * 5f : (1 - p) * 1.25f;
break;
case KIT:
case KIT:
case MASTERY:
am = 1 - p * p;
break;
case EVOKE:
case EVOKE:
case HEALING:
am = p < 0.5f ? 1 : 2 - p * 2;
@ -408,7 +408,7 @@ public class Speck extends Image {
case STEAM:
case TOXIC:
case PARALYSIS:
case CONFUSION:
case CONFUSION:
case DUST:
am = p < 0.5f ? p : 1 - p;
scale.set( 1 + p * 2 );
@ -416,10 +416,10 @@ public class Speck extends Image {
case VENOM:
hardlight( ColorMath.interpolate( 0x8844FF, 0x00FF00 , p ));
case STENCH:
am = (p < 0.5f ? p : 1 - p) * 2;
scale.set( 1 + p * 2 );
break;
case STENCH:
am = (p < 0.5f ? p : 1 - p) * 2;
scale.set( 1 + p * 2 );
break;
case JET:
am = (p < 0.5f ? p : 1 - p) * 2;
@ -435,29 +435,29 @@ public class Speck extends Image {
}
}
public static Emitter.Factory factory( final int type ) {
return factory( type, false );
}
public static Emitter.Factory factory( final int type ) {
return factory( type, false );
}
public static Emitter.Factory factory( final int type, final boolean lightMode ) {
public static Emitter.Factory factory( final int type, final boolean lightMode ) {
Emitter.Factory factory = factories.get( type );
Emitter.Factory factory = factories.get( type );
if (factory == null) {
factory = new Emitter.Factory() {
@Override
public void emit ( Emitter emitter, int index, float x, float y ) {
Speck p = (Speck)emitter.recycle( Speck.class );
p.reset( index, x, y, type );
}
@Override
public boolean lightMode() {
return lightMode;
}
};
factories.put( type, factory );
}
if (factory == null) {
factory = new Emitter.Factory() {
@Override
public void emit ( Emitter emitter, int index, float x, float y ) {
Speck p = (Speck)emitter.recycle( Speck.class );
p.reset( index, x, y, type );
}
@Override
public boolean lightMode() {
return lightMode;
}
};
factories.put( type, factory );
}
return factory;
}
return factory;
}
}

View File

@ -60,7 +60,7 @@ public class Splash {
emitter.burst( FACTORY, n );
}
private static final SplashFactory FACTORY = new SplashFactory();
private static final SplashFactory FACTORY = new SplashFactory();
private static class SplashFactory extends Emitter.Factory {

View File

@ -8,64 +8,61 @@ import com.watabou.noosa.Game;
import com.watabou.noosa.Group;
import com.watabou.noosa.Image;
/**
* Created by Evan on 20/04/2015.
*/
public class Surprise extends Image {
private static final float TIME_TO_FADE = 0.8f;
private static final float TIME_TO_FADE = 0.8f;
private float time;
private float time;
public Surprise() {
super(Effects.get(Effects.Type.EXCLAMATION));
origin.set(width / 2, height / 2);
}
public Surprise() {
super(Effects.get(Effects.Type.EXCLAMATION));
origin.set(width / 2, height / 2);
}
public void reset(int p) {
revive();
public void reset(int p) {
revive();
x = (p % Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
y = (p / Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
x = (p % Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2;
y = (p / Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2;
time = TIME_TO_FADE;
}
time = TIME_TO_FADE;
}
@Override
public void update() {
super.update();
@Override
public void update() {
super.update();
if ((time -= Game.elapsed) <= 0) {
kill();
} else {
float p = time / TIME_TO_FADE;
alpha(p);
scale.y = 1 + p/2;
}
}
if ((time -= Game.elapsed) <= 0) {
kill();
} else {
float p = time / TIME_TO_FADE;
alpha(p);
scale.y = 1 + p/2;
}
}
public static void hit(Char ch) {
hit(ch, 0);
}
public static void hit(Char ch) {
hit(ch, 0);
}
public static void hit(Char ch, float angle) {
if (ch.sprite.parent != null) {
Surprise s = (Surprise) ch.sprite.parent.recycle(Surprise.class);
ch.sprite.parent.bringToFront(s);
s.reset(ch.pos);
s.angle = angle;
}
}
public static void hit(Char ch, float angle) {
if (ch.sprite.parent != null) {
Surprise s = (Surprise) ch.sprite.parent.recycle(Surprise.class);
ch.sprite.parent.bringToFront(s);
s.reset(ch.pos);
s.angle = angle;
}
}
public static void hit(int pos) {
hit(pos, 0);
}
public static void hit(int pos) {
hit(pos, 0);
}
public static void hit(int pos, float angle) {
Group parent = Dungeon.hero.sprite.parent;
Wound w = (Wound) parent.recycle(Wound.class);
parent.bringToFront(w);
w.reset(pos);
w.angle = angle;
}
public static void hit(int pos, float angle) {
Group parent = Dungeon.hero.sprite.parent;
Wound w = (Wound) parent.recycle(Wound.class);
parent.bringToFront(w);
w.reset(pos);
w.angle = angle;
}
}

View File

@ -63,12 +63,12 @@ public class Wound extends Image {
}
public static void hit( Char ch, float angle ) {
if (ch.sprite.parent != null) {
Wound w = (Wound) ch.sprite.parent.recycle(Wound.class);
ch.sprite.parent.bringToFront(w);
w.reset(ch.pos);
w.angle = angle;
}
if (ch.sprite.parent != null) {
Wound w = (Wound) ch.sprite.parent.recycle(Wound.class);
ch.sprite.parent.bringToFront(w);
w.reset(ch.pos);
w.angle = angle;
}
}
public static void hit( int pos ) {

View File

@ -38,7 +38,7 @@ public class BlastParticle extends PixelParticle.Shrinking {
public BlastParticle() {
super();
color( 0xEE7722 );
color( 0xEE7722 );
acc.set( 0, +50 );
}

View File

@ -25,7 +25,7 @@ import com.watabou.utils.Random;
public class BloodParticle extends PixelParticle.Shrinking {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((BloodParticle)emitter.recycle( BloodParticle.class )).reset( x, y );

View File

@ -23,9 +23,9 @@ import com.watabou.noosa.particles.Emitter.Factory;
import com.watabou.utils.ColorMath;
import com.watabou.utils.Random;
public class EarthParticle extends PixelParticle {
public class EarthParticle extends PixelParticle {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((EarthParticle)emitter.recycle( EarthParticle.class )).reset( x, y );

View File

@ -23,7 +23,7 @@ import com.watabou.noosa.particles.Emitter.Factory;
public class ElmoParticle extends PixelParticle.Shrinking {
public static final Emitter.Factory FACTORY = new Factory() {
public static final Emitter.Factory FACTORY = new Factory() {
@Override
public void emit( Emitter emitter, int index, float x, float y ) {
((ElmoParticle)emitter.recycle( ElmoParticle.class )).reset( x, y );

Some files were not shown because too many files have changed in this diff Show More