diff --git a/src/main/java/cz/jzitnik/events/QuestionAnswerEvent.java b/src/main/java/cz/jzitnik/events/QuestionAnswerEvent.java new file mode 100644 index 0000000..e8ec29f --- /dev/null +++ b/src/main/java/cz/jzitnik/events/QuestionAnswerEvent.java @@ -0,0 +1,9 @@ +package cz.jzitnik.events; + +import cz.jzitnik.utils.events.Event; +import lombok.Getter; + +@Getter +public class QuestionAnswerEvent implements Event { + private int questionIndex; +} diff --git a/src/main/java/cz/jzitnik/events/handlers/QuestionAnswerEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/QuestionAnswerEventHandler.java new file mode 100644 index 0000000..77ea448 --- /dev/null +++ b/src/main/java/cz/jzitnik/events/handlers/QuestionAnswerEventHandler.java @@ -0,0 +1,35 @@ +package cz.jzitnik.events.handlers; + +import cz.jzitnik.annotations.EventHandler; +import cz.jzitnik.annotations.injectors.InjectDependency; +import cz.jzitnik.annotations.injectors.InjectState; +import cz.jzitnik.events.QuestionAnswerEvent; +import cz.jzitnik.game.GameState; +import cz.jzitnik.game.dialog.Dialog; +import cz.jzitnik.game.dialog.OnEnd; +import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.utils.events.AbstractEventHandler; +import cz.jzitnik.utils.events.EventManager; + +@EventHandler(QuestionAnswerEvent.class) +public class QuestionAnswerEventHandler extends AbstractEventHandler { + public QuestionAnswerEventHandler(DependencyManager dm) { + super(dm); + } + + @InjectState + private GameState gameState; + + @InjectDependency + private EventManager eventManager; + + @Override + public void handle(QuestionAnswerEvent event) { + OnEnd dialogOnEnd = gameState.getCurrentDialog().getOnEnd(); + + if (dialogOnEnd instanceof OnEnd.AskQuestion dialog) { + OnEnd.AskQuestion.Answer answer = dialog.getAnswers()[event.getQuestionIndex()]; + Dialog switchTo = answer.dialog(); + } + } +} diff --git a/src/main/java/cz/jzitnik/game/GameState.java b/src/main/java/cz/jzitnik/game/GameState.java index efe580e..291ab28 100644 --- a/src/main/java/cz/jzitnik/game/GameState.java +++ b/src/main/java/cz/jzitnik/game/GameState.java @@ -1,6 +1,7 @@ package cz.jzitnik.game; import cz.jzitnik.annotations.State; +import cz.jzitnik.game.dialog.Dialog; import cz.jzitnik.game.objects.Interactable; import cz.jzitnik.screens.Screen; import cz.jzitnik.utils.DependencyManager; @@ -25,6 +26,10 @@ public class GameState { @Setter private Interactable interacting; + @Getter + @Setter + private Dialog currentDialog; + @Getter private Screen screen; diff --git a/src/main/java/cz/jzitnik/game/Player.java b/src/main/java/cz/jzitnik/game/Player.java index 86a14f1..e502d9e 100644 --- a/src/main/java/cz/jzitnik/game/Player.java +++ b/src/main/java/cz/jzitnik/game/Player.java @@ -34,7 +34,6 @@ public class Player { private PlayerRotation playerRotation = PlayerRotation.FRONT; @Setter private GameItem selectedItem; - @Setter private int health = MAX_HEALTH; private int stamina = MAX_STAMINA; private boolean swinging = false; diff --git a/src/main/java/cz/jzitnik/game/dialog/Dialog.java b/src/main/java/cz/jzitnik/game/dialog/Dialog.java new file mode 100644 index 0000000..8956269 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/dialog/Dialog.java @@ -0,0 +1,18 @@ +package cz.jzitnik.game.dialog; + +import cz.jzitnik.utils.events.Event; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@AllArgsConstructor +@RequiredArgsConstructor +@Getter +public class Dialog implements Event { + /** + * Characters per second + */ + private int typingSpeed = 10; + private final String text; + private final OnEnd onEnd; +} \ No newline at end of file diff --git a/src/main/java/cz/jzitnik/game/dialog/OnEnd.java b/src/main/java/cz/jzitnik/game/dialog/OnEnd.java new file mode 100644 index 0000000..711c1c2 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/dialog/OnEnd.java @@ -0,0 +1,25 @@ +package cz.jzitnik.game.dialog; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +public interface OnEnd { + record Continue(Dialog nextDialog) implements OnEnd { + } + + @Getter + @RequiredArgsConstructor + @AllArgsConstructor + class AskQuestion implements OnEnd { + private final String question; + private final Answer[] answers; + /** + * Characters per second + */ + private int typingSpeed = 10; + + public record Answer(String answer, Dialog dialog) { + } + } +} \ No newline at end of file diff --git a/src/main/java/cz/jzitnik/game/mobs/DialogMob.java b/src/main/java/cz/jzitnik/game/mobs/DialogMob.java new file mode 100644 index 0000000..30d00f7 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/mobs/DialogMob.java @@ -0,0 +1,27 @@ +package cz.jzitnik.game.mobs; + +import cz.jzitnik.game.dialog.Dialog; +import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.utils.roomtasks.RoomTask; + +import java.awt.image.BufferedImage; + +public abstract class DialogMob extends Mob { + private final Dialog dialog; + + public DialogMob(BufferedImage texture, RoomTask[] tasks, RoomCords cords, Dialog dialog) { + super(texture, tasks, cords); + this.dialog = dialog; + } + + public DialogMob(BufferedImage texture, RoomTask task, RoomCords cords, Dialog dialog) { + super(texture, task, cords); + this.dialog = dialog; + } + + @Override + public void interact(DependencyManager dm) { + + } +} diff --git a/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java b/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java new file mode 100644 index 0000000..35f5623 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/setup/enemies/Pepa.java @@ -0,0 +1,30 @@ +package cz.jzitnik.game.setup.enemies; + +import cz.jzitnik.game.dialog.Dialog; +import cz.jzitnik.game.dialog.OnEnd; +import cz.jzitnik.game.mobs.DialogMob; +import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.utils.roomtasks.RoomTask; + +import java.awt.image.BufferedImage; + +public class Pepa extends DialogMob { + public Pepa(BufferedImage texture, RoomTask[] tasks, RoomCords cords) { + super(texture, tasks, cords, + new Dialog( + "Never gonna give you up", + new OnEnd.Continue(new Dialog( + "Never gonna let you down", + new OnEnd.Continue(new Dialog( + "Never gonna run around", new OnEnd.AskQuestion( + "How it continues?", + new OnEnd.AskQuestion.Answer[]{ + new OnEnd.AskQuestion.Answer("And desert you", new Dialog("You are god damn right!", new OnEnd.Continue(null))), + new OnEnd.AskQuestion.Answer("You are a dessert", new Dialog("WRONG!", new OnEnd.Continue(null))) + } + ))) + )) + ) + ); + } +}