feat: Enemies dropping items
This commit is contained in:
@@ -30,7 +30,8 @@ import java.util.concurrent.TimeUnit;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public abstract class HittableMob extends Mob {
|
public abstract class HittableMob extends Mob {
|
||||||
public abstract void onKilled();
|
public abstract void onKilled();
|
||||||
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
|
||||||
|
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||||
protected int health;
|
protected int health;
|
||||||
private ScheduledFuture<?> currentTimeoutHitAnimation = null;
|
private ScheduledFuture<?> currentTimeoutHitAnimation = null;
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ public abstract class HittableMob extends Mob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void interact(DependencyManager dm) {
|
public final void interact(DependencyManager dm) {
|
||||||
dm.inject(this);
|
dm.inject(this);
|
||||||
|
|
||||||
health -= gameState.getPlayer().getDamageDeal();
|
health -= gameState.getPlayer().getDamageDeal();
|
||||||
|
|||||||
82
src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java
Normal file
82
src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package cz.jzitnik.game.mobs;
|
||||||
|
|
||||||
|
import cz.jzitnik.annotations.injectors.InjectDependency;
|
||||||
|
import cz.jzitnik.annotations.injectors.InjectState;
|
||||||
|
import cz.jzitnik.events.DroppedItemRerender;
|
||||||
|
import cz.jzitnik.events.InventoryRerender;
|
||||||
|
import cz.jzitnik.game.GameRoom;
|
||||||
|
import cz.jzitnik.game.GameState;
|
||||||
|
import cz.jzitnik.game.Player;
|
||||||
|
import cz.jzitnik.game.items.GameItem;
|
||||||
|
import cz.jzitnik.game.objects.DroppedItem;
|
||||||
|
import cz.jzitnik.game.utils.RoomCords;
|
||||||
|
import cz.jzitnik.utils.events.Event;
|
||||||
|
import cz.jzitnik.utils.events.EventManager;
|
||||||
|
import cz.jzitnik.utils.roomtasks.RoomTask;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public abstract class HittableMobDrops extends HittableMob {
|
||||||
|
@InjectState
|
||||||
|
private GameState gameState;
|
||||||
|
|
||||||
|
@InjectDependency
|
||||||
|
private EventManager eventManager;
|
||||||
|
|
||||||
|
private final Supplier<GameItem[]> itemDropSupplier;
|
||||||
|
|
||||||
|
public HittableMobDrops(BufferedImage texture, RoomTask task, RoomCords cords, int initialHealth, Supplier<GameItem[]> itemDropSupplier) {
|
||||||
|
super(texture, task, cords, initialHealth);
|
||||||
|
this.itemDropSupplier = itemDropSupplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HittableMobDrops(Supplier<GameItem> itemDropSupplier, BufferedImage texture, RoomTask task, RoomCords cords, int initialHealth) {
|
||||||
|
super(texture, task, cords, initialHealth);
|
||||||
|
this.itemDropSupplier = () -> new GameItem[]{
|
||||||
|
itemDropSupplier.get()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int DROP_ITEM_ON_GROUND_RADIUS = 30;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void onKilled() {
|
||||||
|
GameItem[] items = itemDropSupplier.get();
|
||||||
|
boolean addedIntoInventory = false;
|
||||||
|
Player player = gameState.getPlayer();
|
||||||
|
RoomCords enemyCords = getCords();
|
||||||
|
BufferedImage enemyTexture = getTexture();
|
||||||
|
GameRoom currentRoom = gameState.getCurrentRoom();
|
||||||
|
|
||||||
|
int roomX = enemyCords.getX() + enemyTexture.getWidth() / 2;
|
||||||
|
int roomY = enemyCords.getY() + enemyTexture.getHeight() / 2;
|
||||||
|
|
||||||
|
List<Event> events = new ArrayList<>();
|
||||||
|
|
||||||
|
for (GameItem item : items) {
|
||||||
|
boolean added = player.addItem(item);
|
||||||
|
|
||||||
|
if (added) {
|
||||||
|
if (!addedIntoInventory) {
|
||||||
|
addedIntoInventory = true;
|
||||||
|
events.add(new InventoryRerender());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
double angle = ThreadLocalRandom.current().nextDouble(0, Math.PI * 2);
|
||||||
|
double radius = ThreadLocalRandom.current().nextDouble(0, DROP_ITEM_ON_GROUND_RADIUS);
|
||||||
|
int randomX = roomX + (int) (Math.cos(angle) * radius);
|
||||||
|
int randomY = roomY + (int) (Math.sin(angle) * radius);
|
||||||
|
RoomCords itemCords = new RoomCords(randomX, randomY);
|
||||||
|
DroppedItem droppedItem = new DroppedItem(currentRoom, itemCords, item);
|
||||||
|
currentRoom.getDroppedItems().add(droppedItem);
|
||||||
|
events.add(new DroppedItemRerender(droppedItem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eventManager.emitEvent(events);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,12 +35,14 @@ public final class DroppedItem implements Selectable, Serializable {
|
|||||||
public void interact(DependencyManager dm) {
|
public void interact(DependencyManager dm) {
|
||||||
StateManager stateManager = dm.getDependencyOrThrow(StateManager.class);
|
StateManager stateManager = dm.getDependencyOrThrow(StateManager.class);
|
||||||
GameState gameState = stateManager.getOrThrow(GameState.class);
|
GameState gameState = stateManager.getOrThrow(GameState.class);
|
||||||
|
|
||||||
|
if (!gameState.getPlayer().addItem(item)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EventManager eventManager = dm.getDependencyOrThrow(EventManager.class);
|
EventManager eventManager = dm.getDependencyOrThrow(EventManager.class);
|
||||||
var currentRoom = gameState.getCurrentRoom();
|
var currentRoom = gameState.getCurrentRoom();
|
||||||
|
|
||||||
currentRoom.getDroppedItems().remove(this);
|
currentRoom.getDroppedItems().remove(this);
|
||||||
gameState.getPlayer().addItem(item);
|
|
||||||
|
|
||||||
eventManager.emitEvent(new InventoryRerender());
|
eventManager.emitEvent(new InventoryRerender());
|
||||||
eventManager.emitEvent(new DroppedItemRerender(this));
|
eventManager.emitEvent(new DroppedItemRerender(this));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,21 @@
|
|||||||
package cz.jzitnik.game.setup.enemies;
|
package cz.jzitnik.game.setup.enemies;
|
||||||
|
|
||||||
import cz.jzitnik.game.ResourceManager;
|
import cz.jzitnik.game.ResourceManager;
|
||||||
import cz.jzitnik.game.mobs.HittableMob;
|
import cz.jzitnik.game.mobs.HittableMobDrops;
|
||||||
import cz.jzitnik.game.mobs.tasks.EnemyPlayerHittingTask;
|
import cz.jzitnik.game.mobs.tasks.EnemyPlayerHittingTask;
|
||||||
import cz.jzitnik.game.mobs.tasks.MobFollowingPlayerTask;
|
import cz.jzitnik.game.mobs.tasks.MobFollowingPlayerTask;
|
||||||
|
import cz.jzitnik.game.setup.items.Apple;
|
||||||
import cz.jzitnik.game.utils.RoomCords;
|
import cz.jzitnik.game.utils.RoomCords;
|
||||||
import cz.jzitnik.utils.roomtasks.RoomTask;
|
import cz.jzitnik.utils.roomtasks.RoomTask;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Zombie extends HittableMob {
|
public class Zombie extends HittableMobDrops {
|
||||||
|
|
||||||
public Zombie(ResourceManager resourceManager, RoomCords cords) {
|
public Zombie(ResourceManager resourceManager, RoomCords cords) {
|
||||||
super(resourceManager.getResource(ResourceManager.Resource.PLAYER_FRONT), null, cords, 10);
|
super(() -> new Apple(resourceManager), resourceManager.getResource(ResourceManager.Resource.PLAYER_FRONT), null, cords, 10);
|
||||||
setTasks(new RoomTask[]{
|
setTasks(new RoomTask[]{
|
||||||
new MobFollowingPlayerTask(this, 1, 100),
|
new MobFollowingPlayerTask(this, 1, 100),
|
||||||
new EnemyPlayerHittingTask(this, 500, 15, () -> 5)
|
new EnemyPlayerHittingTask(this, 500, 15, () -> 5)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onKilled() {
|
|
||||||
log.debug("Zombie killed");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public abstract class VideoPlayScreen extends Screen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void render() {
|
protected final void render() {
|
||||||
File tempVideo = null;
|
File tempVideo = null;
|
||||||
try (InputStream resource = resourceManager.getResourceAsStream(videoPath)) {
|
try (InputStream resource = resourceManager.getResourceAsStream(videoPath)) {
|
||||||
|
|
||||||
|
|||||||
@@ -352,7 +352,7 @@ public class Inventory {
|
|||||||
int topR = (pixel >> 16) & 0xff;
|
int topR = (pixel >> 16) & 0xff;
|
||||||
int topG = (pixel >> 8) & 0xff;
|
int topG = (pixel >> 8) & 0xff;
|
||||||
int topB = pixel & 0xff;
|
int topB = pixel & 0xff;
|
||||||
float topOpacity = 0.80f;
|
float topOpacity = 0.60f;
|
||||||
int bottomR = bottomPixel.getColor().getRed();
|
int bottomR = bottomPixel.getColor().getRed();
|
||||||
int bottomG = bottomPixel.getColor().getGreen();
|
int bottomG = bottomPixel.getColor().getGreen();
|
||||||
int bottomB = bottomPixel.getColor().getBlue();
|
int bottomB = bottomPixel.getColor().getBlue();
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import org.reflections.Reflections;
|
|||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -44,6 +45,10 @@ public class EventManager extends Thread {
|
|||||||
eventQueue.add(new EventRecord(events));
|
eventQueue.add(new EventRecord(events));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void emitEvent(List<Event> events) {
|
||||||
|
eventQueue.add(new EventRecord(events.toArray(new Event[]{})));
|
||||||
|
}
|
||||||
|
|
||||||
public void emitEvent(Event[] events, Runnable callback) {
|
public void emitEvent(Event[] events, Runnable callback) {
|
||||||
eventQueue.add(new EventRecord(events, callback));
|
eventQueue.add(new EventRecord(events, callback));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user