diff options
| author | Andriy Cherniy <qugalet@m0e.space> | 2024-06-17 02:59:32 +0300 |
|---|---|---|
| committer | Andriy Cherniy <qugalet@m0e.space> | 2024-06-17 02:59:32 +0300 |
| commit | 3401d742ca53dce6bb1464cc12f94d107cfc285d (patch) | |
| tree | 4640d50fbbb738e6ae63dac87c0ade6bd21a9523 | |
| parent | fdfd7040a283b15d7c2346b6a20bda64900244b1 (diff) | |
| download | oop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.tar.gz oop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.zip | |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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 Binary files differindex 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 |
