aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/Driver.java16
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/editor/DiffEditor.java (renamed from src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java)32
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/editor/DiffList.java (renamed from src/main/java/net/sowgro/npehero/devmenu/DiffList.java)38
-rw-r--r--src/main/java/net/sowgro/npehero/editor/ErrorDisplay.java (renamed from src/main/java/net/sowgro/npehero/devmenu/ErrorDisplay.java)2
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/editor/LevelEditor.java (renamed from src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java)40
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/editor/LevelList.java (renamed from src/main/java/net/sowgro/npehero/devmenu/LevelList.java)2
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/editor/NotesEditor.java (renamed from src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java)4
-rw-r--r--src/main/java/net/sowgro/npehero/editor/NotesEditor2.java (renamed from src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java)67
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gameplay/SongPlayer.java25
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/LevelSurround.java5
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/MainMenu.java2
-rw-r--r--src/main/java/net/sowgro/npehero/main/Control.java2
-rw-r--r--src/main/java/net/sowgro/npehero/main/Difficulties.java6
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/main/Difficulty.java26
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/main/Level.java28
15 files changed, 206 insertions, 89 deletions
diff --git a/src/main/java/net/sowgro/npehero/Driver.java b/src/main/java/net/sowgro/npehero/Driver.java
index 6544ebe..4c737f7 100755
--- a/src/main/java/net/sowgro/npehero/Driver.java
+++ b/src/main/java/net/sowgro/npehero/Driver.java
@@ -20,7 +20,7 @@ import java.net.URL;
public class Driver extends Application
{
- public static final Image MENU_BACKGROUND = new Image(Driver.class.getResource("mountains.png").toExternalForm());;
+ public static final Image MENU_BACKGROUND = new Image(Driver.class.getResource("mountains.png").toExternalForm());
public static Stage primaryStage;
public static ScrollPane primaryPane = new ScrollPane();
@@ -32,8 +32,7 @@ public class Driver extends Application
/*
* starts javafx
*/
- public static void main(String[] args)
- {
+ public static void main(String[] args) {
launch(args);
}
@@ -42,8 +41,7 @@ public class Driver extends Application
* (automatically called by javafx on start)
*/
@Override
- public void start(Stage newPrimaryStage)
- {
+ public void start(Stage newPrimaryStage) {
Settings.read();
Levels.readData();
Control.readFromFile();
@@ -87,8 +85,7 @@ public class Driver extends Application
* Replaces/adds a new pane to the primaryPane
* @param pane the new pane
*/
- private static void setMenu(Pane pane)
- {
+ private static void setMenu(Pane pane) {
primaryPane.setContent(pane);
pane.prefWidthProperty().bind(primaryPane.widthProperty()); //makes pane fill the window
pane.prefHeightProperty().bind(primaryPane.heightProperty());
@@ -98,7 +95,7 @@ public class Driver extends Application
/**
* @return the current pane in primaryPane
*/
- public static Page getMenu(){
+ public static Page getMenu() {
return currentPage;
}
@@ -148,8 +145,7 @@ public class Driver extends Application
st.setOnFinished(_ -> backgroundImage.setImage(image));
}
- public static void setMenuBackground()
- {
+ public static void setMenuBackground() {
setBackground(MENU_BACKGROUND);
}
diff --git a/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java b/src/main/java/net/sowgro/npehero/editor/DiffEditor.java
index 11ee274..f98ff46 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java
+++ b/src/main/java/net/sowgro/npehero/editor/DiffEditor.java
@@ -1,17 +1,14 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import javafx.beans.binding.DoubleBinding;
import javafx.geometry.Pos;
-import javafx.scene.control.Label;
-import javafx.scene.control.ScrollPane;
+import javafx.scene.control.*;
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 javafx.scene.control.Button;
-import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import net.sowgro.npehero.main.*;
@@ -36,17 +33,19 @@ public class DiffEditor extends Page
Text titleLabel = new Text("Title");
TextField title = new TextField(diff.title);
- Text priorityLabel = new Text("Order (lower first)");
- TextField priority = new TextField(diff.priority+"");
-
Button editNotes = new Button("Edit notes");
editNotes.setOnAction(_ -> {
if (diff.level.song == null) {
Driver.setMenu(new ErrorDisplay("You must import a song file before editing the notes!", this));
}
- else {
- Driver.setMenu(new NotesEditor2(diff, this));
+ if (diff.bpm != 0.0) {
+ Driver.setMenu(new ErrorDisplay(
+ "Note:\nThe new notes editor does not support bpm and beat based songs. If you continue the beats will be converted to seconds.",
+ this,
+ new NotesEditor2(diff, this)
+ ));
}
+ Driver.setMenu(new NotesEditor2(diff, this));
});
Button oldEditNotes = new Button("Edit notes (legacy)");
@@ -56,6 +55,7 @@ public class DiffEditor extends Page
new NotesEditor(diff, this))
));
+ Label scoresLable = new Label("Scores");
Button editScores = new Button("Clear leaderboard");
editScores.setOnAction(_ -> diff.leaderboard.entries.clear());
@@ -74,14 +74,12 @@ public class DiffEditor extends Page
diff.title = title.getText();
// diff.bpm = Double.parseDouble(bpm.getText());
// diff.numBeats = Integer.parseInt(numBeats.getText());
- diff.priority = Integer.parseInt(priority.getText());
diff.write();
});
HBox scrollContent = new HBox();
- ScrollPane scroll = new ScrollPane(scrollContent);
+ scroll = new ScrollPane(scrollContent);
scroll.setFitToWidth(true);
- this.scroll = scroll;
scroll.getStyleClass().remove("scroll-pane");
scroll.getStyleClass().add("box");
// scroll.setPrefHeight(400);
@@ -112,7 +110,7 @@ public class DiffEditor extends Page
notePreview.setSpacing(10);
VBox left = new VBox();
- left.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,priorityLabel,priority,editScores,playLevel,save);
+ left.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,scoresLable,editScores,playLevel);
left.setSpacing(10);
HBox main = new HBox();
@@ -126,8 +124,12 @@ public class DiffEditor extends Page
Driver.setMenu(prev);
});
+ HBox bottom = new HBox(exit,save);
+ bottom.setSpacing(10);
+ bottom.setAlignment(Pos.CENTER);
+
VBox centerBox = new VBox();
- centerBox.getChildren().addAll(main, exit);
+ centerBox.getChildren().addAll(main, bottom);
centerBox.setSpacing(10);
centerBox.setAlignment(Pos.CENTER);
diff --git a/src/main/java/net/sowgro/npehero/devmenu/DiffList.java b/src/main/java/net/sowgro/npehero/editor/DiffList.java
index 63c09bb..13e4795 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/DiffList.java
+++ b/src/main/java/net/sowgro/npehero/editor/DiffList.java
@@ -1,6 +1,7 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import javafx.beans.property.ReadOnlyStringWrapper;
+import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
@@ -13,6 +14,8 @@ import net.sowgro.npehero.main.Level;
import net.sowgro.npehero.main.Page;
import net.sowgro.npehero.main.Sound;
+import java.util.Collections;
+
public class DiffList extends Page
{
private HBox content = new HBox();
@@ -66,14 +69,41 @@ public class DiffList extends Page
Button refresh = new Button("Refresh");
refresh.setOnAction(e -> {
- level.readData();
- diffs.setItems(level.difficulties.list);
+// level.readData();
+// diffs.setItems(level.difficulties.list.sorted());
+ diffs.refresh();
});
ToggleButton create = new ToggleButton("Create");
+ Button moveUp = new Button("Move Up");
+ moveUp.disableProperty().bind(diffs.getSelectionModel().selectedItemProperty().isNull());
+ moveUp.setOnAction(_ -> {
+ Difficulty diff = diffs.getSelectionModel().selectedItemProperty().get();
+ ObservableList<Difficulty> diffList = level.difficulties.list;
+ int oldIndex = diffList.indexOf(diff);
+ if (oldIndex <= 0) {
+ return;
+ }
+ Collections.swap(diffList, oldIndex, oldIndex-1);
+ level.difficulties.saveOrder();
+ });
+
+ Button moveDown = new Button("Move Down");
+ moveDown.disableProperty().bind(diffs.getSelectionModel().selectedItemProperty().isNull());
+ moveDown.setOnAction(_ -> {
+ Difficulty diff = diffs.getSelectionModel().selectedItemProperty().get();
+ ObservableList<Difficulty> diffList = level.difficulties.list;
+ int oldIndex = diffList.indexOf(diff);
+ if (oldIndex >= diffList.size()-1) {
+ return;
+ }
+ Collections.swap(diffList, oldIndex, oldIndex+1);
+ level.difficulties.saveOrder();
+ });
+
VBox buttons = new VBox();
- buttons.getChildren().addAll(create, edit, remove, refresh);
+ buttons.getChildren().addAll(create, edit, remove, moveUp, moveDown, refresh);
buttons.setSpacing(10);
TextField newLevelEntry = new TextField();
diff --git a/src/main/java/net/sowgro/npehero/devmenu/ErrorDisplay.java b/src/main/java/net/sowgro/npehero/editor/ErrorDisplay.java
index dc4b40c..b3ec751 100644
--- a/src/main/java/net/sowgro/npehero/devmenu/ErrorDisplay.java
+++ b/src/main/java/net/sowgro/npehero/editor/ErrorDisplay.java
@@ -1,4 +1,4 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
diff --git a/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java b/src/main/java/net/sowgro/npehero/editor/LevelEditor.java
index 003f929..56a2924 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java
+++ b/src/main/java/net/sowgro/npehero/editor/LevelEditor.java
@@ -1,4 +1,4 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import java.io.File;
@@ -57,24 +57,24 @@ public class LevelEditor extends Page
ValidIndicator songValid = new ValidIndicator();
if (level.song == null) {
- songValid.setInvalid("Missing file song.wav!");
+ songValid.setInvalid("Missing song file!");
}
HBox filesLabel = new HBox(new Text("Files"), songValid);
FileChooser backgroundChooser = new FileChooser();
- backgroundChooser.getExtensionFilters().add(new ExtensionFilter("PNG", "*.png"));
+ backgroundChooser.getExtensionFilters().add(new ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"));
Button backgroundButton = new Button("Background Image");
- backgroundButton.setOnAction(e -> {selectedBackground = backgroundChooser.showOpenDialog(Driver.primaryStage);});
+ backgroundButton.setOnAction(_ -> selectedBackground = backgroundChooser.showOpenDialog(Driver.primaryStage));
FileChooser previewChooser = new FileChooser();
- previewChooser.getExtensionFilters().add(new ExtensionFilter("PNG", "*.png"));
+ previewChooser.getExtensionFilters().add(new ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"));
Button previewButton = new Button("Preview Image");
- previewButton.setOnAction(e -> {selectedPreview = previewChooser.showOpenDialog(Driver.primaryStage);});
+ previewButton.setOnAction(_ -> selectedPreview = previewChooser.showOpenDialog(Driver.primaryStage));
FileChooser songChooser = new FileChooser();
- songChooser.getExtensionFilters().add(new ExtensionFilter("WAV", "*.wav"));
+ songChooser.getExtensionFilters().add(new ExtensionFilter("Audio Files", "*.wav", "*.mp3", "*.aac"));
Button songButton = new Button("Song file");
- songButton.setOnAction(e -> selectedSong = songChooser.showOpenDialog(Driver.primaryStage));
+ songButton.setOnAction(_ -> selectedSong = songChooser.showOpenDialog(Driver.primaryStage));
ValidIndicator diffsInvalid = new ValidIndicator();
@@ -131,17 +131,14 @@ public class LevelEditor extends Page
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");
+ if (selectedBackground != null && selectedBackground.exists()) {
+ level.addFile(selectedBackground,"background." + getFileExtension(selectedBackground));
}
- if (selectedPreview != null && selectedPreview.exists())
- {
- level.addFile(selectedPreview,"preview.png");
+ if (selectedPreview != null && selectedPreview.exists()) {
+ level.addFile(selectedPreview,"preview." + getFileExtension(selectedPreview));
}
- if (selectedSong != null)
- {
- level.addFile(selectedSong,"song.wav");
+ if (selectedSong != null) {
+ level.addFile(selectedSong,"song." + getFileExtension(selectedSong));
}
level.writeMetadata();
});
@@ -186,4 +183,13 @@ public class LevelEditor extends Page
public Pane getContent() {
return content;
}
+
+ /**
+ * Get the extension of a file.
+ * @param file The file to return the extension of
+ * @return The extension of the file in the format "*.ext"
+ */
+ public String getFileExtension(File file) {
+ return file.getName().substring(file.getName().lastIndexOf('.') + 1);
+ }
} \ 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/editor/LevelList.java
index 7d899bd..b479f49 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/LevelList.java
+++ b/src/main/java/net/sowgro/npehero/editor/LevelList.java
@@ -1,4 +1,4 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.geometry.Insets;
diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java b/src/main/java/net/sowgro/npehero/editor/NotesEditor.java
index 3754847..133330f 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java
+++ b/src/main/java/net/sowgro/npehero/editor/NotesEditor.java
@@ -1,4 +1,4 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
@@ -119,7 +119,7 @@ public class NotesEditor extends Page
try
{
Sound.stopSong();
- diff.numBeats = (int)Double.parseDouble(timer.toString());
+// diff.numBeats = (int)Double.parseDouble(timer.toString());
timer = null;
writer.close();
help.setText(t1);
diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java b/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java
index 22c3f5e..38ad234 100644
--- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java
+++ b/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java
@@ -1,7 +1,9 @@
-package net.sowgro.npehero.devmenu;
+package net.sowgro.npehero.editor;
import javafx.beans.binding.DoubleBinding;
+import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ListProperty;
+import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
@@ -37,13 +39,14 @@ public class NotesEditor2 extends Page {
ListProperty<Block> activeNotes = new SimpleListProperty<>(FXCollections.observableArrayList());
ListProperty<Note> noteList;
DiffEditor prev;
+ DoubleProperty newEndTime = new SimpleDoubleProperty(0);
private HBox content = new HBox();
public NotesEditor2(Difficulty diff, DiffEditor prev) {
this.diff = diff;
noteList = diff.notes.deepCopyList();
- m = new MediaPlayer(new Media(diff.level.song.toURI().toString()));
+ m = new MediaPlayer(diff.level.song);
this.prev = prev;
// Buttons
@@ -65,7 +68,8 @@ public class NotesEditor2 extends Page {
ToggleButton play = new ToggleButton("Play");
Button reset = new Button("Reset");
ToggleButton scrollLock = new ToggleButton("Scroll Lock");
- actionBox.getChildren().addAll(playbackLabel, play, reset, scrollLock);
+ Button setEnd = new Button("End Here");
+ actionBox.getChildren().addAll(playbackLabel, play, reset, scrollLock, setEnd);
delNote.disableProperty().bind(activeNotes.emptyProperty());
moveNote.disableProperty().bind(activeNotes.emptyProperty());
@@ -85,7 +89,8 @@ public class NotesEditor2 extends Page {
lane.prefWidthProperty().bind(sizer.widthProperty());
}
Pane rulerLane = new Pane();
- rulerLane.setManaged(false);
+// rulerLane.setManaged(false);
+
Pane playheadLane = new Pane();
playheadLane.setOnMouseClicked(e -> {
m.seek(new Duration(screenPosToSecond(e.getY()) * 1000));
@@ -101,6 +106,10 @@ public class NotesEditor2 extends Page {
);
playhead.setFill(Color.WHITE);
playheadLane.getChildren().add(playhead);
+// playhead.setOnMouseDragged(e -> {
+// scroll.get
+// playhead.layoutYProperty().bind(secondToScreenPos());
+// });
HBox scrollContent = new HBox();
scrollContent.setAlignment(Pos.CENTER);
@@ -116,7 +125,14 @@ public class NotesEditor2 extends Page {
playheadLine.setStroke(Color.WHITE);
playheadLine.layoutYProperty().bind(playhead.layoutYProperty());
- Pane contentOverlay = new Pane(playheadLine);
+ Line endLine = new Line();
+ endLine.setStartX(0);
+ endLine.endXProperty().bind(scroll.widthProperty().subtract(80));
+ endLine.setStartY(0);
+ endLine.setEndY(0);
+ endLine.setStroke(Color.RED);
+
+ Pane contentOverlay = new Pane(playheadLine, endLine);
contentOverlay.setPickOnBounds(false);
StackPane stackPane = new StackPane();
@@ -124,8 +140,9 @@ public class NotesEditor2 extends Page {
scroll.setContent(stackPane);
// scroll.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35));
- scroll.setMinWidth(400);
-// scroll.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));
+// scroll.setMinWidth(400);
+ scroll.prefHeightProperty().bind(content.heightProperty().multiply(0.75));
+ scroll.prefWidthProperty().bind(scroll.prefHeightProperty().multiply(0.70));
scroll.getStyleClass().remove("scroll-pane");
scroll.getStyleClass().add("box");
scroll.setPadding(new Insets(5));
@@ -144,10 +161,11 @@ public class NotesEditor2 extends Page {
});
Button save = new Button();
- save.setText("Done");
+ save.setText("Save");
save.setOnAction(_ -> {
diff.notes.list = noteList;
diff.notes.writeFile();
+ diff.endTime = newEndTime.get();
Sound.playSfx(Sound.BACKWARD);
Driver.setMenu(new DiffEditor(diff, prev.prev));
});
@@ -156,6 +174,20 @@ public class NotesEditor2 extends Page {
buttons.setSpacing(10);
buttons.setAlignment(Pos.CENTER);
+ Runnable updateEndLine = () -> {
+ System.out.println("LISTENER CALLED");
+ if (newEndTime.get() != 0) {
+ endLine.layoutYProperty().bind(secondToScreenPos(newEndTime.get()));
+ }
+ else {
+ endLine.layoutYProperty().bind(secondToScreenPos(m.getTotalDuration().toSeconds()));
+ }
+ };
+
+ newEndTime.addListener((_, _, _) -> updateEndLine.run());
+ newEndTime.set(diff.endTime);
+ updateEndLine.run();
+
// Draw notes
noteList.forEach(n -> lanes[n.lane].getChildren().add(drawBlock(n)));
noteList.addListener((ListChangeListener<? super Note>) _ -> {
@@ -180,7 +212,7 @@ public class NotesEditor2 extends Page {
});
VBox centerBox = new VBox();
- centerBox.getChildren().addAll(main, exit);
+ centerBox.getChildren().addAll(main, buttons);
centerBox.setSpacing(10);
centerBox.setAlignment(Pos.CENTER);
@@ -284,6 +316,16 @@ public class NotesEditor2 extends Page {
helpBox.getChildren().clear();
}
});
+
+ setEnd.setOnAction(_ -> {
+ double tmp = screenPosToSecond(playhead.getLayoutY());
+ if (Math.round(tmp*10)/10 == Math.round(m.getTotalDuration().toSeconds() * 10)/10) {
+ newEndTime.set(0);
+ }
+ else {
+ newEndTime.set(tmp);
+ }
+ });
}
@Override
@@ -294,6 +336,9 @@ public class NotesEditor2 extends Page {
@Override
public void onView() {
Sound.stopSong();
+ m.play();
+ m.pause();
+ m.seek(Duration.ZERO);
}
@Override
@@ -357,11 +402,11 @@ public class NotesEditor2 extends Page {
}
private void MoveNoteUp() {
- activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01));
+ activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01));
}
private void MoveNoteDown() {
- activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01));
+ activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01));
}
private Pane addHelp() {
diff --git a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java
index b61d11c..2f95ee8 100755
--- a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java
+++ b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java
@@ -42,11 +42,11 @@ import javafx.util.*;
public class SongPlayer extends Pane {
private Double bpm; //initializes the bpm of the song, to be read in from a metadata file later
- private int songLength; //initializes the length of the song in terms of the song's bpm, to be read in later
+ private double songLength; //initializes the length of the song in terms of the song's bpm, to be read in later
private EventHandler<KeyEvent> eventHandler;
- private File song;
+ private Media song;
private boolean songIsPlaying = false;
private boolean missMute = false;
@@ -89,11 +89,11 @@ public class SongPlayer extends Pane {
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)));
+ case 0 -> dSends.add(new NoteInfo(e.time.get() * (bpm / 60)));
+ case 1 -> fSends.add(new NoteInfo(e.time.get() * (bpm / 60)));
+ case 2 -> spaceSends.add(new NoteInfo(e.time.get() * (bpm / 60)));
+ case 3 -> jSends.add(new NoteInfo(e.time.get() * (bpm / 60)));
+ case 4 -> kSends.add(new NoteInfo(e.time.get() * (bpm / 60)));
}
});
}
@@ -105,14 +105,19 @@ public class SongPlayer extends Pane {
if (lvl.background != null) {
Driver.setBackground(lvl.background);
}
- bpm = d.bpm; //Reads the song's bpm from a metadata file
+ bpm = 60.0; //Reads the song's bpm from a metadata file
level = lvl;
difficulty = d;
pane = p;
//System.out.println(d.bpm + " " + d.numBeats);
- songLength = d.numBeats;
+ if (d.endTime != 0) {
+ songLength = d.endTime;
+ }
+ else {
+ songLength = d.level.song.getDuration().toSeconds();
+ }
timer = new Timer(bpm); //Sets the timer's bpm to that of the song
scoreCounter = cntrl; //Uses the song's designated scoreCounter
@@ -255,7 +260,7 @@ public class SongPlayer extends Pane {
}
if (!songIsPlaying && timer.time() > 0.0) {
songIsPlaying = true;
- Sound.playSong(new Media(song.toURI().toString()));
+ Sound.playSong(song);
}
}
};
diff --git a/src/main/java/net/sowgro/npehero/gui/LevelSurround.java b/src/main/java/net/sowgro/npehero/gui/LevelSurround.java
index 05614ff..ea1eb30 100755
--- a/src/main/java/net/sowgro/npehero/gui/LevelSurround.java
+++ b/src/main/java/net/sowgro/npehero/gui/LevelSurround.java
@@ -128,4 +128,9 @@ public class LevelSurround extends Page
public Pane getContent() {
return content;
}
+
+ @Override
+ public void onLeave() {
+ Sound.playSong(Sound.MENU_SONG);
+ }
} \ No newline at end of file
diff --git a/src/main/java/net/sowgro/npehero/gui/MainMenu.java b/src/main/java/net/sowgro/npehero/gui/MainMenu.java
index f13deac..3b8c8db 100755
--- a/src/main/java/net/sowgro/npehero/gui/MainMenu.java
+++ b/src/main/java/net/sowgro/npehero/gui/MainMenu.java
@@ -10,7 +10,7 @@ import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import net.sowgro.npehero.Driver;
-import net.sowgro.npehero.devmenu.LevelList;
+import net.sowgro.npehero.editor.LevelList;
import net.sowgro.npehero.main.Page;
import net.sowgro.npehero.main.Sound;
diff --git a/src/main/java/net/sowgro/npehero/main/Control.java b/src/main/java/net/sowgro/npehero/main/Control.java
index 2a12f5a..d9e3942 100644
--- a/src/main/java/net/sowgro/npehero/main/Control.java
+++ b/src/main/java/net/sowgro/npehero/main/Control.java
@@ -64,6 +64,8 @@ public enum Control {
case LEFT -> "←";
case RIGHT -> "→";
case SPACE -> "_";
+ case EQUALS -> "+";
+ case MINUS -> "-";
case null -> " ";
default -> {
String s = key.toString();
diff --git a/src/main/java/net/sowgro/npehero/main/Difficulties.java b/src/main/java/net/sowgro/npehero/main/Difficulties.java
index 83137a7..f2ccd99 100644
--- a/src/main/java/net/sowgro/npehero/main/Difficulties.java
+++ b/src/main/java/net/sowgro/npehero/main/Difficulties.java
@@ -40,6 +40,7 @@ public class Difficulties {
list.add(diff);
}
}
+ list.sort(Comparator.naturalOrder());
}
/**
@@ -71,6 +72,11 @@ public class Difficulties {
Difficulty temp = new Difficulty(diffDir,level);
temp.title = text;
list.add(temp);
+ list.sort(Comparator.naturalOrder());
+ }
+
+ public void saveOrder() {
+ list.forEach(d -> d.order = list.indexOf(d));
}
diff --git a/src/main/java/net/sowgro/npehero/main/Difficulty.java b/src/main/java/net/sowgro/npehero/main/Difficulty.java
index 290461d..c80e650 100755
--- a/src/main/java/net/sowgro/npehero/main/Difficulty.java
+++ b/src/main/java/net/sowgro/npehero/main/Difficulty.java
@@ -1,5 +1,7 @@
package net.sowgro.npehero.main;
+import javafx.scene.media.Media;
+
import java.io.File;
import java.io.IOException;
@@ -10,8 +12,8 @@ public class Difficulty implements Comparable<Difficulty>
public String title = "Unnamed";
public Double bpm = 0.0;
- public int numBeats;
- public int priority = 0;
+ public double endTime = 0;
+ public int order = 0;
public Leaderboard leaderboard;
public Notes notes;
@@ -40,8 +42,14 @@ public class Difficulty implements Comparable<Difficulty>
title = metadataYaml.getString("title", title);
bpm = metadataYaml.getDouble("bpm", bpm);
- numBeats = metadataYaml.getInt("numBeats", numBeats);
- priority = metadataYaml.getInt("priority", priority);
+ endTime = metadataYaml.getDouble("endTime", endTime);
+ if (endTime == 0) {
+ int tmp = metadataYaml.getInt("numBeats", 0);
+ if (tmp != 0) {
+ endTime = beatToSecond(tmp);
+ }
+ }
+ order = metadataYaml.getInt("priority", order);
notes = new Notes(new File(thisDir, "notes.txt"), this);
leaderboard = new Leaderboard(new File(thisDir, "leaderboard.json"));
@@ -65,8 +73,8 @@ public class Difficulty implements Comparable<Difficulty>
*/
public void write() {
metadataYaml.set("title", title);
- metadataYaml.set("numBeats", numBeats);
- metadataYaml.set("priority", priority);
+ metadataYaml.set("endTime", endTime);
+ metadataYaml.set("priority", order);
try {
metadataYaml.write();
@@ -78,7 +86,11 @@ public class Difficulty implements Comparable<Difficulty>
@Override
public int compareTo(Difficulty d) {
- return priority - d.priority;
+ return order - d.order;
+ }
+
+ private double beatToSecond(double beat) {
+ return beat/(bpm/60);
}
diff --git a/src/main/java/net/sowgro/npehero/main/Level.java b/src/main/java/net/sowgro/npehero/main/Level.java
index dd96815..1b10f3d 100755
--- a/src/main/java/net/sowgro/npehero/main/Level.java
+++ b/src/main/java/net/sowgro/npehero/main/Level.java
@@ -3,6 +3,7 @@ package net.sowgro.npehero.main;
import java.io.File;
import javafx.scene.image.Image;
+import javafx.scene.media.Media;
import javafx.scene.paint.Color;
import java.io.IOException;
@@ -20,7 +21,7 @@ public class Level
public Image preview; //optional
public Image background; //optional
- public File song;
+ public Media song;
public Difficulties difficulties;
@@ -43,16 +44,23 @@ public class Level
public void readData() {
- if (new File(dir, "song.wav").exists()) {
- song = new File(dir,"song.wav");
+ var fileList = dir.listFiles();
+ if (fileList == null) {
+ return;
}
- if (new File(dir, "background.png").exists()) {
- background = new Image(new File(dir,"background.png").toURI().toString());
- }
-
- if (new File(dir, "preview.png").exists()) {
- preview = new Image(new File(dir,"preview.png").toURI().toString());
+ // support any file extension (maybe a bad idea)
+ for (File file : fileList) {
+ String fileName = file.getName();
+ if (fileName.contains("song")) {
+ song = new Media(file.toURI().toString());
+ }
+ else if (fileName.contains("background")) {
+ background = new Image(file.toURI().toString());
+ }
+ else if (fileName.contains("preview")) {
+ preview = new Image(file.toURI().toString());
+ }
}
parseMetadata();
@@ -61,7 +69,7 @@ public class Level
public void validate() {
if (song == null) {
- System.err.println(dir +" is missing song.wav");
+ System.err.println(dir +" is missing song file");
}
if (difficulties.validList.isEmpty()) {