Add support for enemies' friendly fire

This commit is contained in:
2022-08-19 12:26:16 +02:00
parent 7b778845ba
commit 9124f5c58a
8 changed files with 43 additions and 10 deletions

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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();
}

View File

@@ -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() {

View File

@@ -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));

View File

@@ -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));
}
}