summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Cherniy <qugalet@m0e.space>2024-06-16 12:23:49 +0300
committerAndriy Cherniy <qugalet@m0e.space>2024-06-16 12:23:49 +0300
commitfdfd7040a283b15d7c2346b6a20bda64900244b1 (patch)
treeb01c75f7e4354d4259f0aeb30f081ca3b2b14312
parentd0f951643060821673e060eea7376000418c457b (diff)
downloadoop-kursach-fdfd7040a283b15d7c2346b6a20bda64900244b1.tar.gz
oop-kursach-fdfd7040a283b15d7c2346b6a20bda64900244b1.zip
20-22
-rw-r--r--.gitignore5
-rwxr-xr-xgenlisting7
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/Main.java110
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java35
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java26
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java45
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java29
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java2
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java2
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java90
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java4
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java61
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java28
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java19
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java52
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java2
16 files changed, 408 insertions, 109 deletions
diff --git a/.gitignore b/.gitignore
index 5ff6309..d47da0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,4 +35,7 @@ build/
.vscode/
### Mac OS ###
-.DS_Store \ No newline at end of file
+.DS_Store
+
+Lab_5_24.docx
+Lab_5_24.pdf
diff --git a/genlisting b/genlisting
new file mode 100755
index 0000000..10377f0
--- /dev/null
+++ b/genlisting
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+
+find . -type f \( -name "*.java" -o -name "*.fxml" -o -name "*.c" \) | while read -r java_file; do
+ printf "## $(basename $java_file):\n\n\`\`\`java\n" >> listing.md
+ cat "$java_file" >> listing.md
+ printf "\`\`\`\n\n\n" >> listing.md
+done
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/Main.java b/src/main/java/space/m0e/quga/oop/lab56maven/Main.java
index 1549ff5..25ba617 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/Main.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/Main.java
@@ -10,18 +10,25 @@ import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
+import javafx.stage.FileChooser;
import javafx.stage.Stage;
+import space.m0e.quga.oop.lab56maven.dialogs.CountDialog;
import space.m0e.quga.oop.lab56maven.dialogs.InsertDialog;
import space.m0e.quga.oop.lab56maven.dialogs.SearchDialog;
import space.m0e.quga.oop.lab56maven.entities.common.Ability;
+import space.m0e.quga.oop.lab56maven.entities.common.Utils;
import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom;
import space.m0e.quga.oop.lab56maven.entities.macro.Workstation;
import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant;
+import space.m0e.quga.oop.lab56maven.entities.micro.Nobel;
+import space.m0e.quga.oop.lab56maven.threads.DwarfThread;
+import space.m0e.quga.oop.lab56maven.threads.ImmigrantThread;
-import java.io.IOException;
+import java.io.*;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Executors;
@@ -35,9 +42,17 @@ public class Main extends Application {
public static ArrayList<Fortress> fortresses = new ArrayList<>();
public static Label status = new Label();
+ public static final double width = 3555;
+ public static final double height = 2000;
+
@Override
public void start(Stage stage) throws IOException, InterruptedException {
- Rectangle rect = new Rectangle(3000, 2000, Color.WHITE);
+ Rectangle rect = new Rectangle(width, height, Color.WHITE);
+// rect.setStroke(Color.BLUE);
+// rect.setStrokeWidth(10);
+
+ FileChooser fileChooser = new FileChooser();
+ fileChooser.setInitialFileName("serial.csv");
root.getChildren().add(rect);
Fortress fortress = new Fortress("Eartha", 150, 150, new ArrayList<>(List.of(new Workstation("Torgrus"))), new ArrayList<>(List.of(new ThroneRoom("Halzorga"))));
@@ -47,13 +62,8 @@ public class Main extends Application {
immigrants.getFirst().setX(100);
immigrants.getFirst().setY(100);
-// BorderPane borderPane = new BorderPane();
-// borderPane.setCenter(root);
-// borderPane.setTop(status);
-
-// root.setStyle("-fx-background-color:rgb(186,153,122,0.7);");
root.getChildren().add(status);
- Scene scene = new Scene(root, 1500, 700);
+ Scene scene = new Scene(root, width/4, height/4);
scene.setOnKeyPressed(event -> {
switch (event.getCode()) {
@@ -123,6 +133,90 @@ public class Main extends Application {
alert.setContentText(immigrants.stream().map(Immigrant::toString).collect(Collectors.joining("\n")));
alert.showAndWait();
}
+
+ case W -> {
+ if (root.getLayoutY() + 20 <= 0)
+ root.setLayoutY(root.getLayoutY()+20);
+ }
+
+ case S -> {
+ if (root.getLayoutY() - 20 - stage.getHeight() >= -height)
+ root.setLayoutY(root.getLayoutY()-20);
+ }
+
+ case A -> {
+ if (root.getLayoutX() + 20 <= 0)
+ root.setLayoutX(root.getLayoutX()+20);
+ }
+
+ case D -> {
+ if (root.getLayoutX() - 20 - stage.getWidth() >= -width)
+ root.setLayoutX(root.getLayoutX()-20);
+ }
+
+ case F5 -> {
+ File file = fileChooser.showSaveDialog(stage);
+ String finalSerializeData = ""; // "class,name,age,hp,max_hp,items,x,y\n";
+ finalSerializeData += immigrants.stream().map(Immigrant::serialize).collect(Collectors.joining("\n"));
+ finalSerializeData += "\n" + fortresses.stream().map(Fortress::serialize).collect(Collectors.joining("\n"));
+ System.out.println(finalSerializeData);
+ try {
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ writer.write(finalSerializeData);
+ writer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ case F6 -> {
+ File file = fileChooser.showOpenDialog(stage);
+ try {
+ immigrants.forEach(immigrant -> {
+ if (Main.root.getChildren().contains(immigrant.getGroup())) {
+ Main.root.getChildren().remove(immigrant.getGroup());
+ } else {
+ fortresses.forEach(fortress1 -> {
+ fortress1.removeFromContainer((Dwarf) immigrant);
+ fortress1.remove((Dwarf) immigrant);
+ });
+ }
+ immigrant.getThread().interrupt();
+ });
+ immigrants.clear();
+ StringBuilder finalDeserializeData = new StringBuilder();
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ finalDeserializeData.append(line).append("\n");
+ }
+ Arrays.stream(finalDeserializeData.toString().split("\n")).forEach(data -> {
+ String[] params = data.split(",");
+ switch (params[0]) {
+ case "Immigrant" -> {
+ Immigrant immigrant = new Immigrant(data);
+ immigrant.setThread(new ImmigrantThread(immigrant));
+ immigrant.getThread().start();
+ immigrants.add(immigrant);
+ }
+ case "Dwarf" -> {
+ Dwarf dwarf = new Dwarf(data);
+ dwarf.setThread(new DwarfThread(dwarf));
+ dwarf.getThread().start();
+ immigrants.add(dwarf);
+ }
+ case "Nobel" -> {
+ Dwarf nobel = new Nobel(data);
+ nobel.setThread(new DwarfThread(nobel));
+ nobel.getThread().start();
+ immigrants.add(nobel);
+ }
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
}
});
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java
new file mode 100644
index 0000000..a68f658
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java
@@ -0,0 +1,35 @@
+package space.m0e.quga.oop.lab56maven.decisions;
+
+public abstract class Decision {
+
+ private int executeWhen;
+
+ public boolean isComplete() {
+ return isComplete;
+ }
+
+ public void setComplete(boolean complete) {
+ isComplete = complete;
+ }
+
+ private boolean isComplete = false;
+
+ public Decision(int executeWhen) {
+ this.executeWhen = executeWhen;
+ }
+
+ public int getExecuteWhen() {
+ return executeWhen;
+ }
+
+ public void setExecuteWhen(int executeWhen) {
+ this.executeWhen = executeWhen;
+ }
+
+ public abstract void cycle();
+
+ @Override
+ public String toString() {
+ return String.format("Decision [executeWhen=%d, isComplete=%b]", executeWhen, isComplete);
+ }
+}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java
new file mode 100644
index 0000000..6ad8fad
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java
@@ -0,0 +1,26 @@
+package space.m0e.quga.oop.lab56maven.decisions;
+
+import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
+import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
+import space.m0e.quga.oop.lab56maven.entities.macro.Workstation;
+import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
+
+public class GoToDwarvesContainerDecision extends Decision {
+ private Dwarf dwarf;
+
+ public GoToDwarvesContainerDecision(int executeWhen, Dwarf dwarf) {
+ super(executeWhen);
+ this.dwarf = dwarf;
+ }
+
+ @Override
+ public void cycle() {
+ Fortress fortress = dwarf.getFortress();
+ Coordinates nearCoordinates = new Coordinates(fortress.getGroup().getBoundsInParent().getCenterX(), fortress.getGroup().getBoundsInParent().getCenterY());
+ dwarf.move(nearCoordinates);
+ if (nearCoordinates.isThere(dwarf)) {
+ fortress.addToContainer(dwarf);
+ setComplete(true);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java
new file mode 100644
index 0000000..ba44d08
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java
@@ -0,0 +1,45 @@
+package space.m0e.quga.oop.lab56maven.decisions;
+
+import javafx.application.Platform;
+import space.m0e.quga.oop.lab56maven.Main;
+import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
+import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
+import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom;
+import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
+import space.m0e.quga.oop.lab56maven.entities.micro.Nobel;
+
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+
+public class GoToThroneRoomDecision extends Decision {
+ private Dwarf dwarf;
+
+ public GoToThroneRoomDecision(int executeWhen, Dwarf dwarf) {
+ super(executeWhen);
+ this.dwarf = dwarf;
+ }
+
+ @Override
+ public void cycle() {
+ ThroneRoom throneRoom = dwarf.findNearestThroneRoom();
+ if (throneRoom != null) {
+ dwarf.getFortress().removeFromContainer(dwarf);
+ Coordinates nearCoordinates = dwarf.getCoordinatesToThroneRoom(throneRoom);
+ dwarf.move(nearCoordinates);
+ if (nearCoordinates.isThere(dwarf)) {
+ Platform.runLater(() -> {
+ Fortress fort = Main.fortresses.stream().filter(fortress -> fortress.getThroneRooms().contains(throneRoom)).collect(Collectors.toCollection(ArrayList::new)).get(0);
+ dwarf.getFortress().remove(dwarf);
+ Nobel nobel = new Nobel(dwarf, throneRoom);
+ Main.immigrants.remove(dwarf);
+ Main.immigrants.add(nobel);
+ fort.add(nobel);
+ fort.removeFromContainer(nobel);
+ throneRoom.add(nobel);
+ dwarf.getThread().interrupt();
+ });
+ setComplete(true);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java
new file mode 100644
index 0000000..06f69e9
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java
@@ -0,0 +1,29 @@
+package space.m0e.quga.oop.lab56maven.decisions;
+
+import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
+import space.m0e.quga.oop.lab56maven.entities.macro.Workstation;
+import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
+
+public class GoToWorkstationDecision extends Decision {
+
+ private Dwarf dwarf;
+
+ public GoToWorkstationDecision(int executeWhen, Dwarf dwarf) {
+ super(executeWhen);
+ this.dwarf = dwarf;
+ }
+
+ @Override
+ public void cycle() {
+ Workstation near = dwarf.findNearestWorkstation();
+ if (near != null) {
+ dwarf.getFortress().removeFromContainer(dwarf);
+ Coordinates nearCoordinates = dwarf.getCoordinatesToWorkstation(near);
+ dwarf.move(nearCoordinates);
+ if (nearCoordinates.isThere(dwarf)) {
+ dwarf.setWorkstation(near);
+ setComplete(true);
+ }
+ }
+ }
+}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java b/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java
index 13226c8..b4aba1d 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java
@@ -94,9 +94,9 @@ public class InsertDialog implements Initializable {
if (!generateItems.isSelected()) {
immigrant.setItems(new ArrayList<>());
}
+ Main.immigrants.add(immigrant);
immigrant.getThread().start();
- Main.immigrants.add(immigrant);
}
case "Dwarf" -> {
Dwarf dwarf = new Dwarf(firstName.getText(), lastName.getText(), inputAge, inputX, inputY, inputAbility);
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java
index a68f178..b30a6d5 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java
@@ -28,6 +28,6 @@ public class Coordinates {
}
public boolean isThere(Immigrant immigrant) {
- return (int) immigrant.getX() == (int) this.x && (int) immigrant.getY() == (int) this.y;
+ return Math.abs(immigrant.getX() - this.x) < 2 && Math.abs(immigrant.getY() - this.y) < 2;
}
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java
index 5114992..9e74c6a 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java
@@ -1,5 +1,6 @@
package space.m0e.quga.oop.lab56maven.entities.macro;
+import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
@@ -24,6 +25,11 @@ public class Fortress {
private Label countLabel = new Label();
ArrayList<Workstation> workstations = new ArrayList<>();
+
+ public ArrayList<ThroneRoom> getThroneRooms() {
+ return throneRooms;
+ }
+
ArrayList<ThroneRoom> throneRooms = new ArrayList<>();
ArrayList<Dwarf> dwarves = new ArrayList<>();
@@ -50,20 +56,12 @@ public class Fortress {
nameLabel.setStyle("-fx-text-fill: red; -fx-font-size: 16px;");
-// RowConstraints insideRow = new RowConstraints();
-// insideRow.setPrefHeight(200);
-// ColumnConstraints insideColumn = new ColumnConstraints();
-// insideColumn.setPrefWidth(200);
-// for (int i = 0; i < 3; i++) {
-// insideGroup.getRowConstraints().add(insideRow);
-// insideGroup.getColumnConstraints().add(insideColumn);
-// }
insideGroup.setBackground(new Background(new BackgroundImage(spriteImage, BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER, BackgroundSize.DEFAULT)));
insideGroup.setPrefColumns(2);
insideGroup.setPrefRows(2);
- insideGroup.setPrefTileHeight(200);
- insideGroup.setPrefTileWidth(200);
+ insideGroup.setPrefTileHeight(300);
+ insideGroup.setPrefTileWidth(300);
this.workstations = workstations;
this.throneRooms = throneRooms;
@@ -71,36 +69,14 @@ public class Fortress {
throneRooms.forEach(throneRoom -> insideGroup.getChildren().add(throneRoom.getGroup()));
insideGroup.getChildren().add(dwarvesContainer);
-// int col = 0;
-// int row = 0;
-// for (Workstation w : this.workstations) {
-// if (col > 3) {
-// col = 0;
-// row++;
-// }
-// insideGroup.add(w.getGroup(), col, row);
-// col++;
-// }
-//
-// for (ThroneRoom t : this.throneRooms) {
-// if (col > 3) {
-// col = 0;
-// row++;
-// }
-// insideGroup.add(t.getGroup(), col, row);
-// col++;
-// }
-//
-// insideGroup.add(dwarvesContainer, 2, 2);
-
- this.dwarvesContainer.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
+// this.dwarvesContainer.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
// dwarvesContainer.setMinSize(100 * 3, 100 * 3);
vBox.setLayoutX(x);
vBox.setLayoutY(y);
vBox.getChildren().addAll(nameLabel, insideGroup, countLabel);
- this.vBox.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
+// this.vBox.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
this.vBox.setOnMouseClicked(event -> {
switch (event.getButton()) {
@@ -126,24 +102,28 @@ public class Fortress {
public void remove(Dwarf dwarf) {
dwarves.remove(dwarf);
countLabel.setText(String.valueOf(dwarves.size()));
- dwarvesContainer.getChildren().remove(dwarf.getGroup());
- Main.root.getChildren().add(dwarf.getGroup());
+ if (dwarvesContainer.getChildren().contains(dwarf.getGroup()))
+ dwarvesContainer.getChildren().remove(dwarf.getGroup());
+ if (!Main.root.getChildren().contains(dwarf.getGroup()))
+ Main.root.getChildren().add(dwarf.getGroup());
}
- public void process() {
- ArrayList<Immigrant> migration = (ArrayList<Immigrant>) Main.immigrants.stream().filter(immigrant -> immigrant.getClass().equals(Immigrant.class) && immigrant.getCoordinatesToFortress(this).isThere(immigrant)).collect(Collectors.toList());
- migration.forEach(immigrant -> {
- Dwarf dwarf = new Dwarf(immigrant, this);
- Main.immigrants.add(dwarf);
- this.dwarves.add(dwarf);
- Main.root.getChildren().remove(immigrant.getGroup());
+ public void removeFromContainer(Dwarf dwarf) {
+ Platform.runLater(() -> {
+ if (dwarvesContainer.getChildren().contains(dwarf.getGroup())) {
+ dwarvesContainer.getChildren().remove(dwarf.getGroup());
+ Main.root.getChildren().add(dwarf.getGroup());
+ }
});
- Main.immigrants.removeAll(migration);
-
- countLabel.setText(String.valueOf(dwarves.size()));
+ }
- workstations.forEach(Workstation::process);
- throneRooms.forEach(ThroneRoom::process);
+ public void addToContainer(Dwarf dwarf) {
+ Platform.runLater(() -> {
+ if (Main.root.getChildren().contains(dwarf.getGroup())) {
+ Main.root.getChildren().remove(dwarf.getGroup());
+ dwarvesContainer.getChildren().add(dwarf.getGroup());
+ }
+ });
}
public double getX() {
@@ -166,4 +146,18 @@ public class Fortress {
return dwarves;
}
+ public String serialize() {
+ return String.join(",", new String[]{
+ this.getClass().getSimpleName(),
+ this.name,
+ String.valueOf(this.getX()),
+ String.valueOf(this.getY()),
+ "",
+ "",
+ "",
+ "",
+ "",
+ });
+ }
+
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java
index 7a51cb5..fa31908 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java
@@ -38,8 +38,8 @@ public class ThroneRoom {
Main.root.getChildren().add(vBox);
};
- public void process() {
- countLabel.setText(String.valueOf(nobels.size()));
+ public void add(Nobel nobel) {
+ nobels.add(nobel);
}
public ArrayList<Nobel> getNobels() {
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java
index 9c3008e..3197a99 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java
@@ -5,6 +5,7 @@ import space.m0e.quga.oop.lab56maven.Main;
import space.m0e.quga.oop.lab56maven.entities.common.Ability;
import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
+import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom;
import space.m0e.quga.oop.lab56maven.entities.macro.Workstation;
import space.m0e.quga.oop.lab56maven.threads.DwarfThread;
@@ -42,8 +43,6 @@ public class Dwarf extends Immigrant {
public Dwarf(String firstName, String lastName, int age, double x, double y, Ability ability) {
super(firstName, lastName, age, x, y, ability);
getSprite().setImage(spriteImage);
- this.setThread(new DwarfThread(this));
- this.getThread().start();
}
public Dwarf() {
@@ -58,6 +57,10 @@ public class Dwarf extends Immigrant {
this.fortress = fortress;
}
+ public Dwarf(String serializedData) {
+ super(serializedData);
+ }
+
public Workstation findNearestWorkstation() {
ArrayList<Workstation> searchWorkstations = (ArrayList<Workstation>) fortress.getWorkstations().stream().filter(w -> w.getDwarves().isEmpty()).collect(Collectors.toList());
searchWorkstations.sort((o1, o2) -> (int) ((Math.abs(o1.getGroup().getLayoutX() - this.getX()) + Math.abs(o1.getGroup().getLayoutY() - this.getY())) - ((Math.abs(o2.getGroup().getLayoutX() - this.getX()) + Math.abs(o2.getGroup().getLayoutY() - this.getY())))));
@@ -68,51 +71,27 @@ public class Dwarf extends Immigrant {
}
}
+ public ThroneRoom findNearestThroneRoom() {
+ ArrayList<ThroneRoom> searchThroneRooms = (ArrayList<ThroneRoom>) fortress.getThroneRooms().stream().filter(w -> w.getNobels().size() < 2).collect(Collectors.toList());
+ searchThroneRooms.sort((o1, o2) -> (int) ((Math.abs(o1.getGroup().getLayoutX() - this.getX()) + Math.abs(o1.getGroup().getLayoutY() - this.getY())) - ((Math.abs(o2.getGroup().getLayoutX() - this.getX()) + Math.abs(o2.getGroup().getLayoutY() - this.getY())))));
+ if (searchThroneRooms.isEmpty()) {
+ return null;
+ } else {
+ return searchThroneRooms.get(0);
+ }
+ }
+
public Coordinates getCoordinatesToWorkstation(Workstation workstation) {
double workstationX = workstation.getGroup().getLayoutX() + workstation.getGroup().getBoundsInParent().getWidth() - this.getGroup().getBoundsInParent().getWidth();
double workstationY = workstation.getGroup().getLayoutX() + workstation.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight();
return new Coordinates(workstationX, workstationY);
}
-// @Override
-// public void moveAI() {
-// if (fortress == null) {
-// fortress = findNearestFortress();
-// fortress.getDwarves().add(this);
-// }
-// if (!fortress.getGroup().getBoundsInParent().contains(this.getGroup().getBoundsInParent())) {
-// super.moveAI();
-// } else {
-// if (workstation == null) {
-// workstation = findNearestWorkstation();
-// if (workstation == null) {
-// super.moveAI();
-// } else {
-// Coordinates workstationToMove = this.getCoordinatesToWorkstation(workstation);
-// if (!workstationToMove.isThere(this)) {
-// double workstationX = workstationToMove.getX();
-// double workstationY = workstationToMove.getY();
-//
-// if (workstationX > this.getX()) {
-// this.setX(this.getX() + 1);
-// }
-//
-// if (workstationX < this.getX()) {
-// this.setX(this.getX() - 1);
-// }
-//
-// if (workstationY > this.getY()) {
-// this.setY(this.getY() + 1);
-// }
-//
-// if (workstationY < this.getY()) {
-// this.setY(this.getY() - 1);
-// }
-// }
-// }
-// }
-// }
-// }
+ public Coordinates getCoordinatesToThroneRoom(ThroneRoom throneRoom) {
+ double throneRoomX = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getWidth() - this.getGroup().getBoundsInParent().getWidth();
+ double throneRoomY = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight();
+ return new Coordinates(throneRoomX, throneRoomY);
+ }
public void free() {
if (fortress == null) {
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java
index 77a9c63..2c86526 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java
@@ -91,6 +91,20 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
this("Edzul", "Èrithbesmar", 35, 0, 0, Ability.values()[new Random().nextInt(Ability.values().length)]);
}
+ public Immigrant(String serializedData) {
+ this();
+ String[] params = serializedData.split(",");
+ this.setFirstName(params[1].split(" ")[0]);
+ this.setLastName(params[1].split(" ")[1]);
+ this.setX(Double.parseDouble(params[2]));
+ this.setY(Double.parseDouble(params[3]));
+ this.age = Integer.parseInt(params[4]);
+ this.setHp(Double.parseDouble(params[5]));
+ this.setMaxHp(Double.parseDouble(params[6]));
+ this.items = new ArrayList<>(List.of(params[7].split(";")));
+ this.ability = Ability.valueOf(params[8]);
+ }
+
public boolean isActive() {
return isActive;
}
@@ -337,4 +351,18 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
return thread;
}
+ public String serialize() {
+ return String.join(",", new String[]{
+ this.getClass().getSimpleName(),
+ this.getFullName(),
+ String.valueOf(this.getX()),
+ String.valueOf(this.getY()),
+ String.valueOf(this.getAge()),
+ String.valueOf(this.getHp()),
+ String.valueOf(this.getMaxHp()),
+ String.join(";", this.getItems()),
+ this.ability.toString()
+ });
+ }
+
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java
index ed9ba7a..3de303d 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java
@@ -2,12 +2,16 @@ package space.m0e.quga.oop.lab56maven.entities.micro;
import javafx.scene.image.Image;
import space.m0e.quga.oop.lab56maven.entities.common.Ability;
+import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
+import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom;
+import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;
-public class Nobel extends Immigrant {
+public class Nobel extends Dwarf {
public Image spriteImage = new Image(Objects.requireNonNull(Nobel.class.getResourceAsStream("nobel.png")));;
+ private ThroneRoom throneRoom;
public Nobel(String firstName, String lastName, int age, double x, double y, Ability ability) {
super(firstName, lastName, age, x, y, ability);
getSprite().setImage(spriteImage);
@@ -16,4 +20,17 @@ public class Nobel extends Immigrant {
public Nobel() {
this("Edzul", "Èrithbesmar", 35, 0, 0, Ability.values()[new Random().nextInt(Ability.values().length)]);
}
+
+ public Nobel(Immigrant immigrant, ThroneRoom throneRoom) {
+ this(immigrant.getFirstName(), immigrant.getLastName(), immigrant.getAge(), immigrant.getX(), immigrant.getY(), immigrant.getAbility());
+ this.setItems((ArrayList<String>) immigrant.getItems().clone());
+ this.setHp(this.getHp());
+ this.setMaxHp(this.getMaxHp());
+ this.throneRoom = throneRoom;
+ }
+
+ public Nobel(String serializedData) {
+ super(serializedData);
+ }
+
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java b/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java
index a662a6a..cffeeea 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java
@@ -2,11 +2,17 @@ package space.m0e.quga.oop.lab56maven.threads;
import javafx.application.Platform;
import space.m0e.quga.oop.lab56maven.Main;
+import space.m0e.quga.oop.lab56maven.decisions.Decision;
+import space.m0e.quga.oop.lab56maven.decisions.GoToDwarvesContainerDecision;
+import space.m0e.quga.oop.lab56maven.decisions.GoToThroneRoomDecision;
+import space.m0e.quga.oop.lab56maven.decisions.GoToWorkstationDecision;
import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant;
+import java.util.Objects;
+import java.util.Random;
import java.util.concurrent.TimeUnit;
public class DwarfThread extends Thread {
@@ -14,6 +20,15 @@ public class DwarfThread extends Thread {
return dwarf;
}
+ private int timer = 0;
+ private Decision decision;
+ private static final String[] availableDecisions = new String[]{
+ "GoToWorkstation",
+ "GoToDwarvesContainer",
+// "GoToThroneRoom"
+ };
+ private static String lastDecision;
+
public void setDwarf(Dwarf dwarf) {
this.dwarf = dwarf;
}
@@ -33,13 +48,9 @@ public class DwarfThread extends Thread {
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException e) {
- throw new RuntimeException(e);
+ break;
}
-// Fortress fortress = dwarf.findNearestFortress();
-// if (fortress != null) {
-// Coordinates moveTo = dwarf.getCoordinatesToFortress(fortress);
-// dwarf.move(moveTo);
-// }
+ timer++;
if (dwarf.getFortress() == null) {
Fortress fortress = dwarf.findNearestFortress();
if (fortress != null) {
@@ -53,6 +64,35 @@ public class DwarfThread extends Thread {
});
}
}
+ } else {
+ if (decision == null) {
+ String decisionName = availableDecisions[new Random().nextInt(availableDecisions.length)];
+ while (Objects.equals(lastDecision, decisionName)) {
+ decisionName = availableDecisions[new Random().nextInt(availableDecisions.length)];
+ }
+ lastDecision = decisionName;
+ switch (decisionName) {
+ case "GoToWorkstation" -> {
+ if (dwarf.getAge() > 12 && dwarf.getAge() < 70) {
+ decision = new GoToWorkstationDecision(new Random().nextInt(timer + 200, timer + 500), dwarf);
+ }
+ }
+ case "GoToDwarvesContainer" -> {
+ decision = new GoToDwarvesContainerDecision(new Random().nextInt(timer + 200, timer + 500), dwarf);
+ }
+ case "GoToThroneRoom" -> {
+ if (dwarf.getAge() > 35 && dwarf.getAge() < 70) {
+ decision = new GoToThroneRoomDecision(new Random().nextInt(timer + 200, timer + 500), dwarf);
+ }
+ }
+ }
+ } else {
+ if (decision.getExecuteWhen() < timer) {
+ decision.cycle();
+ }
+ if (decision.isComplete())
+ decision = null;
+ }
}
}
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java b/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java
index 1eb8bbb..b3406d8 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java
@@ -42,6 +42,8 @@ public class ImmigrantThread extends Thread {
if (moveTo.isThere(immigrant)) {
Platform.runLater(() -> {
Dwarf dwarf = new Dwarf(immigrant, fortress);
+ dwarf.setThread(new DwarfThread(dwarf));
+ dwarf.getThread().start();
Main.immigrants.remove(immigrant);
Main.immigrants.add(dwarf);
fortress.add(dwarf);