From f8d28acc3314914016dee23c6e04a76be782dff7 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Thu, 22 Jan 2026 14:13:41 +0100 Subject: [PATCH] feat: Dialog running code and changeable tasks --- .../events/handlers/DialogEventHandler.java | 55 ++++++++++++------- .../events/handlers/ExitEventHandler.java | 2 +- .../java/cz/jzitnik/game/dialog/OnEnd.java | 2 + .../java/cz/jzitnik/game/mobs/DialogMob.java | 3 +- src/main/java/cz/jzitnik/game/mobs/Mob.java | 13 ++++- .../cz/jzitnik/game/setup/enemies/Pepa.java | 41 +++++++------- .../cz/jzitnik/game/setup/enemies/Zombie.java | 4 +- .../utils/roomtasks/RoomTaskScheduler.java | 24 +++++--- 8 files changed, 92 insertions(+), 52 deletions(-) diff --git a/src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java index 96695b8..6d30233 100644 --- a/src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/DialogEventHandler.java @@ -15,6 +15,7 @@ import cz.jzitnik.states.TerminalState; import cz.jzitnik.ui.pixels.AlphaPixel; import cz.jzitnik.ui.pixels.ColoredPixel; import cz.jzitnik.ui.pixels.Empty; +import cz.jzitnik.utils.DependencyManager; import cz.jzitnik.utils.TextRenderer; import cz.jzitnik.utils.events.AbstractEventHandler; import cz.jzitnik.utils.events.EventManager; @@ -43,6 +44,9 @@ public class DialogEventHandler extends AbstractEventHandler { @InjectDependency private TextRenderer textRenderer; + @InjectDependency + private DependencyManager dependencyManager; + private static final int WIDTH = 350; private static final int MARGIN_BOTTOM = 15; public static final int PADDING = 7; @@ -158,30 +162,39 @@ public class DialogEventHandler extends AbstractEventHandler { dialogState.setRenderInProgress(false); - if (onEnd instanceof OnEnd.Continue(Dialog nextDialog)) { - Thread.sleep(1000); - for (int y = start.getRow(); y < start.getRow() + size.getRows(); y++) { - for (int x = start.getColumn(); x < start.getColumn() + size.getColumns(); x++) { - screenBuffer.getGlobalOverrideBuffer()[y][x] = new Empty(); - } - } + next(onEnd, start, size); - if (nextDialog == null) { - dialogState.setCurrentDialog(null); - eventManager.emitEvent( - new RerenderScreen( - new RerenderScreen.ScreenPart( - start, - new TerminalPosition(start.getColumn() + size.getColumns(), start.getRow() + size.getRows()) - ) - ) - ); - } else { - eventManager.emitEvent(nextDialog); - } - } } catch (InterruptedException e) { throw new RuntimeException(e); } } + + private void next(OnEnd onEnd, TerminalPosition start, TerminalSize size) throws InterruptedException { + if (onEnd instanceof OnEnd.Continue(Dialog nextDialog)) { + Thread.sleep(1000); + for (int y = start.getRow(); y < start.getRow() + size.getRows(); y++) { + for (int x = start.getColumn(); x < start.getColumn() + size.getColumns(); x++) { + screenBuffer.getGlobalOverrideBuffer()[y][x] = new Empty(); + } + } + + if (nextDialog == null) { + dialogState.setCurrentDialog(null); + eventManager.emitEvent( + new RerenderScreen( + new RerenderScreen.ScreenPart( + start, + new TerminalPosition(start.getColumn() + size.getColumns(), start.getRow() + size.getRows()) + ) + ) + ); + } else { + eventManager.emitEvent(nextDialog); + } + } else if (onEnd instanceof OnEnd.RunCode(Runnable runnable, OnEnd end)) { + dependencyManager.inject(runnable); + runnable.run(); + next(end, start, size); + } + } } diff --git a/src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java index db519a1..3759879 100644 --- a/src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/ExitEventHandler.java @@ -30,6 +30,6 @@ public class ExitEventHandler extends AbstractEventHandler { scheduledTaskManager.shutdown(); roomTaskScheduler.finalShutdown(); runningState.setRunning(false); - System.exit(0); // Pls don't blame me + //System.exit(0); // Pls don't blame me } } diff --git a/src/main/java/cz/jzitnik/game/dialog/OnEnd.java b/src/main/java/cz/jzitnik/game/dialog/OnEnd.java index c765387..0bfd4e6 100644 --- a/src/main/java/cz/jzitnik/game/dialog/OnEnd.java +++ b/src/main/java/cz/jzitnik/game/dialog/OnEnd.java @@ -1,6 +1,8 @@ package cz.jzitnik.game.dialog; public interface OnEnd { + record RunCode(Runnable runnable, OnEnd onEnd) implements OnEnd {} + record Continue(Dialog nextDialog) implements OnEnd { } diff --git a/src/main/java/cz/jzitnik/game/mobs/DialogMob.java b/src/main/java/cz/jzitnik/game/mobs/DialogMob.java index e10d683..0ea2c2d 100644 --- a/src/main/java/cz/jzitnik/game/mobs/DialogMob.java +++ b/src/main/java/cz/jzitnik/game/mobs/DialogMob.java @@ -7,13 +7,14 @@ import cz.jzitnik.game.utils.RoomCords; import cz.jzitnik.states.DialogState; import cz.jzitnik.utils.events.EventManager; import cz.jzitnik.utils.roomtasks.RoomTask; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; @Slf4j public abstract class DialogMob extends Mob { - private final Dialog dialog; + protected Dialog dialog; public DialogMob(BufferedImage texture, RoomTask[] tasks, RoomCords cords, Dialog dialog) { super(texture, tasks, cords); diff --git a/src/main/java/cz/jzitnik/game/mobs/Mob.java b/src/main/java/cz/jzitnik/game/mobs/Mob.java index 8c301c0..3fa7e6a 100644 --- a/src/main/java/cz/jzitnik/game/mobs/Mob.java +++ b/src/main/java/cz/jzitnik/game/mobs/Mob.java @@ -1,9 +1,11 @@ package cz.jzitnik.game.mobs; +import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.game.utils.Renderable; import cz.jzitnik.game.utils.RoomCords; import cz.jzitnik.game.utils.Selectable; import cz.jzitnik.utils.roomtasks.RoomTask; +import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; import lombok.Getter; import lombok.Setter; @@ -13,10 +15,19 @@ import java.awt.image.BufferedImage; public abstract class Mob implements Renderable, Selectable { protected final BufferedImage texture; - @Setter protected RoomTask[] tasks; protected final RoomCords cords; + @InjectDependency + private RoomTaskScheduler roomTaskScheduler; + + protected void updateTasks(RoomTask[] tasks) { + var oldTasks = this.tasks; + this.tasks = tasks; + + roomTaskScheduler.registerNewMob(this, oldTasks); + } + public Mob(BufferedImage texture, RoomTask task, RoomCords cords) { this.texture = texture; this.tasks = new RoomTask[] {task}; diff --git a/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java b/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java index bcc6eef..483f4a0 100644 --- a/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java +++ b/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java @@ -4,31 +4,34 @@ import cz.jzitnik.game.ResourceManager; import cz.jzitnik.game.dialog.Dialog; import cz.jzitnik.game.dialog.OnEnd; import cz.jzitnik.game.mobs.DialogMob; +import cz.jzitnik.game.mobs.tasks.EnemyPlayerHittingTask; +import cz.jzitnik.game.mobs.tasks.MobFollowingPlayerTask; import cz.jzitnik.game.utils.RoomCords; import cz.jzitnik.utils.roomtasks.RoomTask; public class Pepa extends DialogMob { public Pepa(ResourceManager resourceManager, RoomCords cords) { - super(resourceManager.getResource(ResourceManager.Resource.PLAYER_FRONT), new RoomTask[]{}, cords, - new Dialog( - "Pepa: Never gonna give you up", - new OnEnd.Continue(new Dialog( - "Pepa: Never gonna let you down", - new OnEnd.Continue(new Dialog( - "Pepa: Never gonna run around", - new OnEnd.Continue(new Dialog( - "Pepa: How it continues?", new OnEnd.AskQuestion( - new OnEnd.AskQuestion.Answer[]{ - new OnEnd.AskQuestion.Answer("And desert you", new Dialog("Pepa: You are god damn right!", new OnEnd.Continue(null))), - new OnEnd.AskQuestion.Answer("You are a dessert", new Dialog("Pepa: WRONG!", new OnEnd.Continue(null))) - } - ))) - )) - )) - ) + super(resourceManager.getResource(ResourceManager.Resource.PLAYER_FRONT), new RoomTask[]{}, cords, null ); - setTasks(new RoomTask[]{ - }); + dialog = new Dialog( + "Pepa: Never gonna give you up", + new OnEnd.Continue(new Dialog( + "Pepa: Never gonna let you down", + new OnEnd.Continue(new Dialog( + "Pepa: Never gonna run around", + new OnEnd.Continue(new Dialog( + "Pepa: How it continues?", new OnEnd.AskQuestion( + new OnEnd.AskQuestion.Answer[]{ + new OnEnd.AskQuestion.Answer("And desert you", new Dialog("Pepa: You are god damn right!", new OnEnd.Continue(null))), + new OnEnd.AskQuestion.Answer("You are a dessert", new Dialog("Pepa: WRONG!", new OnEnd.RunCode(() -> updateTasks(new RoomTask[]{ + new MobFollowingPlayerTask(this, 1, 100), + new EnemyPlayerHittingTask(this, 500, 15, () -> 5) + }), null))) + } + ))) + )) + )) + ); } } diff --git a/src/main/java/cz/jzitnik/game/setup/enemies/Zombie.java b/src/main/java/cz/jzitnik/game/setup/enemies/Zombie.java index dbd73cc..d55c14f 100644 --- a/src/main/java/cz/jzitnik/game/setup/enemies/Zombie.java +++ b/src/main/java/cz/jzitnik/game/setup/enemies/Zombie.java @@ -13,9 +13,9 @@ import lombok.extern.slf4j.Slf4j; public class Zombie extends HittableMobDrops { public Zombie(ResourceManager resourceManager, RoomCords cords) { super(() -> new Apple(resourceManager), resourceManager.getResource(ResourceManager.Resource.PLAYER_FRONT), null, cords, 10); - setTasks(new RoomTask[]{ + tasks = new RoomTask[]{ new MobFollowingPlayerTask(this, 1, 100), new EnemyPlayerHittingTask(this, 500, 15, () -> 5) - }); + }; } } diff --git a/src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java b/src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java index 7f0466a..c703136 100644 --- a/src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java +++ b/src/main/java/cz/jzitnik/utils/roomtasks/RoomTaskScheduler.java @@ -77,15 +77,25 @@ public class RoomTaskScheduler { } for (Mob mob : currentRoom.getMobs()) { - RoomTask[] mobTasks = mob.getTasks(); - - for (RoomTask task : mobTasks) { - dependencyManager.inject(task.getTask()); - ScheduledFuture future = scheduler.scheduleAtFixedRate(task.getTask(), 0, task.getRate(), task.getRateUnit()); - tasks.put(task, future); - } + registerNewTasks(mob.getTasks()); } firstRun = false; } + + public void registerNewMob(Mob mob, RoomTask[] oldTasks) { + for (RoomTask oldTask : oldTasks) { + stopTask(oldTask); + } + + registerNewTasks(mob.getTasks()); + } + + private void registerNewTasks(RoomTask[] registerTasks) { + for (RoomTask task : registerTasks) { + dependencyManager.inject(task.getTask()); + ScheduledFuture future = scheduler.scheduleAtFixedRate(task.getTask(), 0, task.getRate(), task.getRateUnit()); + tasks.put(task, future); + } + } }