aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2024-07-14 03:40:03 -0400
committersowgro <tpoke.ferrari@gmail.com>2024-07-14 03:40:03 -0400
commit550701557c1e021e45bddff92ad1a2e8c808e8e0 (patch)
tree219c5979d3b30843b88336ae755dd8e45a1e5471
parentcf8f3d35716cd93d0d5d123d80b07f9ae704f939 (diff)
downloadNPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.tar.gz
NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.tar.bz2
NPEhero-550701557c1e021e45bddff92ad1a2e8c808e8e0.zip
NEW LEVEL EDITOR!!!!
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/Driver.java4
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/DiffEditor.java131
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/DiffList.java129
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/LevelEditor.java116
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/LevelList.java101
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/NotesEditor.java30
-rw-r--r--src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java373
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gameplay/Block.java37
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gameplay/SongPlayer.java35
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/GameOver.java4
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/LevelSelector.java11
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/MainMenu.java3
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/Settings.java5
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/main/Difficulty.java8
-rw-r--r--src/main/java/net/sowgro/npehero/main/Note.java28
-rw-r--r--src/main/java/net/sowgro/npehero/main/Notes.java96
-rwxr-xr-xsrc/main/resources/net/sowgro/npehero/style.css24
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 {