diff options
| -rwxr-xr-x | .npehero/settings.json | 2 | ||||
| -rw-r--r-- | pom.xml | 4 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/editor/DiffEditor.java | 1 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/editor/LevelEditor.java | 47 | ||||
| -rw-r--r-- | src/main/java/net/sowgro/npehero/editor/NotesEditor2.java | 39 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/gameplay/Block.java | 2 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java | 7 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/LevelSurround.java | 9 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/SettingsEditor.java | 177 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/levelapi/Level.java | 31 | ||||
| -rwxr-xr-x | src/main/java/net/sowgro/npehero/main/Settings.java | 29 | 
11 files changed, 230 insertions, 118 deletions
| diff --git a/.npehero/settings.json b/.npehero/settings.json index 562d704..dc5e7d5 100755 --- a/.npehero/settings.json +++ b/.npehero/settings.json @@ -2,5 +2,5 @@    "guiScale": 1.0,    "effectsVol": 1.0,    "musicVol": 1.0, -  "enableMenuMusic": true +  "enableMenuMusic": false  }
\ No newline at end of file @@ -6,7 +6,7 @@      <groupId>net.sowgro.npehero</groupId>      <artifactId>NPEHero</artifactId> -    <version>2.0-SNAPSHOT</version> +    <version>2.0.3</version>      <name>NPE Hero</name>      <properties> @@ -121,7 +121,7 @@                  <configuration>                      <name>NPE Hero</name> -                    <appVersion>2.0.1</appVersion> +                    <appVersion>${project.version}</appVersion>                      <vendor>net.sowgro</vendor>                      <runtimeImage>target/app</runtimeImage>                      <module>net.sowgro.npehero/net.sowgro.npehero.Driver</module> diff --git a/src/main/java/net/sowgro/npehero/editor/DiffEditor.java b/src/main/java/net/sowgro/npehero/editor/DiffEditor.java index 0ae8f5f..7d2a8a6 100755 --- a/src/main/java/net/sowgro/npehero/editor/DiffEditor.java +++ b/src/main/java/net/sowgro/npehero/editor/DiffEditor.java @@ -132,6 +132,7 @@ public class DiffEditor extends Page          main.getChildren().addAll(optionsScroll);          main.setSpacing(10);          main.maxWidthProperty().bind(content.widthProperty().multiply(0.95)); +        main.maxHeightProperty().bind(content.heightProperty().multiply(0.75));          Button exit = new Button();          exit.setText("Back"); diff --git a/src/main/java/net/sowgro/npehero/editor/LevelEditor.java b/src/main/java/net/sowgro/npehero/editor/LevelEditor.java index f255705..a4e787a 100755 --- a/src/main/java/net/sowgro/npehero/editor/LevelEditor.java +++ b/src/main/java/net/sowgro/npehero/editor/LevelEditor.java @@ -1,12 +1,14 @@  package net.sowgro.npehero.editor;  import java.io.IOException; +import java.util.Objects;  import javafx.geometry.Insets;  import javafx.geometry.Pos;  import javafx.scene.Node;  import javafx.scene.control.*;  import javafx.scene.layout.*; +import javafx.scene.paint.Color;  import javafx.stage.FileChooser;  import javafx.stage.FileChooser.ExtensionFilter;  import net.sowgro.npehero.Driver; @@ -25,6 +27,7 @@ public class LevelEditor extends Page      private final Level level;      private final HBox content = new HBox(); +    private final CheckBox useCustomColors;      record OptionEntry(String label, Node action, ValidIndicator vi) {          OptionEntry(String label, Node action) { @@ -47,14 +50,17 @@ public class LevelEditor extends Page          descEntry = new TextField(level.desc); -        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) { +        useCustomColors = new CheckBox("Use Custom Colors"); +        useCustomColors.setSelected(!hasNull(level.colors)); + +        colorsPickers = new ColorPicker[5]; +        for (int i = 0; i < colorsPickers.length; i++) { +            var cp = new ColorPicker(Objects.requireNonNullElse( +                    level.colors[i], +                    Settings.defaultColors[i] +            )); +            colorsPickers[i] = cp; +            cp.disableProperty().bind(useCustomColors.selectedProperty().not());              cp.getStyleClass().add("button");              cp.setMinHeight(60);              cp.setMinWidth(60); @@ -64,6 +70,9 @@ public class LevelEditor extends Page          colorPickerBox.getChildren().addAll(colorsPickers);          colorPickerBox.setSpacing(10); +        VBox blockColors = new VBox(useCustomColors, colorPickerBox); +        blockColors.setSpacing(10); +          Node songFile = createFileImportBox(                  Level.SONG_FILE,                  () -> level.song, @@ -103,7 +112,7 @@ public class LevelEditor extends Page                          new OptionEntry("Song File", songFile, songValid),                          new OptionEntry("Preview Image", previewImage),                          new OptionEntry("Background Image", backgroundImage), -                        new OptionEntry("Block Colors", colorPickerBox), +                        new OptionEntry("Block Colors", blockColors),                  }          };          HBox options = new HBox(); @@ -111,6 +120,7 @@ public class LevelEditor extends Page              VBox colBox = new VBox();              colBox.setSpacing(10);              colBox.setPrefWidth(400); +              for (OptionEntry option : col) {                  Label label = new Label(option.label);                  HBox labelBox = new HBox(label); @@ -174,11 +184,13 @@ public class LevelEditor extends Page          level.title = titleEntry.getText();          level.artist = artistEntry.getText();          level.desc = descEntry.getText(); -        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(); +        for (int i = 0; i < colorsPickers.length; i++) { +            if (useCustomColors.isSelected()) { +                level.colors[i] = colorsPickers[i].getValue(); +            } else { +                level.colors[i] = null; +            } +        }          try {              level.writeMetadata();          } catch (IOException e) { @@ -239,4 +251,11 @@ public class LevelEditor extends Page          b1.setSpacing(10);          return b1;      } + +    boolean hasNull(Color[] arr) { +        for (Color color : arr) { +            if (color == null) return true; +        } +        return false; +    }  }
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java b/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java index bd9fd85..4491786 100644 --- a/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java +++ b/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java @@ -30,21 +30,23 @@ import net.sowgro.npehero.main.*;  import net.sowgro.npehero.main.Control;  import java.io.IOException; +import java.util.Objects;  import java.util.Set;  import java.util.concurrent.atomic.AtomicInteger;  public class NotesEditor2 extends Page {      private final DoubleBinding scaleBind; -    Difficulty diff; -    ScrollPane scroll = new ScrollPane(); -    Pane[] lanes; -    MediaPlayer m; -    Polygon playhead; -    ListProperty<Block> selectedNotes = new SimpleListProperty<>(FXCollections.observableArrayList()); -    ListProperty<Note> noteList; -    DiffEditor prev; -    DoubleProperty newEndTime = new SimpleDoubleProperty(0); -    CheckBox selectMultiple; +    private final Difficulty diff; +    private final ScrollPane scroll = new ScrollPane(); +    private final Pane[] lanes; +    private final MediaPlayer m; +    private final Polygon playhead; +    private final ListProperty<Block> selectedNotes = new SimpleListProperty<>(FXCollections.observableArrayList()); +    private final ListProperty<Note> noteList; +    private final DiffEditor prev; +    private final DoubleProperty newEndTime = new SimpleDoubleProperty(0); +    private final CheckBox selectMultiple; +    private final Color[] colors = new Color[5];      private final HBox content = new HBox(); @@ -54,6 +56,11 @@ public class NotesEditor2 extends Page {          m = new MediaPlayer(diff.level.song);          m.volumeProperty().bind(Settings.musicVol);          this.prev = prev; +        for (int i = 0; i < colors.length; i++) { +            colors[i] = Settings.forceDefaultColors +                    ? Settings.defaultColors[i] +                    : Objects.requireNonNullElse(diff.level.colors[i], Settings.defaultColors[i]); +        }          // Buttons          VBox actionBox = new VBox(); @@ -438,7 +445,7 @@ public class NotesEditor2 extends Page {      }      private Block drawBlock(Note n) { -        Color color = diff.level.colors[n.lane]; +        Color color = colors[n.lane];          Block b = new Block(color, false, n);  //        var sizeBind = scroll.widthProperty().divide(8);  //        b.heightProperty().bind(sizeBind); @@ -516,11 +523,11 @@ public class NotesEditor2 extends Page {      private Pane addHelp() {          Label l1 = new Label("Use the following keys");          HBox hb = new HBox( -                createTarget(diff.level.colors[0], Control.LANE0), -                createTarget(diff.level.colors[1], Control.LANE1), -                createTarget(diff.level.colors[2], Control.LANE2), -                createTarget(diff.level.colors[3], Control.LANE3), -                createTarget(diff.level.colors[4], Control.LANE4) +                createTarget(colors[0], Control.LANE0), +                createTarget(colors[1], Control.LANE1), +                createTarget(colors[2], Control.LANE2), +                createTarget(colors[3], Control.LANE3), +                createTarget(colors[4], Control.LANE4)          );          hb.setSpacing(10);          hb.setAlignment(Pos.CENTER_LEFT); diff --git a/src/main/java/net/sowgro/npehero/gameplay/Block.java b/src/main/java/net/sowgro/npehero/gameplay/Block.java index 5d35ccc..04579fc 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/Block.java +++ b/src/main/java/net/sowgro/npehero/gameplay/Block.java @@ -34,7 +34,7 @@ public class Block extends Rectangle      public void enableDropShadow() {          DropShadow dropShadow = new DropShadow(); -        dropShadow.setRadius(200.0); +        dropShadow.setRadius(100.0);          dropShadow.setColor(color);          dropShadow.setBlurType(BlurType.GAUSSIAN);          super.setEffect(dropShadow); diff --git a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java index fb95eb7..fc9269e 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java +++ b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java @@ -1,6 +1,7 @@  package net.sowgro.npehero.gameplay;  import java.util.ArrayList; +import java.util.Objects;  import javafx.event.EventHandler;  import javafx.geometry.Insets; @@ -74,7 +75,11 @@ public class SongPlayer extends HBox {          // create targets          for (int i = 0; i < lanes.length; i++) {              lanes[i] = new Lane(); -            var tmp = new Target(level.colors[i], Control.lanes[i].targetString()); +            var tmp = new Target( +                    Settings.forceDefaultColors +                            ? Settings.defaultColors[i] +                            : Objects.requireNonNullElse(level.colors[i], Settings.defaultColors[i]), +                    Control.lanes[i].targetString());              bindTarget(tmp);              lanes[i].target = tmp;          } diff --git a/src/main/java/net/sowgro/npehero/gui/LevelSurround.java b/src/main/java/net/sowgro/npehero/gui/LevelSurround.java index e6cc2f4..4b7cc75 100755 --- a/src/main/java/net/sowgro/npehero/gui/LevelSurround.java +++ b/src/main/java/net/sowgro/npehero/gui/LevelSurround.java @@ -3,6 +3,7 @@ package net.sowgro.npehero.gui;  import javafx.animation.AnimationTimer;  import javafx.scene.control.Label;  import javafx.scene.layout.*; +import javafx.scene.paint.Color;  import net.sowgro.npehero.Driver;  import net.sowgro.npehero.gameplay.SongPlayer;  import javafx.geometry.Insets; @@ -12,6 +13,7 @@ import javafx.scene.text.Text;  import net.sowgro.npehero.levelapi.Difficulty;  import net.sowgro.npehero.gameplay.ScoreController;  import net.sowgro.npehero.main.Page; +import net.sowgro.npehero.main.Settings;  import net.sowgro.npehero.main.Sound;  public class LevelSurround extends Page @@ -112,7 +114,12 @@ public class LevelSurround extends Page          var scale = content.prefHeightProperty().divide(720);          game.scaleXProperty().bind(scale);          game.scaleYProperty().bind(scale); -        game.getStyleClass().add("box"); +//        game.getStyleClass().add("box"); +//        game.setEffect(new BoxBlur()); +//        game.setBackground(Color.WHITE); +        BackgroundFill bgf = new BackgroundFill(Color.rgb(0, 0, 0, Settings.gameOpacity), null, null); +        game.setBackground(new Background(bgf)); +          BorderPane gameHolder = new BorderPane(game);          gameHolder.maxHeightProperty().bind(content.prefHeightProperty()); diff --git a/src/main/java/net/sowgro/npehero/gui/SettingsEditor.java b/src/main/java/net/sowgro/npehero/gui/SettingsEditor.java index e89dbc9..c5233b5 100755 --- a/src/main/java/net/sowgro/npehero/gui/SettingsEditor.java +++ b/src/main/java/net/sowgro/npehero/gui/SettingsEditor.java @@ -2,62 +2,37 @@ package net.sowgro.npehero.gui;  import javafx.geometry.Insets;  import javafx.geometry.Pos; +import javafx.scene.Node;  import javafx.scene.control.*; -import javafx.scene.layout.BorderPane;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import javafx.scene.layout.VBox; -import javafx.scene.text.Text;  import net.sowgro.npehero.Driver; -import net.sowgro.npehero.main.ErrorDisplay; -import net.sowgro.npehero.main.Page; -import net.sowgro.npehero.main.Settings; -import net.sowgro.npehero.main.Sound; +import net.sowgro.npehero.main.*;  import java.io.IOException;  public class SettingsEditor extends Page  {      private final HBox content = new HBox(); +    private final CheckBox forceDefaultColors; +    private final Slider gameOpacity; +    private final ColorPicker[] colorPickers; + +    record OptionEntry(String label, Node action) { }      public SettingsEditor()      { -        Text musicText = new Text(); -        musicText.setText("Music Volume"); -        musicText.getStyleClass().add("t3"); - -        Slider musicSlider = new Slider(); +        Slider musicSlider = new Slider(0.0, 1.0, 0);          musicSlider.valueProperty().bindBidirectional(Settings.musicVol); -        musicSlider.setMin(0.0); -        musicSlider.setMax(1.0);          CheckBox enableMenuMusic = new CheckBox("Enable Menu Music");          enableMenuMusic.selectedProperty().bindBidirectional(Settings.enableMenuMusic); -        VBox musicBox = new VBox(); -        musicBox.getChildren().addAll(musicText, musicSlider, enableMenuMusic); -        musicBox.getStyleClass().add("box"); -        musicBox.setPadding(new Insets(10)); - - -        Text SFXText = new Text(); -        SFXText.setText("Sound Effects Volume"); -        SFXText.getStyleClass().add("t3"); +        VBox musicBox = new VBox(musicSlider, enableMenuMusic); -        Slider SFXSlider = new Slider(); +        Slider SFXSlider = new Slider(0.0, 1.0, 0);          SFXSlider.valueProperty().bindBidirectional(Settings.effectsVol); -        SFXSlider.setMin(0.0); -        SFXSlider.setMax(1.0); - -        VBox SFXBox = new VBox(); -        SFXBox.getChildren().addAll(SFXText, SFXSlider); -        SFXBox.getStyleClass().add("box"); -        SFXBox.setPadding(new Insets(10)); - - -        Text fullText = new Text(); -        fullText.setText("Fullscreen mode"); -        fullText.getStyleClass().add("t3");          Button fullscreen = new Button();          fullscreen.setText("Toggle (F11)"); @@ -66,15 +41,6 @@ public class SettingsEditor extends Page              Driver.primaryStage.setFullScreen(!Driver.primaryStage.isFullScreen());          }); -        VBox fullBox = new VBox(); -        fullBox.getChildren().addAll(fullText,fullscreen); -        fullBox.getStyleClass().add("box"); -        fullBox.setPadding(new Insets(10)); - - -        Text controlsLabel = new Text("Key Bindings"); -        controlsLabel.getStyleClass().add("t3"); -          Button controlsButton = new Button();          controlsButton.setText("Edit");          controlsButton.setOnAction(_ -> { @@ -82,13 +48,6 @@ public class SettingsEditor extends Page              Driver.setMenu(new ControlEditor());          }); -        VBox controlsBox = new VBox(); -        controlsBox.getStyleClass().add("box"); -        controlsBox.getChildren().addAll(controlsLabel, controlsButton); -        controlsBox.setPadding(new Insets(10)); - -        Label scaleLabel = new Label("UI Scale"); -          ToggleButton[] scaleOptions = new ToggleButton[4];          for (int i = 0; i < scaleOptions.length; i++) {              var val = i * 0.5 + 0.5; @@ -107,36 +66,96 @@ public class SettingsEditor extends Page          tg.selectedToggleProperty().addListener((_, _, newt) -> {              Settings.guiScale.set((Double)newt.getUserData());          }); -          HBox scaleSlider = new HBox(scaleOptions); -        VBox scaleBox = new VBox(scaleLabel, scaleSlider); -        scaleBox.getStyleClass().add("box"); -        scaleBox.setPadding(new Insets(10)); +        colorPickers = new ColorPicker[] { +                new ColorPicker(Settings.defaultColors[0]), +                new ColorPicker(Settings.defaultColors[1]), +                new ColorPicker(Settings.defaultColors[2]), +                new ColorPicker(Settings.defaultColors[3]), +                new ColorPicker(Settings.defaultColors[4]) +        }; +        for (ColorPicker cp : colorPickers) { +            cp.getStyleClass().add("button"); +            cp.setMinHeight(60); +            cp.setMinWidth(60); +        } + +        HBox colorPickerBox = new HBox(); +        colorPickerBox.getChildren().addAll(colorPickers); +        colorPickerBox.setSpacing(10); + +        forceDefaultColors = new CheckBox("Force Default Colors"); +        forceDefaultColors.setSelected(Settings.forceDefaultColors); + +        Button resetColors = new Button("Reset"); +        resetColors.setOnAction(_ -> { +            for (int i = 0; i < colorPickers.length; i++) { +                colorPickers[i].setValue(Settings.DEFAULT_DEFAULT_COLORS[i]); +            } +        }); + +        VBox defaultColors = new VBox(colorPickerBox, forceDefaultColors, resetColors); +        defaultColors.setSpacing(10); + +        gameOpacity = new Slider(0.5, 1.0, 0.75); +        gameOpacity.setMajorTickUnit(0.25); +        gameOpacity.setMinorTickCount(1); +        gameOpacity.setSnapToTicks(true); + +        OptionEntry[][] optionEntries = { +                { +                        new OptionEntry("Music Volume", musicBox), +                        new OptionEntry("Sound Effects Volume", SFXSlider), +                        new OptionEntry("Fullscreen Mode", fullscreen), +                        new OptionEntry("Key Bindings", controlsButton), +                }, +                { +                        new OptionEntry("GUI Scale", scaleSlider), +                        new OptionEntry("Default Block Colors", defaultColors), +                        new OptionEntry("Game Opacity", gameOpacity) +                } +        }; +        HBox options = new HBox(); +        options.setSpacing(10); +        for (OptionEntry[] col : optionEntries) { +            VBox colBox = new VBox(); +            colBox.setSpacing(10); +            colBox.setPrefWidth(420); + +            for (OptionEntry option : col) { +                VBox optionBox = new VBox(new Label(option.label), option.action); +                optionBox.setPadding(new Insets(10)); +                optionBox.setSpacing(5); +                optionBox.getStyleClass().add("box"); +                colBox.getChildren().add(optionBox); +            } +            options.getChildren().add(colBox); +        } +        ScrollPane optionsScroll = new ScrollPane(options); +        optionsScroll.getStyleClass().remove("scroll-pane"); +        optionsScroll.setFitToWidth(true); +//        optionsScroll.setPrefWidth(450); + +        HBox main = new HBox(); +        main.getChildren().addAll(optionsScroll); +        main.setSpacing(10); +        main.maxWidthProperty().bind(content.widthProperty().multiply(0.95)); +        main.maxHeightProperty().bind(content.heightProperty().multiply(0.75));          Button exit = new Button();          exit.setText("Back"); -        exit.setOnAction(e -> { -            try { -                Settings.save(); -            } catch (IOException ex) { -                Driver.setMenu(new ErrorDisplay("Failed to save settings", ex, this)); -            } +        exit.setOnAction(_ -> {              Sound.playSfx(Sound.BACKWARD);              Driver.setMenu(new MainMenu());          }); -        BorderPane buttonBox = new BorderPane(); -        buttonBox.setLeft(exit); - -        VBox options = new VBox(); -        options.setSpacing(10); -        options.setAlignment(Pos.CENTER); -        options.getChildren().addAll(musicBox,SFXBox,fullBox,controlsBox, scaleBox, buttonBox); -//        options.setPrefWidth(450); -        options.prefHeightProperty().bind(content.prefHeightProperty()); +        VBox centerBox = new VBox(); +        centerBox.getChildren().addAll(main, exit); +        centerBox.setSpacing(10); +        centerBox.setAlignment(Pos.CENTER); -        content.getChildren().add(options); +        content.getChildren().add(centerBox);          content.setAlignment(Pos.CENTER);      } @@ -144,5 +163,21 @@ public class SettingsEditor extends Page      public Pane getContent() {          return content;      } + +    @Override +    public void onLeave() { +        Settings.forceDefaultColors = forceDefaultColors.isSelected(); +        Settings.defaultColors[0] = colorPickers[0].getValue(); +        Settings.defaultColors[1] = colorPickers[1].getValue(); +        Settings.defaultColors[2] = colorPickers[2].getValue(); +        Settings.defaultColors[3] = colorPickers[3].getValue(); +        Settings.defaultColors[4] = colorPickers[4].getValue(); +        Settings.gameOpacity = gameOpacity.getValue(); +        try { +            Settings.save(); +        } catch (IOException ex) { +            Driver.setMenu(new ErrorDisplay("Failed to save settings", ex, this)); +        } +    }  } diff --git a/src/main/java/net/sowgro/npehero/levelapi/Level.java b/src/main/java/net/sowgro/npehero/levelapi/Level.java index 0e25445..f61c7b8 100755 --- a/src/main/java/net/sowgro/npehero/levelapi/Level.java +++ b/src/main/java/net/sowgro/npehero/levelapi/Level.java @@ -13,6 +13,7 @@ import java.nio.file.Files;  import java.nio.file.StandardCopyOption;  import java.util.HashMap;  import java.util.Map; +import java.util.Objects;  public class Level implements Comparable<Level>{ @@ -25,7 +26,7 @@ public class Level implements Comparable<Level>{      public String title = "Unnamed";      public String artist = "Unknown";      public String desc; -    public Color[] colors = {Color.RED,Color.BLUE,Color.GREEN,Color.PURPLE,Color.YELLOW}; +    public Color[] colors = {null, null, null, null, null};      public Image preview;      public Image background;      public Media song; @@ -101,11 +102,11 @@ public class Level implements Comparable<Level>{          title = (String) data.getOrDefault("title", title);          artist = (String) data.getOrDefault("artist", artist);          desc = (String) data.getOrDefault("desc", desc); -        colors[0] = Color.web((String) data.getOrDefault("color1", colors[0].toString())); -        colors[1] = Color.web((String) data.getOrDefault("color2", colors[1].toString())); -        colors[2] = Color.web((String) data.getOrDefault("color3", colors[2].toString())); -        colors[3] = Color.web((String) data.getOrDefault("color4", colors[3].toString())); -        colors[4] = Color.web((String) data.getOrDefault("color5", colors[4].toString())); +        colors[0] = colorGetOrDefault(data, "color1", colors[0]); +        colors[1] = colorGetOrDefault(data, "color2", colors[1]); +        colors[2] = colorGetOrDefault(data, "color3", colors[2]); +        colors[3] = colorGetOrDefault(data, "color4", colors[3]); +        colors[4] = colorGetOrDefault(data, "color5", colors[4]);      }      /** @@ -141,11 +142,11 @@ public class Level implements Comparable<Level>{          data.put("title", title);          data.put("artist", artist);          data.put("desc", desc); -        data.put("color1",colors[0].toString()); -        data.put("color2",colors[1].toString()); -        data.put("color3",colors[2].toString()); -        data.put("color4",colors[3].toString()); -        data.put("color5",colors[4].toString()); +        data.put("color1",Objects.toString(colors[0])); +        data.put("color2",Objects.toString(colors[1])); +        data.put("color3",Objects.toString(colors[2])); +        data.put("color4",Objects.toString(colors[3])); +        data.put("color5",Objects.toString(colors[4]));          FileWriter fileWriter = new FileWriter(jsonFile);          jsonParser.toJson(data, fileWriter);          fileWriter.close(); @@ -195,4 +196,12 @@ public class Level implements Comparable<Level>{      public String getFileExtension(File file) {          return file.getName().substring(file.getName().lastIndexOf('.') + 1);      } + +    public static Color colorGetOrDefault(Map<String, Object> source, String key, Color defaultValue) { +        try { +            return Color.web((String) source.getOrDefault(key, defaultValue)); +        } catch (Exception e) { +            return null; +        } +    }  } diff --git a/src/main/java/net/sowgro/npehero/main/Settings.java b/src/main/java/net/sowgro/npehero/main/Settings.java index c79f90f..aa94f54 100755 --- a/src/main/java/net/sowgro/npehero/main/Settings.java +++ b/src/main/java/net/sowgro/npehero/main/Settings.java @@ -4,6 +4,7 @@ import java.io.File;  import java.io.FileReader;  import java.io.FileWriter;  import java.io.IOException; +import java.util.Arrays;  import java.util.HashMap;  import java.util.Map; @@ -11,14 +12,20 @@ import com.google.gson.Gson;  import com.google.gson.GsonBuilder;  import javafx.beans.property.SimpleBooleanProperty;  import javafx.beans.property.SimpleDoubleProperty; +import javafx.scene.paint.Color;  import net.sowgro.npehero.Driver;  public class Settings  { +	public static final Color[] DEFAULT_DEFAULT_COLORS = {Color.RED,Color.BLUE,Color.GREEN,Color.PURPLE,Color.YELLOW}; +  	public static SimpleDoubleProperty effectsVol = new SimpleDoubleProperty(1);  	public static SimpleDoubleProperty musicVol = new SimpleDoubleProperty(1);  	public static SimpleBooleanProperty enableMenuMusic = new SimpleBooleanProperty(true);  	public static SimpleDoubleProperty guiScale = new SimpleDoubleProperty(1); +	public static Color[] defaultColors = Arrays.copyOf(DEFAULT_DEFAULT_COLORS, 5); +	public static boolean forceDefaultColors = false; +	public static double gameOpacity = 0.0;  	private static final Gson jsonParser = new GsonBuilder().serializeNulls().setPrettyPrinting().create();  	private static final File jsonFile = new File(Driver.BASE_DIR, "settings.json"); @@ -36,6 +43,13 @@ public class Settings  		musicVol.set((Double) data.getOrDefault("musicVol", 1.0));  		enableMenuMusic.set((Boolean) data.getOrDefault("enableMenuMusic", true));  		guiScale.set((Double) data.getOrDefault("guiScale", 1.0)); +		defaultColors[0] = colorGetOrDefault(data, "colorOverride1", defaultColors[0]); +		defaultColors[1] = colorGetOrDefault(data, "colorOverride2", defaultColors[1]); +		defaultColors[2] = colorGetOrDefault(data, "colorOverride3", defaultColors[2]); +		defaultColors[3] = colorGetOrDefault(data, "colorOverride4", defaultColors[3]); +		defaultColors[4] = colorGetOrDefault(data, "colorOverride5", defaultColors[4]); +		forceDefaultColors = (Boolean) data.getOrDefault("enableColorOverride", false); +		gameOpacity = (Double) data.getOrDefault("gameOpacity", gameOpacity);  	}  	/** @@ -47,8 +61,23 @@ public class Settings  		data.put("musicVol", musicVol.get());  		data.put("enableMenuMusic", enableMenuMusic.get());  		data.put("guiScale", guiScale.get()); +		data.put("colorOverride1", defaultColors[0].toString()); +		data.put("colorOverride2", defaultColors[1].toString()); +		data.put("colorOverride3", defaultColors[2].toString()); +		data.put("colorOverride4", defaultColors[3].toString()); +		data.put("colorOverride5", defaultColors[4].toString()); +		data.put("enableColorOverride", forceDefaultColors); +		data.put("gameOpacity", gameOpacity);  		FileWriter fileWriter = new FileWriter(jsonFile);  		jsonParser.toJson(data, fileWriter);  		fileWriter.close();  	} + +	public static Color colorGetOrDefault(Map<String, Object> source, String key, Color defaultValue) { +		try { +			return Color.web((String) source.getOrDefault(key, defaultValue)); +		} catch (Exception e) { +			return null; +		} +	}  } | 
