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 /src/main/java/space/m0e/quga/oop/lab56maven/entities | |
| parent | fdfd7040a283b15d7c2346b6a20bda64900244b1 (diff) | |
| download | oop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.tar.gz oop-kursach-3401d742ca53dce6bb1464cc12f94d107cfc285d.zip | |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Diffstat (limited to 'src/main/java/space/m0e/quga/oop/lab56maven/entities')
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) { |
