From ccd3e441302b2e7faf2ca54dada2190c73c156a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 19 Aug 2022 14:38:05 +0200 Subject: [PATCH] Enable automatically picking proper weapon for enemies and update codebase to latest BASE engine --- data.mv.db | Bin 53248 -> 28672 bytes maps/f845355e-b9ad-4884-a217-dd3a4c18a3fa.dat | Bin 14463 -> 15983 bytes .../demo/ai/WeaponBasedAI.java | 21 +++++++++++++----- .../bartlomiejpluta/demo/entity/Enemy.java | 14 +++++++++--- .../demo/map/BaseMapHandler.java | 6 ++++- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/data.mv.db b/data.mv.db index fa0788b57fdfa8249b25daadca69eaef4d90064a..831c0884d52059758a1b446f2f828debd19c2faf 100644 GIT binary patch delta 3170 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 ArT_o{ diff --git a/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java b/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java index 03d0251..422911b 100644 --- a/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java +++ b/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java @@ -44,26 +44,35 @@ public class WeaponBasedAI implements AI { if(lastAttacker != null && lastAttacker instanceof Character) { var attacker = (Character) lastAttacker; if(attacker.isAlive()) { - runawayAI.setCharacter(attacker); + runawayAI.setDanger(attacker); meleeAI.setTarget(attacker); archerAI.setTarget(attacker); } else { - runawayAI.setCharacter(target); + runawayAI.setDanger(target); meleeAI.setTarget(target); archerAI.setTarget(target); } } - if(enemy.getWeapon() == null) { + var meleeWeapon = enemy.getMeleeWeapon(); + var rangedWeapon = enemy.getRangedWeapon(); + + if(meleeWeapon == null && rangedWeapon == null) { runawayAI.nextActivity(layer, dt); + return; + } + + if(rangedWeapon == null || enemy.manhattanDistance(target) == 1) { + enemy.setWeapon(meleeWeapon); + meleeAI.nextActivity(layer, dt); + return; } if(enemy.getWeapon() instanceof MeleeWeapon) { meleeAI.nextActivity(layer, dt); } - if(enemy.getWeapon() instanceof RangedWeapon) { - archerAI.nextActivity(layer, dt); - } + enemy.setWeapon(rangedWeapon); + archerAI.nextActivity(layer, dt); } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java b/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java index bca87eb..ee1768d 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java @@ -25,6 +25,12 @@ public class Enemy extends Character implements NPC { private AI ai = NoopAI.INSTANCE; private final AnimationRunner dieAnimation; + @Getter + private MeleeWeapon meleeWeapon; + + @Getter + private RangedWeapon rangedWeapon; + @Getter private final String name; @@ -42,9 +48,11 @@ public class Enemy extends Character implements NPC { var rangedWeaponTemplate = template.getRangedWeapon(); if(meleeWeaponTemplate != null) { - setWeapon(new MeleeWeapon(context, runner.getMeleeWeaponDAO().find(meleeWeaponTemplate))); - } else if(rangedWeaponTemplate != null) { - setWeapon(new RangedWeapon(context, runner.getRangedWeaponDAO().find(rangedWeaponTemplate))); + this.meleeWeapon = new MeleeWeapon(context, runner.getMeleeWeaponDAO().find(meleeWeaponTemplate)); + } + + if(rangedWeaponTemplate != null) { + this.rangedWeapon = new RangedWeapon(context, runner.getRangedWeaponDAO().find(rangedWeaponTemplate)); } this.dieAnimation = new SimpleAnimationRunner(template.getDieAnimation()); diff --git a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java index 9b29bf3..0aa8966 100644 --- a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java +++ b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java @@ -93,6 +93,10 @@ public abstract class BaseMapHandler implements MapHandler { } } + public Enemy enemy(@NonNull String id) { + return new Enemy(context, runner.getEnemyDAO().find(id)); + } + public Enemy enemy(int x, int y, @NonNull String id) { var enemy = new Enemy(context, runner.getEnemyDAO().find(id)); enemy.setCoordinates(x, y); @@ -108,7 +112,7 @@ public abstract class BaseMapHandler implements MapHandler { } public EntitySpawner spawner(int x, int y, ObjectLayer layer) { - var spawner = new EntitySpawner(x, y, map, layer).trackEntities(EnemyDiedEvent.TYPE); + var spawner = new EntitySpawner(x, y, context, map, layer).trackEntities(EnemyDiedEvent.TYPE); this.spawners.add(spawner); return spawner; }