From 578c4e55f2ffc5674819e7309baa1407a6f4550e Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Sat, 11 Aug 2012 21:26:03 +0000 Subject: [PATCH] Make monster movement aggression based on monster type. --- .../controller/CombatController.java | 7 ++--- .../controller/MonsterMovementController.java | 3 ++- .../rpg/AndorsTrail/model/actor/Monster.java | 7 +++-- .../AndorsTrail/model/actor/MonsterType.java | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java index e96b988e3..6a5c6bb83 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java @@ -15,6 +15,7 @@ import com.gpl.rpg.AndorsTrail.model.AttackResult; import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection; import com.gpl.rpg.AndorsTrail.model.actor.Actor; 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.item.ItemTraits_OnUse; import com.gpl.rpg.AndorsTrail.model.item.Loot; @@ -326,14 +327,14 @@ public final class CombatController implements VisualEffectCompletedCallback { return true; } private static boolean shouldMoveMonsterInCombat(Monster m, MonsterSpawnArea a, Coord playerPosition) { - if (m.aggressionType == Monster.AGGRESSIONTYPE_NONE) return false; + if (m.aggressionType == MonsterType.AGGRESSIONTYPE_NONE) return false; if (!m.hasAPs(m.actorTraits.moveCost)) return false; if (m.position.isAdjacentTo(playerPosition)) return false; - if (m.aggressionType == Monster.AGGRESSIONTYPE_PROTECT_SPAWN) { + if (m.aggressionType == MonsterType.AGGRESSIONTYPE_PROTECT_SPAWN) { if (a.area.contains(playerPosition)) return true; - } else if (m.aggressionType == Monster.AGGRESSIONTYPE_HELP_OTHERS) { + } else if (m.aggressionType == MonsterType.AGGRESSIONTYPE_HELP_OTHERS) { for (Monster o : a.monsters) { if (o == m) continue; if (o.rectPosition.isAdjacentTo(playerPosition)) return true; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MonsterMovementController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MonsterMovementController.java index c9c0382e3..765185d69 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MonsterMovementController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MonsterMovementController.java @@ -8,6 +8,7 @@ import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap; import com.gpl.rpg.AndorsTrail.model.map.MapObject; +import com.gpl.rpg.AndorsTrail.model.actor.MonsterType; import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea; import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; import com.gpl.rpg.AndorsTrail.util.Coord; @@ -102,7 +103,7 @@ public final class MonsterMovementController implements EvaluateWalkable { } private void determineMonsterNextPosition(Monster m, MonsterSpawnArea area, Coord playerPosition) { - if (m.aggressionType == Monster.AGGRESSIONTYPE_PROTECT_SPAWN) { + if (m.aggressionType == MonsterType.AGGRESSIONTYPE_PROTECT_SPAWN) { if (area.area.contains(playerPosition)) { if (findPathFor(m, playerPosition)) return; } 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 b7359c1af..18f5c2828 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java @@ -24,10 +24,7 @@ public final class Monster extends Actor { private boolean forceAggressive = false; private ItemContainer shopItems = null; - public final int aggressionType = AGGRESSIONTYPE_PROTECT_SPAWN; - public static final int AGGRESSIONTYPE_NONE = 0; - public static final int AGGRESSIONTYPE_HELP_OTHERS = 1; // Will move to help if the player attacks some other monster in the same spawn. - public static final int AGGRESSIONTYPE_PROTECT_SPAWN = 2; // Will move to attack if the player stands inside the spawn. + public final int aggressionType; private final MonsterType monsterType; @@ -52,6 +49,7 @@ public final class Monster extends Actor { this.criticalMultiplier = monsterType.criticalMultiplier; if (monsterType.damagePotential != null) this.damagePotential.set(monsterType.damagePotential); else this.damagePotential.set(0, 0); + this.aggressionType = monsterType.aggressionType; this.blockChance = monsterType.blockChance; this.damageResistance = monsterType.damageResistance; this.onHitEffects = monsterType.onHitEffects; @@ -148,6 +146,7 @@ public final class Monster extends Actor { this.shopItems = new ItemContainer(src, world, fileversion); } } + this.aggressionType = monsterType.aggressionType; } public void writeToParcel(DataOutputStream dest, int flags) throws IOException { 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 281aaa8e9..2b9a627b7 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java @@ -25,6 +25,8 @@ public final class MonsterType { public final boolean isUnique; // Unique monsters are not respawned. public final String faction; public final int monsterClass; + public final int aggressionType; + public final Size tileSize; public final int iconID; public final int maxAP; @@ -84,6 +86,30 @@ public final class MonsterType { this.blockChance = blockChance; this.damageResistance = damageResistance; this.onHitEffects = onHitEffects; + this.aggressionType = getAggressionType(monsterClass); + } + + public static final int AGGRESSIONTYPE_NONE = 0; + public static final int AGGRESSIONTYPE_HELP_OTHERS = 1; // Will move to help if the player attacks some other monster in the same spawn. + public static final int AGGRESSIONTYPE_PROTECT_SPAWN = 2; // Will move to attack if the player stands inside the spawn. + + private static int getAggressionType(int monsterClass) { + switch (monsterClass) { + case MONSTERCLASS_CONSTRUCT: + case MONSTERCLASS_GIANT: + case MONSTERCLASS_GHOST: + return AGGRESSIONTYPE_NONE; + case MONSTERCLASS_DEMON: + case MONSTERCLASS_ANIMAL: + case MONSTERCLASS_REPTILE: + case MONSTERCLASS_INSECT: + return AGGRESSIONTYPE_PROTECT_SPAWN; + case MONSTERCLASS_UNDEAD: + case MONSTERCLASS_HUMANOID: + return AGGRESSIONTYPE_HELP_OTHERS; + default: + return AGGRESSIONTYPE_NONE; + } } public boolean isImmuneToCriticalHits() {