Actor traits refactoring - Remove ActorTraits & CombatTraits.

This commit is contained in:
Oskar Wiksten
2012-11-08 20:15:32 +01:00
parent 2770d2156f
commit 2ac6762f2f
7 changed files with 38 additions and 254 deletions

View File

@@ -4,11 +4,9 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.SkillController;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
import com.gpl.rpg.AndorsTrail.model.ability.SkillInfo;
import com.gpl.rpg.AndorsTrail.model.ability.SkillInfo.SkillLevelRequirement;
import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import android.app.Activity;
@@ -194,9 +192,9 @@ public final class SkillInfoActivity extends Activity {
private static int getRequirementActorStatsResourceID(int statID) {
switch (statID) {
case ActorTraits.STAT_ACTOR_MAX_HP: return R.string.actorinfo_health;
case ActorTraits.STAT_ACTOR_MAX_AP: return R.string.heroinfo_actionpoints;
case ActorTraits.STAT_ACTOR_MOVECOST: return R.string.actorinfo_movecost;
case Player.STAT_ACTOR_MAX_HP: return R.string.actorinfo_health;
case Player.STAT_ACTOR_MAX_AP: return R.string.heroinfo_actionpoints;
case Player.STAT_ACTOR_MOVECOST: return R.string.actorinfo_movecost;
default:
return -1;
}
@@ -204,14 +202,14 @@ public final class SkillInfoActivity extends Activity {
private static int getRequirementCombatStatsResourceID(int statID) {
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_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;
case CombatTraits.STAT_COMBAT_BLOCK_CHANCE: return R.string.traitsinfo_defense_chance;
case CombatTraits.STAT_COMBAT_DAMAGE_RESISTANCE: return R.string.traitsinfo_defense_damageresist;
case Player.STAT_COMBAT_ATTACK_COST: return R.string.traitsinfo_attack_cost;
case Player.STAT_COMBAT_ATTACK_CHANCE: return R.string.traitsinfo_attack_chance;
case Player.STAT_COMBAT_CRITICAL_SKILL: return R.string.traitsinfo_criticalhit_skill;
case Player.STAT_COMBAT_CRITICAL_MULTIPLIER: return R.string.traitsinfo_criticalhit_multiplier;
case Player.STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return R.string.traitsinfo_attack_damage;
case Player.STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return R.string.traitsinfo_attack_damage;
case Player.STAT_COMBAT_BLOCK_CHANCE: return R.string.traitsinfo_defense_chance;
case Player.STAT_COMBAT_DAMAGE_RESISTANCE: return R.string.traitsinfo_defense_damageresist;
default:
return -1;
}

View File

@@ -2,7 +2,6 @@ package com.gpl.rpg.AndorsTrail.controller;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.AttackResult;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;

View File

@@ -1,101 +0,0 @@
package com.gpl.rpg.AndorsTrail.model;
import android.util.FloatMath;
import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits;
import com.gpl.rpg.AndorsTrail.util.Range;
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_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 static final int STAT_COMBAT_BLOCK_CHANCE = 6;
public static final int STAT_COMBAT_DAMAGE_RESISTANCE = 7;
public int attackCost;
public int attackChance;
public int criticalSkill;
public float criticalMultiplier;
public final Range damagePotential;
public int blockChance;
public int damageResistance;
public CombatTraits() {
this.damagePotential = new Range();
}
public CombatTraits(ActorTraits copy) {
this();
set(copy);
}
public void set(ActorTraits copy) {
if (copy == null) return;
this.attackCost = copy.attackCost;
this.attackChance = copy.attackChance;
this.criticalSkill = copy.criticalSkill;
this.criticalMultiplier = copy.criticalMultiplier;
this.damagePotential.set(copy.damagePotential);
this.blockChance = copy.blockChance;
this.damageResistance = copy.damageResistance;
}
public boolean isSameValuesAs(ActorTraits other) {
if (other == null) return isZero();
return
this.attackCost == other.attackCost
&& this.attackChance == other.attackChance
&& this.criticalSkill == other.criticalSkill
&& this.criticalMultiplier == other.criticalMultiplier
&& this.damagePotential.equals(other.damagePotential)
&& this.blockChance == other.blockChance
&& this.damageResistance == other.damageResistance;
}
private boolean isZero() {
return
this.attackCost == 0
&& this.attackChance == 0
&& this.criticalSkill == 0
&& this.criticalMultiplier == 0
&& this.damagePotential.current == 0
&& this.damagePotential.max == 0
&& this.blockChance == 0
&& this.damageResistance == 0;
}
public boolean hasAttackChanceEffect() { return attackChance != 0; }
public boolean hasAttackDamageEffect() { return damagePotential.max != 0; }
public boolean hasBlockEffect() { return blockChance != 0; }
public boolean hasCriticalSkillEffect() { return criticalSkill != 0; }
public boolean hasCriticalMultiplierEffect() { return criticalMultiplier != 0 && criticalMultiplier != 1; }
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);
}
public int getCombatStats(int statID) {
switch (statID) {
case STAT_COMBAT_ATTACK_COST: return attackCost;
case STAT_COMBAT_ATTACK_CHANCE: return attackChance;
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;
case STAT_COMBAT_BLOCK_CHANCE: return blockChance;
case STAT_COMBAT_DAMAGE_RESISTANCE: return damageResistance;
}
return 0;
}
}

View File

@@ -6,9 +6,8 @@ import java.util.Collection;
import android.util.SparseArray;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.ability.SkillInfo.SkillLevelRequirement;
import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
public final class SkillCollection {
public static final int SKILL_WEAPON_CHANCE = 0;
@@ -91,7 +90,7 @@ public final class SkillCollection {
initializeSkill(new SkillInfo(SKILL_DODGE, SkillInfo.MAXLEVEL_NONE, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, null));
initializeSkill(new SkillInfo(SKILL_BARKSKIN, MAX_LEVEL_BARKSKIN, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, new SkillLevelRequirement[] {
SkillLevelRequirement.requireExperienceLevels(10, 0)
,SkillLevelRequirement.requireCombatStats(CombatTraits.STAT_COMBAT_BLOCK_CHANCE, 15, 0)
,SkillLevelRequirement.requireCombatStats(Player.STAT_COMBAT_BLOCK_CHANCE, 15, 0)
}));
initializeSkill(new SkillInfo(SKILL_MORE_CRITICALS, SkillInfo.MAXLEVEL_NONE, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, null));
initializeSkill(new SkillInfo(SKILL_BETTER_CRITICALS, SkillInfo.MAXLEVEL_NONE, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, new SkillLevelRequirement[] {
@@ -107,14 +106,14 @@ public final class SkillCollection {
,SkillLevelRequirement.requireOtherSkill(SKILL_WEAPON_DMG, 1)
}));
initializeSkill(new SkillInfo(SKILL_EATER, SkillInfo.MAXLEVEL_NONE, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, new SkillLevelRequirement[] {
SkillLevelRequirement.requireActorStats(ActorTraits.STAT_ACTOR_MAX_HP, 20, 20)
SkillLevelRequirement.requireActorStats(Player.STAT_ACTOR_MAX_HP, 20, 20)
}));
initializeSkill(new SkillInfo(SKILL_FORTITUDE, SkillInfo.MAXLEVEL_NONE, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, new SkillLevelRequirement[] {
SkillLevelRequirement.requireExperienceLevels(15, -10)
}));
initializeSkill(new SkillInfo(SKILL_EVASION, MAX_LEVEL_EVASION, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, null));
initializeSkill(new SkillInfo(SKILL_REGENERATION, SkillInfo.MAXLEVEL_NONE, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, new SkillLevelRequirement[] {
SkillLevelRequirement.requireActorStats(ActorTraits.STAT_ACTOR_MAX_HP, 30, 0)
SkillLevelRequirement.requireActorStats(Player.STAT_ACTOR_MAX_HP, 30, 0)
,SkillLevelRequirement.requireOtherSkill(SKILL_FORTITUDE, 1)
}));
initializeSkill(new SkillInfo(SKILL_LOWER_EXPLOSS, MAX_LEVEL_LOWER_EXPLOSS, SkillInfo.LEVELUP_TYPE_ALWAYS_SHOWN, null));

View File

@@ -1,92 +0,0 @@
package com.gpl.rpg.AndorsTrail.model.actor;
import android.util.FloatMath;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.util.Range;
public class ActorTraits {
public static final int STAT_ACTOR_MAX_HP = 0;
public static final int STAT_ACTOR_MAX_AP = 1;
public static final int STAT_ACTOR_MOVECOST = 2;
public final int iconID;
public int maxAP;
public int maxHP;
public int moveCost;
public final int baseMoveCost;
public int attackCost;
public int attackChance;
public int criticalSkill;
public float criticalMultiplier;
public final Range damagePotential;
public int blockChance;
public int damageResistance;
public ItemTraits_OnUse[] onHitEffects;
public ActorTraits(
int iconID
, int attackCost
, int attackChance
, int criticalSkill
, float criticalMultiplier
, Range damagePotential
, int blockChance
, int damageResistance
, int standardMoveCost
, ItemTraits_OnUse[] onHitEffects
) {
this.iconID = iconID;
this.attackCost = attackCost;
this.attackChance = attackChance;
this.criticalSkill = criticalSkill;
this.criticalMultiplier = criticalMultiplier;
this.damagePotential = damagePotential;
this.blockChance = blockChance;
this.damageResistance = damageResistance;
this.baseMoveCost = standardMoveCost;
this.onHitEffects = onHitEffects;
}
public int getMovesPerTurn() { return (int) Math.floor(maxAP / moveCost); }
public boolean hasAttackChanceEffect() { return attackChance != 0; }
public boolean hasAttackDamageEffect() { return damagePotential.max != 0; }
public boolean hasBlockEffect() { return blockChance != 0; }
public boolean hasCriticalSkillEffect() { return criticalSkill != 0; }
public boolean hasCriticalMultiplierEffect() { return criticalMultiplier != 0 && criticalMultiplier != 1; }
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 getActorStats(int statID) {
switch (statID) {
case STAT_ACTOR_MAX_HP: return maxHP;
case STAT_ACTOR_MAX_AP: return maxAP;
case STAT_ACTOR_MOVECOST: return moveCost;
}
return 0;
}
public int getCombatStats(int statID) {
switch (statID) {
case CombatTraits.STAT_COMBAT_ATTACK_COST: return attackCost;
case CombatTraits.STAT_COMBAT_ATTACK_CHANCE: return attackChance;
case CombatTraits.STAT_COMBAT_CRITICAL_SKILL: return criticalSkill;
case CombatTraits.STAT_COMBAT_CRITICAL_MULTIPLIER: return (int) FloatMath.floor(criticalMultiplier);
case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return damagePotential.current;
case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return damagePotential.max;
case CombatTraits.STAT_COMBAT_BLOCK_CHANCE: return blockChance;
case CombatTraits.STAT_COMBAT_DAMAGE_RESISTANCE: return damageResistance;
}
return 0;
}
}

View File

@@ -14,7 +14,6 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.ActorStatsController;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
import com.gpl.rpg.AndorsTrail.model.item.DropListCollection;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
@@ -28,6 +27,18 @@ import com.gpl.rpg.AndorsTrail.util.Range;
import com.gpl.rpg.AndorsTrail.util.Size;
public final class Player extends Actor {
public static final int STAT_ACTOR_MAX_HP = 0;
public static final int STAT_ACTOR_MAX_AP = 1;
public static final int STAT_ACTOR_MOVECOST = 2;
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_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 static final int STAT_COMBAT_BLOCK_CHANCE = 6;
public static final int STAT_COMBAT_DAMAGE_RESISTANCE = 7;
public static final int DEFAULT_PLAYER_ATTACKCOST = 4;
public final Coord lastPosition;
public final Coord nextPosition;
@@ -225,23 +236,23 @@ public final class Player extends Actor {
public int getActorStats(int statID) {
switch (statID) {
case ActorTraits.STAT_ACTOR_MAX_HP: return baseTraits.maxHP;
case ActorTraits.STAT_ACTOR_MAX_AP: return baseTraits.maxAP;
case ActorTraits.STAT_ACTOR_MOVECOST: return baseTraits.moveCost;
case Player.STAT_ACTOR_MAX_HP: return baseTraits.maxHP;
case Player.STAT_ACTOR_MAX_AP: return baseTraits.maxAP;
case Player.STAT_ACTOR_MOVECOST: return baseTraits.moveCost;
}
return 0;
}
public int getCombatStats(int statID) {
switch (statID) {
case CombatTraits.STAT_COMBAT_ATTACK_COST: return baseTraits.attackCost;
case CombatTraits.STAT_COMBAT_ATTACK_CHANCE: return baseTraits.attackChance;
case CombatTraits.STAT_COMBAT_CRITICAL_SKILL: return baseTraits.criticalSkill;
case CombatTraits.STAT_COMBAT_CRITICAL_MULTIPLIER: return (int) FloatMath.floor(baseTraits.criticalMultiplier);
case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return baseTraits.damagePotential.current;
case CombatTraits.STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return baseTraits.damagePotential.max;
case CombatTraits.STAT_COMBAT_BLOCK_CHANCE: return baseTraits.blockChance;
case CombatTraits.STAT_COMBAT_DAMAGE_RESISTANCE: return baseTraits.damageResistance;
case Player.STAT_COMBAT_ATTACK_COST: return baseTraits.attackCost;
case Player.STAT_COMBAT_ATTACK_CHANCE: return baseTraits.attackChance;
case Player.STAT_COMBAT_CRITICAL_SKILL: return baseTraits.criticalSkill;
case Player.STAT_COMBAT_CRITICAL_MULTIPLIER: return (int) FloatMath.floor(baseTraits.criticalMultiplier);
case Player.STAT_COMBAT_DAMAGE_POTENTIAL_MIN: return baseTraits.damagePotential.current;
case Player.STAT_COMBAT_DAMAGE_POTENTIAL_MAX: return baseTraits.damagePotential.max;
case Player.STAT_COMBAT_BLOCK_CHANCE: return baseTraits.blockChance;
case Player.STAT_COMBAT_DAMAGE_RESISTANCE: return baseTraits.damageResistance;
}
return 0;
}

View File

@@ -1,7 +1,6 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
@@ -66,35 +65,6 @@ public final class ResourceParserUtils {
return new Size(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
}
public static CombatTraits parseCombatTraits(String[] parts, int startIndex) {
String attackCost = parts[startIndex];
String attackChance = parts[startIndex + 1];
String criticalSkill = parts[startIndex + 2];
String criticalMultiplier = parts[startIndex + 3];
ConstRange attackDamage = parseConstRange(parts[startIndex + 4], parts[startIndex + 5]);
String blockChance = parts[startIndex + 6];
String damageResistance = parts[startIndex + 7];
if ( attackCost.length() <= 0
&& attackChance.length() <= 0
&& criticalSkill.length() <= 0
&& criticalMultiplier.length() <= 0
&& attackDamage == null
&& blockChance.length() <= 0
&& damageResistance.length() <= 0
) {
return null;
} else {
CombatTraits result = new CombatTraits();
result.attackCost = parseInt(attackCost, 0);
result.attackChance = parseInt(attackChance, 0);
result.criticalSkill = parseInt(criticalSkill, 0);
result.criticalMultiplier = parseFloat(criticalMultiplier, 0);
if (attackDamage != null) result.damagePotential.set(attackDamage);
result.blockChance = parseInt(blockChance, 0);
result.damageResistance = parseInt(damageResistance, 0);
return result;
}
}
public static String parseNullableString(String s) {
if (s == null || s.length() <= 0) return null;
return s;