<TableRow
android:id="@+id/traitsinfo_critical_row1"
>
- <TextView android:text="@string/traitsinfo_criticalhit_chance" android:layout_marginRight="10sp" />
- <TextView android:id="@+id/traitsinfo_criticalhit_chance" />
+ <TextView android:text="@string/traitsinfo_criticalhit_skill" android:layout_marginRight="10sp" />
+ <TextView android:id="@+id/traitsinfo_criticalhit_skill" />
</TableRow>
<TableRow
android:id="@+id/traitsinfo_critical_row2"
<TextView android:id="@+id/traitsinfo_criticalhit_multiplier" />
</TableRow>
<TableRow
+ android:id="@+id/traitsinfo_critical_row3"
+ >
+ <TextView android:text="@string/traitsinfo_criticalhit_effectivechance" android:layout_marginRight="10sp" />
+ <TextView android:id="@+id/traitsinfo_criticalhit_effectivechance" />
+ </TableRow>
+ <TableRow
android:id="@+id/traitsinfo_defense_row1"
>
<TextView android:text="@string/traitsinfo_defense_chance" android:layout_marginRight="10sp" />
<string name="traitsinfo_attack_cost">Angriffskosten (AP):</string>
<string name="traitsinfo_attack_chance">Angriffschance:</string>
<string name="traitsinfo_attack_damage">Schaden:</string>
- <string name="traitsinfo_criticalhit_chance">Kritische Treffer:</string>
+ <string name="traitsinfo_criticalhit_skill">Kritische Treffer:</string>
<string name="traitsinfo_criticalhit_multiplier">Faktor bei krit. Treffern:</string>
<string name="traitsinfo_defense_chance">Abwehrchance:</string>
<string name="traitsinfo_defense_damageresist">Schadensresistenz:</string>
<string name="traitsinfo_attack_cost">Coût d\'une attaque (AP) :</string>
<string name="traitsinfo_attack_chance">Probabilité de toucher :</string>
<string name="traitsinfo_attack_damage">Dégâts :</string>
- <string name="traitsinfo_criticalhit_chance">Probabilité de coup critique :</string>
+ <string name="traitsinfo_criticalhit_skill">Probabilité de coup critique :</string>
<string name="traitsinfo_criticalhit_multiplier">Coefficient de coup critique :</string>
<string name="traitsinfo_defense_chance">Probabilité de bloquer :</string>
<string name="traitsinfo_defense_damageresist">Résistance aux dégâts :</string>
<string name="traitsinfo_attack_cost">Costo attacco (AP):</string>
<string name="traitsinfo_attack_chance">Possibilità attacco:</string>
<string name="traitsinfo_attack_damage">Possibilità danni:</string>
- <string name="traitsinfo_criticalhit_chance">colpo critico:</string>
+ <string name="traitsinfo_criticalhit_skill">colpo critico:</string>
<string name="traitsinfo_criticalhit_multiplier">moltiplicatore critico:</string>
<string name="traitsinfo_defense_chance">Possibilità difesa:</string>
<string name="traitsinfo_defense_damageresist">Resistenza ai danni:</string>
<string name="traitsinfo_attack_cost">Custo de ataque (AP):</string>
<string name="traitsinfo_attack_chance">Probabilidade de ataque:</string>
<string name="traitsinfo_attack_damage">Danos de ataque:</string>
- <string name="traitsinfo_criticalhit_chance">Probabilidade de golpe crítico:</string>
+ <string name="traitsinfo_criticalhit_skill">Probabilidade de golpe crítico:</string>
<string name="traitsinfo_criticalhit_multiplier">Multiplicador de golpe crítico:</string>
<string name="traitsinfo_defense_chance">Probabilidade de bloqueio:</string>
<string name="traitsinfo_defense_damageresist">Resistência a danos:</string>
<string name="traitsinfo_attack_cost">Цена атаки (AP):</string>
<string name="traitsinfo_attack_chance">Шанс атаки:</string>
<string name="traitsinfo_attack_damage">Сила атаки:</string>
- <string name="traitsinfo_criticalhit_chance">Шанс критического удара:</string>
+ <string name="traitsinfo_criticalhit_skill">Шанс критического удара:</string>
<string name="traitsinfo_criticalhit_multiplier">Критический умножитель:</string>
<string name="traitsinfo_defense_chance">Шанс блока:</string>
<string name="traitsinfo_defense_damageresist">Сопротивление урону:</string>
}|};
{ulirfendor_helmet_1|Could it be? Hmm. Let me look at that thing.||{{N|ulirfendor_helmet_2|||||}}|};
-{ulirfendor_helmet_2|Those markings on it are most peculiar. And it was found by the lich that you spoke of?||{{N|ulirfendor_helmet_3|||||}}|};
+{ulirfendor_helmet_2|Those markings on it are most peculiar. It was found by the lich that you spoke of?||{{N|ulirfendor_helmet_3|||||}}|};
{ulirfendor_helmet_3|Hmm. You know what, this could actually be connected to what the shrine speaks of - The Dark Protector||{{N|ulirfendor_helmet_4|||||}}|};
{ulirfendor_helmet_4|I am not certain of what the term \'The Dark Protector\' refers to. At first I thought it might be some creature protecting something, but this helmet seems to fit better in on what the shrine speaks of.||{{N|ulirfendor_helmet_5|||||}}|};
{ulirfendor_helmet_5|It could either be the helmet itself, or that the helmet has some effect on whoever wears it, meaning that the wearer will become the Dark Protector.||{{N|ulirfendor_helmet_6|||||}}|};
{No. I will keep this item for myself instead.|ulirfendor_helmet_keep1|||||}
}|};
{ulirfendor_helmet_n8|Think all you want, but please hurry. We need to destroy this thing as soon as possible!|||};
-{ulirfendor_dp_proc_1|Thank you. And the heart of that lich.|{{0|darkprotector|30|}}|{{Here it is.|ulirfendor_dp_proc_2||toszylae_heart|1|0|}}|};
+{ulirfendor_dp_proc_1|Thank you. Next, I need the heart of that lich.|{{0|darkprotector|30|}}|{{Here it is.|ulirfendor_dp_proc_2||toszylae_heart|1|0|}}|};
{ulirfendor_dp_proc_2|Excellent. I will begin the procedure immediately.|{{0|darkprotector|31|}}|{{N|ulirfendor_dp_proc_3|||||}}|};
{ulirfendor_dp_proc_3|(Ulirfendor places the helmet and the lich\'s heart on the ground before him, and opens his backpack of items.)||{{N|ulirfendor_dp_proc_4|||||}}|};
{ulirfendor_dp_proc_4|(He pulls out a leathery potion case from his backpack, and takes out a vial of clear but almost shining liquid.)||{{N|ulirfendor_dp_proc_5|||||}}|};
{ulirfendor_dp_bless_5|There. You now have the dark blessing of the Shadow upon you.|{{0|darkprotector|40|}{2|20|1|}}|{{N|ulirfendor_dp_bless_6|||||}}|};
{ulirfendor_dp_bless_6|Thank you yet again for all you have done here.|||};
{ulirfendor_helmet_keep1|What!? Keep it!? Have you gone mad? We need to destroy it to protect the people!||{
- {Who knows that power I could gain from it? I will keep this for myself.|ulirfendor_helmet_keep2|||||}
+ {Who knows what power I could gain from it? I will keep this for myself.|ulirfendor_helmet_keep2|||||}
{It could be worth a lot. I will keep this for myself.|ulirfendor_helmet_keep2|||||}
{I think I should give this a second thought before we begin.|ulirfendor_helmet_n8|||||}
}|};
{sign_ulirfendor_8|You start reciting the words of the Kazaul tongue from the book, taking great care of saying the words exactly as the book states them.||{{N|sign_ulirfendor_9|||||}}|};
{sign_ulirfendor_9|As you speak the words, you notice a faint glow coming from the shrine, and you get the eerie feeling that the sand on the ground almost moves by itself.||{{N|sign_ulirfendor_10|||||}}|};
{sign_ulirfendor_10|The movements start to get more visible, almost as if there\'s something crawling under the sand.||{{N|sign_ulirfendor_11|||||}}|};
-{sign_ulirfendor_11|As you get closer to the end of the ritual, the helmet falls over its side, leaving one side down on the ground.||{{N|sign_ulirfendor_12|||||}}|};
+{sign_ulirfendor_11|As you get closer to the end of the ritual, the helmet falls forward, face down in the sand.||{{N|sign_ulirfendor_12|||||}}|};
{sign_ulirfendor_12|Once you speak the final words of the ritual, the ground sinks slightly in front of the shrine, taking part of the helmet down under the sand.||{{N|sign_ulirfendor_13|||||}}|};
{sign_ulirfendor_13|As you pull it out and dust off the sand, you notice a change in texture on the part that was submerged in the sand.||{{Take the helmet|sign_ulirfendor_14|||||}}|};
{sign_ulirfendor_14|You take the helmet, and examine it more closely.|{{0|darkprotector|70|}{1|sign_ulirfendor|0|}}|{{N|sign_ulirfendor_15|||||}}|};
{talion_cure_7|(The potion smells rancid, but you manage to drink it all down. The pain from the stomach decreases, and you feel one of the rotworms crawling up into your mouth. You quickly spit the worm out into the now empty vial.)|{{0|maggots|50|}{1|potion_rotworm|0|}{3|rotworm|-99|}}|{{N|talion_cured_1|||||}}|};
{talion_cured_1|Ah, that seems to have worked. Frankly, I was a little worried that it might not have worked, but seeing you spit out that worm really confirms it. Ha ha.||{
{Yuck! Those things were inside of me?|talion_cured_2|||||}
- {What now?|talion_cure_7|||||}
+ {What now?|talion_cured_3|||||}
}|};
{talion_cured_2|Yes. Nasty, aren\'t they? *chuckle*||{{N|talion_cured_3|||||}}|};
{talion_cured_3|That one worm you spit out, you should make sure you hold on to that. It might be valuable in the future.||{
{Ok, I\'ll take it for 400 gold.|talion_bless_guard_2||gold|400|0|}
{Never mind, let\'s go back to those other blessings.|talion_bless_1|||||}
}|};
-{talion_bless_str_2|Very well. *starts chanting*|{{3|shadowbless_str|60|}}|{{N|talion_bless_2|||||}}|};
-{talion_bless_heal_2|Very well. *starts chanting*|{{3|shadowbless_heal|100|}}|{{N|talion_bless_2|||||}}|};
-{talion_bless_acc_2|Very well. *starts chanting*|{{3|shadowbless_acc|60|}}|{{N|talion_bless_2|||||}}|};
-{talion_bless_guard_2|Very well. *starts chanting*|{{3|shadowbless_guard|50|}}|{{N|talion_bless_2|||||}}|};
+{talion_bless_str_2|Very well. *starts chanting*|{{3|shadowbless_str|30|}}|{{N|talion_bless_2|||||}}|};
+{talion_bless_heal_2|Very well. *starts chanting*|{{3|shadowbless_heal|45|}}|{{N|talion_bless_2|||||}}|};
+{talion_bless_acc_2|Very well. *starts chanting*|{{3|shadowbless_acc|30|}}|{{N|talion_bless_2|||||}}|};
+{talion_bless_guard_2|Very well. *starts chanting*|{{3|shadowbless_guard|20|}}|{{N|talion_bless_2|||||}}|};
{talion_bless_2|There. I hope you will find it useful on your travels.||{
{Thank you, goodbye.|X|||||}
{How about some of those other blessings?|talion_bless_1|||||}
{helm_redeye2|items_armours:24|Cap of bloody eyes|2||0|1|1|-5|||||||0|1|8||||||||||||||||||||||};
{helm_defend1|items_armours_3:31|Defender\'s helmet|2||0|1975|1|||||-3|||||8|1|||||||||||||||||||||};
{helm_protector0|items_armours_3:31|Strange looking helmet|2|1|1|0|1|-9|||||||0|1|5||||||||||||||||||||||};
-{helm_protector|items_armours_3:31|Dark protector|2|3|0|1794|1|-6|||||||0|1|13||||||||||||||||||||||};
+{helm_protector|items_armours_3:31|Dark protector|2|3|0|3119|1|-6|||||||0|1|13|1|||||||||||||||||||||};
{armour_chain_remg|items_armours_3:13|Remgard chain mail|3||0|8927|1|||||-7|||||25||||||||||||||||||||||};
{armour_cvest1|items_armours_3:5|Combat vest|3||0|1116|1|||||15|||||8||||||||||||||||||||||};
<string name="traitsinfo_attack_cost">Attack cost (AP):</string>
<string name="traitsinfo_attack_chance">Attack chance:</string>
<string name="traitsinfo_attack_damage">Attack damage:</string>
- <string name="traitsinfo_criticalhit_chance">Critical hit chance:</string>
+ <string name="traitsinfo_criticalhit_skill">Critical hit skill:</string>
<string name="traitsinfo_criticalhit_multiplier">Critical multiplier:</string>
<string name="traitsinfo_defense_chance">Block chance:</string>
<string name="traitsinfo_defense_damageresist">Damage resistance:</string>
<string name="skill_shortdescription_barter">Better shop prices</string>
<string name="skill_shortdescription_dodge">Increased block chance</string>
<string name="skill_shortdescription_barkskin">Damage resistance</string>
- <string name="skill_shortdescription_more_criticals">Increased critical chance</string>
+ <string name="skill_shortdescription_more_criticals">Increased critical skill</string>
<string name="skill_shortdescription_better_criticals">Increased critical damage</string>
<string name="skill_shortdescription_speed">Increased maximum action points</string>
<string name="skill_shortdescription_coinfinder">Higher chance of finding gold</string>
<string name="skill_longdescription_barter">For every skill level, decreases the buying and selling gold penalty by %1$d percentage points.</string>
<string name="skill_longdescription_dodge">Increases block chance by %1$d for each skill level.</string>
<string name="skill_longdescription_barkskin">Increases damage resistance by %1$d for each skill level.</string>
- <string name="skill_longdescription_more_criticals">Increases any existing critical chance given by equipment by %1$d %% for each skill level (percentage of existing critical chance value, not percentage points).</string>
+ <string name="skill_longdescription_more_criticals">Increases any existing critical skill given by equipment by %1$d %% for each skill level (percentage of existing critical skill value, not percentage points).</string>
<string name="skill_longdescription_better_criticals">Increases any existing critical multiplier given by equipment by %1$d %% for each skill level.</string>
<string name="skill_longdescription_speed">Increases maximum action points (AP) by %1$d for each skill level.</string>
<string name="skill_longdescription_coinfinder">Increases chance of finding gold in monster drops by %1$d %%, and increases amount of gold in drops by %2$d %% for each skill level (up to the maximum amount that the monster drops).</string>
<string name="inventory_movetop">Move to top</string>
<string name="inventory_movebottom">Move to bottom</string>
<string name="actorinfo_immune_criticals">Immune to critical hits</string>
-
+ <string name="traitsinfo_criticalhit_effectivechance">Effective critical chance:</string>
+
</resources>
rangebar_hp.update(player.health);
rangebar_exp.update(player.levelExperience);
- heroinfo_currenttraits.update(player.combatTraits);
+ heroinfo_currenttraits.update(player);
ArrayList<ItemTraits_OnUse> effects_hit = new ArrayList<ItemTraits_OnUse>();
ArrayList<ItemTraits_OnUse> effects_kill = new ArrayList<ItemTraits_OnUse>();
for (int i = 0; i < Inventory.NUM_WORN_SLOTS; ++i) {
}\r
\r
private void updateTraits(Monster monster) {\r
- monsterinfo_currenttraits.update(monster.combatTraits);\r
+ monsterinfo_currenttraits.update(monster);\r
monsterinfo_onhiteffects.update(\r
null, \r
null, \r
switch (statID) {
case CombatTraits.STAT_COMBAT_ATTACK_COST: return R.string.traitsinfo_attack_cost;
case CombatTraits.STAT_COMBAT_ATTACK_CHANCE: return R.string.traitsinfo_attack_chance;
- case CombatTraits.STAT_COMBAT_CRITICAL_CHANCE: return R.string.traitsinfo_criticalhit_chance;
+ case CombatTraits.STAT_COMBAT_CRITICAL_SKILL: return R.string.traitsinfo_criticalhit_skill;
case CombatTraits.STAT_COMBAT_CRITICAL_MULTIPLIER: return R.string.traitsinfo_criticalhit_multiplier;
case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return R.string.traitsinfo_attack_damage;
case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return R.string.traitsinfo_attack_damage;
actorCombatTraits.criticalMultiplier += (combatTraits.criticalMultiplier * magnitude);
}
actorCombatTraits.attackChance += (combatTraits.attackChance * magnitude);
- actorCombatTraits.criticalChance += (combatTraits.criticalChance * magnitude);
+ actorCombatTraits.criticalSkill += (combatTraits.criticalSkill * magnitude);
actorCombatTraits.damagePotential.add(combatTraits.damagePotential.current * magnitude, true);
actorCombatTraits.damagePotential.max += (combatTraits.damagePotential.max * magnitude);
actorCombatTraits.blockChance += (combatTraits.blockChance * magnitude);
private static float getAverageDamagePerHit(Actor attacker, Actor target) {
float result = (float) (getAttackHitChance(attacker.combatTraits, target.combatTraits)) * attacker.combatTraits.damagePotential.average() / 100;
if (hasCriticalAttack(attacker, target)) {
- result += (float) attacker.combatTraits.criticalChance * result * attacker.combatTraits.criticalMultiplier / 100;
+ result += (float) attacker.combatTraits.getEffectiveCriticalChance() * result * attacker.combatTraits.criticalMultiplier / 100;
}
result -= target.combatTraits.damageResistance;
return result;
int damage = Constants.rollValue(attacker.combatTraits.damagePotential);
boolean isCriticalHit = false;
if (hasCriticalAttack(attacker, target)) {
- isCriticalHit = Constants.roll100(attacker.combatTraits.criticalChance);
+ isCriticalHit = Constants.roll100(attacker.combatTraits.getEffectiveCriticalChance());
if (isCriticalHit) {
damage *= attacker.combatTraits.criticalMultiplier;
}
combatTraits.damagePotential.add(SkillCollection.PER_SKILLPOINT_INCREASE_WEAPON_DAMAGE_MIN * player.getSkillLevel(SkillCollection.SKILL_WEAPON_DMG), false);
combatTraits.blockChance += SkillCollection.PER_SKILLPOINT_INCREASE_DODGE * player.getSkillLevel(SkillCollection.SKILL_DODGE);
combatTraits.damageResistance += SkillCollection.PER_SKILLPOINT_INCREASE_BARKSKIN * player.getSkillLevel(SkillCollection.SKILL_BARKSKIN);
- if (combatTraits.hasCriticalChanceEffect()) {
- combatTraits.criticalChance += combatTraits.criticalChance * SkillCollection.PER_SKILLPOINT_INCREASE_MORE_CRITICALS_PERCENT * player.getSkillLevel(SkillCollection.SKILL_MORE_CRITICALS) / 100;
+ if (combatTraits.hasCriticalSkillEffect()) {
+ combatTraits.criticalSkill += combatTraits.criticalSkill * SkillCollection.PER_SKILLPOINT_INCREASE_MORE_CRITICALS_PERCENT * player.getSkillLevel(SkillCollection.SKILL_MORE_CRITICALS) / 100;
}
if (combatTraits.hasCriticalMultiplierEffect()) {
combatTraits.criticalMultiplier += combatTraits.criticalMultiplier * SkillCollection.PER_SKILLPOINT_INCREASE_BETTER_CRITICALS_PERCENT * player.getSkillLevel(SkillCollection.SKILL_BETTER_CRITICALS) / 100;
public class CombatTraits {
public static final int STAT_COMBAT_ATTACK_COST = 0;
public static final int STAT_COMBAT_ATTACK_CHANCE = 1;
- public static final int STAT_COMBAT_CRITICAL_CHANCE = 2;
+ public static final int STAT_COMBAT_CRITICAL_SKILL = 2;
public static final int STAT_COMBAT_CRITICAL_MULTIPLIER = 3;
public static final int STAT_COMBAT_DAMAGE_POTENTIAL_MIN = 4;
public static final int STAT_COMBAT_DAMAGE_POTENTIAL_MAX = 5;
public int attackCost;
public int attackChance;
- public int criticalChance;
+ public int criticalSkill;
public float criticalMultiplier;
public final Range damagePotential;
if (copy == null) return;
this.attackCost = copy.attackCost;
this.attackChance = copy.attackChance;
- this.criticalChance = copy.criticalChance;
+ this.criticalSkill = copy.criticalSkill;
this.criticalMultiplier = copy.criticalMultiplier;
this.damagePotential.set(copy.damagePotential);
this.blockChance = copy.blockChance;
return
this.attackCost == other.attackCost
&& this.attackChance == other.attackChance
- && this.criticalChance == other.criticalChance
+ && this.criticalSkill == other.criticalSkill
&& this.criticalMultiplier == other.criticalMultiplier
&& this.damagePotential.equals(other.damagePotential)
&& this.blockChance == other.blockChance
return
this.attackCost == 0
&& this.attackChance == 0
- && this.criticalChance == 0
+ && this.criticalSkill == 0
&& this.criticalMultiplier == 0
&& this.damagePotential.current == 0
&& this.damagePotential.max == 0
public boolean hasAttackChanceEffect() { return attackChance != 0; }
public boolean hasAttackDamageEffect() { return damagePotential.max != 0; }
public boolean hasBlockEffect() { return blockChance != 0; }
- public boolean hasCriticalChanceEffect() { return criticalChance != 0; }
+ public boolean hasCriticalSkillEffect() { return criticalSkill != 0; }
public boolean hasCriticalMultiplierEffect() { return criticalMultiplier != 0 && criticalMultiplier != 1; }
- public boolean hasCriticalAttacks() { return hasCriticalChanceEffect() && hasCriticalMultiplierEffect(); }
+ public boolean hasCriticalAttacks() { return hasCriticalSkillEffect() && hasCriticalMultiplierEffect(); }
+ public int getEffectiveCriticalChance() {
+ if (criticalSkill <= 0) return 0;
+ int v = (int) (-5 + 2 * FloatMath.sqrt(5*criticalSkill));
+ if (v < 0) return 0;
+ return v;
+ }
+
public int getAttacksPerTurn(final int maxAP) {
return (int) Math.floor(maxAP / attackCost);
}
switch (statID) {
case STAT_COMBAT_ATTACK_COST: return attackCost;
case STAT_COMBAT_ATTACK_CHANCE: return attackChance;
- case STAT_COMBAT_CRITICAL_CHANCE: return criticalChance;
+ case STAT_COMBAT_CRITICAL_SKILL: return criticalSkill;
case STAT_COMBAT_CRITICAL_MULTIPLIER: return (int) FloatMath.floor(criticalMultiplier);
case STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return damagePotential.current;
case STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return damagePotential.max;
final int costDMG_Max = isWeapon ?
(int) (2*Math.pow(Math.max(0, damagePotential.max), 2.1))
:(int) (2*Math.pow(Math.max(0, damagePotential.max), 3) + damagePotential.max*20);
- final int costCC = (int) (2.2*Math.pow(criticalChance, 3));
+ final int costCS = (int) (2.2*Math.pow(criticalSkill, 3));
final int costCM = (int) (50*Math.pow(Math.max(0, criticalMultiplier), 2));
- return costBC + costAC + costAP + costDR + costDMG_Min + costDMG_Max + costCC + costCM;
+ return costBC + costAC + costAP + costDR + costDMG_Min + costDMG_Max + costCS + costCM;
}
public CombatTraits(DataInputStream src, int fileversion) throws IOException {
this.attackCost = src.readInt();
this.attackChance = src.readInt();
- this.criticalChance = src.readInt();
+ this.criticalSkill = src.readInt();
if (fileversion <= 20) {
this.criticalMultiplier = src.readInt();
} else {
public void writeToParcel(DataOutputStream dest, int flags) throws IOException {
dest.writeInt(attackCost);
dest.writeInt(attackChance);
- dest.writeInt(criticalChance);
+ dest.writeInt(criticalSkill);
dest.writeFloat(criticalMultiplier);
damagePotential.writeToParcel(dest, flags);
dest.writeInt(blockChance);
CombatTraits combat = new CombatTraits();
combat.attackCost = 3;
combat.attackChance = 60;
- combat.criticalChance = 0;
+ combat.criticalSkill = 0;
combat.criticalMultiplier = 1;
combat.damagePotential.set(1, 1);
combat.blockChance = 0;
sb.append(attackEffect.damagePotential.toMinMaxString());\r
addSpace = true;\r
}\r
- if (attackEffect.hasCriticalChanceEffect()) {\r
+ if (attackEffect.hasCriticalSkillEffect()) {\r
sb.append(" +");\r
- sb.append(attackEffect.criticalChance);\r
- sb.append("%x");\r
- sb.append(attackEffect.criticalMultiplier); \r
+ sb.append(attackEffect.criticalSkill);\r
+ sb.append("x");\r
+ if (attackEffect.hasCriticalMultiplierEffect()) {\r
+ sb.append(attackEffect.criticalMultiplier); \r
+ } \r
}\r
}\r
public static String describeAttackEffect(CombatTraits attackEffect) {\r
}
private static int getExpectedMonsterExperience(final CombatTraits t, ItemTraits_OnUse hitEffect, final int maxHP, final int maxAP) {
if (t == null) return 0;
- final float avgAttackHP = t.getAttacksPerTurn(maxAP) * div100(t.attackChance) * t.damagePotential.averagef() * (1 + div100(t.criticalChance) * t.criticalMultiplier);
+ final float avgAttackHP = t.getAttacksPerTurn(maxAP) * div100(t.attackChance) * t.damagePotential.averagef() * (1 + div100(t.criticalSkill) * t.criticalMultiplier);
final float avgDefenseHP = maxHP * (1 + div100(t.blockChance)) + Constants.EXP_FACTOR_DAMAGERESISTANCE * t.damageResistance;
int attackConditionBonus = 0;
if (hitEffect != null && hitEffect.addedConditions_target != null && hitEffect.addedConditions_target.length > 0) {
public static CombatTraits parseCombatTraits(String[] parts, int startIndex) {
String attackCost = parts[startIndex];
String attackChance = parts[startIndex + 1];
- String criticalChance = parts[startIndex + 2];
+ String criticalSkill = parts[startIndex + 2];
String criticalMultiplier = parts[startIndex + 3];
ConstRange attackDamage = parseRange(parts[startIndex + 4], parts[startIndex + 5]);
String blockChance = parts[startIndex + 6];
String damageResistance = parts[startIndex + 7];
if ( attackCost.length() <= 0
&& attackChance.length() <= 0
- && criticalChance.length() <= 0
+ && criticalSkill.length() <= 0
&& criticalMultiplier.length() <= 0
&& attackDamage == null
&& blockChance.length() <= 0
CombatTraits result = new CombatTraits();
result.attackCost = parseInt(attackCost, 0);
result.attackChance = parseInt(attackChance, 0);
- result.criticalChance = parseInt(criticalChance, 0);
+ result.criticalSkill = parseInt(criticalSkill, 0);
result.criticalMultiplier = parseFloat(criticalMultiplier, 0);
if (attackDamage != null) result.damagePotential.set(attackDamage);
result.blockChance = parseInt(blockChance, 0);
final Resources res = getResources();
if (traits != null && traits.combatProficiency != null) {
- abilitymodifierinfo_traits.update(traits.combatProficiency);
+ abilitymodifierinfo_traits.update(traits);
abilitymodifierinfo_traits.setVisibility(View.VISIBLE);
} else {
abilitymodifierinfo_traits.setVisibility(View.GONE);
}
public void update(ActorTraits traits) {
- super.update(traits.baseCombatTraits);
+ super.update(traits);
basetraitsinfo_max_hp.setText(Integer.toString(traits.maxHP));
basetraitsinfo_max_ap.setText(Integer.toString(traits.maxAP));
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
+import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
+import com.gpl.rpg.AndorsTrail.model.actor.Actor;
+import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits;
import android.content.Context;
import android.util.AttributeSet;
private final TableRow traitsinfo_attack_row3;
private final TableRow traitsinfo_critical_row1;
private final TableRow traitsinfo_critical_row2;
+ private final TableRow traitsinfo_critical_row3;
private final TableRow traitsinfo_defense_row1;
private final TableRow traitsinfo_defense_row2;
private final TextView traitsinfo_attack_cost;
private final TextView traitsinfo_attack_chance;
private final TextView traitsinfo_attack_damage;
- private final TextView traitsinfo_criticalhit_chance;
+ private final TextView traitsinfo_criticalhit_skill;
private final TextView traitsinfo_criticalhit_multiplier;
+ private final TextView traitsinfo_criticalhit_effectivechance;
private final TextView traitsinfo_defense_chance;
private final TextView traitsinfo_defense_damageresist;
traitsinfo_attack_row3 = (TableRow) findViewById(R.id.traitsinfo_attack_row3);
traitsinfo_critical_row1 = (TableRow) findViewById(R.id.traitsinfo_critical_row1);
traitsinfo_critical_row2 = (TableRow) findViewById(R.id.traitsinfo_critical_row2);
+ traitsinfo_critical_row3 = (TableRow) findViewById(R.id.traitsinfo_critical_row3);
traitsinfo_defense_row1 = (TableRow) findViewById(R.id.traitsinfo_defense_row1);
traitsinfo_defense_row2 = (TableRow) findViewById(R.id.traitsinfo_defense_row2);
traitsinfo_attack_cost = (TextView) findViewById(R.id.traitsinfo_attack_cost);
traitsinfo_attack_chance = (TextView) findViewById(R.id.traitsinfo_attack_chance);
traitsinfo_attack_damage = (TextView) findViewById(R.id.traitsinfo_attack_damage);
- traitsinfo_criticalhit_chance = (TextView) findViewById(R.id.traitsinfo_criticalhit_chance);
+ traitsinfo_criticalhit_skill = (TextView) findViewById(R.id.traitsinfo_criticalhit_skill);
traitsinfo_criticalhit_multiplier = (TextView) findViewById(R.id.traitsinfo_criticalhit_multiplier);
+ traitsinfo_criticalhit_effectivechance = (TextView) findViewById(R.id.traitsinfo_criticalhit_effectivechance);
traitsinfo_defense_chance = (TextView) findViewById(R.id.traitsinfo_defense_chance);
traitsinfo_defense_damageresist = (TextView) findViewById(R.id.traitsinfo_defense_damageresist);
}
- public void update(CombatTraits traits) {
+ public void update(Actor actor) { update(actor.combatTraits, true); }
+ public void update(ActorTraits actorTraits) { update(actorTraits.baseCombatTraits, true); }
+ public void update(AbilityModifierTraits traits) { update(traits.combatProficiency, false); }
+ private void update(CombatTraits traits, boolean showEffectiveCriticalChance) {
if (traits != null && traits.attackCost != 0) {
traitsinfo_attack_row1.setVisibility(View.VISIBLE);
traitsinfo_attack_cost.setText(Integer.toString(traits.attackCost));
} else {
traitsinfo_attack_row3.setVisibility(View.GONE);
}
- if (traits != null && traits.hasCriticalChanceEffect()) {
+ if (traits != null && traits.hasCriticalSkillEffect()) {
traitsinfo_critical_row1.setVisibility(View.VISIBLE);
- traitsinfo_criticalhit_chance.setText(Integer.toString(traits.criticalChance) + "%");
+ traitsinfo_criticalhit_skill.setText(Integer.toString(traits.criticalSkill));
} else {
traitsinfo_critical_row1.setVisibility(View.GONE);
}
} else {
traitsinfo_critical_row2.setVisibility(View.GONE);
}
+ if (showEffectiveCriticalChance && traits != null && traits.hasCriticalAttacks()) {
+ traitsinfo_critical_row3.setVisibility(View.VISIBLE);
+ traitsinfo_criticalhit_effectivechance.setText(Integer.toString(traits.getEffectiveCriticalChance()) + "%");
+ } else {
+ traitsinfo_critical_row3.setVisibility(View.GONE);
+ }
if (traits != null && traits.hasBlockEffect()) {
traitsinfo_defense_row1.setVisibility(View.VISIBLE);
traitsinfo_defense_chance.setText(Integer.toString(traits.blockChance) + "%");
</div>\r
<div id="hasCriticalDisplay">\r
<div class="fieldWithLabel">\r
- <label for="criticalChance" class="label">Critical chance:</label>\r
+ <label for="criticalChance" class="label">Critical skill:</label>\r
<div class="field"><input type="text" size="5" id="criticalChance" class="fieldInput integer" />%</div>\r
</div>\r
<div class="fieldWithLabel">\r
</div>\r
<div id="equip_hasCriticalDisplay">\r
<div class="fieldWithLabel">\r
- <label for="equip_criticalChance" class="label">Critical chance:</label>\r
+ <label for="equip_criticalChance" class="label">Critical skill:</label>\r
<div class="field"><input type="text" size="5" id="equip_criticalChance" class="fieldInput integer" />%</div>\r
</div>\r
<div class="fieldWithLabel">\r
</div>\r
<div id="hasCriticalDisplay">\r
<div class="fieldWithLabel">\r
- <label for="criticalChance" class="label">Critical chance:</label>\r
+ <label for="criticalChance" class="label">Critical skill:</label>\r
<div class="field"><input type="text" size="5" id="criticalChance" class="fieldInput integer" />%</div>\r
</div>\r
<div class="fieldWithLabel">\r