diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java index e991454af..f3a2213b6 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java @@ -238,7 +238,7 @@ public final class CombatController implements VisualEffectCompletedCallback { controllers.actorStatsController.addActorAP(player, player.getSkillLevel(SkillCollection.SkillID.cleave) * SkillCollection.PER_SKILLPOINT_INCREASE_CLEAVE_AP); controllers.actorStatsController.addActorHealth(player, player.getSkillLevel(SkillCollection.SkillID.eater) * SkillCollection.PER_SKILLPOINT_INCREASE_EATER_HEALTH); - world.model.statistics.addMonsterKill(killedMonster.getMonsterTypeID()); + world.model.statistics.addMonsterKill(killedMonster.monsterType); controllers.actorStatsController.addExperience(loot.exp); world.model.combatLog.append(controllers.getResources().getString(R.string.dialog_monsterloot_gainedexp, loot.exp)); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/GameStatistics.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/GameStatistics.java index 515eb2fa0..29fe694f5 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/GameStatistics.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/GameStatistics.java @@ -22,7 +22,8 @@ import com.gpl.rpg.AndorsTrail.model.quest.Quest; public final class GameStatistics { private int deaths = 0; - private final HashMap killedMonsters = new HashMap(); + private final HashMap killedMonstersByTypeID = new HashMap(); + private final HashMap killedMonstersByName = new HashMap(); private final HashMap usedItems = new HashMap(); private int spentGold = 0; private boolean unlimitedSaves = true; @@ -33,10 +34,14 @@ public final class GameStatistics { this.startLives = startLives; } - public void addMonsterKill(String monsterTypeID) { - if (!killedMonsters.containsKey(monsterTypeID)) killedMonsters.put(monsterTypeID, 1); - else killedMonsters.put(monsterTypeID, killedMonsters.get(monsterTypeID) + 1); + public void addMonsterKill(MonsterType monsterType) { + // Track monster kills by type ID, for savegame file + killedMonstersByTypeID.put(monsterType.id, killedMonstersByTypeID.getOrDefault((monsterType.id), 0) + 1); + + // Also track by name, for statistics display (multiple IDs w/same name don't matter to player) + killedMonstersByName.put(monsterType.name, killedMonstersByName.getOrDefault(monsterType.name, 0) + 1); } + public void addPlayerDeath(int lostExp) { ++deaths; } @@ -68,30 +73,34 @@ public final class GameStatistics { public boolean isDead() { return !hasUnlimitedLives() && getLivesLeft() < 1; } public int getNumberOfKillsForMonsterType(String monsterTypeID) { - Integer v = killedMonsters.get(monsterTypeID); + Integer v = killedMonstersByTypeID.get(monsterTypeID); if (v == null) return 0; return v; } + /*public int getNumberOfKillsForMonsterName(String monsterName) { + Integer v = killedMonstersByName.get(monsterName); + if (v == null) return 0; + return v; + } +*/ public String getTop5MostCommonlyKilledMonsters(WorldContext world, Resources res) { - if (killedMonsters.isEmpty()) return null; - List> entries = new ArrayList>(killedMonsters.entrySet()); + if (killedMonstersByTypeID.isEmpty()) return null; + List> entries = new ArrayList>(killedMonstersByName.entrySet()); Collections.sort(entries, descendingValueComparator); StringBuilder sb = new StringBuilder(100); int i = 0; for (Entry e : entries) { if (i++ >= 5) break; - MonsterType t = world.monsterTypes.getMonsterType(e.getKey()); - if (t == null) continue; - sb.append(res.getString(R.string.heroinfo_gamestats_name_and_qty, t.name, e.getValue())).append('\n'); + sb.append(res.getString(R.string.heroinfo_gamestats_name_and_qty, e.getKey(), e.getValue())).append('\n'); } return sb.toString(); } public String getMostPowerfulKilledMonster(WorldContext world) { - if (killedMonsters.isEmpty()) return null; - HashMap expPerMonsterType = new HashMap(killedMonsters.size()); - for (String monsterTypeID : killedMonsters.keySet()) { + if (killedMonstersByTypeID.isEmpty()) return null; + HashMap expPerMonsterType = new HashMap(killedMonstersByTypeID.size()); + for (String monsterTypeID : killedMonstersByTypeID.keySet()) { MonsterType t = world.monsterTypes.getMonsterType(monsterTypeID); expPerMonsterType.put(monsterTypeID, t != null ? t.exp : 0); } @@ -147,7 +156,7 @@ public final class GameStatistics { public int getNumberOfKilledMonsters() { int result = 0; - for (int v : killedMonsters.values()) result += v; + for (int v : killedMonstersByTypeID.values()) result += v; return result; } @@ -172,8 +181,14 @@ public final class GameStatistics { if (type == null) continue; id = type.id; } - this.killedMonsters.put(id, value); + this.killedMonstersByTypeID.put(id, value); + + // Also track by name, for statistics display (multiple IDs w/same name don't matter to player) + MonsterType t = world.monsterTypes.getMonsterType(id); + + if (t != null) killedMonstersByName.put(t.name, killedMonstersByName.getOrDefault(t.name, 0) + value); } + if (fileversion <= 17) return; final int numItems = src.readInt(); @@ -192,7 +207,7 @@ public final class GameStatistics { public void writeToParcel(DataOutputStream dest) throws IOException { dest.writeInt(deaths); - Set > set = killedMonsters.entrySet(); + Set > set = killedMonstersByTypeID.entrySet(); dest.writeInt(set.size()); for (Entry e : set) { dest.writeUTF(e.getKey()); 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 0b65faa20..063394013 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java @@ -26,7 +26,7 @@ public final class Monster extends Actor { private boolean forceAggressive = false; private ItemContainer shopItems = null; - private final MonsterType monsterType; + public final MonsterType monsterType; public final MonsterSpawnArea area; public Monster(MonsterType monsterType, MonsterSpawnArea area) {