diff options
| author | sowgro <tpoke.ferrari@gmail.com> | 2024-07-23 00:24:44 -0400 | 
|---|---|---|
| committer | sowgro <tpoke.ferrari@gmail.com> | 2024-07-23 00:24:44 -0400 | 
| commit | aae98b8bfca1578c14d6dde3a2f3180c7c580131 (patch) | |
| tree | a01dbb81ce6289c72b172b040a0a8185faaefd8e /src/main | |
| parent | 231c511304915d80aab89d28779d7445ad21ef70 (diff) | |
| download | NPEhero-aae98b8bfca1578c14d6dde3a2f3180c7c580131.tar.gz NPEhero-aae98b8bfca1578c14d6dde3a2f3180c7c580131.tar.bz2 NPEhero-aae98b8bfca1578c14d6dde3a2f3180c7c580131.zip | |
Improve difficulty ordering and add songEnd and support multiple file types.
Diffstat (limited to 'src/main')
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()) { | 
