package space.m0e.quga.oop.lab56maven; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Label; import javafx.scene.input.KeyCode; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.FileChooser; import javafx.stage.Stage; import space.m0e.quga.oop.lab56maven.dialogs.CountDialog; import space.m0e.quga.oop.lab56maven.dialogs.InsertDialog; import space.m0e.quga.oop.lab56maven.dialogs.SearchDialog; import space.m0e.quga.oop.lab56maven.entities.common.Ability; import space.m0e.quga.oop.lab56maven.entities.common.Utils; import space.m0e.quga.oop.lab56maven.entities.macro.Fortress; import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom; import space.m0e.quga.oop.lab56maven.entities.macro.Workstation; import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf; import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant; import space.m0e.quga.oop.lab56maven.entities.micro.Nobel; import space.m0e.quga.oop.lab56maven.threads.DwarfThread; import space.m0e.quga.oop.lab56maven.threads.ImmigrantThread; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class Main extends Application { public static Group root = new Group(); public static ArrayList immigrants = new ArrayList<>(); public static ArrayList fortresses = new ArrayList<>(); public static Label status = new Label(); public static final double width = 3555; public static final double height = 2000; @Override public void start(Stage stage) throws IOException, InterruptedException { Rectangle rect = new Rectangle(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")))); fortresses.add(fortress); immigrants.add(new Immigrant("1", "0", 50, 0,0, Ability.MASONIST)); immigrants.getFirst().setX(100); immigrants.getFirst().setY(100); root.getChildren().add(status); Scene scene = new Scene(root, width/4, height/4); scene.setOnKeyPressed(event -> { switch (event.getCode()) { case LEFT -> moveImmigrants(-10, 0); case RIGHT -> moveImmigrants(10, 0); case UP -> moveImmigrants(0, -10); case DOWN -> moveImmigrants(0, 10); case INSERT -> { try { InsertDialog.display(); } catch (IOException e) { e.printStackTrace(); } } case DELETE -> { Iterator iterator = immigrants.iterator(); while (iterator.hasNext()) { Immigrant immigrant = iterator.next(); if (immigrant.isActive()) { iterator.remove(); root.getChildren().remove(immigrant.getGroup()); } } processImmigrants(); } case ESCAPE -> { immigrants.forEach(immigrant -> { immigrant.setActive(false); }); } case END -> { immigrants.stream().filter(immigrant -> immigrant.isActive() && immigrant instanceof Dwarf).forEach(immigrant -> { Dwarf dwarf = (Dwarf) immigrant; if (dwarf.getFortress() != null) Platform.runLater(() -> { dwarf.setX(dwarf.getFortress().getX()-50); dwarf.setY(dwarf.getFortress().getY()-50); dwarf.setActive(false); dwarf.free(); }); }); } case F -> { try { SearchDialog.display(); } catch (IOException e) { e.printStackTrace(); } } case C -> { try { CountDialog.display(); } catch (IOException e) { e.printStackTrace(); } } case TAB -> { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Object list"); alert.setHeaderText("Object list"); alert.setContentText(immigrants.stream().map(Immigrant::toString).collect(Collectors.joining("\n"))); alert.showAndWait(); } case W -> { if (root.getLayoutY() + 20 <= 0) root.setLayoutY(root.getLayoutY()+20); } case S -> { if (root.getLayoutY() - 20 - stage.getHeight() >= -height) root.setLayoutY(root.getLayoutY()-20); } case A -> { if (root.getLayoutX() + 20 <= 0) root.setLayoutX(root.getLayoutX()+20); } case D -> { if (root.getLayoutX() - 20 - stage.getWidth() >= -width) root.setLayoutX(root.getLayoutX()-20); } case F5 -> { File file = fileChooser.showSaveDialog(stage); String finalSerializeData = ""; // "class,name,age,hp,max_hp,items,x,y\n"; finalSerializeData += immigrants.stream().map(Immigrant::serialize).collect(Collectors.joining("\n")); finalSerializeData += "\n" + fortresses.stream().map(Fortress::serialize).collect(Collectors.joining("\n")); System.out.println(finalSerializeData); try { BufferedWriter writer = new BufferedWriter(new FileWriter(file)); writer.write(finalSerializeData); writer.close(); } catch (Exception e) { e.printStackTrace(); } } case F6 -> { File file = fileChooser.showOpenDialog(stage); try { immigrants.forEach(immigrant -> { if (Main.root.getChildren().contains(immigrant.getGroup())) { Main.root.getChildren().remove(immigrant.getGroup()); } else { fortresses.forEach(fortress1 -> { fortress1.removeFromContainer((Dwarf) immigrant); fortress1.remove((Dwarf) immigrant); }); } immigrant.getThread().interrupt(); }); immigrants.clear(); StringBuilder finalDeserializeData = new StringBuilder(); BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { finalDeserializeData.append(line).append("\n"); } Arrays.stream(finalDeserializeData.toString().split("\n")).forEach(data -> { String[] params = data.split(","); switch (params[0]) { case "Immigrant" -> { Immigrant immigrant = new Immigrant(data); immigrant.setThread(new ImmigrantThread(immigrant)); immigrant.getThread().start(); immigrants.add(immigrant); } case "Dwarf" -> { Dwarf dwarf = new Dwarf(data); dwarf.setThread(new DwarfThread(dwarf)); dwarf.getThread().start(); immigrants.add(dwarf); } case "Nobel" -> { Dwarf nobel = new Nobel(data); nobel.setThread(new DwarfThread(nobel)); nobel.getThread().start(); immigrants.add(nobel); } } }); } catch (Exception e) { e.printStackTrace(); } } } }); root.setOnMouseClicked(event -> { switch (event.getButton()) { case SECONDARY -> { try { Utils.findImmigrants("Dwarves outside MacroObjects:", immigrant -> fortresses.stream().noneMatch(fortress1 -> fortress1.getDwarves().contains(immigrant))); } catch (IOException e) { e.printStackTrace(); } } } }); stage.setTitle("Hello!"); stage.setScene(scene); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleWithFixedDelay(() -> immigrants.forEach(immigrant -> { immigrant.getThread().start(); }), 1, 1, TimeUnit.SECONDS); stage.show(); } private void moveImmigrants(double dx, double dy) { immigrants.forEach(immigrant -> { if (immigrant.isActive()) { Platform.runLater(() -> { immigrant.setX(immigrant.getX() + dx); immigrant.setY(immigrant.getY() + dy); }); } }); } public static void processImmigrants() { status.setText("Active:"); immigrants.forEach(immigrant -> { if (immigrant.isActive()) { status.setText(status.getText() + " " + immigrant.getFullName()); } }); } public static void main(String[] args) { launch(); } }