Add support for enemies' loot
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package com.bartlomiejpluta.demo.entity;
|
||||
|
||||
import DB.EnemyDropDAO;
|
||||
import DB.dao;
|
||||
import com.bartlomiejpluta.base.api.ai.AI;
|
||||
import com.bartlomiejpluta.base.api.ai.NPC;
|
||||
import com.bartlomiejpluta.base.api.context.ContextHolder;
|
||||
@@ -7,20 +9,31 @@ import com.bartlomiejpluta.base.api.move.MoveEvent;
|
||||
import com.bartlomiejpluta.base.lib.ai.NoopAI;
|
||||
import com.bartlomiejpluta.base.lib.animation.AnimationRunner;
|
||||
import com.bartlomiejpluta.base.lib.animation.SimpleAnimationRunner;
|
||||
import com.bartlomiejpluta.base.lib.db.Relop;
|
||||
import com.bartlomiejpluta.base.util.random.DiceRoller;
|
||||
import com.bartlomiejpluta.demo.ai.*;
|
||||
import com.bartlomiejpluta.demo.event.EnemyDiedEvent;
|
||||
import com.bartlomiejpluta.demo.runner.DemoRunner;
|
||||
import com.bartlomiejpluta.demo.world.item.Item;
|
||||
import com.bartlomiejpluta.demo.world.weapon.Ammunition;
|
||||
import com.bartlomiejpluta.demo.world.weapon.MeleeWeapon;
|
||||
import com.bartlomiejpluta.demo.world.weapon.RangedWeapon;
|
||||
import lombok.Getter;
|
||||
import lombok.NonNull;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import static com.bartlomiejpluta.demo.util.ListUtil.randomIntSequence;
|
||||
|
||||
|
||||
public class Enemy extends Creature implements NPC {
|
||||
public static final int MAX_LOOT = 4 * 4;
|
||||
|
||||
private final Random random = new Random();
|
||||
private final DB.model.EnemyModel template;
|
||||
private final AnimationRunner dieAnimation;
|
||||
|
||||
@Getter
|
||||
private final Item[] loot = new Item[MAX_LOOT];
|
||||
@Getter
|
||||
private final String name;
|
||||
private AI ai = NoopAI.INSTANCE;
|
||||
@@ -78,8 +91,35 @@ public class Enemy extends Creature implements NPC {
|
||||
dieAnimation.run(context, getLayer(), this);
|
||||
context.playSound(A.sounds.get(template.getDieSound()).uid);
|
||||
context.fireEvent(new EnemyDiedEvent(this));
|
||||
|
||||
drawLoot();
|
||||
}
|
||||
|
||||
private void drawLoot() {
|
||||
var def = dao.enemy_drop.query()
|
||||
.where(EnemyDropDAO.Column.ENEMY, Relop.EQ, template.getId())
|
||||
.orderBy("rand()")
|
||||
.find();
|
||||
|
||||
var indexesIterator = randomIntSequence(0, loot.length).iterator();
|
||||
for (var d : def) {
|
||||
if (!indexesIterator.hasNext()) {
|
||||
break;
|
||||
}
|
||||
|
||||
var index = indexesIterator.next();
|
||||
|
||||
var split = d.getItem().split(":");
|
||||
loot[index] = switch (split[0]) {
|
||||
case "melee_weapon" -> new MeleeWeapon(split[1]);
|
||||
case "ranged_weapon" -> new RangedWeapon(split[1]);
|
||||
case "ammo" -> new Ammunition(split[1], DiceRoller.of(d.getAmount()).roll());
|
||||
default -> throw new IllegalArgumentException("Unsupported item type");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Enemy followAndAttack(Creature target, int range) {
|
||||
var ai = new SimpleEnemyAI(this, target, range);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user