summaryrefslogtreecommitdiff
path: root/src/main/java/space/m0e/quga/oop/lab56maven/entities
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 /src/main/java/space/m0e/quga/oop/lab56maven/entities
parentfdfd7040a283b15d7c2346b6a20bda64900244b1 (diff)
downloadoop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.tar.gz
oop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.zip
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Diffstat (limited to 'src/main/java/space/m0e/quga/oop/lab56maven/entities')
-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
9 files changed, 284 insertions, 52 deletions
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) {