diff options
| author | sowgro <tpoke.ferrari@gmail.com> | 2024-07-14 03:40:03 -0400 | 
|---|---|---|
| committer | sowgro <tpoke.ferrari@gmail.com> | 2024-07-14 03:40:03 -0400 | 
| commit | 550701557c1e021e45bddff92ad1a2e8c808e8e0 (patch) | |
| tree | 219c5979d3b30843b88336ae755dd8e45a1e5471 /src/main | |
| parent | cf8f3d35716cd93d0d5d123d80b07f9ae704f939 (diff) | |
| download | NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.tar.gz NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.tar.bz2 NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.zip | |
NEW LEVEL EDITOR!!!!
Diffstat (limited to 'src/main')
17 files changed, 969 insertions, 166 deletions
| diff --git a/src/main/java/net/sowgro/npehero/Driver.java b/src/main/java/net/sowgro/npehero/Driver.java index 262f441..fded71c 100755 --- a/src/main/java/net/sowgro/npehero/Driver.java +++ b/src/main/java/net/sowgro/npehero/Driver.java @@ -15,17 +15,15 @@ import javafx.scene.layout.BackgroundRepeat;  import javafx.scene.layout.BackgroundSize;  import javafx.scene.layout.Pane;  import javafx.stage.Stage; -import net.sowgro.npehero.devmenu.DebugMenu;  import net.sowgro.npehero.gui.MainMenu;  import net.sowgro.npehero.main.LevelController;  import net.sowgro.npehero.main.SettingsController;  import net.sowgro.npehero.main.SoundController;  import java.net.URL; -import java.util.Objects; -public class Driver extends Application  +public class Driver extends Application  {      public static Stage primaryStage; diff --git a/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java b/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java index 4bb55e4..74cfab6 100755 --- a/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java +++ b/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java @@ -1,52 +1,57 @@  package net.sowgro.npehero.devmenu; -import java.io.FileNotFoundException; -import java.io.UnsupportedEncodingException; - +import javafx.beans.binding.DoubleBinding; +import javafx.geometry.Pos; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane; +import javafx.scene.paint.Color;  import net.sowgro.npehero.Driver; +import net.sowgro.npehero.gameplay.Block;  import net.sowgro.npehero.gui.LevelSurround; -import net.sowgro.npehero.gui.MainMenu; -import javafx.scene.Scene;  import javafx.scene.control.Button;  import javafx.scene.control.TextField;  import javafx.scene.layout.VBox;  import javafx.scene.text.Text; -import javafx.stage.Stage;  import net.sowgro.npehero.main.Difficulty; +import net.sowgro.npehero.main.Note;  public class DiffEditor extends Pane  { +    Difficulty diff; +    ScrollPane scroll; + +    public Pane prev;      /*       * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.       * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.       * style classes are defined in the style.css file.       */ -    public DiffEditor(Difficulty diff) +    public DiffEditor(Difficulty diff, Pane prev)      { -        Stage primaryStage = new Stage(); +        this.diff = diff; +        this.prev = prev; -        Text folderNameLabel = new Text("Folder name (ordered alphabetically)"); +        Text folderNameLabel = new Text("Folder name");          TextField folderName = new TextField(diff.thisDir.getName());          folderName.setDisable(true);          Text titleLabel = new Text("Title");          TextField title = new TextField(diff.title); -        Text bpmLabel = new Text("BPM"); -        TextField bpm = new TextField(diff.bpm+""); - -        Text numBeatsLabel = new Text("Number of beats (set by notes editor)"); -        TextField numBeats = new TextField(diff.numBeats+""); - -        Text priorityLabel = new Text("priority (lower first)"); +        Text priorityLabel = new Text("Order (lower first)");          TextField priority = new TextField(diff.priority+"");          Button editNotes = new Button("Edit notes");          editNotes.setOnAction(e -> { +            Driver.setMenu(new NotesEditor2(diff, this)); +        }); + +        Button oldEditNotes = new Button("Edit notes (legacy)"); +        oldEditNotes.setOnAction(_ -> {              try { -                new NotesEditor(diff); -            } catch (FileNotFoundException | UnsupportedEncodingException e1) { +                Driver.setMenu(new NotesEditor(diff, this)); +            } catch (Exception e1) {                  e1.printStackTrace();              }          }); @@ -54,28 +59,86 @@ public class DiffEditor extends Pane          Button editScores = new Button("Clear leaderboard");          editScores.setOnAction(e -> diff.getLeaderboard().clear()); -        Button playLevel = new Button("Launch level"); -        playLevel.setOnAction(e -> Driver.setMenu(new LevelSurround(diff.level, diff, new MainMenu()))); - -        Button refresh = new Button("Refresh"); -        refresh.setOnAction( e -> { -            numBeats.setText(diff.numBeats+""); -        }); +        Button playLevel = new Button("Play level"); +        playLevel.setOnAction(e -> Driver.setMenu(new LevelSurround(diff.level, diff, this)));          Button save = new Button("Save"); -        save.setOnAction(e -> { //assigns text feilds to values +        save.setOnAction(e -> { //assigns text fields to values              diff.title = title.getText(); -            diff.bpm = Double.parseDouble(bpm.getText()); -            diff.numBeats = Integer.parseInt(numBeats.getText()); +//            diff.bpm = Double.parseDouble(bpm.getText()); +//            diff.numBeats = Integer.parseInt(numBeats.getText());              diff.priority = Integer.parseInt(priority.getText());              diff.writeMetadata();          }); -        VBox main = new VBox(); -        main.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,bpmLabel,bpm,numBeatsLabel,numBeats,refresh,priorityLabel,priority,editNotes,editScores,playLevel,save); -//        Scene scene = new Scene(main); -//        primaryStage.setScene(scene); -//        primaryStage.show(); -        super.getChildren().add(main); +        HBox content = new HBox(); +        ScrollPane scroll = new ScrollPane(content); +        this.scroll = scroll; +        scroll.getStyleClass().remove("scroll-pane"); +        scroll.getStyleClass().add("box"); +        scroll.setPrefHeight(400); + +        Pane[] lanes = new Pane[5]; +        for (int i = 0; i < lanes.length; i++) { +            lanes[i] = new Pane(); +        } + +        content.getChildren().addAll(lanes); + +        diff.notes.list.forEach(n -> lanes[n.lane].getChildren().add(drawNote(n))); + +        VBox notePreview = new VBox(scroll); +        notePreview.getChildren().addAll(editNotes,oldEditNotes); +        notePreview.setSpacing(10); + +        VBox left = new VBox(); +        left.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,priorityLabel,priority,editScores,playLevel,save); +        left.setSpacing(10); + +        HBox main = new HBox(); +        main.getChildren().addAll(left, notePreview); +        main.setSpacing(30); + +        Button exit = new Button(); +        exit.setText("Back"); +        exit.setOnAction(e -> { +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(prev); +        }); + +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(main,exit); +        centerBox.setMinWidth(400); + +        HBox rootBox = new HBox(); +        rootBox.prefWidthProperty().bind(super.prefWidthProperty()); +        rootBox.prefHeightProperty().bind(super.prefHeightProperty()); +        rootBox.getChildren().add(centerBox); +        rootBox.setAlignment(Pos.CENTER); + +        super.getChildren().add(rootBox); +    } + +    // Duplicates of NotesEditor2 methods, should be made generic and combined +    private Block drawNote(Note n) { +        Color color = diff.level.colors[n.lane]; +        Block b = new Block(color,20, 20, 5, false, n); +        b.heightProperty().bind(scroll.widthProperty().divide(8)); +        b.widthProperty().bind(scroll.widthProperty().divide(8)); +        b.arcHeightProperty().bind(scroll.widthProperty().divide(25)); +        b.arcWidthProperty().bind(scroll.widthProperty().divide(25)); +        b.strokeWidthProperty().bind(scroll.widthProperty().divide(120)); +        b.layoutYProperty().bind(secondToScreenPos(n.time.add(0))); +        return b; +    } + +    private DoubleBinding secondToScreenPos(double second) { +        return scroll.heightProperty().multiply(second * 0.9); +    } + +    private DoubleBinding secondToScreenPos(DoubleBinding second) { +        return scroll.heightProperty().multiply(second).multiply(0.9);      }  }
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/devmenu/DiffList.java b/src/main/java/net/sowgro/npehero/devmenu/DiffList.java new file mode 100755 index 0000000..be4126d --- /dev/null +++ b/src/main/java/net/sowgro/npehero/devmenu/DiffList.java @@ -0,0 +1,129 @@ +package net.sowgro.npehero.devmenu; + +import javafx.beans.property.ReadOnlyBooleanWrapper; +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; +import net.sowgro.npehero.Driver; +import net.sowgro.npehero.main.Difficulty; +import net.sowgro.npehero.main.Level; + +public class DiffList extends Pane +{ +    /* +     * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes. +     * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature. +     * style classes are defined in the style.css file. +     */ +    public DiffList(Level level, Pane prev) +    { +        //sets up table view: requires special getters, setters and constructors to work +        TableView<Difficulty> diffs = new TableView<>(); + +        TableColumn<Difficulty,String> titleCol = new TableColumn<>("Name"); +        TableColumn<Difficulty,Boolean> validCol = new TableColumn<>("Valid?"); + +        diffs.getColumns().add(titleCol); +        diffs.getColumns().add(validCol); + +        titleCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getTitle())); +        validCol.setCellValueFactory(data -> new ReadOnlyBooleanWrapper(data.getValue().isValid())); + +        diffs.setItems(level.getDiffList()); + +        diffs.setRowFactory( _ -> { +            TableRow<Difficulty> row = new TableRow<>(); +            row.setOnMouseClicked(event -> { +                if (event.getClickCount() == 2 && (! row.isEmpty()) ) { +                    Difficulty rowData = row.getItem(); +                    Driver.setMenu(new DiffEditor(rowData, this)); +                } +            }); +            return row ; +        }); + +//        diffs.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35)); +        diffs.setPrefWidth(400); +        diffs.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.67)); + +        Button edit = new Button("Edit"); +        edit.setOnAction(e -> Driver.setMenu(new DiffEditor(diffs.getSelectionModel().getSelectedItem(), this))); +        edit.setDisable(true); +        edit.disableProperty().bind(diffs.getSelectionModel().selectedItemProperty().isNull()); + +        Button remove = new Button("Delete"); +        remove.setOnAction(e -> level.removeDiff(diffs.getSelectionModel().getSelectedItem())); +        remove.setDisable(true); +        remove.disableProperty().bind(diffs.getSelectionModel().selectedItemProperty().isNull()); + +        Button refresh = new Button("Refresh"); +        refresh.setOnAction(e -> { +            level.readData(); +            diffs.setItems(level.getDiffList()); +        }); + +        ToggleButton create = new ToggleButton("Create"); + +        VBox buttons = new VBox(); +        buttons.getChildren().addAll(create, edit, remove, refresh); +        buttons.setSpacing(10); + +        TextField newLevelEntry = new TextField(); +        Button newLevelButton = new Button("add"); + +        HBox newLevel = new HBox(newLevelEntry,newLevelButton); +        Label newLevelLabel = new Label("Name of new difficulty"); +        VBox newLevelBox = new VBox(newLevelLabel, newLevel); +        newLevelBox.setSpacing(10); +        newLevelBox.getStyleClass().add("box"); +        newLevelBox.setPadding(new Insets(10)); + +        Pane sidebar = new Pane(); + +        HBox main = new HBox(); +        main.getChildren().addAll(diffs,buttons, sidebar); +        main.setSpacing(10); + +        Button exit = new Button(); +        exit.setText("Back"); +        exit.setOnAction(e -> { +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(prev); +        }); + +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(main,exit); + +        HBox rootBox = new HBox(); +        rootBox.prefWidthProperty().bind(super.prefWidthProperty()); +        rootBox.prefHeightProperty().bind(super.prefHeightProperty()); +        rootBox.getChildren().add(centerBox); +        rootBox.setAlignment(Pos.CENTER); + +        create.setOnAction(_ -> { +            if (create.isSelected()) { +                sidebar.getChildren().add(newLevelBox); +            } +            else { +                sidebar.getChildren().remove(newLevelBox); +            } +        }); + +        newLevelButton.setOnAction(_ -> { +            level.addDiff(newLevelEntry.getText()); +            newLevelEntry.clear(); +            refresh.fire(); +            sidebar.getChildren().clear(); +            create.setSelected(false); +        }); + +        super.getChildren().add(rootBox); +    } + +}
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java b/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java index bd8bde6..e5ecf1c 100755 --- a/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java +++ b/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java @@ -4,18 +4,13 @@ import java.io.File;  import javafx.beans.property.ReadOnlyBooleanWrapper;  import javafx.beans.property.ReadOnlyStringWrapper; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.ColorPicker; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; +import javafx.geometry.Pos; +import javafx.scene.control.*;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import javafx.scene.layout.VBox;  import javafx.scene.text.Text;  import javafx.stage.FileChooser; -import javafx.stage.Stage;  import javafx.stage.FileChooser.ExtensionFilter;  import net.sowgro.npehero.Driver;  import net.sowgro.npehero.main.Difficulty; @@ -32,11 +27,14 @@ public class LevelEditor extends Pane       * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.       * style classes are defined in the style.css file.       */ -    public LevelEditor(Level level) +    public LevelEditor(Level level, Pane prev)      {          Text folderNameLabel = new Text("Folder name"); -        TextField folderName = new TextField(level.thisDir.getName()); -        folderName.setDisable(true); +        TextField folderName = new TextField(); +        if (level.thisDir != null) { +            folderName.setText(level.thisDir.getName()); +            folderName.setDisable(true); +        }          Text titleLabel = new Text("Title");          TextField title = new TextField(level.getTitle()); @@ -47,12 +45,22 @@ public class LevelEditor extends Pane          Text descLabel = new Text("Description");          TextField desc = new TextField(level.desc); -        Text colorsLabel = new Text("Colors (Left to right)"); -        ColorPicker c1 = new ColorPicker(level.colors[0]); -        ColorPicker c2 = new ColorPicker(level.colors[1]); -        ColorPicker c3 = new ColorPicker(level.colors[2]); -        ColorPicker c4 = new ColorPicker(level.colors[3]); -        ColorPicker c5 = new ColorPicker(level.colors[4]); +        Text colorsLabel = new Text("Colors"); + +        ColorPicker[] colorsPickers = new ColorPicker[] { +                new ColorPicker(level.colors[0]), +                new ColorPicker(level.colors[1]), +                new ColorPicker(level.colors[2]), +                new ColorPicker(level.colors[3]), +                new ColorPicker(level.colors[4]) +        }; + +        for (ColorPicker cp : colorsPickers) { +            cp.getStyleClass().add("button"); +        } + +        HBox colorPickerBox = new HBox(); +        colorPickerBox.getChildren().addAll(colorsPickers);          Text filesLabel = new Text("Files"); @@ -73,10 +81,10 @@ public class LevelEditor extends Pane          Text diffLabel = new Text("Difficulties"); -        TableView<Difficulty> diffList = new TableView<Difficulty>(); -         -        TableColumn<Difficulty,String> diffCol = new TableColumn<Difficulty,String>("Difficulty"); -        TableColumn<Difficulty,Boolean> validCol = new TableColumn<Difficulty,Boolean>("Valid?"); +        TableView<Difficulty> diffList = new TableView<>(); + +        TableColumn<Difficulty,String> diffCol = new TableColumn<>("Difficulty"); +        TableColumn<Difficulty,Boolean> validCol = new TableColumn<>("Valid?");          diffList.getColumns().add(diffCol);          diffList.getColumns().add(validCol); @@ -85,39 +93,39 @@ public class LevelEditor extends Pane          validCol.setCellValueFactory(data -> new ReadOnlyBooleanWrapper(data.getValue().isValid));          diffList.setItems(level.getDiffList()); -         -        Button edit = new Button("Edit"); -        edit.setOnAction(e -> Driver.setMenu(new DiffEditor(diffList.getSelectionModel().getSelectedItem()))); - -        Button remove = new Button("Delete"); -        remove.setOnAction(e -> level.removeDiff(diffList.getSelectionModel().getSelectedItem())); - -        Button refresh = new Button("Refresh"); -        refresh.setOnAction(e -> { -            level.readData(); -            diffList.setItems(level.getDiffList()); +        diffList.setRowFactory( _ -> { +            TableRow<Difficulty> row = new TableRow<>(); +            row.setOnMouseClicked(event -> { +                if (event.getClickCount() == 2 && (! row.isEmpty()) ) { +                    Difficulty rowData = row.getItem(); +                    Driver.setMenu(new DiffEditor(rowData, this)); +                } +            }); +            return row ;          }); -        HBox buttons = new HBox(); -        buttons.getChildren().addAll(edit,remove,refresh); -          TextField newDiff = new TextField("new");          Button newDiffButton = new Button("add");          newDiffButton.setOnAction(e -> level.addDiff(newDiff.getText()));          HBox newDiffBox = new HBox();          newDiffBox.getChildren().addAll(newDiff,newDiffButton); +        Button newDiffs = new Button("Edit difficulties"); +        newDiffs.setOnAction(_ -> Driver.setMenu(new DiffList(level, this))); + +        diffList.setSelectionModel(null); +          Button save = new Button("Save"); -        save.setOnAction(e -> { //asigns feilds to values +        save.setOnAction(e -> { //assigns fields to values              level.setTitle(title.getText());              level.setArtist(artist.getText());              level.desc = desc.getText(); -            level.colors[0] = c1.getValue(); -            level.colors[1] = c2.getValue(); -            level.colors[2] = c3.getValue(); -            level.colors[3] = c4.getValue(); -            level.colors[4] = c5.getValue(); +            level.colors[0] = colorsPickers[0].getValue(); +            level.colors[1] = colorsPickers[1].getValue(); +            level.colors[2] = colorsPickers[2].getValue(); +            level.colors[3] = colorsPickers[3].getValue(); +            level.colors[4] = colorsPickers[4].getValue();              if (selectedBackground != null && selectedBackground.exists())              {                  level.addFile(selectedBackground,"background.png"); @@ -135,14 +143,36 @@ public class LevelEditor extends Pane          VBox options = new VBox();          options.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,artistLabel,artist,descLabel,desc,colorsLabel, -            c1,c2,c3,c4,c5,filesLabel,previewButton,backgroundButton,songButton,save); +            colorPickerBox,filesLabel,previewButton,backgroundButton,songButton,save); +        options.setSpacing(10);          VBox diffBox = new VBox(); -        diffBox.getChildren().addAll(diffLabel,diffList,buttons,newDiffBox); +        diffBox.getChildren().addAll(diffLabel,diffList,/*buttons,newDiffBox,*/ newDiffs); +        diffBox.setSpacing(10);          HBox mainBox = new HBox();          mainBox.getChildren().addAll(options,diffBox); +        mainBox.setSpacing(30); + +        Button exit = new Button(); +        exit.setText("Back"); +        exit.setOnAction(e -> { +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(prev); +        }); + +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(mainBox,exit); +        centerBox.setMinWidth(400); + +        HBox rootBox = new HBox(); +        rootBox.prefWidthProperty().bind(super.prefWidthProperty()); +        rootBox.prefHeightProperty().bind(super.prefHeightProperty()); +        rootBox.getChildren().add(centerBox); +        rootBox.setAlignment(Pos.CENTER); -        super.getChildren().add(mainBox); +        super.getChildren().add(rootBox);      }  }
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/devmenu/LevelList.java b/src/main/java/net/sowgro/npehero/devmenu/LevelList.java index c1c38af..e37e2ea 100755 --- a/src/main/java/net/sowgro/npehero/devmenu/LevelList.java +++ b/src/main/java/net/sowgro/npehero/devmenu/LevelList.java @@ -2,16 +2,14 @@ package net.sowgro.npehero.devmenu;  import javafx.beans.property.ReadOnlyBooleanWrapper;  import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*;  import javafx.scene.layout.Pane;  import net.sowgro.npehero.Driver; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField;  import javafx.scene.layout.HBox;  import javafx.scene.layout.VBox; -import javafx.stage.Stage; +import net.sowgro.npehero.gui.MainMenu;  import net.sowgro.npehero.main.Level;  import net.sowgro.npehero.main.LevelController; @@ -25,10 +23,10 @@ public class LevelList extends Pane      public LevelList()      {          //sets up table view: requires special getters, setters and constructors to work -        TableView<Level> levels = new TableView<Level>(); +        TableView<Level> levels = new TableView<>(); -        TableColumn<Level,String> titleCol = new TableColumn<Level,String>("Title"); -        TableColumn<Level,String> artistCol = new TableColumn<Level,String>("Artist"); +        TableColumn<Level,String> titleCol = new TableColumn<>("Title"); +        TableColumn<Level,String> artistCol = new TableColumn<>("Artist");          TableColumn<Level,Boolean> validCol = new TableColumn<>("Valid?");          levels.getColumns().add(titleCol); @@ -41,12 +39,30 @@ public class LevelList extends Pane          levels.setItems(LevelController.getLevelList()); +        levels.setRowFactory( _ -> { +            TableRow<Level> row = new TableRow<>(); +            row.setOnMouseClicked(event -> { +                if (event.getClickCount() == 2 && (! row.isEmpty()) ) { +                    Level rowData = row.getItem(); +                    Driver.setMenu(new LevelEditor(rowData, this)); +                } +            }); +            return row ; +        }); + +        levels.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35)); +        levels.setMinWidth(400); +        levels.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));          Button edit = new Button("Edit"); -        edit.setOnAction(e -> Driver.setMenu(new LevelEditor(levels.getSelectionModel().getSelectedItem()))); +        edit.setOnAction(e -> Driver.setMenu(new LevelEditor(levels.getSelectionModel().getSelectedItem(), this))); +        edit.setDisable(true); +        edit.disableProperty().bind(levels.getSelectionModel().selectedItemProperty().isNull());          Button remove = new Button("Delete");          remove.setOnAction(e -> Driver.levelController.removeLevel(levels.getSelectionModel().getSelectedItem())); +        remove.setDisable(true); +        remove.disableProperty().bind(levels.getSelectionModel().selectedItemProperty().isNull());          Button refresh = new Button("Refresh");          refresh.setOnAction(e -> { @@ -54,17 +70,64 @@ public class LevelList extends Pane              levels.setItems(LevelController.getLevelList());          }); -        HBox buttons = new HBox(); -        buttons.getChildren().addAll(edit,remove,refresh); +        ToggleButton create = new ToggleButton("Create"); -        TextField newLevel = new TextField("new"); +        VBox buttons = new VBox(); +        buttons.getChildren().addAll(create, edit, remove, refresh); +        buttons.setSpacing(10); + +        TextField newLevelEntry = new TextField();          Button newLevelButton = new Button("add"); -        newLevelButton.setOnAction(e -> Driver.levelController.addLevel(newLevel.getText())); -        HBox newLevelBox = new HBox(); -        newLevelBox.getChildren().addAll(newLevel,newLevelButton); -        VBox main = new VBox(); -        main.getChildren().addAll(levels,buttons,newLevelBox); -        super.getChildren().add(main); +        HBox newLevel = new HBox(newLevelEntry,newLevelButton); +        Label newLevelLabel = new Label("Name of new level"); +        VBox newLevelBox = new VBox(newLevelLabel, newLevel); +        newLevelBox.setSpacing(10); +        newLevelBox.getStyleClass().add("box"); +        newLevelBox.setPadding(new Insets(10)); + +        Pane sidebar = new Pane(); + +        HBox main = new HBox(); +        main.getChildren().addAll(levels,buttons,sidebar); +        main.setSpacing(10); + +        Button exit = new Button(); +        exit.setText("Back"); +        exit.setOnAction(e -> { +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(new MainMenu()); +        }); + +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(main,exit); +        centerBox.setMinWidth(400); + +        HBox rootBox = new HBox(); +        rootBox.prefWidthProperty().bind(super.prefWidthProperty()); +        rootBox.prefHeightProperty().bind(super.prefHeightProperty()); +        rootBox.getChildren().add(centerBox); +        rootBox.setAlignment(Pos.CENTER); + +        create.setOnAction(_ -> { +            if (create.isSelected()) { +                sidebar.getChildren().add(newLevelBox); +            } +            else { +                sidebar.getChildren().remove(newLevelBox); +            } +        }); + +        newLevelButton.setOnAction(_ -> { +            Driver.levelController.addLevel(newLevelEntry.getText()); +            newLevelEntry.clear(); +            refresh.fire(); +            sidebar.getChildren().clear(); +            create.setSelected(false); +        }); + +        super.getChildren().add(rootBox);      }  }
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java index 39a2b8e..6f2721e 100755 --- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java +++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java @@ -4,6 +4,8 @@ import java.io.FileNotFoundException;  import java.io.PrintWriter;  import java.io.UnsupportedEncodingException; +import javafx.geometry.Pos; +import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import net.sowgro.npehero.gameplay.Timer;  import net.sowgro.npehero.Driver; @@ -12,18 +14,17 @@ import javafx.scene.control.Button;  import javafx.scene.input.KeyCode;  import javafx.scene.layout.VBox;  import javafx.scene.text.Text; -import javafx.stage.Stage;  import net.sowgro.npehero.main.Difficulty;  public class NotesEditor extends Pane  {      Text help; -    String t1 = "Press Start to begin recording. Use the same keys. Note: existing notes will be overwitten."; +    String t1 = "Press Start to begin recording. Use the same keys. Note: existing notes will be overwritten.";      String t2 = "Now recording. Press Stop or ESC to finish";      Difficulty diff;      Timer timer;      PrintWriter writer; -    public NotesEditor(Difficulty diff) throws FileNotFoundException, UnsupportedEncodingException +    public NotesEditor(Difficulty diff, Pane prev) throws FileNotFoundException, UnsupportedEncodingException      {          this.diff = diff; @@ -41,9 +42,28 @@ public class NotesEditor extends Pane          VBox main = new VBox();          main.getChildren().addAll(help,cur,start,stop); -        super.getChildren().add(main); +        Button exit = new Button(); +        exit.setText("Back"); +        exit.setOnAction(e -> { +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(prev); +        }); -        writer = new PrintWriter(diff.notes, "UTF-8"); +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(main,exit); +        centerBox.setMinWidth(400); + +        HBox rootBox = new HBox(); +        rootBox.prefWidthProperty().bind(super.prefWidthProperty()); +        rootBox.prefHeightProperty().bind(super.prefHeightProperty()); +        rootBox.getChildren().add(centerBox); +        rootBox.setAlignment(Pos.CENTER); + +        super.getChildren().add(rootBox); + +        writer = new PrintWriter(diff.notes.getFile(), "UTF-8");          Scene scene = Driver.primaryStage.getScene();          scene.setOnKeyPressed(e -> { diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java new file mode 100644 index 0000000..fc44339 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java @@ -0,0 +1,373 @@ +package net.sowgro.npehero.devmenu; + +import javafx.beans.binding.DoubleBinding; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; +import javafx.scene.paint.Color; +import javafx.scene.shape.Line; +import javafx.scene.shape.Polygon; +import javafx.util.Duration; +import net.sowgro.npehero.Driver; +import net.sowgro.npehero.gameplay.Block; +import net.sowgro.npehero.gameplay.Target; +import net.sowgro.npehero.main.Difficulty; +import net.sowgro.npehero.main.Note; + +import java.util.concurrent.atomic.AtomicInteger; + +public class NotesEditor2 extends Pane { +    Difficulty diff; +    ScrollPane scroll = new ScrollPane(); +    Pane[] lanes; +    MediaPlayer m; +    Polygon playhead; +    ListProperty<Block> activeNotes = new SimpleListProperty<>(FXCollections.observableArrayList()); +    ListProperty<Note> noteList; + +    public NotesEditor2(Difficulty diff, DiffEditor prev) { + +        this.diff = diff; +        noteList = diff.notes.deepCopyList(); + +        m = new MediaPlayer(new Media(diff.level.song.toURI().toString())); + +        // Buttons +        VBox actionBox = new VBox(); +        actionBox.setSpacing(10); + +        Label noteLabel = new Label("Notes"); +        ToggleButton addNote  = new ToggleButton("Add"); +        Button delNote  = new Button("Delete"); +        ToggleButton moveNote = new ToggleButton("Move"); +        actionBox.getChildren().addAll(noteLabel, addNote, delNote, moveNote); + +        Label selectionLabel = new Label("Selection"); +        Button selectAll     = new Button("Select All"); +        Button clearSelect   = new Button("Clear"); +        actionBox.getChildren().addAll(selectionLabel, selectAll, clearSelect); + +        Label playbackLabel     = new Label("Playback"); +        ToggleButton play       = new ToggleButton("Play"); +        Button reset            = new Button("Reset"); +        ToggleButton scrollLock = new ToggleButton("Scroll Lock"); +        actionBox.getChildren().addAll(playbackLabel, play, reset, scrollLock); + +        delNote.disableProperty().bind(activeNotes.emptyProperty()); +        moveNote.disableProperty().bind(activeNotes.emptyProperty()); +        clearSelect.disableProperty().bind(activeNotes.emptyProperty()); + +        ToggleGroup tg = new ToggleGroup(); +        addNote.setToggleGroup(tg); +        moveNote.setToggleGroup(tg); + +        // Lanes +        this.lanes = new Pane[5]; +        for (int i = 0; i < lanes.length; i++) { +            lanes[i] = new Pane(); +        } +        Block sizer = drawBlock(new Note(0, 0)); +        for (Pane lane : lanes) { +            lane.prefWidthProperty().bind(sizer.widthProperty()); +            lane.prefHeightProperty().bind(sizer.heightProperty()); +        } +        Pane rulerLane = new Pane(); +        Pane playheadLane = new Pane(); +        playheadLane.setOnMouseClicked(e -> { +            m.seek(new Duration(screenPosToSecond(e.getY()) * 1000)); +        }); + +        this.playhead = new Polygon(); +        playhead.getPoints().addAll( +                0.0, -10.0, +                20.0, -10.0, +                30.0, 0.0, +                20.0, 10.0, +                0.0, 10.0 +        ); +        playhead.setFill(Color.WHITE); +        playheadLane.getChildren().add(playhead); + +        HBox content = new HBox(); +        content.setAlignment(Pos.CENTER); +        content.setSpacing(10); +        content.getChildren().addAll(playheadLane, rulerLane); +        content.getChildren().addAll(lanes); + +        Line playheadLine = new Line(); +        playheadLine.setStartX(0); +        playheadLine.endXProperty().bind(scroll.widthProperty().subtract(80)); +        playheadLine.setStartY(0); +        playheadLine.setEndY(0); +        playheadLine.setStroke(Color.WHITE); +        playheadLine.layoutYProperty().bind(playhead.layoutYProperty()); + +        Pane contentOverlay = new Pane(playheadLine); +        contentOverlay.setPickOnBounds(false); + +        StackPane stackPane = new StackPane(); +        stackPane.getChildren().addAll(content, contentOverlay); + +        scroll.setContent(stackPane); +        scroll.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35)); +        scroll.setMinWidth(400); +        scroll.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75)); +        scroll.getStyleClass().remove("scroll-pane"); +        scroll.getStyleClass().add("box"); +        scroll.setPadding(new Insets(5)); + +        Pane helpBox = new Pane(); + +        HBox main = new HBox(); +        main.getChildren().addAll(scroll, actionBox, helpBox); +        main.setSpacing(10); + +        Button exit = new Button(); +        exit.setText("Cancel"); +        exit.setOnAction(_ -> { +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(prev); +        }); + +        Button save = new Button(); +        save.setText("Done"); +        save.setOnAction(_ -> { +            diff.notes.list = noteList; +            Driver.soundController.playSfx("backward"); +            Driver.setMenu(new DiffEditor(diff, prev.prev)); +        }); + +        HBox buttons = new HBox(save, exit); +        buttons.setSpacing(10); +        buttons.setAlignment(Pos.CENTER); + +        // Draw notes +        noteList.forEach(n -> lanes[n.lane].getChildren().add(drawBlock(n))); +        noteList.addListener((ListChangeListener<? super Note>) e -> { +            // TODO +            for (Pane lane : lanes) { +                lane.getChildren().clear(); +            } +            noteList.forEach(n -> lanes[n.lane].getChildren().add(drawBlock(n))); +        }); + +        // Draw and update ruler +        AtomicInteger lastRuler = new AtomicInteger(-1); +        content.heightProperty().addListener(_ -> { +            int ruler1 = (int) screenPosToSecond(content.getHeight()); +            for (int i = lastRuler.get() + 1; i <= ruler1; i++) { +                Label l = new Label(toMinAndSec(i)+" -"); +                l.layoutYProperty().bind(secondToScreenPos(i)); +                l.setTextFill(Color.WHITE); +                rulerLane.getChildren().add(l); +            } +            lastRuler.set(ruler1); +        }); + +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(main, buttons); +        centerBox.setMinWidth(400); + +        HBox rootBox = new HBox(); +        rootBox.prefWidthProperty().bind(super.prefWidthProperty()); +        rootBox.prefHeightProperty().bind(super.prefHeightProperty()); +        rootBox.getChildren().add(centerBox); +        rootBox.setAlignment(Pos.CENTER); + +        // write notes on key press +        rootBox.setOnKeyPressed(e -> { +            switch (e.getCode()) { +                case D  -> WriteNote(0); +                case F  -> WriteNote(1); +                case G  -> WriteNote(2); // Problem with space to select +                case J  -> WriteNote(3); +                case K  -> WriteNote(4); +                case EQUALS -> activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01)); +                case MINUS -> activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01)); +                case DELETE -> delNote.fire(); +                case ESCAPE -> clearSelect.fire(); +            }; +        }); + +        m.currentTimeProperty().addListener(_ -> { +            // TODO +            playhead.layoutYProperty().bind(secondToScreenPos(m.getCurrentTime().toSeconds())); +        }); + +        play.setOnAction(_ -> { +            if (play.isSelected()) { +                m.play(); +            } +            else { +                m.pause(); +            } + +        }); + +        scrollLock.setOnAction(_ -> { +            if (scrollLock.isSelected()) { +                // vvalue takes in a value between 0 and 1 NOT a pixel value +                scroll.vvalueProperty().bind(playhead.layoutYProperty().subtract(scroll.heightProperty().divide(2)).divide(content.heightProperty().subtract(scroll.heightProperty()))); +            } +            else { +                scroll.vvalueProperty().unbind(); +            } + + +        }); + +        reset.setOnAction(_ -> { +            m.seek(new Duration(0)); +        }); + +        delNote.setOnAction(_ -> { +            activeNotes.forEach(e -> { +                noteList.remove(e.note); +            }); +            activeNotes.clear(); +        }); + +        clearSelect.setOnAction(_ -> { +            activeNotes.forEach(e -> e.setFill(e.color)); +            activeNotes.clear(); +        }); + +        selectAll.setOnAction(_ -> { +            activeNotes.clear(); +            for (Pane lane : lanes) { +                lane.getChildren().forEach(e -> activeNotes.add((Block) e)); +            } +            activeNotes.forEach(e -> e.setFill(Color.WHITE)); +        }); + +        Pane addHelp = addHelp(); +        Pane moveHelp = moveHelp(); +        addNote.setOnAction(_ -> { +            if (addNote.isSelected()) { +                helpBox.getChildren().clear(); +                helpBox.getChildren().add(addHelp); +            } +            else { +                helpBox.getChildren().clear(); +            } +        }); + +        moveNote.setOnAction(_ -> { +            if (moveNote.isSelected()) { +                helpBox.getChildren().clear(); +                helpBox.getChildren().add(moveHelp); +            } +            else { +                helpBox.getChildren().clear(); +            } +        }); + +        moveNote.disabledProperty().addListener(_ -> { +            if (moveNote.isDisabled() && moveNote.isSelected()) { +                moveNote.setSelected(false); +                helpBox.getChildren().clear(); +            } +        }); + +        super.getChildren().add(rootBox); +    } + +    private Block drawBlock(Note n) { +        Color color = diff.level.colors[n.lane]; +        Block b = new Block(color,20, 20, 5, false, n); +        b.heightProperty().bind(scroll.widthProperty().divide(8)); +        b.widthProperty().bind(scroll.widthProperty().divide(8)); +        b.arcHeightProperty().bind(scroll.widthProperty().divide(25)); +        b.arcWidthProperty().bind(scroll.widthProperty().divide(25)); +        b.strokeWidthProperty().bind(scroll.widthProperty().divide(120)); +        b.layoutYProperty().bind(secondToScreenPos(n.time.add(0))); +        b.setOnMouseClicked(_ -> { +            if (activeNotes.contains(b)) { +                activeNotes.remove(b); +                b.setFill(b.color); +            } +            else { +                activeNotes.add(b); +                b.setFill(Color.WHITE); +            } +        }); +        return b; +    } + +    private String toMinAndSec(int t) { +        int min = t / 60; +        int sec = t % 60; + +        String min2 = min  + ""; +        if (min2.length() == 1) { +            min2 = "0" + min2; +        } +        String sec2 = sec  + ""; +        if (sec2.length() == 1) { +            sec2 = "0" + sec2; +        } +        return min2 + ":" + sec2; +    } + +    private double screenPosToSecond(double screenYPos) { +        return screenYPos / (scroll.getHeight() * 0.9); +    } + +    private DoubleBinding secondToScreenPos(DoubleBinding second) { +        return scroll.heightProperty().multiply(second).multiply(0.9); +    } + +    private DoubleBinding secondToScreenPos(double second) { +        return scroll.heightProperty().multiply(second).multiply(0.9); +    } + +    private void WriteNote(int col) { +        Note tmp = new Note(screenPosToSecond(playhead.getLayoutY()), col); +        noteList.add(tmp); +    } + +    private Pane addHelp() { +        Label l1 = new Label("Use the following keys"); +        HBox hb = new HBox( +                new Target(diff.level.colors[0], 40, 40, 10, 'd'), +                new Target(diff.level.colors[1], 40, 40, 10, 'f'), +                new Target(diff.level.colors[2], 40, 40, 10, 'g'), +                new Target(diff.level.colors[3], 40, 40, 10, 'j'), +                new Target(diff.level.colors[4], 40, 40, 10, 'k') +        ); +        hb.setSpacing(10); +        hb.setAlignment(Pos.CENTER_LEFT); +        Label l2 = new Label("to write a new note at \nthe play head's position."); + +        VBox ret = new VBox(l1, hb, l2); +        ret.setPadding(new Insets(10)); +        ret.getStyleClass().add("box"); +        return ret; +    } + +    private Pane moveHelp() { +        Label l1 = new Label("Use the"); +        HBox hb = new HBox(new Target(Color.BLACK, 40, 40, 10, '+'), new Label("and"), new Target(Color.BLACK, 40, 40, 10, '-'), new Label("keys")); +        hb.setSpacing(10); +        hb.setAlignment(Pos.CENTER_LEFT); +        Label l2 = new Label("to move the selected \nnote(s) up and down."); + +        VBox ret = new VBox(l1, hb, l2); +        ret.setPadding(new Insets(10)); +        ret.getStyleClass().add("box"); +        ret.setLayoutY(120); +        return ret; +    } +} diff --git a/src/main/java/net/sowgro/npehero/gameplay/Block.java b/src/main/java/net/sowgro/npehero/gameplay/Block.java index 5bc9d9c..c55a7bf 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/Block.java +++ b/src/main/java/net/sowgro/npehero/gameplay/Block.java @@ -6,22 +6,41 @@ import javafx.scene.effect.BlurType;  import javafx.scene.effect.DropShadow;  import javafx.scene.paint.Color;  import javafx.scene.shape.Rectangle; +import net.sowgro.npehero.main.Note; +/** + * A block is a visual representation of a note on the screen. This is used both in the editor and in during the game play. + */  public class Block extends Rectangle  { -    public Block(Color c, double a, double b, int r) +    public Color color; +    public Note note; + +    public Block(Color color, double width, double height, int cornerRadius, boolean useDropShadow, Note note)      { -        super(); +        this.note = note; +        this.color = color; +        +        super.setFill(color); +        super.setWidth(width); +        super.setHeight(height); +        super.setArcHeight(cornerRadius); +        super.setArcWidth(cornerRadius); + +        if (useDropShadow) { +            enableDropShadow(); +        } +    } + +    public Block(Color color, double width, double height, int cornerRadius) { +        this(color, width, height, cornerRadius, true, null); +    } + +    public void enableDropShadow() {          DropShadow dropShadow = new DropShadow();          dropShadow.setRadius(200.0); -        dropShadow.setColor(c); +        dropShadow.setColor(color);          dropShadow.setBlurType(BlurType.GAUSSIAN); -        -        super.setFill(c); -        super.setWidth(a); -        super.setHeight(b); -        super.setArcHeight(r); -        super.setArcWidth(r);          super.setEffect(dropShadow);      }  }
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java index 39932a5..41976a9 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java +++ b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java @@ -6,7 +6,6 @@ import java.io.IOException;  import java.util.ArrayList;  import java.util.LinkedList;  import java.util.Queue; -import java.util.Scanner;  import javax.sound.sampled.LineUnavailableException;  import javax.sound.sampled.UnsupportedAudioFileException; @@ -86,30 +85,16 @@ public class SongPlayer extends Pane {  	 * Establishes what the chart for the song is going to look like  	 * @throws FileNotFoundException  	 */ -	public void loadSong(File notes) throws FileNotFoundException { -		Scanner scan = new Scanner(new File(notes.getPath()));	//file reader for reading in the notes from a notes.txt file -		try{ -			while (scan.hasNext()) { -				String input = scan.next(); -				if (input.charAt(0) == 'd') { -					dSends.add(new NoteInfo(Double.parseDouble(input.substring(1)))); -				} -				else if (input.charAt(0) == 'f') { -					fSends.add(new NoteInfo(Double.parseDouble(input.substring(1)))); -				} -				else if (input.charAt(0) == 's') { -					spaceSends.add(new NoteInfo(Double.parseDouble(input.substring(1)))); -				} -				else if (input.charAt(0) == 'j') { -					jSends.add(new NoteInfo(Double.parseDouble(input.substring(1)))); -				} -				else if (input.charAt(0) == 'k') { -					kSends.add(new NoteInfo(Double.parseDouble(input.substring(1)))); -				} +	public void loadSong() throws FileNotFoundException { +		difficulty.notes.list.forEach(e -> { +			switch (e.lane) { +				case 0 -> dSends.add(new NoteInfo(e.time.get() * (difficulty.bpm / 60))); +				case 1 -> fSends.add(new NoteInfo(e.time.get() * (difficulty.bpm / 60))); +				case 2 -> spaceSends.add(new NoteInfo(e.time.get() * (difficulty.bpm / 60))); +				case 3 -> jSends.add(new NoteInfo(e.time.get() * (difficulty.bpm / 60))); +				case 4 -> kSends.add(new NoteInfo(e.time.get() * (difficulty.bpm / 60)));  			} -		} catch (NumberFormatException e) { -			e.printStackTrace(); -		} +		});  	}  	public SongPlayer(Level lvl, Difficulty d, Pane p, ScoreController cntrl) { @@ -131,7 +116,7 @@ public class SongPlayer extends Pane {  		scoreCounter = cntrl;			//Uses the song's designated scoreCounter  		try { -			loadSong(d.notes);			//Calls the file loading from the song's notes.txt file +			loadSong();			//Calls the file loading from the song's notes.txt file  		} catch (FileNotFoundException e) {  			e.printStackTrace();  		} diff --git a/src/main/java/net/sowgro/npehero/gui/GameOver.java b/src/main/java/net/sowgro/npehero/gui/GameOver.java index 68ce3ea..99f3985 100755 --- a/src/main/java/net/sowgro/npehero/gui/GameOver.java +++ b/src/main/java/net/sowgro/npehero/gui/GameOver.java @@ -62,8 +62,8 @@ public class GameOver extends Pane          nameLabel.getStyleClass().add("t3");          TextField name = new TextField(); -        name.getStyleClass().remove("text-feild"); -        name.getStyleClass().add("button"); +//        name.getStyleClass().remove("text-filed"); +//        name.getStyleClass().add("button");          name.setText("name");          Button save = new Button(); diff --git a/src/main/java/net/sowgro/npehero/gui/LevelSelector.java b/src/main/java/net/sowgro/npehero/gui/LevelSelector.java index 6d3442e..fe51853 100755 --- a/src/main/java/net/sowgro/npehero/gui/LevelSelector.java +++ b/src/main/java/net/sowgro/npehero/gui/LevelSelector.java @@ -1,8 +1,6 @@  package net.sowgro.npehero.gui;  import javafx.beans.property.ReadOnlyStringWrapper; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue;  import javafx.geometry.Pos;  import javafx.scene.control.Button;  import javafx.scene.control.TableColumn; @@ -66,13 +64,8 @@ public class LevelSelector extends Pane          rootBox.setSpacing(10);          levels.getStyleClass().remove("list-view"); -        levels.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Level>() { //listens for change in selected item of the list - -			@Override -			public void changed(ObservableValue<? extends Level> arg0, Level arg1, Level arg2) { -				addDetails(rightBox, levels); -			}	 -		}); +        //listens for change in selected item of the list +        levels.getSelectionModel().selectedItemProperty().addListener(_ -> addDetails(rightBox, levels));          super.getChildren().add(rootBox);      } diff --git a/src/main/java/net/sowgro/npehero/gui/MainMenu.java b/src/main/java/net/sowgro/npehero/gui/MainMenu.java index 2da6036..890c7aa 100755 --- a/src/main/java/net/sowgro/npehero/gui/MainMenu.java +++ b/src/main/java/net/sowgro/npehero/gui/MainMenu.java @@ -53,7 +53,8 @@ public class MainMenu extends Pane          Button exit = new Button();          exit.setText("Quit"); -        exit.setOnAction(e -> {Driver.quit(); +        exit.setOnAction(e -> { +            Driver.quit();              Driver.soundController.playSfx("backward");          }); diff --git a/src/main/java/net/sowgro/npehero/gui/Settings.java b/src/main/java/net/sowgro/npehero/gui/Settings.java index e6ae13b..1e92906 100755 --- a/src/main/java/net/sowgro/npehero/gui/Settings.java +++ b/src/main/java/net/sowgro/npehero/gui/Settings.java @@ -11,7 +11,6 @@ import javafx.scene.layout.Pane;  import javafx.scene.layout.VBox;  import javafx.scene.text.Text;  import net.sowgro.npehero.Driver; -import net.sowgro.npehero.devmenu.LevelList;  public class Settings extends Pane  { @@ -58,8 +57,6 @@ public class Settings extends Pane          Button fullscreen = new Button();          fullscreen.setText("Toggle (F11)"); -        fullscreen.getStyleClass().remove("toggle-button"); -        fullscreen.getStyleClass().add("button");          fullscreen.setOnAction(e -> {              Driver.soundController.playSfx("forward");              Driver.primaryStage.setFullScreen(!Driver.primaryStage.isFullScreen()); @@ -89,8 +86,6 @@ public class Settings extends Pane          devBox.setPadding(new Insets(10));          ToggleButton advanced = new ToggleButton("Advanced"); -        advanced.getStyleClass().remove("toggle-button"); -        advanced.getStyleClass().add("button");          advanced.selectedProperty().bindBidirectional(devBox.managedProperty());          advanced.selectedProperty().bindBidirectional(devBox.visibleProperty()); diff --git a/src/main/java/net/sowgro/npehero/main/Difficulty.java b/src/main/java/net/sowgro/npehero/main/Difficulty.java index 6bd565a..2c99702 100755 --- a/src/main/java/net/sowgro/npehero/main/Difficulty.java +++ b/src/main/java/net/sowgro/npehero/main/Difficulty.java @@ -5,6 +5,7 @@ import java.io.FileReader;  import java.io.FileWriter;  import java.io.IOException;  import java.time.LocalDate; +  import org.json.simple.JSONArray;  import org.json.simple.JSONObject;  import org.json.simple.parser.JSONParser; @@ -16,7 +17,7 @@ public class Difficulty implements Comparable<Difficulty>      public File thisDir;      public String title = "Unnamed";      private ObservableList<LeaderboardEntry> leaderboard = FXCollections.observableArrayList(); -    public File notes; +    public Notes notes;      public Double bpm = 0.0;      public int numBeats;      public Level level; @@ -62,9 +63,10 @@ public class Difficulty implements Comparable<Difficulty>              isValid1 = false;          } -        if (new File(thisDir, "notes.txt").exists()) +        File notesFile = new File(thisDir, "notes.txt"); +        if (notesFile.exists())          { -            notes = new File(thisDir, "notes.txt"); +            notes = new Notes(notesFile, this);          }          else          { diff --git a/src/main/java/net/sowgro/npehero/main/Note.java b/src/main/java/net/sowgro/npehero/main/Note.java new file mode 100644 index 0000000..c2c9015 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/main/Note.java @@ -0,0 +1,28 @@ +package net.sowgro.npehero.main; + +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.SimpleDoubleProperty; + +/** + * A note represents a moment in the song when the player should hit a key + * The key corresponding to the lane the note is in should be pressed + */ +public class Note { + +    public DoubleProperty time = new SimpleDoubleProperty(); +    public int lane; + +    public Note(double time, int lane) { +        this.time.set(time); +        this.lane = lane; +    } + +    /** +     * Copy constructor +     * @param other the note to copy from +     */ +    public Note(Note other) { +        this.lane = other.lane; +        this.time.set(other.time.get()); +    } +} diff --git a/src/main/java/net/sowgro/npehero/main/Notes.java b/src/main/java/net/sowgro/npehero/main/Notes.java new file mode 100644 index 0000000..04524c3 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/main/Notes.java @@ -0,0 +1,96 @@ +package net.sowgro.npehero.main; + +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Scanner; + +public class Notes { +    private File file; +    private Difficulty diff; + +    public ListProperty<Note> list = new SimpleListProperty<>(FXCollections.observableArrayList()); + +    public Notes(File f, Difficulty diff) { +        this.file = f; +        this.diff = diff; +        readFile(); +    } + +    public void readFile() { +        Scanner scan = null;	//file reader for reading in the notes from a notes.txt file +        try { +            scan = new Scanner(file); +        } +        catch (FileNotFoundException e) { +            // TODO handle error +            throw new RuntimeException(e); +        } + +        while (scan.hasNext()) { +            String input = scan.next(); + +            int lane = switch (input.charAt(0)) { +                case 'd' -> 0; +                case 'f' -> 1; +                case 's' -> 2; +                case 'j' -> 3; +                case 'k' -> 4; +                default  -> -1; +            }; + +            if (lane == -1) { +                // TODO handle error +                continue; +            } + +            double time = Double.parseDouble(input.substring(1)); +            if (diff.bpm != 0.0) { +                time = beatToSecond(time, diff.bpm); +            } +            list.add(new Note(time, lane)); +        } +    } + +    public void writeFile() { +        try (PrintWriter writer = new PrintWriter(diff.notes.getFile(), StandardCharsets.UTF_8)) { +            for (Note note : list) { +                char lane = switch (note.lane) { +                    case 0 -> 'd'; +                    case 1 -> 'f'; +                    case 2 -> 's'; +                    case 3 -> 'j'; +                    case 4 -> 'k'; +                    default -> 'e'; +                }; + +                if (lane == 'e') { +                    // TODO handle error +                } + +                writer.println(lane + note.time.get()); + +            } +        } +        catch (IOException e) { +            throw new RuntimeException(e); +        } +    } + +    private double beatToSecond(double beat, double bpm) { +        return beat/(bpm/60); +    } + +    public File getFile() { +        return file; +    } + +    public ListProperty<Note> deepCopyList() { +        ListProperty<Note> ret = new SimpleListProperty<>(FXCollections.observableArrayList()); +        list.forEach(e -> ret.add(new Note(e))); +        return ret; +    } +} diff --git a/src/main/resources/net/sowgro/npehero/style.css b/src/main/resources/net/sowgro/npehero/style.css index 6e8a7a3..950be11 100755 --- a/src/main/resources/net/sowgro/npehero/style.css +++ b/src/main/resources/net/sowgro/npehero/style.css @@ -7,9 +7,8 @@      -fx-font-size: 20;  } -/* button */ - -.button {  +/* buttons */ +Button, TextField, RadioButton, ToggleButton, ColorPicker {      -fx-background-color: rgba(0, 0, 0, 0.5);       -fx-text-fill: white;      -fx-border-color: transparent; @@ -19,27 +18,31 @@      -fx-background-radius: 5;  } -.button:hover { +Button:hover, TextField:hover, RadioButton:hover, ToggleButton:hover, ColorPicker:hover {      -fx-background-color: rgb(50, 50, 50, 0.5);  } -.button:focused { +Button:focused, TextField:focused, RadioButton:focused, ToggleButton:focused, ColorPicker:focused {      -fx-background-color: rgb(50, 50, 50, 0.5);      -fx-border-color: rgb(255, 255, 255);  } -.button:selected { +Button:selected, TextField:selected, RadioButton:selected, ToggleButton:selected, ColorPicker:selected {      -fx-background-color: rgb(255, 255, 255);      -fx-text-fill: rgb(0, 0, 0);  } -.button:pressed{ +Button:pressed, TextField:pressed, RadioButton:pressed, ToggleButton:pressed, ColorPicker:pressed {      -fx-background-color: rgb(231, 231, 231);      -fx-border-color: transparent;      -fx-text-fill: rgb(0, 0, 0);  } +ColorPicker { +    -fx-color-label-visible: false +} +  /* table */  TableView { @@ -105,6 +108,7 @@ TableView:focused .list-cell:focused {  .table-row-cell:pressed {      -fx-background-color: rgb(231, 231, 231); +    -fx-text-background-color: rgb(0, 0, 0);      /* -fx-border-color: transparent; */  } @@ -161,7 +165,7 @@ Slider:focused .thumb{  .scroll-bar:horizontal ,  .scroll-bar:vertical{ -    -fx-font-size: 5px; +    -fx-font-size: 10px;      -fx-background-color :transparent;      -fx-border-color :transparent;      -fx-background-radius : 0.0em; @@ -225,6 +229,10 @@ Slider:focused .thumb{      -fx-text-fill: white;  } +.box Label { +    -fx-text-fill: white; +} +  /* debug */  .debug { | 
