114 lines
2.4 KiB
Java
114 lines
2.4 KiB
Java
package com.bartlomiejpluta.demo.entity;
|
|
|
|
import com.bartlomiejpluta.base.api.character.Character;
|
|
import com.bartlomiejpluta.demo.world.item.Item;
|
|
import com.bartlomiejpluta.demo.world.weapon.Ammunition;
|
|
import com.bartlomiejpluta.demo.world.weapon.RangedWeapon;
|
|
import com.bartlomiejpluta.demo.world.weapon.Weapon;
|
|
import lombok.Getter;
|
|
import lombok.NonNull;
|
|
import lombok.Setter;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
public abstract class Creature extends NamedCharacter {
|
|
private static final Logger log = LoggerFactory.getLogger(Creature.class);
|
|
|
|
protected int attackCooldown = 0;
|
|
|
|
@Getter
|
|
protected boolean alive = true;
|
|
|
|
@Getter
|
|
protected boolean immortal = false;
|
|
|
|
@Getter
|
|
protected int maxHp;
|
|
|
|
@Getter
|
|
protected int hp;
|
|
|
|
@Getter
|
|
@Setter
|
|
private Weapon weapon;
|
|
|
|
@Getter
|
|
@Setter
|
|
private Ammunition ammunition;
|
|
|
|
@Getter
|
|
private NamedCharacter lastAttacker;
|
|
|
|
public Creature(@NonNull Character entity) {
|
|
super(entity);
|
|
}
|
|
|
|
public void attack() {
|
|
if (weapon == null) {
|
|
return;
|
|
}
|
|
|
|
if (attackCooldown >= weapon.getCooldown()) {
|
|
if (weapon.attack(this)) {
|
|
if (weapon instanceof RangedWeapon) {
|
|
ammunition.decrease();
|
|
|
|
if (ammunition.getCount() == 0) {
|
|
ammunition = null;
|
|
}
|
|
}
|
|
|
|
attackCooldown = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void hit(NamedCharacter source, int dmg) {
|
|
this.lastAttacker = source;
|
|
|
|
if (immortal) {
|
|
return;
|
|
}
|
|
|
|
hp -= dmg;
|
|
}
|
|
|
|
public void useEquipmentItem(Item item) {
|
|
if (item instanceof Weapon weapon) {
|
|
setWeapon(weapon);
|
|
return;
|
|
}
|
|
|
|
if (item instanceof Ammunition ammunition) {
|
|
setAmmunition(ammunition);
|
|
}
|
|
}
|
|
|
|
public void heal(int hp) {
|
|
this.hp = Math.min(this.hp + hp, this.maxHp);
|
|
}
|
|
|
|
@Override
|
|
public void update(float dt) {
|
|
super.update(dt);
|
|
|
|
if (weapon != null && attackCooldown < weapon.getCooldown()) {
|
|
attackCooldown += (int) (dt * 1000f);
|
|
}
|
|
|
|
if (hp <= 0 && alive && getLayer() != null) {
|
|
alive = false;
|
|
die();
|
|
}
|
|
}
|
|
|
|
protected void die() {
|
|
if (isMoving()) {
|
|
abortMove();
|
|
}
|
|
}
|
|
|
|
public abstract String getName();
|
|
|
|
public abstract void removeItemFromEquipment(Item item);
|
|
} |