diff options
Diffstat (limited to 'src/main/java/net/sowgro/npehero')
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()) { |