Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions Eugene-JR/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM maven:3.8.5-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests


FROM tomcat:9.0-jdk17

# @TODO Replace Oleksandr-JR-Example.war with your app name
COPY --from=build /app/target/Eugene-JR-M3.war /usr/local/tomcat/webapps/ROOT.war
EXPOSE 8080
CMD ["catalina.sh", "run"]
7 changes: 7 additions & 0 deletions Eugene-JR/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

Quest Description: "Shadow of the Past"
You and your team receive a mysterious letter inviting you to an abandoned mansion on the outskirts of the city. The letter is signed by the famous historian Artem Lysenko, who mysteriously disappeared 20 years ago. In the letter, he claims to have uncovered evidence of an ancient conspiracy that could change history forever.
As you step inside the eerie mansion, the doors creak shut behind you. The air is thick with the scent of old books, and the dim candlelight barely illuminates the grand hallway. The walls whisper secrets of the past, and every room holds hidden clues, puzzles, and dangers.

Your choices will determine the outcome of the story. Will you uncover the truth, or will you fall victim to the mysteries lurking in the shadows?
Access quest-game via the link - https://m3-quest-eugene.onrender.com/
112 changes: 112 additions & 0 deletions Eugene-JR/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.taco</groupId>
<artifactId>Eugene-JR</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Eugene-JR Maven Webapp</name>
<url>http://maven.apache.org</url>

<properties>
<java.version>17</java.version>

<lombok.version>1.18.36</lombok.version>
<commons-lang3.version>3.12.0</commons-lang3.version>

<junit-jupiter-engine.version>5.12.0</junit-jupiter-engine.version>

<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
<jakarta.servlet.jsp.jstl.version>3.0.1</jakarta.servlet.jsp.jstl.version>
<jstl.version>1.2</jstl.version>

<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<maven-war-plugin.version>3.3.2</maven-war-plugin.version>

</properties>



<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit-jupiter-engine.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>

<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>${jakarta.servlet.jsp.jstl.version}</version>
</dependency>

<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>${jakarta.servlet.jsp.jstl.version}</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
</dependencies>
<build>
<finalName>Eugene-JR-M3</finalName>
<plugins>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.9.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
</plugin>

</plugins>
</build>
</project>
46 changes: 46 additions & 0 deletions Eugene-JR/src/main/java/controller/QuizServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package controller;

import model.Scene;
import service.QuizService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/quiz")
public class QuizServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
QuizService quizService = (QuizService) session.getAttribute("quizService");

if (quizService == null || request.getParameter("restart") != null) {
quizService = new QuizService();
session.setAttribute("quizService", quizService);
}

Scene currentScene = quizService.getCurrentScene();
request.setAttribute("scene", currentScene);
request.getRequestDispatcher("quiz.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

HttpSession session = request.getSession();
QuizService quizService = (QuizService) session.getAttribute("quizService");

int answer = Integer.parseInt(request.getParameter("answer"));
Scene currentScene = quizService.makeStep(answer);
session.setAttribute("currentScene", currentScene);

request.setAttribute("scene", currentScene);
request.setAttribute("questions", currentScene.getQuestions());
request.getRequestDispatcher("quiz.jsp").forward(request, response);
}
}
19 changes: 19 additions & 0 deletions Eugene-JR/src/main/java/controller/RestartServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/restart")
public class RestartServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();
resp.sendRedirect("quiz");
}
}
18 changes: 18 additions & 0 deletions Eugene-JR/src/main/java/model/Question.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package model;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

@Data
@AllArgsConstructor
public class Question {

private String name;
private Scene nextScene;

public Question(String name) {
this.name = name;
}
}
26 changes: 26 additions & 0 deletions Eugene-JR/src/main/java/model/Scene.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package model;

import lombok.*;

import java.util.List;
@Data
public class Scene {

private String name;
private List<Question> questions;
private boolean isFinal = false;

public Scene(String name) {
this.name = name;
}

public Scene setFinal(){
isFinal = true;
return this;
}

@Override
public String toString() {
return "Question{text='" + name+" }";
}
}
109 changes: 109 additions & 0 deletions Eugene-JR/src/main/java/repository/QuizRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package repository;

import lombok.Data;
import model.Question;
import model.Scene;

import java.util.Arrays;

@Data
public class QuizRepository {
private static QuizRepository INSTANCE;

// Локації квесту
private Scene scene1 = new Scene("Біля входу до маєтку");
private Scene scene2 = new Scene("Велика зала");
private Scene scene3 = new Scene("Стара бібліотека");
private Scene scene4 = new Scene("Темний підвал");
private Scene scene5 = new Scene("Залізні сходи");
private Scene scene6 = new Scene("Музична кімната");
private Scene scene7 = new Scene("Секретний прохід");
private Scene scene8 = new Scene("Горище");
private Scene scene9 = new Scene("Старий сад");
private Scene scene10 = new Scene("Покинута каплиця");

// Фінальні сцени
private Scene sceneEnd1 = new Scene("Перемога! Ви розкрили таємницю маєтку Лисенка і знайшли скарб.").setFinal();
private Scene sceneEnd2 = new Scene("Поразка... Ви зачепили старий механізм, і стеля обвалилася.").setFinal();
private Scene sceneEnd3 = new Scene("Нейтральна кінцівка. Ви залишилися в маєтку, зачаровані його музикою.").setFinal();

private QuizRepository() {
scene1.setQuestions(
Arrays.asList(
new Question("Зайти в маєток", scene2),
new Question("Обійти будівлю навколо", scene9)
)
);

scene2.setQuestions(
Arrays.asList(
new Question("Піти до бібліотеки", scene3),
new Question("Спуститися в підвал", scene4),
new Question("Дослідити сходи нагору", scene5)
)
);

scene3.setQuestions(
Arrays.asList(
new Question("Відкрити стару книгу", scene7),
new Question("Оглянути нотні записи", scene6)
)
);

scene4.setQuestions(
Arrays.asList(
new Question("Шукати вихід", sceneEnd2), // Поразка
new Question("Піднятися назад", scene2)
)
);

scene5.setQuestions(
Arrays.asList(
new Question("Продовжити підніматися нагору", scene8),
new Question("Спуститися назад у залу", scene2)
)
);

scene6.setQuestions(
Arrays.asList(
new Question("Грати на піаніно", sceneEnd3), // Нейтральний фінал
new Question("Шукати прихований механізм", scene7)
)
);

scene7.setQuestions(
Arrays.asList(
new Question("Відкрити потайний хід", scene10),
new Question("Повернутися в бібліотеку", scene3)
)
);

scene8.setQuestions(
Arrays.asList(
new Question("Відчинити стару скриню", sceneEnd1), // Перемога
new Question("Спуститися вниз", scene5)
)
);

scene9.setQuestions(
Arrays.asList(
new Question("Дослідити старий фонтан", sceneEnd3), // Нейтральний фінал
new Question("Повернутися до входу в маєток", scene1)
)
);

scene10.setQuestions(
Arrays.asList(
new Question("Оглянути вівтар", sceneEnd1), // Перемога
new Question("Залишити каплицю і повернутися", scene7)
)
);
}

public static QuizRepository getInstance() {
if (INSTANCE == null) {
INSTANCE = new QuizRepository();
}
return INSTANCE;
}
}
29 changes: 29 additions & 0 deletions Eugene-JR/src/main/java/service/QuizService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package service;

import lombok.Data;
import model.Question;
import model.Scene;
import repository.QuizRepository;

import java.util.List;

@Data
public class QuizService {

private Scene currentScene;
private List<Scene> scenes;
private QuizRepository quizRepository = QuizRepository.getInstance();;


public QuizService() {
currentScene = quizRepository.getScene1();
}

public Scene makeStep(int answer){
List<Question> questions = currentScene.getQuestions();
Question question = questions.get(answer);
currentScene = question.getNextScene();
return currentScene;
}

}
7 changes: 7 additions & 0 deletions Eugene-JR/src/main/webapp/WEB-INF/web.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
Loading