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 | |
parent | cf8f3d35716cd93d0d5d123d80b07f9ae704f939 (diff) | |
download | NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.tar.gz NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.tar.bz2 NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.zip |
NEW LEVEL EDITOR!!!!
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 { |