summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Cherniy <qugalet@m0e.space>2024-06-17 02:59:32 +0300
committerAndriy Cherniy <qugalet@m0e.space>2024-06-17 02:59:32 +0300
commit3401d742ca53dce6bb1464cc12f94d107cfc285d (patch)
tree4640d50fbbb738e6ae63dac87c0ade6bd21a9523
parentfdfd7040a283b15d7c2346b6a20bda64900244b1 (diff)
downloadoop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.tar.gz
oop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.zip
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/Main.java103
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java15
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java10
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java8
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java59
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/decisions/WorkAtWorkstationDecision.java67
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java15
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Ability.java2
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Item.java12
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java40
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java47
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java6
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Workstation.java39
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java82
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java93
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java15
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java141
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java52
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/handlers/NobelHandler.java72
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java102
-rw-r--r--src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java60
-rw-r--r--src/main/resources/space/m0e/quga/oop/lab56maven/entities/macro/workstation_woodcutting.png (renamed from src/main/resources/space/m0e/quga/oop/lab56maven/entities/macro/workstation.png)bin6545 -> 6545 bytes
22 files changed, 797 insertions, 243 deletions
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 25ba617..65a0f5d 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/Main.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/Main.java
@@ -1,21 +1,30 @@
package space.m0e.quga.oop.lab56maven;
+import javafx.animation.AnimationTimer;
+import javafx.animation.KeyFrame;
+import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
+import javafx.scene.SnapshotParameters;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
-import javafx.scene.input.KeyCode;
-import javafx.scene.layout.BorderPane;
+import javafx.scene.image.ImageView;
+import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
+import javafx.scene.transform.Scale;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
+import javafx.util.Duration;
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.MiniMap;
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;
@@ -23,8 +32,8 @@ 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 space.m0e.quga.oop.lab56maven.handlers.DwarfHandler;
+import space.m0e.quga.oop.lab56maven.handlers.ImmigrantHandler;
import java.io.*;
import java.util.ArrayList;
@@ -38,32 +47,54 @@ import java.util.stream.Collectors;
public class Main extends Application {
public static Group root = new Group();
+ public static Group group = new Group();
public static ArrayList<Immigrant> immigrants = new ArrayList<>();
public static ArrayList<Fortress> fortresses = new ArrayList<>();
public static Label status = new Label();
+ public static MiniMap miniMap;
+
public static final double width = 3555;
public static final double height = 2000;
+ public static ImageView imgviewmap;
+ public static Rectangle rectMinimap;
+
@Override
public void start(Stage stage) throws IOException, InterruptedException {
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"))));
+ Fortress fortress = new Fortress("Eartha", 150, 150,
+ new ArrayList<>(List.of(
+ new Workstation("Torgrus", Ability.MASONIST),
+ new Workstation("Abbacus", Ability.WOODCUTTER)
+ )),
+ new ArrayList<>(List.of(
+ new ThroneRoom("Halzorga"))
+ ));
+
+ Fortress fortressTrade = new Fortress("Aboba", 1000, 150,
+ new ArrayList<>(List.of(
+ new Workstation("Torgrass", Ability.WOODCUTTER)
+ )),
+ new ArrayList<>(List.of(
+ )));
+ fortresses.add(fortressTrade);
fortresses.add(fortress);
+ fortressTrade.setWoodCount(999);
- immigrants.add(new Immigrant("1", "0", 50, 0,0, Ability.MASONIST));
- immigrants.getFirst().setX(100);
- immigrants.getFirst().setY(100);
+// immigrants.add(new Immigrant("Melbil", "Lancerpaddle", 50, 100,100, Ability.WOODCUTTER));
+// immigrants.add(new Immigrant("Atír", "Razorpaddle", 50, 0,0, Ability.WOODCUTTER));
+// immigrants.add(new Immigrant("Onget", "Sabreletter", 52, 200,150, Ability.WOODCUTTER));
+ immigrants.add(new Immigrant("Limul", "Rockrack", 52, 700,150, Ability.WOODCUTTER));
root.getChildren().add(status);
- Scene scene = new Scene(root, width/4, height/4);
+ group.getChildren().add(root);
+ Scene scene = new Scene(group, width/4, height/4);
scene.setOnKeyPressed(event -> {
switch (event.getCode()) {
@@ -181,7 +212,7 @@ public class Main extends Application {
fortress1.remove((Dwarf) immigrant);
});
}
- immigrant.getThread().interrupt();
+ immigrant.getTimeline().stop();
});
immigrants.clear();
StringBuilder finalDeserializeData = new StringBuilder();
@@ -195,20 +226,17 @@ public class Main extends Application {
switch (params[0]) {
case "Immigrant" -> {
Immigrant immigrant = new Immigrant(data);
- immigrant.setThread(new ImmigrantThread(immigrant));
- immigrant.getThread().start();
+ immigrant.getTimeline().play();
immigrants.add(immigrant);
}
case "Dwarf" -> {
Dwarf dwarf = new Dwarf(data);
- dwarf.setThread(new DwarfThread(dwarf));
- dwarf.getThread().start();
+ dwarf.getTimeline().play();
immigrants.add(dwarf);
}
case "Nobel" -> {
Dwarf nobel = new Nobel(data);
- nobel.setThread(new DwarfThread(nobel));
- nobel.getThread().start();
+ nobel.getTimeline().play();
immigrants.add(nobel);
}
}
@@ -235,14 +263,49 @@ public class Main extends Application {
stage.setScene(scene);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(() -> immigrants.forEach(immigrant -> {
- immigrant.getThread().start();
+ immigrant.getTimeline().play();
}), 1, 1, TimeUnit.SECONDS);
+// isMiniMapVisible = !isMiniMapVisible;
+// if (isMiniMapVisible){
+//
+// mainGroup.getChildren().add(miniMap);
+// mainGroup.getChildren().add(miniMap.rect);
+// UpdateTimer.play();
+// }
+// else{
+// mainGroup.getChildren().remove(miniMap);
+// mainGroup.getChildren().remove(miniMap.rect);
+// UpdateTimer.stop();
+// }
+ miniMap = new MiniMap(400, 225, stage.getWidth()/10, stage.getHeight()/10, root);
+ mapTimer = new Timeline(new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>()
+ {
+ @Override
+ public void handle(ActionEvent event)
+ {
+ Platform.runLater(() -> {
+ miniMap.updateMap();
+ miniMap.setHeight(height/10);
+ miniMap.setWidth(width/10);
+ miniMap.rect.setHeight(stage.getHeight()/10);
+ miniMap.rect.setWidth(stage.getWidth()/10);
+ });
- stage.show();
+ miniMap.rect.setX(-root.getLayoutX() / 10);
+ miniMap.rect.setY(-root.getLayoutY() / 10);
+ }
+ }));
+ mapTimer.setCycleCount(Timeline.INDEFINITE);
+ group.getChildren().add(miniMap);
+ group.getChildren().add(miniMap.rect);
+ mapTimer.play();
+ stage.show();
}
+ public static Timeline mapTimer;
+
private void moveImmigrants(double dx, double dy) {
immigrants.forEach(immigrant -> {
if (immigrant.isActive()) {
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
index 6ad8fad..4eb83c2 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java
@@ -1,6 +1,8 @@
package space.m0e.quga.oop.lab56maven.decisions;
+import javafx.application.Platform;
import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
+import space.m0e.quga.oop.lab56maven.entities.common.Item;
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;
@@ -19,6 +21,19 @@ public class GoToDwarvesContainerDecision extends Decision {
Coordinates nearCoordinates = new Coordinates(fortress.getGroup().getBoundsInParent().getCenterX(), fortress.getGroup().getBoundsInParent().getCenterY());
dwarf.move(nearCoordinates);
if (nearCoordinates.isThere(dwarf)) {
+ dwarf.getItems().entrySet().forEach(item -> {
+ switch (item.getKey()) {
+ case WOOD -> {
+ fortress.setWoodCount(fortress.getWoodCount() + item.getValue());
+ item.setValue(0);
+ }
+ case STONE -> {
+ fortress.setStoneCount(fortress.getStoneCount() + item.getValue());
+ item.setValue(0);
+ }
+ }
+ });
+ Platform.runLater(dwarf::updateItemLabel);
fortress.addToContainer(dwarf);
setComplete(true);
}
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
index ba44d08..cfadb5c 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java
@@ -1,6 +1,8 @@
package space.m0e.quga.oop.lab56maven.decisions;
import javafx.application.Platform;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Circle;
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;
@@ -29,14 +31,20 @@ public class GoToThroneRoomDecision extends Decision {
if (nearCoordinates.isThere(dwarf)) {
Platform.runLater(() -> {
Fortress fort = Main.fortresses.stream().filter(fortress -> fortress.getThroneRooms().contains(throneRoom)).collect(Collectors.toCollection(ArrayList::new)).get(0);
+ double lastX = dwarf.getX();
+ double lastY = dwarf.getY();
dwarf.getFortress().remove(dwarf);
+ Main.root.getChildren().remove(dwarf.getGroup());
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();
+ nobel.setX(lastX);
+ nobel.setY(lastY);
+ dwarf.getTimeline().stop();
+ nobel.getTimeline().play();
});
setComplete(true);
}
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
index 06f69e9..6dc4448 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java
@@ -1,8 +1,10 @@
package space.m0e.quga.oop.lab56maven.decisions;
+import javafx.application.Platform;
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;
+import space.m0e.quga.oop.lab56maven.handlers.DwarfHandler;
public class GoToWorkstationDecision extends Decision {
@@ -17,11 +19,17 @@ public class GoToWorkstationDecision extends Decision {
public void cycle() {
Workstation near = dwarf.findNearestWorkstation();
if (near != null) {
+ System.out.println(near.getName());
+ Platform.runLater(dwarf::updateItemLabel);
dwarf.getFortress().removeFromContainer(dwarf);
Coordinates nearCoordinates = dwarf.getCoordinatesToWorkstation(near);
dwarf.move(nearCoordinates);
if (nearCoordinates.isThere(dwarf)) {
dwarf.setWorkstation(near);
+
+ DwarfHandler dwarfHandler = (DwarfHandler) dwarf.getHandler();
+ dwarfHandler.setDecision(new WorkAtWorkstationDecision(dwarfHandler.getTimer() + 1, dwarf));
+ near.getCountLabel().setText(String.valueOf(near.getDwarves().size()));
setComplete(true);
}
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java
new file mode 100644
index 0000000..493fb45
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java
@@ -0,0 +1,59 @@
+package space.m0e.quga.oop.lab56maven.decisions;
+
+import javafx.application.Platform;
+import space.m0e.quga.oop.lab56maven.entities.common.Coordinates;
+import space.m0e.quga.oop.lab56maven.entities.common.Item;
+import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
+import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
+import space.m0e.quga.oop.lab56maven.handlers.DwarfHandler;
+
+public class GoTradingDecision extends Decision {
+
+ private Dwarf dwarf;
+
+ private Item tradingItem;
+ private int amountOfItem;
+
+ public GoTradingDecision(int executeWhen, Dwarf dwarf, Item tradingItem, int amountOfItem) {
+ super(executeWhen);
+ this.dwarf = dwarf;
+ this.tradingItem = tradingItem;
+ this.amountOfItem = amountOfItem;
+ }
+
+ @Override
+ public void cycle() {
+ Fortress near = dwarf.findNearestFortressToTrade(tradingItem, amountOfItem);
+ if (near != null) {
+ dwarf.getFortress().removeFromContainer(dwarf);
+ Coordinates nearCoordinates = dwarf.getCoordinatesToFortress(near);
+ dwarf.move(nearCoordinates);
+ if (nearCoordinates.isThere(dwarf)) {
+ dwarf.getItems().remove(tradingItem);
+ Item getItem = null;
+ switch (tradingItem) {
+ case WOOD -> {
+ near.setStoneCount(near.getStoneCount() - amountOfItem);
+ getItem = Item.STONE;
+ }
+ case STONE -> {
+ near.setWoodCount(near.getWoodCount() - amountOfItem);
+ getItem = Item.WOOD;
+ }
+ }
+ if (getItem != null) {
+ dwarf.getItems().put(getItem, amountOfItem);
+ }
+
+ Platform.runLater(dwarf::updateItemLabel);
+ DwarfHandler dwarfHandler = (DwarfHandler) dwarf.getHandler();
+ dwarfHandler.setDecision(new GoToDwarvesContainerDecision(dwarfHandler.getTimer() + 1, dwarf));
+ setComplete(true);
+ }
+ } else {
+ DwarfHandler dwarfHandler = (DwarfHandler) dwarf.getHandler();
+ dwarfHandler.setDecision(new GoToDwarvesContainerDecision(dwarfHandler.getTimer() + 1, dwarf));
+ setComplete(true);
+ }
+ }
+}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/WorkAtWorkstationDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/WorkAtWorkstationDecision.java
new file mode 100644
index 0000000..79244d1
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/WorkAtWorkstationDecision.java
@@ -0,0 +1,67 @@
+package space.m0e.quga.oop.lab56maven.decisions;
+
+import javafx.application.Platform;
+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.common.Item;
+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;
+import space.m0e.quga.oop.lab56maven.handlers.DwarfHandler;
+
+import java.util.Random;
+
+public class WorkAtWorkstationDecision extends Decision {
+ private Dwarf dwarf;
+
+ private int timer = 0;
+
+ private static int endsAt = 1000;
+
+ public WorkAtWorkstationDecision(int executeWhen, Dwarf dwarf) {
+ super(executeWhen);
+ this.dwarf = dwarf;
+ }
+
+ @Override
+ public void cycle() {
+ timer += 10;
+ if (timer >= endsAt) {
+ Workstation workstation = dwarf.getWorkstation();
+ Fortress fortress = dwarf.getFortress();
+
+ int amount = new Random().nextInt(5,20);
+ switch (workstation.getRequiredAbility()) {
+ case MASONIST -> {
+ if (dwarf.getItems().containsKey(Item.PICKAXE) && dwarf.getItems().get(Item.PICKAXE) > 0)
+ amount *= 2;
+
+ if (fortress.getThroneRooms().stream().anyMatch(
+ throneRoom -> throneRoom.getNobels().stream().anyMatch(
+ nobel -> nobel.getAbility() == Ability.MASONIST))) {
+ amount *= 2;
+ }
+
+ fortress.setStoneCount(fortress.getStoneCount() + amount);
+ }
+ case WOODCUTTER -> {
+ if (dwarf.getItems().containsKey(Item.AXE) && dwarf.getItems().get(Item.AXE) > 0)
+ amount *= 2;
+
+ if (fortress.getThroneRooms().stream().anyMatch(
+ throneRoom -> throneRoom.getNobels().stream().anyMatch(
+ nobel -> nobel.getAbility() == Ability.MASONIST))) {
+ amount *= 2;
+ }
+ fortress.setWoodCount(fortress.getWoodCount() + amount);
+ }
+ }
+ Platform.runLater(dwarf::updateItemLabel);
+ DwarfHandler dwarfHandler = (DwarfHandler) dwarf.getHandler();
+ dwarfHandler.setDecision(new GoToDwarvesContainerDecision(dwarfHandler.getTimer() + 1, dwarf));
+ workstation.getDwarves().remove(dwarf);
+ workstation.getCountLabel().setText(String.valueOf(workstation.getDwarves().size()));
+ setComplete(true);
+ }
+ }
+} \ No newline at end of file
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 b4aba1d..a3d9425 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
@@ -20,10 +20,7 @@ import space.m0e.quga.oop.lab56maven.entities.micro.Nobel;
import java.awt.*;
import java.io.IOException;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.ResourceBundle;
+import java.util.*;
import static space.m0e.quga.oop.lab56maven.entities.common.Utils.sendErrorAlert;
@@ -92,27 +89,29 @@ public class InsertDialog implements Initializable {
case "Immigrant" -> {
Immigrant immigrant = new Immigrant(firstName.getText(), lastName.getText(), inputAge, inputX, inputY, inputAbility);
if (!generateItems.isSelected()) {
- immigrant.setItems(new ArrayList<>());
+ immigrant.setItems(new HashMap<>());
}
Main.immigrants.add(immigrant);
- immigrant.getThread().start();
+ immigrant.getTimeline().play();
}
case "Dwarf" -> {
Dwarf dwarf = new Dwarf(firstName.getText(), lastName.getText(), inputAge, inputX, inputY, inputAbility);
if (!generateItems.isSelected()) {
- dwarf.setItems(new ArrayList<>());
+ dwarf.setItems(new HashMap<>());
}
+ dwarf.getTimeline().play();
Main.immigrants.add(dwarf);
}
case "Nobel" -> {
Nobel nobel = new Nobel(firstName.getText(), lastName.getText(), inputAge, inputX, inputY, inputAbility);
if (!generateItems.isSelected()) {
- nobel.setItems(new ArrayList<>());
+ nobel.setItems(new HashMap<>());
}
+ nobel.getTimeline().play();
Main.immigrants.add(nobel);
}
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Ability.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Ability.java
index 9fc2e68..ba35799 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Ability.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Ability.java
@@ -1,5 +1,5 @@
package space.m0e.quga.oop.lab56maven.entities.common;
public enum Ability {
- WOODCUTTER, MASONIST
+ WOODCUTTER, MASONIST, COMMUNICATION
}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Item.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Item.java
new file mode 100644
index 0000000..58eb0c5
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Item.java
@@ -0,0 +1,12 @@
+package space.m0e.quga.oop.lab56maven.entities.common;
+
+public enum Item {
+ // tools
+ PICKAXE,
+ AXE,
+ SWORD,
+
+ // resources
+ WOOD,
+ STONE,
+}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java
new file mode 100644
index 0000000..5e5f319
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java
@@ -0,0 +1,40 @@
+package space.m0e.quga.oop.lab56maven.entities.common;
+
+import javafx.scene.SnapshotParameters;
+import javafx.scene.image.Image;
+import javafx.scene.Group;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.ImagePattern;
+import javafx.scene.shape.Rectangle;
+public class MiniMap extends Rectangle
+{
+ private final Group mainGroup;
+ public Rectangle rect = new Rectangle();
+ public MiniMap(double width, double height,double selectionWidth,double selectionHeight, Group mainGroup)
+ {
+ setHeight(height);
+ setWidth(width);
+ this.mainGroup = mainGroup;
+ setFill(Color.GREY);
+ setStroke(Color.GREEN);
+ setStrokeWidth(5);
+ rect.setWidth(selectionWidth);
+ rect.setHeight(selectionHeight);
+ rect.setFill(Color.TRANSPARENT);
+ rect.setStroke(Color.BLACK);
+ rect.setStrokeWidth(1);
+ rect.setMouseTransparent(true);
+ updateMap();
+ }
+ public void updateMap()
+ {
+ Image image = createSnapshot(mainGroup);
+ ImagePattern imagePatternmagePattern = new ImagePattern(image);
+ this.setFill(imagePatternmagePattern);
+ }
+ private Image createSnapshot(Group group) {
+ SnapshotParameters params = new SnapshotParameters();
+ params.setFill(Color.TRANSPARENT);
+ return group.snapshot(params, null);
+ }
+} \ No newline at end of file
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 9e74c6a..3264802 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
@@ -20,9 +20,15 @@ import java.util.stream.Collectors;
public class Fortress {
private Image spriteImage = new Image(Objects.requireNonNull(Fortress.class.getResourceAsStream("fortress.jpeg")));;
+
+ public TilePane getInsideGroup() {
+ return insideGroup;
+ }
+
private TilePane insideGroup = new TilePane(10, 10);
private Label nameLabel = new Label();
private Label countLabel = new Label();
+ private Label resourcesLabel = new Label();
ArrayList<Workstation> workstations = new ArrayList<>();
@@ -34,11 +40,41 @@ public class Fortress {
ArrayList<Dwarf> dwarves = new ArrayList<>();
+ public String getName() {
+ return name;
+ }
+
private String name;
private double x;
private double y;
private VBox vBox = new VBox();
+ private int woodCount = 0;
+
+ public int getStoneCount() {
+ return stoneCount;
+ }
+
+ public void setStoneCount(int stoneCount) {
+ this.stoneCount = stoneCount;
+ Platform.runLater(() -> {
+ resourcesLabel.setText(String.format("Stone: %d | Wood: %d", stoneCount, woodCount));
+ });
+ }
+
+ public int getWoodCount() {
+ return woodCount;
+ }
+
+ public void setWoodCount(int woodCount) {
+ this.woodCount = woodCount;
+ Platform.runLater(() -> {
+ resourcesLabel.setText(String.format("Stone: %d | Wood: %d", stoneCount, woodCount));
+ });
+ }
+
+ private int stoneCount = 0;
+
@Override
public String toString() {
return String.format("%s{Name=%s, Position=(%f,%f)}", this.getClass().getSimpleName(), this.name, getX(), getY());
@@ -52,6 +88,10 @@ public class Fortress {
this.name = name;
nameLabel.setText(name);
+
+ HBox hBox = new HBox();
+ hBox.setSpacing(100);
+ resourcesLabel.setText("Stone: 0 | Wood: 0");
countLabel.setText("0");
nameLabel.setStyle("-fx-text-fill: red; -fx-font-size: 16px;");
@@ -71,10 +111,11 @@ public class Fortress {
// this.dwarvesContainer.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
// dwarvesContainer.setMinSize(100 * 3, 100 * 3);
+ hBox.getChildren().addAll(countLabel, resourcesLabel);
vBox.setLayoutX(x);
vBox.setLayoutY(y);
- vBox.getChildren().addAll(nameLabel, insideGroup, countLabel);
+ vBox.getChildren().addAll(nameLabel, insideGroup, hBox);
// this.vBox.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
@@ -126,6 +167,10 @@ public class Fortress {
});
}
+ public boolean contains(Dwarf dwarf) {
+ return dwarvesContainer.getChildren().contains(dwarf.getGroup());
+ }
+
public double getX() {
return x;
}
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 fa31908..b0df4e8 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
@@ -17,6 +17,11 @@ public class ThroneRoom {
private Image spriteImage = new Image(Objects.requireNonNull(ThroneRoom.class.getResourceAsStream("throne_room.jpg")));;
private ImageView sprite = new ImageView(spriteImage);
private Label nameLabel = new Label();
+
+ public Label getCountLabel() {
+ return countLabel;
+ }
+
private Label countLabel = new Label();
private ArrayList<Nobel> nobels = new ArrayList<>();
@@ -30,6 +35,7 @@ public class ThroneRoom {
sprite.setFitHeight(150);
sprite.setFitWidth(150);
nameLabel.setText(name);
+ countLabel.setText("0");
nameLabel.setStyle("-fx-text-fill: white; -fx-font-size: 16px; -fx-background-color: grey");
countLabel.setStyle("-fx-text-fill: white; -fx-font-size: 16px; -fx-background-color: grey");
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Workstation.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Workstation.java
index fe80a2b..e8776e1 100644
--- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Workstation.java
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Workstation.java
@@ -6,6 +6,7 @@ import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import space.m0e.quga.oop.lab56maven.Main;
+import space.m0e.quga.oop.lab56maven.entities.common.Ability;
import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant;
@@ -15,22 +16,54 @@ import java.util.Optional;
import java.util.stream.Collectors;
public class Workstation {
- private Image spriteImage = new Image(Objects.requireNonNull(Workstation.class.getResourceAsStream("workstation.png")));;
- private ImageView sprite = new ImageView(spriteImage);
+// private Image spriteImage = new Image(Objects.requireNonNull(Workstation.class.getResourceAsStream("workstation_woodcutting.png")));;
+// private ImageView sprite = new ImageView(spriteImage);
+ private ImageView sprite;
private Label nameLabel = new Label();
private Label countLabel = new Label();
+ public Ability getRequiredAbility() {
+ return requiredAbility;
+ }
+
+ private Ability requiredAbility;
+
private ArrayList<Dwarf> dwarves = new ArrayList<>();
+
+ public String getName() {
+ return name;
+ }
+
+ public Label getCountLabel() {
+ return countLabel;
+ }
+
private String name;
private VBox vBox = new VBox();
- public Workstation(String name) {
+ public Workstation(String name, Ability requiredAbility) {
this.name = name;
+ this.requiredAbility = requiredAbility;
+
+ Image spriteImage = null;
+
+ switch (this.requiredAbility) {
+ case WOODCUTTER -> {
+ spriteImage = new Image(Objects.requireNonNull(Workstation.class.getResourceAsStream("workstation_woodcutting.png")));
+ }
+
+ case MASONIST -> {
+ spriteImage = new Image(Objects.requireNonNull(Workstation.class.getResourceAsStream("workstation_mason.png")));
+ }
+ }
+
+ sprite = new ImageView(spriteImage);
sprite.setFitHeight(150);
sprite.setFitWidth(150);
nameLabel.setText(name);
+ countLabel.setText("0");
nameLabel.setStyle("-fx-text-fill: white; -fx-font-size: 16px; -fx-background-color: grey");
countLabel.setStyle("-fx-text-fill: white; -fx-font-size: 16px; -fx-background-color: grey");
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 3197a99..daaa9c5 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
@@ -1,18 +1,22 @@
package space.m0e.quga.oop.lab56maven.entities.micro;
+import javafx.animation.Animation;
+import javafx.animation.KeyFrame;
+import javafx.animation.Timeline;
+import javafx.application.Platform;
+import javafx.scene.control.Label;
import javafx.scene.image.Image;
+import javafx.util.Duration;
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.common.Item;
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;
+import space.m0e.quga.oop.lab56maven.handlers.DwarfHandler;
-import java.util.ArrayList;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Random;
+import java.util.*;
import java.util.stream.Collectors;
public class Dwarf extends Immigrant {
@@ -30,19 +34,44 @@ public class Dwarf extends Immigrant {
public void setWorkstation(Workstation workstation) {
this.workstation = workstation;
+ workstation.getDwarves().add(this);
}
@Override
public String toString() {
- return String.format("%s{Name=%s, Age=%d, Ability=%s, HP: %f/%f, Items: [%s], Position=(%f,%f), MacroObject=%s}", this.getClass().getSimpleName(), this.getFullName(), this.getAge(), this.getAbility(), this.getHp(), this.getMaxHp(), String.join(", ", this.getItems()), getX(), getY(), getFortress());
+ return String.format("%s{Name=%s, Age=%d, Ability=%s, HP: %f/%f, Items: [%s], Position=(%f,%f), MacroObject=%s}",
+ this.getClass().getSimpleName(),
+ this.getFullName(),
+ this.getAge(),
+ this.getAbility(),
+ this.getHp(),
+ this.getMaxHp(),
+ this.getItems().entrySet().stream().map(item -> String.format("%s (%d)", item.getKey().toString(), item.getValue())).collect(Collectors.joining(", ")),
+ getX(),
+ getY(),
+ getFortress());
}
private Fortress fortress = null;
private Workstation workstation = null;
public Image spriteImage = new Image(Objects.requireNonNull(Immigrant.class.getResourceAsStream("dwarf.png")));;
+
+ public Label getItemLabel() {
+ return itemLabel;
+ }
+
+ private Label itemLabel = new Label();
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.setHandler(new DwarfHandler(this));
+ setTimeline(new Timeline(new KeyFrame(Duration.millis(20), this.getHandler())));
+ getTimeline().setCycleCount(Animation.INDEFINITE);
+ Platform.runLater(() -> {
+ getGroup().getChildren().add(itemLabel);
+ });
+ Platform.runLater(this::updateItemLabel);
+ itemLabel.setStyle("-fx-text-fill: white; -fx-font-size: 16px; -fx-background-color: grey");
}
public Dwarf() {
@@ -51,18 +80,25 @@ public class Dwarf extends Immigrant {
public Dwarf(Immigrant immigrant, Fortress fortress) {
this(immigrant.getFirstName(), immigrant.getLastName(), immigrant.getAge(), immigrant.getX(), immigrant.getY(), immigrant.getAbility());
- this.setItems((ArrayList<String>) immigrant.getItems().clone());
+ this.setItems(new HashMap<>(immigrant.getItems()));
this.setHp(this.getHp());
this.setMaxHp(this.getMaxHp());
this.fortress = fortress;
}
+ public void updateItemLabel() {
+ itemLabel.setText(this.getItems().entrySet().stream().map(item -> String.format("%s (%d)", item.getKey().toString(), item.getValue())).collect(Collectors.joining("|")));
+ }
+
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());
+// System.out.println(fortress.getWorkstations());
+ ArrayList<Workstation> searchWorkstations = (ArrayList<Workstation>) fortress.getWorkstations().stream().filter(w ->
+ w.getDwarves().size() <= 3 && w.getRequiredAbility() == this.getAbility()
+ ).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())))));
if (searchWorkstations.isEmpty()) {
return null;
@@ -72,7 +108,9 @@ 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());
+ ArrayList<ThroneRoom> searchThroneRooms = (ArrayList<ThroneRoom>) fortress.getThroneRooms().stream().filter(w ->
+ fortress.getInsideGroup().getChildren().contains(w.getGroup()) && w.getNobels().size() <= 3
+ ).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;
@@ -81,15 +119,35 @@ public class Dwarf extends Immigrant {
}
}
+ public Fortress findNearestFortressToTrade(Item materialToSell, int amount) {
+ ArrayList<Fortress> searchFortresses = (ArrayList<Fortress>) Main.fortresses.clone();
+ searchFortresses.sort((o1, o2) -> {
+ return (int) ((Math.abs(o1.getX() - this.getX()) + Math.abs(o1.getY() - this.getY())) - (Math.abs(o2.getX() - this.getX()) + Math.abs(o2.getY() - this.getY())));
+ });
+ return searchFortresses.stream().filter(f -> {
+ if (f == this.fortress) return false;
+
+ switch (materialToSell) {
+ case WOOD -> {
+ return f.getStoneCount() >= amount;
+ }
+ case STONE -> {
+ return f.getWoodCount() >= amount;
+ }
+ }
+ return false;
+ }).findFirst().orElse(null);
+ }
+
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();
+ double workstationY = workstation.getGroup().getLayoutY() + workstation.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight();
return new Coordinates(workstationX, workstationY);
}
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();
+ double throneRoomX = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getWidth() / 2 + this.getGroup().getBoundsInParent().getWidth();
+ double throneRoomY = throneRoom.getGroup().getLayoutY() + throneRoom.getGroup().getBoundsInParent().getHeight() / 2 + this.getGroup().getBoundsInParent().getHeight();
return new Coordinates(throneRoomX, throneRoomY);
}
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 2c86526..b915105 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
@@ -1,5 +1,10 @@
package space.m0e.quga.oop.lab56maven.entities.micro;
+import javafx.animation.Animation;
+import javafx.animation.KeyFrame;
+import javafx.animation.Timeline;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
@@ -7,18 +12,17 @@ import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
+import javafx.util.Duration;
import space.m0e.quga.oop.lab56maven.dialogs.ChangeDialog;
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.common.Item;
import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
-import space.m0e.quga.oop.lab56maven.threads.ImmigrantThread;
+import space.m0e.quga.oop.lab56maven.handlers.ImmigrantHandler;
import java.io.IOException;
import java.util.*;
-import java.util.concurrent.ForkJoinTask;
-import java.util.function.Function;
-import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Immigrant implements Comparable<Immigrant>, Cloneable {
@@ -29,8 +33,16 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
private double y;
private Ability ability;
- private ArrayList<String> items = new ArrayList<>();
- private static final String[] availableItems = new String[]{"axe", "pickaxe", "shovel", "piece of coal", "wood log"};
+ public HashMap<Item, Integer> getItems() {
+ return items;
+ }
+
+ public void setItems(HashMap<Item, Integer> items) {
+ this.items = items;
+ }
+
+ private HashMap<Item, Integer> items = new HashMap<Item, Integer>();
+// private static final String[] availableItems = new String[]{"axe", "pickaxe", "shovel", "piece of coal", "wood log"};
private double hp;
private double maxHp;
@@ -45,11 +57,24 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
private final Rectangle hpBar;
private static final Image spriteImage = new Image(Objects.requireNonNull(Immigrant.class.getResourceAsStream("immigrant.png")));
- public void setThread(Thread thread) {
- this.thread = thread;
+ public Timeline getTimeline() {
+ return timeline;
+ }
+
+ public void setTimeline(Timeline timeline) {
+ this.timeline = timeline;
+ }
+
+ public EventHandler<ActionEvent> getHandler() {
+ return handler;
+ }
+
+ public void setHandler(EventHandler<ActionEvent> handler) {
+ this.handler = handler;
}
- private Thread thread;
+ private EventHandler<ActionEvent> handler = new ImmigrantHandler(this);
+ private Timeline timeline = new Timeline(new KeyFrame(Duration.millis(20), this.handler));
public Immigrant(String firstName, String lastName, int age, double x, double y, Ability ability) {
this.firstName = firstName;
@@ -60,6 +85,7 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
this.ability = ability;
this.label = new Label(firstName + " " + lastName);
+ this.label.setStyle("-fx-text-fill: white; -fx-font-size: 16px; -fx-background-color: grey");
this.sprite = new ImageView(spriteImage);
this.hpBar = new Rectangle(50, 10);
this.hpBar.widthProperty().multiply(this.hp/this.maxHp);
@@ -83,7 +109,7 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
}
}
});
- this.thread = new ImmigrantThread(this);
+ getTimeline().setCycleCount(Animation.INDEFINITE);
Main.root.getChildren().add(this.getGroup());
}
@@ -101,7 +127,10 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
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(";")));
+ Arrays.stream(params[7].split(";")).forEach(rawItem -> {
+ String[] item = rawItem.split("=");
+ items.put(Item.valueOf(item[0]), Integer.parseInt(item[1]));
+ });
this.ability = Ability.valueOf(params[8]);
}
@@ -125,13 +154,6 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
this.ability = ability;
}
- public ArrayList<String> getItems() {
- return items;
- }
-
- public void setItems(ArrayList<String> items) {
- this.items = items;
- }
static {
hpCap = 100 + new Random().nextInt(50);
@@ -140,10 +162,10 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
{
maxHp = 50 + new Random().nextInt(100);
hp = maxHp;
- int itemCount = new Random().nextInt(1, availableItems.length);
- ArrayList<String> itemPick = new ArrayList<String>(List.of(availableItems));
- Collections.shuffle(itemPick);
- items = (ArrayList<String>) itemPick.stream().limit(itemCount).collect(Collectors.toList());
+ List<Item> tools = new ArrayList<>(List.of(Item.AXE, Item.PICKAXE, Item.SWORD));
+ int itemCount = new Random().nextInt(1, tools.size());
+ Collections.shuffle(tools);
+ tools.stream().limit(itemCount).forEach(tool -> items.put(tool, 1));
}
public String getFullName() {
@@ -221,7 +243,16 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
@Override
public String toString() {
- return String.format("%s{Name=%s, Age=%d, Ability=%s, HP: %f/%f, Items: [%s], Position=(%f,%f)}", this.getClass().getSimpleName(), this.getFullName(), this.age, this.ability, this.hp, this.maxHp, String.join(", ", this.items), getX(), getY());
+ return String.format("%s{Name=%s, Age=%d, Ability=%s, HP: %f/%f, Items: [%s], Position=(%f,%f)}",
+ this.getClass().getSimpleName(),
+ this.getFullName(),
+ this.age,
+ this.ability,
+ this.hp,
+ this.maxHp,
+ items.entrySet().stream().map(item -> String.format("%s (%d)", item.getKey().toString(), item.getValue())).collect(Collectors.joining(", ")),
+ getX(),
+ getY());
}
@Override
@@ -318,19 +349,19 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
double pointY = coordinates.getY();
if (pointX > this.getX()) {
- this.setX(this.getX() + 1);
+ this.setX(this.getX() + 2);
}
if (pointX < this.getX()) {
- this.setX(this.getX() - 1);
+ this.setX(this.getX() - 2);
}
if (pointY > this.getY()) {
- this.setY(this.getY() + 1);
+ this.setY(this.getY() + 2);
}
if (pointY < this.getY()) {
- this.setY(this.getY() - 1);
+ this.setY(this.getY() - 2);
}
}
}
@@ -343,14 +374,10 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
@Override
public Immigrant clone() throws CloneNotSupportedException {
Immigrant immigrant = (Immigrant) super.clone();
- immigrant.setItems((ArrayList<String>) this.items.clone());
+ immigrant.setItems(new HashMap<>(this.getItems()));
return immigrant;
}
- public Thread getThread() {
- return thread;
- }
-
public String serialize() {
return String.join(",", new String[]{
this.getClass().getSimpleName(),
@@ -360,7 +387,7 @@ public class Immigrant implements Comparable<Immigrant>, Cloneable {
String.valueOf(this.getAge()),
String.valueOf(this.getHp()),
String.valueOf(this.getMaxHp()),
- String.join(";", this.getItems()),
+ this.getItems().entrySet().stream().map(item -> String.format("%s=%d", item.getKey(), item.getValue())).collect(Collectors.joining(";")),
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 3de303d..431f067 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
@@ -1,9 +1,15 @@
package space.m0e.quga.oop.lab56maven.entities.micro;
+import javafx.animation.Animation;
+import javafx.animation.KeyFrame;
+import javafx.animation.Timeline;
import javafx.scene.image.Image;
+import javafx.util.Duration;
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 space.m0e.quga.oop.lab56maven.handlers.DwarfHandler;
+import space.m0e.quga.oop.lab56maven.handlers.NobelHandler;
import java.util.ArrayList;
import java.util.Objects;
@@ -21,12 +27,17 @@ public class Nobel extends Dwarf {
this("Edzul", "Èrithbesmar", 35, 0, 0, Ability.values()[new Random().nextInt(Ability.values().length)]);
}
- public Nobel(Immigrant immigrant, ThroneRoom throneRoom) {
+ public Nobel(Dwarf immigrant, ThroneRoom throneRoom) {
this(immigrant.getFirstName(), immigrant.getLastName(), immigrant.getAge(), immigrant.getX(), immigrant.getY(), immigrant.getAbility());
- this.setItems((ArrayList<String>) immigrant.getItems().clone());
+ this.setItems(immigrant.getItems());
this.setHp(this.getHp());
this.setMaxHp(this.getMaxHp());
+ this.setFortress(immigrant.getFortress());
this.throneRoom = throneRoom;
+
+ this.setHandler(new NobelHandler(this));
+ setTimeline(new Timeline(new KeyFrame(Duration.millis(20), this.getHandler())));
+ getTimeline().setCycleCount(Animation.INDEFINITE);
}
public Nobel(String serializedData) {
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java
new file mode 100644
index 0000000..7ba5466
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java
@@ -0,0 +1,141 @@
+package space.m0e.quga.oop.lab56maven.handlers;
+
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import space.m0e.quga.oop.lab56maven.Main;
+import space.m0e.quga.oop.lab56maven.decisions.*;
+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.common.Item;
+import space.m0e.quga.oop.lab56maven.entities.macro.Fortress;
+import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
+
+import java.util.Objects;
+import java.util.Random;
+
+public class DwarfHandler implements EventHandler<ActionEvent> {
+ public Dwarf getDwarf() {
+ return dwarf;
+ }
+
+ public int getTimer() {
+ return timer;
+ }
+
+ private int timer = 0;
+
+ public Decision getDecision() {
+ return decision;
+ }
+
+ public void setDecision(Decision decision) {
+ this.decision = decision;
+ }
+
+ private Decision decision;
+ private static final String[] availableDecisions = new String[]{
+ "GoToWorkstation",
+ "GoToDwarvesContainer",
+ "GoToThroneRoom",
+ "GoTrading"
+ };
+ private static String lastDecision;
+
+ public void setDwarf(Dwarf dwarf) {
+ this.dwarf = dwarf;
+ }
+
+ private Dwarf dwarf;
+
+ public DwarfHandler(Dwarf dwarf) {
+ super();
+// this.setName(String.format("DwarfThread_%s", dwarf.getFullName()));
+ this.dwarf = dwarf;
+ }
+
+ @Override
+ public void handle(ActionEvent e) {
+ if (dwarf != null && !dwarf.isActive()) {
+// try {
+// TimeUnit.MILLISECONDS.sleep(10);
+// } catch (InterruptedException e) {
+// break;
+// }
+ timer++;
+ if (dwarf.getFortress() == null) {
+ Fortress fortress = dwarf.findNearestFortress();
+ if (fortress != null) {
+ Coordinates moveTo = dwarf.getCoordinatesToFortress(fortress);
+ dwarf.move(moveTo);
+ if (moveTo.isThere(dwarf)) {
+ Platform.runLater(() -> {
+ dwarf.setFortress(fortress);
+ fortress.add(dwarf);
+ Main.root.getChildren().remove(dwarf.getGroup());
+ });
+ }
+ }
+ } 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 && dwarf.getAbility() != Ability.COMMUNICATION ) {
+ decision = new GoToWorkstationDecision(new Random().nextInt(timer + 200, timer + 500), dwarf);
+ }
+ }
+ case "GoToDwarvesContainer" -> {
+ if (dwarf.getFortress().contains(dwarf))
+ break;
+ 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);
+ }
+ }
+ case "GoTrading" -> {
+ if (dwarf.getAbility() == Ability.COMMUNICATION) {
+ Fortress fortress = dwarf.getFortress();
+ Item itemToTrade;
+ int amountToTrade;
+ if (fortress.getWoodCount() > 0 && fortress.getWoodCount() >= fortress.getStoneCount()) {
+ itemToTrade = Item.WOOD;
+ amountToTrade = new Random().nextInt(1, fortress.getWoodCount() / 2);
+ fortress.setWoodCount(fortress.getWoodCount() - amountToTrade);
+ } else if (fortress.getStoneCount() > 0 && fortress.getStoneCount() >= fortress.getWoodCount()) {
+ itemToTrade = Item.STONE;
+ amountToTrade = new Random().nextInt(1, fortress.getStoneCount() / 2);
+ fortress.setStoneCount(fortress.getStoneCount() - amountToTrade);
+ } else {
+ break;
+ }
+ if (dwarf.getItems().containsKey(itemToTrade)) {
+ dwarf.getItems().put(itemToTrade, dwarf.getItems().get(itemToTrade) + amountToTrade);
+ } else {
+ dwarf.getItems().put(itemToTrade, amountToTrade);
+ }
+ Platform.runLater(dwarf::updateItemLabel);
+ decision = new GoTradingDecision(new Random().nextInt(timer + 200, timer + 500), dwarf, itemToTrade, amountToTrade);
+ }
+ }
+ }
+ }
+ else {
+ if (decision.getExecuteWhen() < timer) {
+ decision.cycle();
+ }
+ if (decision.isComplete())
+ decision = null;
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java
new file mode 100644
index 0000000..fe9a3f0
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java
@@ -0,0 +1,52 @@
+package space.m0e.quga.oop.lab56maven.handlers;
+
+import javafx.animation.Timeline;
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+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.micro.Dwarf;
+import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant;
+
+public class ImmigrantHandler implements EventHandler<ActionEvent> {
+ public Immigrant getImmigrant() {
+ return immigrant;
+ }
+
+ public void setImmigrant(Immigrant immigrant) {
+ this.immigrant = immigrant;
+ }
+
+ private Immigrant immigrant;
+
+ public ImmigrantHandler(Immigrant immigrant) {
+ super();
+ this.immigrant = immigrant;
+ }
+
+ @Override
+ public void handle(ActionEvent e) {
+ if (immigrant != null && !immigrant.isActive()) {
+ Fortress fortress = immigrant.findNearestFortress();
+ if (fortress != null) {
+ Coordinates moveTo = immigrant.getCoordinatesToFortress(fortress);
+ immigrant.move(moveTo);
+ if (moveTo.isThere(immigrant)) {
+ Platform.runLater(() -> {
+ immigrant.getTimeline().stop();
+ Dwarf dwarf = new Dwarf(immigrant, fortress);
+ dwarf.getTimeline().play();
+ Main.immigrants.remove(immigrant);
+ Main.immigrants.add(dwarf);
+ fortress.add(dwarf);
+ Main.root.getChildren().remove(immigrant.getGroup());
+ });
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/NobelHandler.java b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/NobelHandler.java
new file mode 100644
index 0000000..abb84a2
--- /dev/null
+++ b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/NobelHandler.java
@@ -0,0 +1,72 @@
+package space.m0e.quga.oop.lab56maven.handlers;
+
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+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.macro.ThroneRoom;
+import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf;
+import space.m0e.quga.oop.lab56maven.entities.micro.Nobel;
+
+import java.util.Objects;
+import java.util.Random;
+
+public class NobelHandler implements EventHandler<ActionEvent> {
+ public Nobel getNobel() {
+ return nobel;
+ }
+
+ private int timer = 0;
+
+ public void setNobel(Nobel nobel) {
+ this.nobel = nobel;
+ }
+
+ private Nobel nobel;
+
+ public NobelHandler(Nobel nobel) {
+ super();
+ this.nobel = nobel;
+ }
+
+ @Override
+ public void handle(ActionEvent event) {
+ if (nobel != null && !nobel.isActive()) {
+ timer++;
+ if (nobel.getFortress() == null) {
+ Fortress fortress = nobel.findNearestFortress();
+ if (fortress != null) {
+ Coordinates moveToFortress = nobel.getCoordinatesToFortress(fortress);
+ nobel.move(moveToFortress);
+ if (moveToFortress.isThere(nobel)) {
+ Platform.runLater(() -> {
+ nobel.setFortress(fortress);
+ fortress.add(nobel);
+ fortress.removeFromContainer(nobel);
+ });
+ }
+
+ }
+ } else {
+ ThroneRoom throneRoom = nobel.findNearestThroneRoom();
+ if (throneRoom != null) {
+ Coordinates moveToThroneRoom = nobel.getCoordinatesToThroneRoom(throneRoom);
+ nobel.move(moveToThroneRoom);
+ if (moveToThroneRoom.isThere(nobel)) {
+ Platform.runLater(() -> {
+ throneRoom.add(nobel);
+ });
+ }
+ }
+ }
+ }
+ }
+
+
+}
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
deleted file mode 100644
index cffeeea..0000000
--- a/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java
+++ /dev/null
@@ -1,102 +0,0 @@
-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 {
- public Dwarf getDwarf() {
- 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;
- }
-
- private Dwarf dwarf;
-
- public DwarfThread(Dwarf dwarf) {
- super();
- this.setName(String.format("DwarfThread_%s", dwarf.getFullName()));
- this.dwarf = dwarf;
- }
-
- @Override
- public void run() {
- while (!isInterrupted()) {
- if (dwarf != null && !dwarf.isActive()) {
- try {
- TimeUnit.MILLISECONDS.sleep(10);
- } catch (InterruptedException e) {
- break;
- }
- timer++;
- if (dwarf.getFortress() == null) {
- Fortress fortress = dwarf.findNearestFortress();
- if (fortress != null) {
- Coordinates moveTo = dwarf.getCoordinatesToFortress(fortress);
- dwarf.move(moveTo);
- if (moveTo.isThere(dwarf)) {
- Platform.runLater(() -> {
- dwarf.setFortress(fortress);
- fortress.add(dwarf);
- Main.root.getChildren().remove(dwarf.getGroup());
- });
- }
- }
- } 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
deleted file mode 100644
index b3406d8..0000000
--- a/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package space.m0e.quga.oop.lab56maven.threads;
-
-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.micro.Dwarf;
-import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant;
-
-import java.util.concurrent.TimeUnit;
-
-public class ImmigrantThread extends Thread {
- public Immigrant getImmigrant() {
- return immigrant;
- }
-
- public void setImmigrant(Immigrant immigrant) {
- this.immigrant = immigrant;
- }
-
- private Immigrant immigrant;
-
- public ImmigrantThread(Immigrant immigrant) {
- super();
- this.setName(String.format("ImmigrantThread_%s", immigrant.getFullName()));
- this.immigrant = immigrant;
- }
-
- @Override
- public void run() {
- while (!isInterrupted()) {
- if (immigrant != null && !immigrant.isActive()) {
- try {
- TimeUnit.MILLISECONDS.sleep(10);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- Fortress fortress = immigrant.findNearestFortress();
- if (fortress != null) {
- Coordinates moveTo = immigrant.getCoordinatesToFortress(fortress);
- immigrant.move(moveTo);
- 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);
- Main.root.getChildren().remove(immigrant.getGroup());
- });
- this.interrupt();
- }
- }
- }
- }
- }
-
-
-}
diff --git a/src/main/resources/space/m0e/quga/oop/lab56maven/entities/macro/workstation.png b/src/main/resources/space/m0e/quga/oop/lab56maven/entities/macro/workstation_woodcutting.png
index 8ca4a3c..8ca4a3c 100644
--- a/src/main/resources/space/m0e/quga/oop/lab56maven/entities/macro/workstation.png
+++ b/src/main/resources/space/m0e/quga/oop/lab56maven/entities/macro/workstation_woodcutting.png
Binary files differ