Start on a basic skill system.

git-svn-id: https://andors-trail.googlecode.com/svn/trunk@134 08aca716-68be-ccc6-4d58-36f5abd142ac
This commit is contained in:
oskar.wiksten
2011-07-16 19:45:46 +00:00
parent 67513a3692
commit 2b961c391c
23 changed files with 215 additions and 54 deletions

View File

@@ -170,13 +170,13 @@ public final class R {
public static final int bulkselection_summary_totalgold=0x7f09001b;
public static final int combatview_actionbar=0x7f09001e;
public static final int combatview_endturn=0x7f090021;
public static final int combatview_flee=0x7f090020;
public static final int combatview_flee=0x7f090022;
public static final int combatview_monsterbar=0x7f090024;
public static final int combatview_monsterhealth=0x7f090026;
public static final int combatview_monsterinfo=0x7f090025;
public static final int combatview_monsterismoving=0x7f090023;
public static final int combatview_moveattack=0x7f09001f;
public static final int combatview_status=0x7f090022;
public static final int combatview_status=0x7f090020;
public static final int conversation_image=0x7f09002a;
public static final int conversation_leave=0x7f090029;
public static final int conversation_next=0x7f090028;

View File

@@ -19,7 +19,7 @@ public final class AndorsTrailApplication extends Application {
public static final boolean DEVELOPMENT_DEBUGBUTTONS = true;
public static final boolean DEVELOPMENT_VALIDATEDATA = true;
public static final boolean DEVELOPMENT_DEBUGMESSAGES = true;
public static final int CURRENT_VERSION = 20;
public static final int CURRENT_VERSION = 21;
public static final String CURRENT_VERSION_DISPLAY = "0.6.10dev";
public final WorldContext world = new WorldContext();

View File

@@ -16,6 +16,7 @@ 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.actor.Player;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
public final class LevelUpActivity extends Activity {
private WorldContext world;
@@ -89,11 +90,10 @@ public final class LevelUpActivity extends Activity {
}
private static void addLevelupEffect(Player player, int selectionID) {
int hpIncrease = 0;
switch (selectionID) {
case SELECT_HEALTH:
player.health.max += Constants.LEVELUP_EFFECT_HEALTH;
player.traits.maxHP += Constants.LEVELUP_EFFECT_HEALTH;
player.health.current += Constants.LEVELUP_EFFECT_HEALTH;
hpIncrease = Constants.LEVELUP_EFFECT_HEALTH;
break;
case SELECT_ATK_CH:
player.traits.baseCombatTraits.attackChance += Constants.LEVELUP_EFFECT_ATK_CH;
@@ -107,6 +107,12 @@ public final class LevelUpActivity extends Activity {
break;
}
player.level++;
hpIncrease += player.getSkillLevel(Skills.SKILL_FORTITUDE) * Skills.PER_SKILLPOINT_INCREASE_FORTITUDE_HEALTH;
player.health.max += hpIncrease;
player.traits.maxHP += hpIncrease;
player.health.current += hpIncrease;
player.recalculateLevelExperience();
ActorStatsController.recalculatePlayerCombatTraits(player);
}

View File

@@ -13,8 +13,6 @@ import com.gpl.rpg.AndorsTrail.controller.CombatController;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
import com.gpl.rpg.AndorsTrail.model.map.MapObject;
import com.gpl.rpg.AndorsTrail.model.quest.QuestProgress;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.view.CombatView;
@@ -149,6 +147,20 @@ public final class MainActivity extends Activity {
Toast.makeText(MainActivity.this, "DEBUG: added items", Toast.LENGTH_SHORT).show();
}
})*/
/*,new DebugButton("skills+=20", new OnClickListener() {
@Override
public void onClick(View arg0) {
int N = 1;
for(int j = 0; j < N; ++j) {
for(int i = 0; i < Skills.NUM_SKILLS; ++i) {
world.model.player.addSkillLevel(i);
}
}
ActorStatsController.recalculatePlayerCombatTraits(world.model.player);
updateStatus();
Toast.makeText(MainActivity.this, "DEBUG: all skills raised " + N + " levels", Toast.LENGTH_SHORT).show();
}
})*/
/*,new DebugButton("bwm", new OnClickListener() {
@Override
public void onClick(View arg0) {
@@ -172,7 +184,7 @@ public final class MainActivity extends Activity {
view.movementController.placePlayerAt(MapObject.MAPEVENT_NEWMAP, "blackwater_mountain29", "south", 0, 0);
}
})*/
,new DebugButton("kazaul", new OnClickListener() {
/*,new DebugButton("kazaul", new OnClickListener() {
@Override
public void onClick(View arg0) {
Player player = world.model.player;
@@ -188,7 +200,7 @@ public final class MainActivity extends Activity {
view.movementController.placePlayerAt(MapObject.MAPEVENT_NEWMAP, "blackwater_mountain50", "exit", 0, 0);
}
})
})*/
/*,new DebugButton("wyrms", new OnClickListener() {
@Override
public void onClick(View arg0) {

View File

@@ -73,7 +73,7 @@ public final class ShopActivity extends TabActivity implements OnContainerItemCl
shoplist_sell = (ListView) h.findViewById(R.id.shop_sell_list);
Loot merchantLoot = new Loot();
npcType.dropList.createRandomLoot(merchantLoot);
npcType.dropList.createRandomLoot(merchantLoot, player);
container_buy = merchantLoot.items;
shoplist_buy.setAdapter(new ShopItemContainerAdapter(

View File

@@ -118,6 +118,7 @@ public class ActorStatsController {
private static void recalculateActorCombatTraits(Actor actor) {
actor.resetStatsToBaseTraits();
if (actor.isPlayer) ItemController.applyInventoryEffects((Player) actor);
if (actor.isPlayer) SkillController.applySkillEffects((Player) actor);
applyEffectsFromCurrentConditions(actor);
if (actor.isPlayer) ItemController.recalculateHitEffectsFromWornItems((Player) actor);
}

View File

@@ -19,6 +19,8 @@ import com.gpl.rpg.AndorsTrail.model.actor.Actor;
import com.gpl.rpg.AndorsTrail.model.actor.ActorTraits;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
@@ -205,17 +207,22 @@ public final class CombatController {
}
public void playerKilledMonster(Monster killedMonster) {
final Player player = model.player;
Loot loot = model.currentMap.getBagOrCreateAt(killedMonster.position);
killedMonster.createLoot(loot);
killedMonster.createLoot(loot, player);
model.currentMap.remove(killedMonster);
context.mainActivity.redrawAll(MainView.REDRAW_ALL_MONSTER_KILLED);
if (player.getSkillLevel(Skills.SKILL_CLEAVE) > 0) player.ap.setMax();
player.health.add(player.getSkillLevel(Skills.SKILL_EATER) * Skills.PER_SKILLPOINT_INCREASE_EATER_HEALTH, false);
model.statistics.addMonsterKill(killedMonster.monsterType);
model.player.addExperience(loot.exp);
totalExpThisFight += loot.exp;
loot.exp = 0;
context.actorStatsController.applyKillEffectsToPlayer(model.player);
context.actorStatsController.applyKillEffectsToPlayer(player);
context.mainActivity.updateStatus();
@@ -240,7 +247,8 @@ public final class CombatController {
if (dest == null) return;
if (!useAPs(model.player.traits.moveCost)) return;
if (Constants.roll100(Constants.FLEE_FAIL_CHANCE_PERCENT)) {
int fleeChanceBias = model.player.getSkillLevel(Skills.SKILL_EVASION) * Skills.PER_SKILLPOINT_INCREASE_EVASION_FLEE_CHANCE_PERCENTAGE;
if (Constants.roll100(Constants.FLEE_FAIL_CHANCE_PERCENT - fleeChanceBias)) {
fleeingFailed();
return;
}
@@ -249,7 +257,9 @@ public final class CombatController {
context.movementController.moveToNextIfPossible(false);
if (canExitCombat()) exitCombat(true);
else maybeAutoEndTurn();
context.mainActivity.updateStatus();
maybeAutoEndTurn();
}
private void fleeingFailed() {

View File

@@ -37,15 +37,16 @@ public final class Constants {
public static final Random rnd = new Random();
public static boolean roll100(final int chance) { return rnd.nextInt(100) < chance; }
public static int rollValue(final ConstRange r) {
if (r.isMax()) return r.max;
else return rnd.nextInt(r.max - r.current) + r.current;
public static int rollValue(final ConstRange r) { return rollValue(r.max, r.current); }
public static int rollValue(final ConstRange r, int bias) { return rollValue(r.max, r.current + bias); }
public static int rollValue(final Range r) { return rollValue(r.max, r.current); }
private static int rollValue(final int max, final int min) {
if (max <= min) return max;
else return rnd.nextInt(max - min + 1) + min;
}
public static int rollValue(final Range r) {
if (r.isMax()) return r.max;
else return rnd.nextInt(r.max - r.current + 1) + r.current;
}
public static boolean rollResult(final ConstRange r) { return rnd.nextInt(r.max) < r.current; }
public static boolean rollResult(final Range r) { return rnd.nextInt(r.max) < r.current; }
public static boolean roll100(final int chance) { return rollResult(100, chance); }
public static boolean rollResult(final ConstRange r) { return rollResult(r.max, r.current); }
public static boolean rollResult(final ConstRange r, int bias) { return rollResult(r.max, r.current + bias); }
public static boolean rollResult(final Range r) { return rollResult(r.max, r.current); }
private static boolean rollResult(final int probabilityMax, final int probabilityValue) { return rnd.nextInt(probabilityMax) < probabilityValue; }
}

View File

@@ -10,6 +10,7 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.model.map.MapObject;
import com.gpl.rpg.AndorsTrail.util.Coord;
@@ -62,8 +63,10 @@ public final class Controller {
view.combatController.exitCombat(false);
view.effectController.waitForCurrentEffect();
final Player player = model.player;
int lostExp = player.levelExperience.current / (100 / Constants.PERCENT_EXP_LOST_WHEN_DIED);
if (lostExp < 0) lostExp = 0; // Shouldn't happen, but just to be sure.
int lostExp = player.levelExperience.current * Constants.PERCENT_EXP_LOST_WHEN_DIED / 100;
lostExp -= lostExp * player.getSkillLevel(Skills.SKILL_LOWER_EXPLOSS) * Skills.PER_SKILLPOINT_INCREASE_EXPLOSS_PERCENT / 100;
if (lostExp < 0) lostExp = 0;
player.addExperience(-lostExp);
model.statistics.addPlayerDeath(lostExp);
playerRested(world, null);

View File

@@ -16,7 +16,7 @@ public final class ConversationController {
final Loot loot = new Loot();
if (phrase.rewardDropList != null) {
phrase.rewardDropList.createRandomLoot(loot);
phrase.rewardDropList.createRandomLoot(loot, player);
player.inventory.add(loot);
}
if (phrase.progressQuest != null) {

View File

@@ -3,6 +3,7 @@ package com.gpl.rpg.AndorsTrail.controller;
import com.gpl.rpg.AndorsTrail.context.ViewContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
import com.gpl.rpg.AndorsTrail.util.TimedMessageTask;
public final class GameRoundController implements TimedMessageTask.Callback {
@@ -65,6 +66,8 @@ public final class GameRoundController implements TimedMessageTask.Callback {
private void onNewRound() {
view.actorStatsController.applyConditionsToMonsters(model.currentMap, false);
view.actorStatsController.applyConditionsToPlayer(model.player, false);
model.player.health.add(model.player.getSkillLevel(Skills.SKILL_REGENERATION) * Skills.PER_SKILLPOINT_INCREASE_REGENERATION, false);
}
private void onNewTick() {

View File

@@ -10,6 +10,7 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.CombatTraits;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
@@ -190,11 +191,15 @@ public final class ItemController {
return isBagRemoved;
}
private static int getMarketPriceFactor(Player player) {
return Constants.MARKET_PRICEFACTOR_PERCENT
- player.getSkillLevel(Skills.SKILL_BARTER) * Skills.PER_SKILLPOINT_INCREASE_BARTER_PRICEFACTOR_PERCENTAGE;
}
public static int getBuyingPrice(Player player, ItemType itemType) {
return itemType.baseMarketCost * (100 + Constants.MARKET_PRICEFACTOR_PERCENT) / 100;
return itemType.baseMarketCost + itemType.baseMarketCost * getMarketPriceFactor(player) / 100;
}
public static int getSellingPrice(Player player, ItemType itemType) {
return itemType.baseMarketCost * (100 - Constants.MARKET_PRICEFACTOR_PERCENT) / 100;
return itemType.baseMarketCost - itemType.baseMarketCost * getMarketPriceFactor(player) / 100;
}
public static boolean canAfford(Player player, ItemType itemType) {

View File

@@ -4,6 +4,7 @@ import com.gpl.rpg.AndorsTrail.context.ViewContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
import com.gpl.rpg.AndorsTrail.util.Coord;
@@ -38,7 +39,9 @@ public final class MonsterMovementController {
for (Monster m : a.monsters) {
if (!m.isAgressive()) continue;
if (!m.rectPosition.isAdjacentTo(model.player.position)) continue;
if (Constants.roll100(Constants.MONSTER_AGGRESSION_CHANCE_PERCENT)) {
int aggressionChanceBias = model.player.getSkillLevel(Skills.SKILL_EVASION) * Skills.PER_SKILLPOINT_INCREASE_EVASION_MONSTER_ATTACK_CHANCE_PERCENTAGE;
if (Constants.roll100(Constants.MONSTER_AGGRESSION_CHANCE_PERCENT - aggressionChanceBias)) {
view.combatController.monsterSteppedOnPlayer(m);
return;
}

View File

@@ -0,0 +1,58 @@
package com.gpl.rpg.AndorsTrail.controller;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.actor.Skills;
import com.gpl.rpg.AndorsTrail.model.item.ItemTypeCollection;
import com.gpl.rpg.AndorsTrail.model.item.DropList.DropItem;
public final class SkillController {
public static void applySkillEffects(Player player) {
player.traits.attackChance += Skills.PER_SKILLPOINT_INCREASE_WEAPON_CHANCE * player.getSkillLevel(Skills.SKILL_WEAPON_CHANCE);
player.traits.damagePotential.addToMax(Skills.PER_SKILLPOINT_INCREASE_WEAPON_DAMAGE_MAX * player.getSkillLevel(Skills.SKILL_WEAPON_DMG));
player.traits.damagePotential.add(Skills.PER_SKILLPOINT_INCREASE_WEAPON_DAMAGE_MIN * player.getSkillLevel(Skills.SKILL_WEAPON_DMG), false);
player.traits.blockChance += Skills.PER_SKILLPOINT_INCREASE_DODGE * player.getSkillLevel(Skills.SKILL_DODGE);
player.traits.damageResistance += Skills.PER_SKILLPOINT_INCREASE_BARKSKIN * player.getSkillLevel(Skills.SKILL_BARKSKIN);
if (player.traits.hasCriticalChanceEffect()) {
player.traits.criticalChance += player.traits.criticalChance * Skills.PER_SKILLPOINT_INCREASE_MORE_CRITICALS_PERCENT * player.getSkillLevel(Skills.SKILL_MORE_CRITICALS) / 100;
}
if (player.traits.hasCriticalMultiplierEffect()) {
player.traits.criticalMultiplier += player.traits.criticalMultiplier * Skills.PER_SKILLPOINT_INCREASE_BETTER_CRITICALS_PERCENT * player.getSkillLevel(Skills.SKILL_BETTER_CRITICALS) / 100;
}
player.ap.addToMax(Skills.PER_SKILLPOINT_INCREASE_SPEED * player.getSkillLevel(Skills.SKILL_SPEED));
/*final int berserkLevel = player.getSkillLevel(Skills.SKILL_BERSERKER);
if (berserkLevel > 0) {
final int berserkHealth = player.health.max * Skills.BERSERKER_STARTS_AT_HEALTH_PERCENT / 100;
if (player.health.current <= berserkHealth) {
player.traits.attackChance += Skills.PER_SKILLPOINT_INCREASE_BERSERKER_WEAPON_CHANCE * berserkLevel;
player.traits.damagePotential.addToMax(Skills.PER_SKILLPOINT_INCREASE_BERSERKER_WEAPON_DAMAGE_MAX * berserkLevel);
player.traits.damagePotential.add(Skills.PER_SKILLPOINT_INCREASE_BERSERKER_WEAPON_DAMAGE_MIN * berserkLevel, false);
player.traits.blockChance += Skills.PER_SKILLPOINT_INCREASE_BERSERKER_DODGE * berserkLevel;
}
}*/
}
public static int getChanceRollBias(DropItem item, Player player) {
if (player == null) return 0;
if (item.itemType.id == ItemTypeCollection.ITEMTYPE_GOLD) {
return getRollBias(item, player, Skills.SKILL_COINFINDER, Skills.PER_SKILLPOINT_INCREASE_COINFINDER_CHANCE_PERCENT);
} else if (!item.itemType.isOrdinaryItem()) {
return getRollBias(item, player, Skills.SKILL_MAGICFINDER, Skills.PER_SKILLPOINT_INCREASE_MAGICFINDER_CHANCE_PERCENT);
} else {
return 0;
}
}
public static int getQuantityRollBias(DropItem item, Player player) {
if (player == null) return 0;
if (item.itemType.id != ItemTypeCollection.ITEMTYPE_GOLD) return 0;
return getRollBias(item, player, Skills.SKILL_COINFINDER, Skills.PER_SKILLPOINT_INCREASE_COINFINDER_QUANTITY_PERCENT);
}
private static int getRollBias(DropItem item, Player player, int skill, int perSkillpointIncrease) {
int skillLevel = player.getSkillLevel(skill);
if (skillLevel <= 0) return 0;
return item.chance.current * skillLevel * perSkillpointIncrease / 100;
}
}

View File

@@ -11,7 +11,7 @@ public class CombatTraits {
public int attackChance;
public int criticalChance;
public int criticalMultiplier;
public float criticalMultiplier;
public final Range damagePotential;
public int blockChance;
@@ -51,7 +51,11 @@ public class CombatTraits {
this.attackCost = src.readInt();
this.attackChance = src.readInt();
this.criticalChance = src.readInt();
this.criticalMultiplier = src.readInt();
if (fileversion <= 20) {
this.criticalMultiplier = src.readInt();
} else {
this.criticalMultiplier = src.readFloat();
}
this.damagePotential = new Range(src, fileversion);
this.blockChance = src.readInt();
this.damageResistance = src.readInt();
@@ -61,7 +65,7 @@ public class CombatTraits {
dest.writeInt(attackCost);
dest.writeInt(attackChance);
dest.writeInt(criticalChance);
dest.writeInt(criticalMultiplier);
dest.writeFloat(criticalMultiplier);
damagePotential.writeToParcel(dest, flags);
dest.writeInt(blockChance);
dest.writeInt(damageResistance);

View File

@@ -27,10 +27,12 @@ public final class Monster extends Actor {
this.nextPosition = new CoordRect(new Coord(), traits.tileSize);
}
public void createLoot(Loot container) {
container.exp += monsterType.exp;
public void createLoot(Loot container, Player player) {
int exp = monsterType.exp;
exp += exp * player.getSkillLevel(Skills.SKILL_MORE_EXP) * Skills.PER_SKILLPOINT_INCREASE_MORE_EXP_PERCENT / 100;
container.exp += exp;
if (monsterType.dropList == null) return;
monsterType.dropList.createRandomLoot(container);
monsterType.dropList.createRandomLoot(container, player);
}
public boolean isAgressive() {

View File

@@ -32,7 +32,7 @@ public final class Player extends Actor {
private final HashMap<String, HashSet<Integer> > questProgress = new HashMap<String, HashSet<Integer> >();
public int useItemCost;
public int reequipCost;
public final int[] skillLevels = new int[Skills.NUM_SKILLS];
private final int[] skillLevels = new int[Skills.NUM_SKILLS];
public String spawnMap;
public String spawnPlace;
@@ -69,7 +69,7 @@ public final class Player extends Actor {
recalculateLevelExperience();
Loot startItems = new Loot();
dropLists.getDropList(DropListCollection.DROPLIST_STARTITEMS).createRandomLoot(startItems);
dropLists.getDropList(DropListCollection.DROPLIST_STARTITEMS).createRandomLoot(startItems, this);
inventory.add(startItems);
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
@@ -127,6 +127,17 @@ public final class Player extends Actor {
return levelExperience.isMax();
}
public int getSkillLevel(int skill) {
return skillLevels[skill];
}
public boolean hasSkill(int skill) {
return skillLevels[skill] > 0;
}
public void addSkillLevel(int skill) {
skillLevels[skill] += 1;
}
// ====== PARCELABLE ===================================================================

View File

@@ -1,20 +1,50 @@
package com.gpl.rpg.AndorsTrail.model.actor;
public class Skills {
public final class Skills {
public static final int SKILL_WEAPON_CHANCE = 0;
public static final int SKILL_WEAPON_DMG = 1;
public static final int SKILL_BARTER = 2;
public static final int SKILL_DODGE = 3;
public static final int SKILL_BARKSKIN = 4;
public static final int SKILL_DODGE = 3; // + BC
public static final int SKILL_BARKSKIN = 4; // Dmg resist
public static final int SKILL_MORE_CRITICALS = 5;
public static final int SKILL_BETTER_CRITICALS = 6;
public static final int SKILL_SPEED = 7;
public static final int SKILL_SPEED = 7; // Raises max ap
public static final int SKILL_COINFINDER = 8;
public static final int SKILL_MORE_EXP = 9;
public static final int SKILL_CLEAVE = 10;
public static final int SKILL_EATER = 11; // +1hp per kill
public static final int SKILL_BERSERKER = 12; // <=20%hp
public static final int SKILL_FORTITUDE = 13; // +2hp /level
public static final int SKILL_CLEAVE = 10; // +10ap on kill
public static final int SKILL_EATER = 11; // +1hp per kill
//public static final int SKILL_BERSERKER = 12; // <=20%hp increases AC and DMG
public static final int SKILL_FORTITUDE = 13; // +N hp per levelup
public static final int SKILL_EVASION = 14; // increase successful flee chance & reduce chance of monster attack
public static final int SKILL_REGENERATION = 15; // +N hp per round
public static final int SKILL_LOWER_EXPLOSS = 16;
public static final int SKILL_MAGICFINDER = 17;
public static final int NUM_SKILLS = 14;
public static final int NUM_SKILLS = SKILL_MAGICFINDER+1;
//public static final int BERSERKER_STARTS_AT_HEALTH_PERCENT = 20;
public static final int PER_SKILLPOINT_INCREASE_WEAPON_CHANCE = 15;
public static final int PER_SKILLPOINT_INCREASE_WEAPON_DAMAGE_MAX = 1;
public static final int PER_SKILLPOINT_INCREASE_WEAPON_DAMAGE_MIN = 1;
public static final int PER_SKILLPOINT_INCREASE_DODGE = 9;
public static final int PER_SKILLPOINT_INCREASE_BARKSKIN = 1;
public static final int PER_SKILLPOINT_INCREASE_MORE_CRITICALS_PERCENT = 20;
public static final int PER_SKILLPOINT_INCREASE_BETTER_CRITICALS_PERCENT = 50;
public static final int PER_SKILLPOINT_INCREASE_SPEED = 1;
/*public static final int PER_SKILLPOINT_INCREASE_BERSERKER_WEAPON_CHANCE = 15;
public static final int PER_SKILLPOINT_INCREASE_BERSERKER_WEAPON_DAMAGE_MAX = 1;
public static final int PER_SKILLPOINT_INCREASE_BERSERKER_WEAPON_DAMAGE_MIN = 1;
public static final int PER_SKILLPOINT_INCREASE_BERSERKER_DODGE = 9;*/
public static final int PER_SKILLPOINT_INCREASE_BARTER_PRICEFACTOR_PERCENTAGE = 5;
public static final int PER_SKILLPOINT_INCREASE_COINFINDER_CHANCE_PERCENT = 50;
public static final int PER_SKILLPOINT_INCREASE_MAGICFINDER_CHANCE_PERCENT = 100;
public static final int PER_SKILLPOINT_INCREASE_COINFINDER_QUANTITY_PERCENT = 100;
public static final int PER_SKILLPOINT_INCREASE_MORE_EXP_PERCENT = 10;
public static final int PER_SKILLPOINT_INCREASE_EATER_HEALTH = 1;
public static final int PER_SKILLPOINT_INCREASE_FORTITUDE_HEALTH = 2;
public static final int PER_SKILLPOINT_INCREASE_EVASION_FLEE_CHANCE_PERCENTAGE = 5;
public static final int PER_SKILLPOINT_INCREASE_EVASION_MONSTER_ATTACK_CHANCE_PERCENTAGE = 5;
public static final int PER_SKILLPOINT_INCREASE_REGENERATION = 1;
public static final int PER_SKILLPOINT_INCREASE_EXPLOSS_PERCENT = 30;
}

View File

@@ -3,6 +3,8 @@ package com.gpl.rpg.AndorsTrail.model.item;
import java.util.Collection;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.controller.SkillController;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.util.ConstRange;
public final class DropList {
@@ -17,10 +19,15 @@ public final class DropList {
this.items = items.toArray(new DropItem[items.size()]);
this.DEBUG_items = this.items;
}
public void createRandomLoot(Loot loot) {
public void createRandomLoot(Loot loot, Player player) {
for (DropItem item : items) {
if (Constants.rollResult(item.chance)) {
int quantity = Constants.rollValue(item.quantity);
final int chanceRollBias = SkillController.getChanceRollBias(item, player);
if (Constants.rollResult(item.chance, chanceRollBias)) {
final int quantityRollBias = SkillController.getQuantityRollBias(item, player);
int quantity = Constants.rollValue(item.quantity, quantityRollBias);
if (quantity != 0) {
if (item.itemType.id == ItemTypeCollection.ITEMTYPE_GOLD) {
loot.gold += quantity;

View File

@@ -68,6 +68,7 @@ public final class ItemType {
public boolean isEquippable() { return actionType == ACTIONTYPE_EQUIP; }
public boolean isUsable() { return actionType == ACTIONTYPE_USE; }
public boolean isQuestItem() { return baseMarketCost == 0; }
public boolean isOrdinaryItem() { return displayType == DISPLAYTYPE_ORDINARY; }
public String describeWearEffect(int quantity) {
StringBuilder sb = new StringBuilder(name);

View File

@@ -232,7 +232,7 @@ public final class PredefinedMap {
for (MapObject o : eventObjects) {
if (o.type == MapObject.MAPEVENT_CONTAINER) {
Loot bag = getBagOrCreateAt(o.position.topLeft);
o.dropList.createRandomLoot(bag);
o.dropList.createRandomLoot(bag, null);
}
}
}

View File

@@ -78,7 +78,7 @@ public class ResourceFileParser {
result.attackCost = parseInt(attackCost, 0);
result.attackChance = parseInt(attackChance, 0);
result.criticalChance = parseInt(criticalChance, 0);
result.criticalMultiplier = parseInt(criticalMultiplier, 0);
result.criticalMultiplier = parseFloat(criticalMultiplier, 0);
if (attackDamage != null) result.damagePotential.set(attackDamage);
result.blockChance = parseInt(blockChance, 0);
result.damageResistance = parseInt(damageResistance, 0);
@@ -89,6 +89,10 @@ public class ResourceFileParser {
if (s == null || s.length() <= 0) return defaultValue;
return Integer.parseInt(s);
}
public static float parseFloat(String s, int defaultValue) {
if (s == null || s.length() <= 0) return defaultValue;
return Float.parseFloat(s);
}
public static boolean parseBoolean(String s, boolean defaultValue) {
if (s == null || s.length() <= 0) return defaultValue;
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {

View File

@@ -74,7 +74,7 @@ public final class TraitsInfoView extends TableLayout {
}
if (traits != null && traits.hasCriticalMultiplierEffect()) {
traitsinfo_critical_row2.setVisibility(View.VISIBLE);
traitsinfo_criticalhit_multiplier.setText(Integer.toString(traits.criticalMultiplier));
traitsinfo_criticalhit_multiplier.setText(Float.toString(traits.criticalMultiplier));
} else {
traitsinfo_critical_row2.setVisibility(View.GONE);
}