diff --git a/AndorsTrail/res/layout/levelup.xml b/AndorsTrail/res/layout/levelup.xml
index fcf8ae245..22d832693 100644
--- a/AndorsTrail/res/layout/levelup.xml
+++ b/AndorsTrail/res/layout/levelup.xml
@@ -90,7 +90,7 @@
-
+
diff --git a/AndorsTrail/res/layout/monsterinfo.xml b/AndorsTrail/res/layout/monsterinfo.xml
index c3a3fcbc1..5d02a4eb0 100644
--- a/AndorsTrail/res/layout/monsterinfo.xml
+++ b/AndorsTrail/res/layout/monsterinfo.xml
@@ -63,6 +63,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
+
+
+
diff --git a/AndorsTrail/res/values/strings.xml b/AndorsTrail/res/values/strings.xml
index 12dcd0b51..95ab0d070 100644
--- a/AndorsTrail/res/values/strings.xml
+++ b/AndorsTrail/res/values/strings.xml
@@ -484,4 +484,8 @@
Resistance against all types of conditions
Lowers the chance of being afflicted with all types of conditions by %1$d %% for every skill level. This includes all types conditions caused by monster attacks such as Poison, Dazed or Fatigue.
+ Move to top
+ Move to bottom
+ Immune to critical hits
+
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Inventory.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Inventory.java
index 43b1f5f1d..3c0d2c1d7 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Inventory.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/HeroinfoActivity_Inventory.java
@@ -229,6 +229,12 @@ public final class HeroinfoActivity_Inventory extends Activity {
case R.id.inv_assign_slot3:
view.itemController.setQuickItem(lastSelectedItem, 2);
break;
+ case R.id.inv_menu_movetop:
+ player.inventory.sortToTop(getSelectedItemType(info).id);
+ break;
+ case R.id.inv_menu_movebottom:
+ player.inventory.sortToBottom(getSelectedItemType(info).id);
+ break;
default:
return super.onContextItemSelected(item);
}
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java
index 0b50b6bf6..5f2093f56 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/LevelUpActivity.java
@@ -21,6 +21,9 @@ import com.gpl.rpg.AndorsTrail.model.actor.Player;
public final class LevelUpActivity extends Activity {
private WorldContext world;
private Player player;
+ private ImageView levelup_image;
+ private TextView levelup_description;
+ private View levelup_adds_new_skillpoint;
/** Called when the activity is first created. */
@Override
@@ -34,13 +37,10 @@ public final class LevelUpActivity extends Activity {
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.levelup);
- final Resources res = getResources();
- ImageView img = (ImageView) findViewById(R.id.levelup_image);
- world.tileManager.setImageViewTile(img, player);
-
- TextView tv = (TextView) findViewById(R.id.levelup_description);
- tv.setText(res.getString(R.string.levelup_description, player.level+1));
+ levelup_image = (ImageView) findViewById(R.id.levelup_image);
+ levelup_description = (TextView) findViewById(R.id.levelup_description);
+ levelup_adds_new_skillpoint = findViewById(R.id.levelup_adds_new_skillpoint);
Button b;
@@ -79,12 +79,24 @@ public final class LevelUpActivity extends Activity {
}
});
b.setText(getString(R.string.levelup_add_blockchance, Constants.LEVELUP_EFFECT_DEF_CH));
-
- View v = findViewById(R.id.levelup_adds_new_skillpoint);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ final Resources res = getResources();
+
+ if (!player.canLevelup()) {
+ this.finish();
+ return;
+ }
+
+ world.tileManager.setImageViewTile(levelup_image, player);
+ levelup_description.setText(res.getString(R.string.levelup_description, player.level+1));
if (player.nextLevelAddsNewSkillpoint()) {
- v.setVisibility(View.VISIBLE);
+ levelup_adds_new_skillpoint.setVisibility(View.VISIBLE);
} else {
- v.setVisibility(View.GONE);
+ levelup_adds_new_skillpoint.setVisibility(View.GONE);
}
}
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java
index 68cb5075b..c6030e2a9 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MonsterInfoActivity.java
@@ -30,6 +30,7 @@ public final class MonsterInfoActivity extends Activity {
private TraitsInfoView monsterinfo_currenttraits;
private ItemEffectsView monsterinfo_onhiteffects;
private TextView monsterinfo_currentconditions_title;
+ private TextView monsterinfo_immune_criticals;
private ActorConditionList monsterinfo_currentconditions;
private RangeBar hp;
private WorldContext world;
@@ -47,6 +48,7 @@ public final class MonsterInfoActivity extends Activity {
monsterinfo_image = (ImageView) findViewById(R.id.monsterinfo_image);
monsterinfo_title = (TextView) findViewById(R.id.monsterinfo_title);
monsterinfo_difficulty = (TextView) findViewById(R.id.monsterinfo_difficulty);
+ monsterinfo_immune_criticals = (TextView) findViewById(R.id.monsterinfo_immune_criticals);
Button b = (Button) findViewById(R.id.monsterinfo_close);
b.setOnClickListener(new OnClickListener() {
@@ -93,6 +95,7 @@ public final class MonsterInfoActivity extends Activity {
monster.actorTraits.onHitEffects == null ? null : Arrays.asList(monster.actorTraits.onHitEffects),
null);
hp.update(monster.health);
+ monsterinfo_immune_criticals.setVisibility(monster.isImmuneToCriticalHits ? View.VISIBLE : View.GONE);
}
public static int getMonsterDifficultyResource(WorldContext world, Monster monster) {
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java
index 1d25b4f66..ab12a0941 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java
@@ -411,9 +411,16 @@ public final class CombatController implements VisualEffectCompletedCallback {
context.mainActivity.updateStatus();
}
+ private static boolean hasCriticalAttack(Actor attacker, Actor target) {
+ if (!attacker.combatTraits.hasCriticalAttacks()) return false;
+ if (target.isImmuneToCriticalHits) return false;
+ return true;
+ }
private static float getAverageDamagePerHit(Actor attacker, Actor target) {
float result = (float) (getAttackHitChance(attacker.combatTraits, target.combatTraits)) * attacker.combatTraits.damagePotential.average() / 100;
- result += (float) attacker.combatTraits.criticalChance * result * attacker.combatTraits.criticalMultiplier / 100;
+ if (hasCriticalAttack(attacker, target)) {
+ result += (float) attacker.combatTraits.criticalChance * result * attacker.combatTraits.criticalMultiplier / 100;
+ }
result -= target.combatTraits.damageResistance;
return result;
}
@@ -421,7 +428,7 @@ public final class CombatController implements VisualEffectCompletedCallback {
return getAverageDamagePerHit(attacker, target) * attacker.getAttacksPerTurn();
}
private static int getTurnsToKillTarget(Actor attacker, Actor target) {
- if (attacker.combatTraits.hasCriticalAttacks()) {
+ if (hasCriticalAttack(attacker, target)) {
if (attacker.combatTraits.damagePotential.max * attacker.combatTraits.criticalMultiplier <= target.combatTraits.damageResistance) return 999;
} else {
if (attacker.combatTraits.damagePotential.max <= target.combatTraits.damageResistance) return 999;
@@ -466,7 +473,7 @@ public final class CombatController implements VisualEffectCompletedCallback {
int damage = Constants.rollValue(attacker.combatTraits.damagePotential);
boolean isCriticalHit = false;
- if (attacker.combatTraits.hasCriticalAttacks()) {
+ if (hasCriticalAttack(attacker, target)) {
isCriticalHit = Constants.roll100(attacker.combatTraits.criticalChance);
if (isCriticalHit) {
damage *= attacker.combatTraits.criticalMultiplier;
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Actor.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Actor.java
index 59931177b..b95ef1066 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Actor.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Actor.java
@@ -21,8 +21,9 @@ public class Actor {
public final CoordRect rectPosition;
public final ArrayList conditions = new ArrayList();
public final boolean isPlayer;
+ public final boolean isImmuneToCriticalHits;
- public Actor(ActorTraits actorTraits, boolean isPlayer) {
+ public Actor(ActorTraits actorTraits, boolean isPlayer, boolean isImmuneToCriticalHits) {
this.combatTraits = new CombatTraits(actorTraits.baseCombatTraits);
this.actorTraits = actorTraits;
this.ap = new Range(actorTraits.maxAP, actorTraits.maxAP);
@@ -30,6 +31,7 @@ public class Actor {
this.position = new Coord();
this.rectPosition = new CoordRect(position, actorTraits.tileSize);
this.isPlayer = isPlayer;
+ this.isImmuneToCriticalHits = isImmuneToCriticalHits;
}
public int getAttacksPerTurn() { return combatTraits.getAttacksPerTurn(actorTraits.maxAP); }
@@ -64,11 +66,13 @@ public class Actor {
actorTraits.moveCost = actorTraits.baseMoveCost;
}
+
// ====== PARCELABLE ===================================================================
- public Actor(DataInputStream src, WorldContext world, int fileversion, boolean isPlayer, ActorTraits actorTraits) throws IOException {
+ public Actor(DataInputStream src, WorldContext world, int fileversion, boolean isPlayer, boolean isImmuneToCriticalHits, ActorTraits actorTraits) throws IOException {
this.isPlayer = isPlayer;
+ this.isImmuneToCriticalHits = isImmuneToCriticalHits;
CombatTraits combatTraits = null;
boolean readCombatTraits = true;
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java
index 24d3cac7d..c4e73ea70 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java
@@ -28,7 +28,7 @@ public final class Monster extends Actor {
public final int monsterClass;
public Monster(MonsterType monsterType, Coord position) {
- super(monsterType, false);
+ super(monsterType, false, monsterType.isImmuneToCriticalHits());
this.monsterTypeID = monsterType.id;
this.position.set(position);
this.millisecondsPerMove = Constants.MONSTER_MOVEMENT_TURN_DURATION_MS / monsterType.getMovesPerTurn();
@@ -68,7 +68,7 @@ public final class Monster extends Actor {
}
public Monster(DataInputStream src, WorldContext world, int fileversion, MonsterType monsterType) throws IOException {
- super(src, world, fileversion, false, monsterType);
+ super(src, world, fileversion, false, monsterType.isImmuneToCriticalHits(), monsterType);
this.monsterTypeID = monsterType.id;
this.millisecondsPerMove = Constants.MONSTER_MOVEMENT_TURN_DURATION_MS / monsterType.getMovesPerTurn();
this.nextPosition = new CoordRect(new Coord(), actorTraits.tileSize);
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java
index ebcedf3ec..3def8159d 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java
@@ -56,4 +56,11 @@ public final class MonsterType extends ActorTraits {
this.isUnique = isUnique;
this.monsterClass = monsterClass;
}
+
+ public boolean isImmuneToCriticalHits() {
+ if (monsterClass == MONSTERCLASS_GHOST) return true;
+ else if (monsterClass == MONSTERCLASS_UNDEAD) return true;
+ else if (monsterClass == MONSTERCLASS_DEMON) return true;
+ return false;
+ }
}
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java
index ec64dc3dd..71ac72866 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Player.java
@@ -40,7 +40,7 @@ public final class Player extends Actor {
private final HashMap alignments = new HashMap();
public Player() {
- super(new ActorTraits(TileManager.CHAR_HERO, new Size(1, 1), new CombatTraits(), DEFAULT_PLAYER_MOVECOST, null), true);
+ super(new ActorTraits(TileManager.CHAR_HERO, new Size(1, 1), new CombatTraits(), DEFAULT_PLAYER_MOVECOST, null), true, false);
this.lastPosition = new Coord();
this.nextPosition = new Coord();
this.levelExperience = new Range();
@@ -177,7 +177,7 @@ public final class Player extends Actor {
// ====== PARCELABLE ===================================================================
public Player(DataInputStream src, WorldContext world, int fileversion) throws IOException {
- super(src, world, fileversion, true, null);
+ super(src, world, fileversion, true, false, null);
this.lastPosition = new Coord(src, fileversion);
this.nextPosition = new Coord(src, fileversion);
this.level = src.readInt();
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java
index e0a121115..e24727b30 100644
--- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java
+++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java
@@ -87,6 +87,12 @@ public class ItemContainer {
}
return null;
}
+ public int findItemIndex(String itemTypeID) {
+ for (int i = 0; i < items.size(); ++i) {
+ if (items.get(i).itemType.id.equals(itemTypeID)) return i;
+ }
+ return -1;
+ }
public boolean hasItem(String itemTypeID) { return findItem(itemTypeID) != null; }
public boolean hasItem(String itemTypeID, int minimumQuantity) {
return getItemQuantity(itemTypeID) >= minimumQuantity;
@@ -97,6 +103,18 @@ public class ItemContainer {
if (e == null) return 0;
return e.quantity;
}
+
+ public void sortToTop(String itemTypeID) {
+ int i = findItemIndex(itemTypeID);
+ if (i <= 0) return;
+ items.add(0, items.remove(i));
+ }
+
+ public void sortToBottom(String itemTypeID) {
+ int i = findItemIndex(itemTypeID);
+ if (i < 0) return;
+ items.add(items.remove(i));
+ }
// ====== PARCELABLE ===================================================================