Add support for enemies' friendly fire
This commit is contained in:
@@ -12,8 +12,8 @@ import com.bartlomiejpluta.demo.world.weapon.*;
|
||||
|
||||
public class WeaponBasedAI implements AI {
|
||||
private static final int RANGE = 10;
|
||||
private static final int MIN_RANGE = 4;
|
||||
private static final int MAX_RANGE = 8;
|
||||
private static final int MIN_RANGE = 3;
|
||||
private static final int MAX_RANGE = 12;
|
||||
private final Enemy enemy;
|
||||
private final Character target;
|
||||
private final RunawayAI runawayAI;
|
||||
@@ -40,6 +40,20 @@ public class WeaponBasedAI implements AI {
|
||||
|
||||
@Override
|
||||
public void nextActivity(ObjectLayer layer, float dt) {
|
||||
var lastAttacker = enemy.getLastAttacker();
|
||||
if(lastAttacker != null && lastAttacker instanceof Character) {
|
||||
var attacker = (Character) lastAttacker;
|
||||
if(attacker.isAlive()) {
|
||||
runawayAI.setCharacter(attacker);
|
||||
meleeAI.setTarget(attacker);
|
||||
archerAI.setTarget(attacker);
|
||||
} else {
|
||||
runawayAI.setCharacter(target);
|
||||
meleeAI.setTarget(target);
|
||||
archerAI.setTarget(target);
|
||||
}
|
||||
}
|
||||
|
||||
if(enemy.getWeapon() == null) {
|
||||
runawayAI.nextActivity(layer, dt);
|
||||
}
|
||||
|
||||
@@ -5,13 +5,12 @@ import org.slf4j.*;
|
||||
import org.joml.Vector2i;
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.lib.entity.EntityDelegate;
|
||||
import com.bartlomiejpluta.base.lib.animation.AnimationRunner;
|
||||
|
||||
import com.bartlomiejpluta.demo.runner.DemoRunner;
|
||||
import com.bartlomiejpluta.demo.world.weapon.Weapon;
|
||||
|
||||
public abstract class Character extends EntityDelegate {
|
||||
public abstract class Character extends NamedEntity {
|
||||
private static final Logger log = LoggerFactory.getLogger(Character.class);
|
||||
protected final Context context;
|
||||
protected final DemoRunner runner;
|
||||
@@ -34,6 +33,9 @@ public abstract class Character extends EntityDelegate {
|
||||
@Setter
|
||||
private Weapon weapon;
|
||||
|
||||
@Getter
|
||||
private NamedEntity lastAttacker;
|
||||
|
||||
public Character(@NonNull Context context, @NonNull Entity entity) {
|
||||
super(entity);
|
||||
this.context = context;
|
||||
@@ -52,7 +54,9 @@ public abstract class Character extends EntityDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
public void hit(int dmg) {
|
||||
public void hit(NamedEntity source, int dmg) {
|
||||
this.lastAttacker = source;
|
||||
|
||||
if(immortal) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.bartlomiejpluta.demo.entity;
|
||||
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.lib.entity.EntityDelegate;
|
||||
|
||||
public abstract class NamedEntity extends EntityDelegate {
|
||||
|
||||
public NamedEntity(Entity entity) {
|
||||
super(entity);
|
||||
}
|
||||
|
||||
public abstract String getName();
|
||||
}
|
||||
@@ -10,8 +10,8 @@ public class Player extends Character {
|
||||
|
||||
public Player(@NonNull Context context, @NonNull Entity entity) {
|
||||
super(context, entity);
|
||||
this.hp = 100;
|
||||
this.maxHp = 100;
|
||||
this.hp = 500;
|
||||
this.maxHp = 500;
|
||||
}
|
||||
|
||||
public void interact() {
|
||||
|
||||
@@ -48,7 +48,7 @@ public class MeleeWeapon implements Weapon {
|
||||
if(entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Character) {
|
||||
var character = (Character) entity;
|
||||
var damage = roller.roll();
|
||||
character.hit(damage);
|
||||
character.hit(attacker, damage);
|
||||
animation.run(context, character.getLayer(), character);
|
||||
context.playSound(sound);
|
||||
context.fireEvent(new HitEvent(attacker, character, damage));
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.bartlomiejpluta.base.util.random.DiceRoller;
|
||||
|
||||
import com.bartlomiejpluta.base.generated.db.model.RangedWeaponModel;
|
||||
import com.bartlomiejpluta.demo.entity.Character;
|
||||
import com.bartlomiejpluta.demo.entity.NamedEntity;
|
||||
|
||||
import com.bartlomiejpluta.demo.event.HitEvent;
|
||||
|
||||
@@ -57,12 +58,13 @@ public class RangedWeapon implements Weapon {
|
||||
|
||||
private void onHit(Movable attacker, Entity target) {
|
||||
if(target.isBlocking() && target instanceof Character) {
|
||||
var namedAttacker = (Character) attacker;
|
||||
var character = (Character) target;
|
||||
var damage = dmgRoller.roll();
|
||||
character.hit(damage);
|
||||
character.hit(namedAttacker, damage);
|
||||
punchAnimation.run(context, character.getLayer(), character);
|
||||
context.playSound(punchSound);
|
||||
context.fireEvent(new HitEvent((Character) attacker, character, damage));
|
||||
context.fireEvent(new HitEvent(namedAttacker, character, damage));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user