From ab19b53d63e9f0bb52166099a37635cc9bc0da78 Mon Sep 17 00:00:00 2001 From: yugecin Date: Mon, 25 Jun 2018 22:18:26 +0200 Subject: [PATCH] remove unnecessary events pattern and replace it with something more simple --- src/itdelatrisu/opsu/GameImage.java | 11 ++-- .../opsu/audio/MusicController.java | 10 ++- .../opsu/audio/SoundController.java | 18 +++--- .../opsu/beatmap/BeatmapParser.java | 5 +- .../opsu/beatmap/BeatmapSetList.java | 9 +-- .../opsu/beatmap/BeatmapWatchService.java | 8 +-- src/itdelatrisu/opsu/beatmap/OszUnpacker.java | 5 +- src/itdelatrisu/opsu/downloads/Download.java | 6 +- .../opsu/downloads/DownloadNode.java | 16 ++--- src/itdelatrisu/opsu/downloads/Updater.java | 6 +- src/itdelatrisu/opsu/replay/Replay.java | 5 +- .../opsu/replay/ReplayImporter.java | 9 ++- src/itdelatrisu/opsu/skins/SkinLoader.java | 7 +- .../opsu/states/DownloadsMenu.java | 16 ++--- src/itdelatrisu/opsu/states/Game.java | 40 ++++++------ src/itdelatrisu/opsu/states/GameRanking.java | 11 ++-- src/itdelatrisu/opsu/states/MainMenu.java | 25 ++++---- src/itdelatrisu/opsu/states/SongMenu.java | 8 +-- .../opsudance/core/DisplayContainer.java | 64 +++++++++---------- .../opsudance/core/GlobalInputListener.java | 7 +- .../opsudance/core/InstanceContainer.java | 14 +++- src/yugecin/opsudance/core/events/Event.java | 53 --------------- .../opsudance/core/state/BaseOpsuState.java | 6 +- .../specialstates/BarNotificationState.java | 16 +++-- .../state/specialstates/BubNotifState.java | 16 +++-- .../state/specialstates/FpsRenderState.java | 3 +- .../opsudance/events/BarNotifListener.java | 28 -------- .../opsudance/events/BubNotifListener.java | 30 --------- .../events/ResolutionChangedListener.java | 11 +--- .../opsudance/events/SkinChangedListener.java | 10 +-- .../opsudance/options/Configuration.java | 25 ++++---- .../opsudance/options/NumericOption.java | 10 +-- src/yugecin/opsudance/options/Options.java | 7 +- .../opsudance/options/OptionsService.java | 9 ++- .../opsudance/sbv2/MoveStoryboard.java | 7 +- .../opsudance/skinning/SkinService.java | 26 ++++++-- 36 files changed, 227 insertions(+), 330 deletions(-) delete mode 100644 src/yugecin/opsudance/core/events/Event.java delete mode 100644 src/yugecin/opsudance/events/BarNotifListener.java delete mode 100644 src/yugecin/opsudance/events/BubNotifListener.java diff --git a/src/itdelatrisu/opsu/GameImage.java b/src/itdelatrisu/opsu/GameImage.java index 68002fc5..06023610 100644 --- a/src/itdelatrisu/opsu/GameImage.java +++ b/src/itdelatrisu/opsu/GameImage.java @@ -31,10 +31,11 @@ import org.newdawn.slick.SlickException; import org.newdawn.slick.util.Log; import org.newdawn.slick.util.ResourceLoader; import yugecin.opsudance.core.errorhandling.ErrorHandler; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.skinning.SkinService; import yugecin.opsudance.utils.SlickUtil; +import static itdelatrisu.opsu.ui.Colors.*; +import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; /** @@ -743,7 +744,7 @@ public enum GameImage { String err = String.format("Could not find default image '%s'.", filename); Log.warn(err); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } /** @@ -806,8 +807,7 @@ public enum GameImage { img = img.getScaledCopy(0.5f); list.add(img); } catch (SlickException e) { - BubNotifListener.EVENT.make().onBubNotif( - String.format("Failed to set image '%s'.", name), Colors.BUB_RED); + bubNotifs.sendf(BUB_RED, "Failed to set image '%s'.", name); break; } } @@ -834,8 +834,7 @@ public enum GameImage { img = img.getScaledCopy(0.5f); return img; } catch (SlickException e) { - BubNotifListener.EVENT.make().onBubNotif( - String.format("Failed to set image '%s'.", filename), Colors.BUB_RED); + bubNotifs.sendf(BUB_RED, "Failed to set image '%s'.", filename); } } return null; diff --git a/src/itdelatrisu/opsu/audio/MusicController.java b/src/itdelatrisu/opsu/audio/MusicController.java index eee4135a..a37e1f44 100644 --- a/src/itdelatrisu/opsu/audio/MusicController.java +++ b/src/itdelatrisu/opsu/audio/MusicController.java @@ -33,7 +33,6 @@ import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; -import itdelatrisu.opsu.ui.Colors; import org.lwjgl.BufferUtils; import org.lwjgl.openal.AL; import org.lwjgl.openal.AL10; @@ -45,10 +44,10 @@ import org.newdawn.slick.openal.SoundStore; import org.newdawn.slick.util.Log; import org.newdawn.slick.util.ResourceLoader; import org.tritonus.share.sampled.file.TAudioFileFormat; -import yugecin.opsudance.events.BarNotifListener; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; +import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; /** @@ -103,8 +102,7 @@ public class MusicController { if (lastBeatmap == null || !beatmap.audioFilename.equals(lastBeatmap.audioFilename)) { final File audioFile = beatmap.audioFilename; if (!audioFile.isFile() && !ResourceLoader.resourceExists(audioFile.getPath())) { - BarNotifListener.EVENT.make().onBarNotif(String.format("Could not find track '%s'.", - audioFile.getName())); + barNotifs.sendf("Could not find track '%s'.", audioFile.getName()); return; } @@ -159,7 +157,7 @@ public class MusicController { } catch (Exception e) { String err = String.format("Could not play track '%s'.", file.getName()); Log.error(err, e); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } } diff --git a/src/itdelatrisu/opsu/audio/SoundController.java b/src/itdelatrisu/opsu/audio/SoundController.java index 659b9fbb..2f62d3d2 100644 --- a/src/itdelatrisu/opsu/audio/SoundController.java +++ b/src/itdelatrisu/opsu/audio/SoundController.java @@ -36,15 +36,14 @@ import javax.sound.sampled.DataLine; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.SlickException; import org.newdawn.slick.util.ResourceLoader; -import yugecin.opsudance.events.BarNotifListener; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.options.Configuration; import yugecin.opsudance.skinning.SkinService; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; +import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; /** @@ -220,8 +219,8 @@ public class SoundController { // menu and game sounds for (SoundEffect s : SoundEffect.values()) { if ((currentFileName = getSoundFileName(s.getFileName())) == null) { - BubNotifListener.EVENT.make().onBubNotif( - "Could not find sound file " + s.getFileName(), Colors.BUB_ORANGE); + final String name = s.getFileName(); + bubNotifs.send(BUB_ORANGE, "Could not find sound file " + name); continue; } MultiClip newClip = loadClip(currentFileName, currentFileName.endsWith(".mp3")); @@ -240,8 +239,10 @@ public class SoundController { for (HitSound s : HitSound.values()) { String filename = String.format("%s-%s", ss.getName(), s.getFileName()); if ((currentFileName = getSoundFileName(filename)) == null) { - BubNotifListener.EVENT.make().onBubNotif( - "Could not find hit sound file " + filename, Colors.BUB_ORANGE); + bubNotifs.send( + BUB_ORANGE, + "Could not find hit sound file " + filename + ); continue; } MultiClip newClip = loadClip(currentFileName, false); @@ -398,8 +399,7 @@ public class SoundController { @Override public void error() { - BarNotifListener.EVENT.make().onBarNotif( - "Failed to download track preview"); + barNotifs.send("Failed to download track preview"); } }); try { diff --git a/src/itdelatrisu/opsu/beatmap/BeatmapParser.java b/src/itdelatrisu/opsu/beatmap/BeatmapParser.java index 7550d0af..1e31d024 100644 --- a/src/itdelatrisu/opsu/beatmap/BeatmapParser.java +++ b/src/itdelatrisu/opsu/beatmap/BeatmapParser.java @@ -31,13 +31,12 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.Color; import org.newdawn.slick.util.Log; import yugecin.opsudance.core.Nullable; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.skinning.SkinService; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; @@ -890,7 +889,7 @@ public class BeatmapParser { private static void logAndShowErrorNotification(Exception e, String message, Object... formatArgs) { message = String.format(message, formatArgs); Log.error(message, e); - BubNotifListener.EVENT.make().onBubNotif(message, Colors.BUB_RED); + bubNotifs.send(BUB_RED, message); } } \ No newline at end of file diff --git a/src/itdelatrisu/opsu/beatmap/BeatmapSetList.java b/src/itdelatrisu/opsu/beatmap/BeatmapSetList.java index 1cb1d72c..2e6ea9db 100644 --- a/src/itdelatrisu/opsu/beatmap/BeatmapSetList.java +++ b/src/itdelatrisu/opsu/beatmap/BeatmapSetList.java @@ -21,8 +21,6 @@ package itdelatrisu.opsu.beatmap; import itdelatrisu.opsu.Utils; import itdelatrisu.opsu.audio.MusicController; import itdelatrisu.opsu.db.BeatmapDB; -import itdelatrisu.opsu.ui.Colors; -import yugecin.opsudance.events.BubNotifListener; import java.io.File; import java.io.IOException; @@ -36,6 +34,9 @@ import java.util.LinkedList; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static itdelatrisu.opsu.ui.Colors.*; +import static yugecin.opsudance.core.InstanceContainer.*; + /** * Indexed, expanding, doubly-linked list data type for song groups. */ @@ -215,7 +216,7 @@ public class BeatmapSetList { try { Utils.deleteToTrash(dir); } catch (IOException e) { - BubNotifListener.EVENT.make().onBubNotif("Could not delete song group", Colors.BUB_ORANGE); + bubNotifs.send(BUB_ORANGE, "Could not delete song group"); } if (ws != null) ws.resume(); @@ -271,7 +272,7 @@ public class BeatmapSetList { try { Utils.deleteToTrash(file); } catch (IOException e) { - BubNotifListener.EVENT.make().onBubNotif("Could not delete song", Colors.BUB_ORANGE); + bubNotifs.send(BUB_ORANGE, "Could not delete song"); } if (ws != null) ws.resume(); diff --git a/src/itdelatrisu/opsu/beatmap/BeatmapWatchService.java b/src/itdelatrisu/opsu/beatmap/BeatmapWatchService.java index b49acd37..8b36f570 100644 --- a/src/itdelatrisu/opsu/beatmap/BeatmapWatchService.java +++ b/src/itdelatrisu/opsu/beatmap/BeatmapWatchService.java @@ -38,11 +38,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BarNotifListener; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; @@ -101,7 +99,7 @@ public class BeatmapWatchService { ws.register(config.beatmapDir.toPath()); } catch (IOException e) { Log.error("Could not create watch service", e); - BubNotifListener.EVENT.make().onBubNotif("Could not create watch service", Colors.BUB_RED); + bubNotifs.send(BUB_RED, "Could not create watch service"); return; } @@ -124,7 +122,7 @@ public class BeatmapWatchService { } catch (IOException e) { String msg = "An I/O exception occurred while closing the previous watch service."; Log.error(msg, e); - BarNotifListener.EVENT.make().onBarNotif(msg); + barNotifs.send(msg); ws = null; } } diff --git a/src/itdelatrisu/opsu/beatmap/OszUnpacker.java b/src/itdelatrisu/opsu/beatmap/OszUnpacker.java index 05e7182a..a31ed064 100644 --- a/src/itdelatrisu/opsu/beatmap/OszUnpacker.java +++ b/src/itdelatrisu/opsu/beatmap/OszUnpacker.java @@ -23,12 +23,11 @@ import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; -import itdelatrisu.opsu.ui.Colors; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.InstanceContainer.*; /** @@ -97,7 +96,7 @@ public class OszUnpacker { } catch (ZipException e) { String err = String.format("Failed to unzip file %s to dest %s.", file.getAbsolutePath(), dest.getAbsolutePath()); Log.error(err, e); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } } diff --git a/src/itdelatrisu/opsu/downloads/Download.java b/src/itdelatrisu/opsu/downloads/Download.java index 1b65d5d3..35f59134 100644 --- a/src/itdelatrisu/opsu/downloads/Download.java +++ b/src/itdelatrisu/opsu/downloads/Download.java @@ -33,10 +33,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; +import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; /** @@ -220,7 +220,7 @@ public class Download { else if (redirectCount > MAX_REDIRECTS) error = String.format("Download for URL '%s' is attempting too many redirects (over %d).", base.toString(), MAX_REDIRECTS); if (error != null) { - BubNotifListener.EVENT.make().onBubNotif(error, Colors.BUB_ORANGE); + bubNotifs.send(BUB_ORANGE, error); throw new IOException(); } diff --git a/src/itdelatrisu/opsu/downloads/DownloadNode.java b/src/itdelatrisu/opsu/downloads/DownloadNode.java index e5625306..a90b3eff 100644 --- a/src/itdelatrisu/opsu/downloads/DownloadNode.java +++ b/src/itdelatrisu/opsu/downloads/DownloadNode.java @@ -33,9 +33,8 @@ import java.io.File; import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; -import yugecin.opsudance.events.BarNotifListener; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; @@ -280,14 +279,12 @@ public class DownloadNode { download.setListener(new DownloadListener() { @Override public void completed() { - BarNotifListener.EVENT.make().onBarNotif( - String.format("Download complete: %s", getTitle())); + barNotifs.sendf("Download complete: %s", getTitle()); } @Override public void error() { - BarNotifListener.EVENT.make().onBarNotif( - "Download failed due to a connection error."); + barNotifs.send("Download failed due to a connection error."); } }); this.download = download; @@ -409,9 +406,10 @@ public class DownloadNode { public void drawDownload(Graphics g, float position, int id, boolean hover) { Download download = this.download; // in case clearDownload() is called asynchronously if (download == null) { - BubNotifListener.EVENT.make().onBubNotif( - "Trying to draw download information for button without Download object", - Colors.BUB_ORANGE); + bubNotifs.send( + BUB_ORANGE, + "Trying to draw download information for button without Download object" + ); return; } diff --git a/src/itdelatrisu/opsu/downloads/Updater.java b/src/itdelatrisu/opsu/downloads/Updater.java index f0d95efd..c8da26e5 100644 --- a/src/itdelatrisu/opsu/downloads/Updater.java +++ b/src/itdelatrisu/opsu/downloads/Updater.java @@ -36,7 +36,6 @@ import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.newdawn.slick.util.Log; import org.newdawn.slick.util.ResourceLoader; import yugecin.opsudance.core.Constants; -import yugecin.opsudance.events.BarNotifListener; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; import static yugecin.opsudance.core.InstanceContainer.*; @@ -241,14 +240,13 @@ public class Updater { @Override public void completed() { status = Status.UPDATE_DOWNLOADED; - BarNotifListener.EVENT.make().onBarNotif("Update has finished downloading"); + barNotifs.send("Update has finished downloading"); } @Override public void error() { status = Status.CONNECTION_ERROR; - BarNotifListener.EVENT.make().onBarNotif( - "Update failed due to a connection error."); + barNotifs.send("Update failed due to a connection error."); } }); } diff --git a/src/itdelatrisu/opsu/replay/Replay.java b/src/itdelatrisu/opsu/replay/Replay.java index 9296f55e..6550e96e 100644 --- a/src/itdelatrisu/opsu/replay/Replay.java +++ b/src/itdelatrisu/opsu/replay/Replay.java @@ -39,13 +39,12 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import itdelatrisu.opsu.ui.Colors; import org.apache.commons.compress.compressors.lzma.LZMACompressorInputStream; import org.newdawn.slick.util.Log; import lzma.streams.LzmaOutputStream; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; import static yugecin.opsudance.core.InstanceContainer.*; @@ -275,7 +274,7 @@ public class Replay { public void save() { // create replay directory if (!config.replayDir.isDirectory() && !config.replayDir.mkdir()) { - BubNotifListener.EVENT.make().onBubNotif("Failed to create replay directory", Colors.BUB_RED); + bubNotifs.send(BUB_RED, "Failed to create replay directory"); return; } diff --git a/src/itdelatrisu/opsu/replay/ReplayImporter.java b/src/itdelatrisu/opsu/replay/ReplayImporter.java index 84b0a44e..3d002bf1 100644 --- a/src/itdelatrisu/opsu/replay/ReplayImporter.java +++ b/src/itdelatrisu/opsu/replay/ReplayImporter.java @@ -28,10 +28,9 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.InstanceContainer.*; /** @@ -69,7 +68,7 @@ public class ReplayImporter { if (!config.replayDir.isDirectory() && !config.replayDir.mkdir()) { String err = String.format("Failed to create replay directory '%s'.", config.replayDir.getAbsolutePath()); Log.error(err); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); return; } @@ -83,7 +82,7 @@ public class ReplayImporter { moveToFailedDirectory(file); String err = String.format("Failed to import replay '%s'. The replay file could not be parsed.", file.getName()); Log.error(err, e); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); continue; } Beatmap beatmap = BeatmapSetList.get().getBeatmapFromHash(r.beatmapHash); @@ -102,7 +101,7 @@ public class ReplayImporter { moveToFailedDirectory(file); String err = String.format("Failed to import replay '%s'. The associated beatmap could not be found.", file.getName()); Log.error(err); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } } diff --git a/src/itdelatrisu/opsu/skins/SkinLoader.java b/src/itdelatrisu/opsu/skins/SkinLoader.java index 799a2da2..6c45e747 100644 --- a/src/itdelatrisu/opsu/skins/SkinLoader.java +++ b/src/itdelatrisu/opsu/skins/SkinLoader.java @@ -29,10 +29,11 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.Color; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BubNotifListener; + +import static itdelatrisu.opsu.ui.Colors.*; +import static yugecin.opsudance.core.InstanceContainer.*; /** * Loads skin configuration files. @@ -293,7 +294,7 @@ public class SkinLoader { } catch (IOException e) { String err = String.format("Failed to read file '%s'.", skinFile.getAbsolutePath()); Log.error(err, e); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } return skin; diff --git a/src/itdelatrisu/opsu/states/DownloadsMenu.java b/src/itdelatrisu/opsu/states/DownloadsMenu.java index 23fe14b8..3cf1cbac 100644 --- a/src/itdelatrisu/opsu/states/DownloadsMenu.java +++ b/src/itdelatrisu/opsu/states/DownloadsMenu.java @@ -53,7 +53,6 @@ import org.newdawn.slick.SlickException; import org.newdawn.slick.gui.TextField; import org.newdawn.slick.util.Log; import yugecin.opsudance.core.state.ComplexOpsuState; -import yugecin.opsudance.events.BarNotifListener; import static org.lwjgl.input.Keyboard.*; import static yugecin.opsudance.core.InstanceContainer.*; @@ -273,13 +272,12 @@ public class DownloadsMenu extends ComplexOpsuState { if (this.importedNode == null) { return; } - String msg; + if (dirs.length == 1) { - msg = "Imported 1 new song."; - } else { - msg = String.format("Imported %d new songs.", dirs.length); + barNotifs.send("Imported 1 new song."); + return; } - BarNotifListener.EVENT.make().onBarNotif(msg); + barNotifs.sendf("Imported %d new songs.", dirs.length); } } @@ -686,7 +684,7 @@ public class DownloadsMenu extends ComplexOpsuState { if (playing) previewID = node.getID(); } catch (SlickException e) { - BarNotifListener.EVENT.make().onBarNotif("Failed to load track preview. See log for details."); + barNotifs.send("Failed to load track preview. See log for details."); Log.error(e); } } @@ -709,7 +707,7 @@ public class DownloadsMenu extends ComplexOpsuState { if (!DownloadList.get().contains(node.getID())) { node.createDownload(serverMenu.getSelectedItem()); if (node.getDownload() == null) { - BarNotifListener.EVENT.make().onBarNotif("The download could not be started"); + barNotifs.send("The download could not be started"); } else { DownloadList.get().addNode(node); node.getDownload().start(); @@ -951,7 +949,7 @@ public class DownloadsMenu extends ComplexOpsuState { pageDir = Page.RESET; previewID = -1; if (barNotificationOnLoad != null) { - BarNotifListener.EVENT.make().onBarNotif(barNotificationOnLoad); + barNotifs.send(barNotificationOnLoad); barNotificationOnLoad = null; } } diff --git a/src/itdelatrisu/opsu/states/Game.java b/src/itdelatrisu/opsu/states/Game.java index 71915169..0b9d9226 100644 --- a/src/itdelatrisu/opsu/states/Game.java +++ b/src/itdelatrisu/opsu/states/Game.java @@ -57,8 +57,6 @@ import org.newdawn.slick.SlickException; import org.newdawn.slick.util.Log; import yugecin.opsudance.*; import yugecin.opsudance.core.state.ComplexOpsuState; -import yugecin.opsudance.events.BarNotifListener; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.objects.curves.FakeCombinedCurve; import yugecin.opsudance.options.OptionGroups; import yugecin.opsudance.sbv2.MoveStoryboard; @@ -67,6 +65,7 @@ import yugecin.opsudance.ui.OptionsOverlay; import yugecin.opsudance.ui.StoryboardOverlay; import yugecin.opsudance.utils.GLHelper; +import static itdelatrisu.opsu.ui.Colors.*; import static org.lwjgl.input.Keyboard.*; import static yugecin.opsudance.options.Options.*; import static yugecin.opsudance.core.InstanceContainer.*; @@ -335,9 +334,10 @@ public class Game extends ComplexOpsuState { gOffscreen.setBackground(Color.black); } catch (SlickException e) { Log.error("could not create offscreen graphics", e); - BubNotifListener.EVENT.make().onBubNotif( - "Exception while creating offscreen graphics. See logfile for details.", - Colors.BUB_RED); + bubNotifs.send( + BUB_RED, + "Exception while creating offscreen graphics. See logfile for details." + ); } // initialize music position bar location @@ -1167,7 +1167,7 @@ public class Game extends ComplexOpsuState { if (0 <= time && time < 3600) { OPTION_CHECKPOINT.setValue(time); SoundController.playSound(SoundEffect.MENUCLICK); - BarNotifListener.EVENT.make().onBarNotif("Checkpoint saved."); + barNotifs.send("Checkpoint saved."); } } break; @@ -1179,7 +1179,7 @@ public class Game extends ComplexOpsuState { break; // invalid checkpoint loadCheckpoint(checkpoint); SoundController.playSound(SoundEffect.MENUHIT); - BarNotifListener.EVENT.make().onBarNotif("Checkpoint loaded."); + barNotifs.send("Checkpoint loaded."); } break; case KEY_F: @@ -1222,12 +1222,12 @@ public class Game extends ComplexOpsuState { break; case KEY_MINUS: currentMapMusicOffset += 5; - BarNotifListener.EVENT.make().onBarNotif("Current map offset: " + currentMapMusicOffset); + barNotifs.send("Current map offset: " + currentMapMusicOffset); break; } if (key == KEY_ADD || c == '+') { currentMapMusicOffset -= 5; - BarNotifListener.EVENT.make().onBarNotif("Current map offset: " + currentMapMusicOffset); + barNotifs.send("Current map offset: " + currentMapMusicOffset); } return true; @@ -1447,8 +1447,9 @@ public class Game extends ComplexOpsuState { } if (beatmap == null || beatmap.objects == null) { - BubNotifListener.EVENT.make().onBubNotif("Game was running without a beatmap", Colors.BUB_RED); + bubNotifs.send(BUB_RED, "Game was running without a beatmap"); displayContainer.switchStateInstantly(songMenuState); + return; } Dancer.instance.reset(); @@ -1554,7 +1555,7 @@ public class Game extends ComplexOpsuState { } catch (Exception e) { String message = String.format("Failed to create %s at index %d:\n%s", hitObject.getTypeName(), i, hitObject.toString()); Log.error(message, e); - BubNotifListener.EVENT.make().onBubNotif(message, Colors.BUB_RED); + bubNotifs.send(BUB_RED, message); gameObjects[i] = new DummyObject(hitObject); } } @@ -2138,15 +2139,16 @@ public class Game extends ComplexOpsuState { if (replay == null) { this.isReplay = false; this.replay = null; - } else { - if (replay.frames == null) { - BubNotifListener.EVENT.make().onBubNotif("Attempting to set a replay with no frames.", - Colors.BUB_ORANGE); - return; - } - this.isReplay = true; - this.replay = replay; + return; } + + if (replay.frames == null) { + bubNotifs.send(BUB_ORANGE, "Attempting to set a replay with no frames."); + return; + } + + this.isReplay = true; + this.replay = replay; } /** diff --git a/src/itdelatrisu/opsu/states/GameRanking.java b/src/itdelatrisu/opsu/states/GameRanking.java index eb069a0e..0a0a2864 100644 --- a/src/itdelatrisu/opsu/states/GameRanking.java +++ b/src/itdelatrisu/opsu/states/GameRanking.java @@ -38,7 +38,6 @@ import org.newdawn.slick.Image; import org.newdawn.slick.Input; import org.newdawn.slick.util.Log; import yugecin.opsudance.core.state.BaseOpsuState; -import yugecin.opsudance.events.BarNotifListener; import static yugecin.opsudance.core.InstanceContainer.*; @@ -157,14 +156,14 @@ public class GameRanking extends BaseOpsuState { gameState.setRestart((data.isGameplay()) ? Game.Restart.REPLAY : Game.Restart.NEW); returnToGame = true; } catch (FileNotFoundException e) { - BarNotifListener.EVENT.make().onBarNotif("Replay file not found."); + barNotifs.send("Replay file not found."); } catch (IOException e) { Log.error("Failed to load replay data.", e); - BarNotifListener.EVENT.make().onBarNotif( - "Failed to load replay data. See log for details."); + barNotifs.send("Failed to load replay data. See log for details."); } - } else - BarNotifListener.EVENT.make().onBarNotif("Replay file not found."); + } else { + barNotifs.send("Replay file not found."); + } } // retry diff --git a/src/itdelatrisu/opsu/states/MainMenu.java b/src/itdelatrisu/opsu/states/MainMenu.java index c711e05b..884b9c75 100644 --- a/src/itdelatrisu/opsu/states/MainMenu.java +++ b/src/itdelatrisu/opsu/states/MainMenu.java @@ -48,9 +48,8 @@ import org.newdawn.slick.util.Log; import yugecin.opsudance.core.Constants; import yugecin.opsudance.core.state.BaseOpsuState; import yugecin.opsudance.core.state.OpsuState; -import yugecin.opsudance.events.BarNotifListener; -import yugecin.opsudance.events.BubNotifListener; +import static itdelatrisu.opsu.ui.Colors.*; import static org.lwjgl.input.Keyboard.*; import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; @@ -466,9 +465,9 @@ public class MainMenu extends BaseOpsuState { UI.enter(); if (!enterNotification) { if (updater.getStatus() == Updater.Status.UPDATE_AVAILABLE) { - BarNotifListener.EVENT.make().onBarNotif("An opsu! update is available."); + barNotifs.send("An opsu! update is available."); } else if (updater.justUpdated()) { - BarNotifListener.EVENT.make().onBarNotif("opsu! is now up to date!"); + barNotifs.send("opsu! is now up to date!"); } enterNotification = true; } @@ -531,15 +530,15 @@ public class MainMenu extends BaseOpsuState { if (musicPlay.contains(x, y)) { if (MusicController.isPlaying()) { MusicController.pause(); - BarNotifListener.EVENT.make().onBarNotif("Pause"); + barNotifs.send("Pause"); } else if (!MusicController.isTrackLoading()) { MusicController.resume(); - BarNotifListener.EVENT.make().onBarNotif("Play"); + barNotifs.send("Play"); } return true; } else if (musicNext.contains(x, y)) { nextTrack(true); - BarNotifListener.EVENT.make().onBarNotif(">> Next"); + barNotifs.send(">> Next"); return true; } else if (musicPrevious.contains(x, y)) { lastMeasureProgress = 0f; @@ -551,7 +550,7 @@ public class MainMenu extends BaseOpsuState { } else { MusicController.setPosition(0); } - BarNotifListener.EVENT.make().onBarNotif("<< Previous"); + barNotifs.send("<< Previous"); return true; } @@ -567,11 +566,10 @@ public class MainMenu extends BaseOpsuState { try { Desktop.getDesktop().browse(Constants.REPOSITORY_URI); } catch (UnsupportedOperationException e) { - BarNotifListener.EVENT.make().onBarNotif( - "The repository web page could not be opened."); + barNotifs.send("The repository web page could not be opened."); } catch (IOException e) { Log.error("could not browse to repo", e); - BubNotifListener.EVENT.make().onBubNotif("Could not browse to repo", Colors.BUB_ORANGE); + bubNotifs.send(BUB_ORANGE, "Could not browse to repo"); } return true; } @@ -580,11 +578,10 @@ public class MainMenu extends BaseOpsuState { try { Desktop.getDesktop().browse(Constants.DANCE_REPOSITORY_URI); } catch (UnsupportedOperationException e) { - BarNotifListener.EVENT.make().onBarNotif( - "The repository web page could not be opened."); + barNotifs.send("The repository web page could not be opened."); } catch (IOException e) { Log.error("could not browse to repo", e); - BubNotifListener.EVENT.make().onBubNotif("Could not browse to repo", Colors.BUB_ORANGE); + bubNotifs.send(BUB_ORANGE, "Could not browse to repo"); } return true; } diff --git a/src/itdelatrisu/opsu/states/SongMenu.java b/src/itdelatrisu/opsu/states/SongMenu.java index 3bb48625..19de32b6 100644 --- a/src/itdelatrisu/opsu/states/SongMenu.java +++ b/src/itdelatrisu/opsu/states/SongMenu.java @@ -64,7 +64,6 @@ import org.newdawn.slick.Input; import org.newdawn.slick.SpriteSheet; import org.newdawn.slick.gui.TextField; import yugecin.opsudance.core.state.ComplexOpsuState; -import yugecin.opsudance.events.BarNotifListener; import yugecin.opsudance.options.OptionGroups; import yugecin.opsudance.ui.OptionsOverlay; @@ -446,8 +445,7 @@ public class SongMenu extends ComplexOpsuState { if (!displayContainer.isInState(SongMenu.class)) { return; } - BarNotifListener.EVENT.make().onBarNotif( - "Changed is Songs folder detected. Hit F5 to refresh."); + barNotifs.send("Changes in Songs folder detected. Hit F5 to refresh."); } }); @@ -955,7 +953,7 @@ public class SongMenu extends ComplexOpsuState { setFocus(BeatmapSetList.get().getRandomNode(), -1, true, true); if (BeatmapSetList.get().size() < 1 && group.getEmptyMessage() != null) { - BarNotifListener.EVENT.make().onBarNotif(group.getEmptyMessage()); + barNotifs.send(group.getEmptyMessage()); } return true; } @@ -1761,7 +1759,7 @@ public class SongMenu extends ComplexOpsuState { Beatmap beatmap = MusicController.getBeatmap(); if (focusNode == null || beatmap != focusNode.getSelectedBeatmap()) { - BarNotifListener.EVENT.make().onBarNotif("Unable to load the beatmap audio."); + barNotifs.send("Unable to load the beatmap audio."); return; } diff --git a/src/yugecin/opsudance/core/DisplayContainer.java b/src/yugecin/opsudance/core/DisplayContainer.java index f9ee69a4..cdc0144f 100644 --- a/src/yugecin/opsudance/core/DisplayContainer.java +++ b/src/yugecin/opsudance/core/DisplayContainer.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ import itdelatrisu.opsu.downloads.DownloadNode; import itdelatrisu.opsu.downloads.Updater; import itdelatrisu.opsu.render.CurveRenderState; import itdelatrisu.opsu.replay.PlaybackSpeed; -import itdelatrisu.opsu.ui.Colors; import itdelatrisu.opsu.ui.Cursor; import itdelatrisu.opsu.ui.Fonts; import itdelatrisu.opsu.ui.UI; @@ -43,16 +42,15 @@ import org.newdawn.slick.opengl.renderer.SGL; import org.newdawn.slick.util.Log; import yugecin.opsudance.core.errorhandling.ErrorDumpable; import yugecin.opsudance.core.state.OpsuState; -import yugecin.opsudance.core.state.specialstates.BarNotificationState; -import yugecin.opsudance.core.state.specialstates.BubNotifState; -import yugecin.opsudance.core.state.specialstates.FpsRenderState; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.events.ResolutionChangedListener; import yugecin.opsudance.events.SkinChangedListener; import yugecin.opsudance.utils.GLHelper; import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.Entrypoint.sout; import static yugecin.opsudance.core.InstanceContainer.*; import static yugecin.opsudance.options.Options.*; @@ -60,14 +58,10 @@ import static yugecin.opsudance.options.Options.*; /** * based on org.newdawn.slick.AppGameContainer */ -public class DisplayContainer implements ErrorDumpable, ResolutionChangedListener, SkinChangedListener { +public class DisplayContainer implements ErrorDumpable, SkinChangedListener { private static SGL GL = Renderer.get(); - private FpsRenderState fpsState; - private BarNotificationState barNotifState; - private BubNotifState bubNotifState; - private OpsuState state; public final DisplayMode nativeDisplayMode; @@ -104,6 +98,8 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene public final Cursor cursor; public boolean drawCursor; + + private final List resolutionChangedListeners; class Transition { int in; @@ -145,12 +141,13 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene private final Transition transition = new Transition(); - public DisplayContainer() { + public DisplayContainer() + { + this.resolutionChangedListeners = new ArrayList<>(); this.cursor = new Cursor(); drawCursor = true; - ResolutionChangedListener.EVENT.addListener(this); - SkinChangedListener.EVENT.addListener(this); + skinservice.addSkinChangedListener(this); this.nativeDisplayMode = Display.getDisplayMode(); targetBackgroundRenderInterval = 41; // ~24 fps @@ -159,10 +156,9 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene renderDelta = 1; } - @Override - public void onResolutionChanged(int w, int h) { - destroyImages(); - reinit(); + public void addResolutionChangedListener(ResolutionChangedListener l) + { + this.resolutionChangedListeners.add(l); } @Override @@ -208,10 +204,6 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene setUPS(OPTION_TARGET_UPS.val); setFPS(targetFPS[targetFPSIndex]); - fpsState = new FpsRenderState(); - bubNotifState = new BubNotifState(); - barNotifState = new BarNotificationState(); - state = startingState; state.enter(); } @@ -229,7 +221,7 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene mouseY = input.getMouseY(); transition.update(); - fpsState.update(); + fpsDisplay.update(); state.update(); if (drawCursor) { @@ -257,9 +249,9 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene state.preRenderUpdate(); state.render(graphics); - fpsState.render(graphics); - bubNotifState.render(graphics); - barNotifState.render(graphics); + fpsDisplay.render(graphics); + bubNotifs.render(graphics); + barNotifs.render(graphics); cursor.updateAngle(renderDelta); if (drawCursor) { @@ -342,13 +334,13 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene return true; } if (DownloadList.get().hasActiveDownloads()) { - BubNotifListener.EVENT.make().onBubNotif(DownloadList.EXIT_CONFIRMATION, Colors.BUB_RED); + bubNotifs.send(BUB_RED, DownloadList.EXIT_CONFIRMATION); exitRequested = false; exitconfirmation = System.currentTimeMillis(); return false; } if (updater.getStatus() == Updater.Status.UPDATE_DOWNLOADING) { - BubNotifListener.EVENT.make().onBubNotif(Updater.EXIT_CONFIRMATION, Colors.BUB_PURPLE); + bubNotifs.send(BUB_PURPLE, Updater.EXIT_CONFIRMATION); exitRequested = false; exitconfirmation = System.currentTimeMillis(); return false; @@ -387,7 +379,7 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene try { setDisplayMode(width, height, OPTION_FULLSCREEN.state); } catch (Exception e) { - BubNotifListener.EVENT.make().onBubNotif("Failed to change resolution", Colors.BUB_RED); + bubNotifs.send(BUB_RED, "Failed to change resolution"); Log.error("Failed to set display mode.", e); } } @@ -409,7 +401,7 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene fullscreen = false; String msg = String.format("Fullscreen mode is not supported for %sx%s", width, height); Log.warn(msg); - BubNotifListener.EVENT.make().onBubNotif(msg, Colors.BUB_ORANGE); + bubNotifs.send(BUB_ORANGE, msg); } } @@ -439,7 +431,7 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene input = new Input(height); input.enableKeyRepeat(); input.addListener(new GlobalInputListener()); - input.addMouseListener(bubNotifState); + input.addMouseListener(bubNotifs); } input.addListener(state); @@ -448,7 +440,15 @@ public class DisplayContainer implements ErrorDumpable, ResolutionChangedListene GameImage.init(width, height); Fonts.init(); - ResolutionChangedListener.EVENT.make().onResolutionChanged(width, height); + destroyImages(); + reinit(); + + barNotifs.onResolutionChanged(width, height); + bubNotifs.onResolutionChanged(width, height); + fpsDisplay.onResolutionChanged(width, height); + for (ResolutionChangedListener l : this.resolutionChangedListeners) { + l.onResolutionChanged(width, height); + } } public void resetCursor() { diff --git a/src/yugecin/opsudance/core/GlobalInputListener.java b/src/yugecin/opsudance/core/GlobalInputListener.java index 4e57f1b2..7a15bde0 100644 --- a/src/yugecin/opsudance/core/GlobalInputListener.java +++ b/src/yugecin/opsudance/core/GlobalInputListener.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,6 @@ import itdelatrisu.opsu.states.Game; import itdelatrisu.opsu.ui.UI; import org.newdawn.slick.Input; import org.newdawn.slick.InputListener; -import yugecin.opsudance.events.BarNotifListener; import static org.lwjgl.input.Keyboard.*; import static yugecin.opsudance.core.InstanceContainer.*; @@ -38,8 +37,8 @@ public class GlobalInputListener implements InputListener { public boolean keyReleased(int key, char c) { if (key == KEY_F7) { OPTION_TARGET_FPS.clickListItem((targetFPSIndex + 1) % targetFPS.length); - BarNotifListener.EVENT.make().onBarNotif(String.format("Frame limiter: %s", - OPTION_TARGET_FPS.getValueString())); + final String value = OPTION_TARGET_FPS.getValueString(); + barNotifs.sendf("Frame limiter: %s", value); return true; } if (key == KEY_F10) { diff --git a/src/yugecin/opsudance/core/InstanceContainer.java b/src/yugecin/opsudance/core/InstanceContainer.java index a2cb6c75..15eeec85 100644 --- a/src/yugecin/opsudance/core/InstanceContainer.java +++ b/src/yugecin/opsudance/core/InstanceContainer.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,10 @@ import itdelatrisu.opsu.states.*; import org.newdawn.slick.Input; import org.newdawn.slick.util.FileSystemLocation; import org.newdawn.slick.util.ResourceLoader; + +import yugecin.opsudance.core.state.specialstates.BarNotificationState; +import yugecin.opsudance.core.state.specialstates.BubNotifState; +import yugecin.opsudance.core.state.specialstates.FpsRenderState; import yugecin.opsudance.options.Configuration; import yugecin.opsudance.options.OptionsService; import yugecin.opsudance.render.GameObjectRenderer; @@ -55,6 +59,10 @@ public class InstanceContainer { public static Input input; public static GameObjectRenderer gameObjectRenderer; + + public static BarNotificationState barNotifs; + public static BubNotifState bubNotifs; + public static FpsRenderState fpsDisplay; public static Splash splashState; public static MainMenu mainmenuState; @@ -94,6 +102,10 @@ public class InstanceContainer { updater = new Updater(); displayContainer = new DisplayContainer(); + + barNotifs = new BarNotificationState(); + bubNotifs = new BubNotifState(); + fpsDisplay = new FpsRenderState(); gameObjectRenderer = new GameObjectRenderer(); diff --git a/src/yugecin/opsudance/core/events/Event.java b/src/yugecin/opsudance/core/events/Event.java deleted file mode 100644 index 63160e02..00000000 --- a/src/yugecin/opsudance/core/events/Event.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin - * - * opsu!dance is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * opsu!dance is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with opsu!dance. If not, see . - */ -package yugecin.opsudance.core.events; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.LinkedList; - -@SuppressWarnings("unchecked") -public class Event { - - private final Class type; - private final LinkedList listeners; - - public Event(Class type) { - this.type = type; - this.listeners = new LinkedList<>(); - } - - public void addListener(T listener) { - this.listeners.add(listener); - } - - public T make() { - return (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, - new InvocationHandler() { - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - for (T listener : listeners) { - method.invoke(listener, args); - } - return null; - } - }); - } - -} diff --git a/src/yugecin/opsudance/core/state/BaseOpsuState.java b/src/yugecin/opsudance/core/state/BaseOpsuState.java index 893a4853..e4d621b2 100644 --- a/src/yugecin/opsudance/core/state/BaseOpsuState.java +++ b/src/yugecin/opsudance/core/state/BaseOpsuState.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +22,8 @@ import yugecin.opsudance.events.ResolutionChangedListener; import java.io.StringWriter; +import static yugecin.opsudance.core.InstanceContainer.*; + public abstract class BaseOpsuState implements OpsuState, ResolutionChangedListener { /** @@ -31,7 +33,7 @@ public abstract class BaseOpsuState implements OpsuState, ResolutionChangedListe private boolean isCurrentState; public BaseOpsuState() { - ResolutionChangedListener.EVENT.addListener(this); + displayContainer.addResolutionChangedListener(this); } protected void revalidate() { diff --git a/src/yugecin/opsudance/core/state/specialstates/BarNotificationState.java b/src/yugecin/opsudance/core/state/specialstates/BarNotificationState.java index dfb24d2c..387ea05e 100644 --- a/src/yugecin/opsudance/core/state/specialstates/BarNotificationState.java +++ b/src/yugecin/opsudance/core/state/specialstates/BarNotificationState.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,14 +21,14 @@ import itdelatrisu.opsu.ui.Fonts; import itdelatrisu.opsu.ui.animations.AnimationEquation; import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; -import yugecin.opsudance.events.BarNotifListener; import yugecin.opsudance.events.ResolutionChangedListener; +import java.util.Formatter; import java.util.List; import static yugecin.opsudance.core.InstanceContainer.displayContainer; -public class BarNotificationState implements BarNotifListener, ResolutionChangedListener { +public class BarNotificationState implements ResolutionChangedListener { private final int IN_TIME = 200; private final int DISPLAY_TIME = 5700 + IN_TIME; @@ -51,8 +51,6 @@ public class BarNotificationState implements BarNotifListener, ResolutionChanged this.bgcol = new Color(Color.black); this.textCol = new Color(Color.white); this.timeShown = TOTAL_TIME; - BarNotifListener.EVENT.addListener(this); - ResolutionChangedListener.EVENT.addListener(this); } public void render(Graphics g) { @@ -95,9 +93,13 @@ public class BarNotificationState implements BarNotifListener, ResolutionChanged textY = (displayContainer.height - textHeight) / 2 + (int) (Fonts.LARGE.getLineHeight() / 5f); barHalfTargetHeight = textHeight / 2; } + + @SuppressWarnings("resource") + public void sendf(String format, Object... args) { + this.send(new Formatter().format(format, args).toString()); + } - @Override - public void onBarNotif(String message) { + public void send(String message) { this.message = message; calculatePosition(); timeShown = 0; diff --git a/src/yugecin/opsudance/core/state/specialstates/BubNotifState.java b/src/yugecin/opsudance/core/state/specialstates/BubNotifState.java index 34cefd0f..4a8ef574 100644 --- a/src/yugecin/opsudance/core/state/specialstates/BubNotifState.java +++ b/src/yugecin/opsudance/core/state/specialstates/BubNotifState.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,16 +22,16 @@ import itdelatrisu.opsu.ui.animations.AnimationEquation; import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; import org.newdawn.slick.MouseListener; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.events.ResolutionChangedListener; +import java.util.Formatter; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import static yugecin.opsudance.core.InstanceContainer.*; -public class BubNotifState implements MouseListener, BubNotifListener, ResolutionChangedListener { +public class BubNotifState implements MouseListener, ResolutionChangedListener { public static final int IN_TIME = 633; public static final int DISPLAY_TIME = 7000 + IN_TIME; @@ -46,8 +46,6 @@ public class BubNotifState implements MouseListener, BubNotifListener, Resolutio public BubNotifState() { this.bubbles = new LinkedList<>(); this.addAnimationTime = IN_TIME; - BubNotifListener.EVENT.addListener(this); - ResolutionChangedListener.EVENT.addListener(this); } public void render(Graphics g) { @@ -111,8 +109,12 @@ public class BubNotifState implements MouseListener, BubNotifListener, Resolutio addAnimationTime = IN_TIME; } - @Override - public void onBubNotif(String message, Color borderColor) { + @SuppressWarnings("resource") + public void sendf(Color borderColor, String format, Object... args) { + this.send(borderColor, new Formatter().format(format, args).toString()); + } + + public void send(Color borderColor, String message) { finishAddAnimation(); Notification newBubble = new Notification(message, borderColor); bubbles.add(0, newBubble); diff --git a/src/yugecin/opsudance/core/state/specialstates/FpsRenderState.java b/src/yugecin/opsudance/core/state/specialstates/FpsRenderState.java index 5d41a5b5..8e7ff76d 100644 --- a/src/yugecin/opsudance/core/state/specialstates/FpsRenderState.java +++ b/src/yugecin/opsudance/core/state/specialstates/FpsRenderState.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -42,7 +42,6 @@ public class FpsRenderState implements ResolutionChangedListener { public FpsRenderState() { fpsMeter = new FPSMeter(10); upsMeter = new FPSMeter(10); - ResolutionChangedListener.EVENT.addListener(this); } public void update() { diff --git a/src/yugecin/opsudance/events/BarNotifListener.java b/src/yugecin/opsudance/events/BarNotifListener.java deleted file mode 100644 index ed798e32..00000000 --- a/src/yugecin/opsudance/events/BarNotifListener.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin - * - * opsu!dance is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * opsu!dance is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with opsu!dance. If not, see . - */ -package yugecin.opsudance.events; - -import yugecin.opsudance.core.events.Event; - -public interface BarNotifListener { - - Event EVENT = new Event<>(BarNotifListener.class); - - void onBarNotif(String message); - -} diff --git a/src/yugecin/opsudance/events/BubNotifListener.java b/src/yugecin/opsudance/events/BubNotifListener.java deleted file mode 100644 index 2990d676..00000000 --- a/src/yugecin/opsudance/events/BubNotifListener.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin - * - * opsu!dance is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * opsu!dance is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with opsu!dance. If not, see . - */ -package yugecin.opsudance.events; - -import org.newdawn.slick.Color; -import yugecin.opsudance.core.events.Event; - -@SuppressWarnings({"UnnecessaryInterfaceModifier", "unused"}) -public interface BubNotifListener { - - Event EVENT = new Event<>(BubNotifListener.class); - - void onBubNotif(String message, Color borderColor); - -} diff --git a/src/yugecin/opsudance/events/ResolutionChangedListener.java b/src/yugecin/opsudance/events/ResolutionChangedListener.java index c0311f0d..f00c9e4f 100644 --- a/src/yugecin/opsudance/events/ResolutionChangedListener.java +++ b/src/yugecin/opsudance/events/ResolutionChangedListener.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,12 +17,7 @@ */ package yugecin.opsudance.events; -import yugecin.opsudance.core.events.Event; - -public interface ResolutionChangedListener { - - Event EVENT = new Event<>(ResolutionChangedListener.class); - +public interface ResolutionChangedListener +{ void onResolutionChanged(int w, int h); - } diff --git a/src/yugecin/opsudance/events/SkinChangedListener.java b/src/yugecin/opsudance/events/SkinChangedListener.java index 273fa1b6..6409302b 100644 --- a/src/yugecin/opsudance/events/SkinChangedListener.java +++ b/src/yugecin/opsudance/events/SkinChangedListener.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,12 +17,8 @@ */ package yugecin.opsudance.events; -import yugecin.opsudance.core.events.Event; - -public interface SkinChangedListener { - - Event EVENT = new Event<>(SkinChangedListener.class); - +public interface SkinChangedListener +{ void onSkinChanged(String stringName); } diff --git a/src/yugecin/opsudance/options/Configuration.java b/src/yugecin/opsudance/options/Configuration.java index 989d99fc..14ddbf23 100644 --- a/src/yugecin/opsudance/options/Configuration.java +++ b/src/yugecin/opsudance/options/Configuration.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,12 +24,10 @@ import itdelatrisu.opsu.audio.SoundController; import itdelatrisu.opsu.audio.SoundEffect; import itdelatrisu.opsu.beatmap.Beatmap; import itdelatrisu.opsu.beatmap.TimingPoint; -import itdelatrisu.opsu.ui.Colors; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BubNotifListener; import yugecin.opsudance.utils.ManifestWrapper; import javax.imageio.ImageIO; @@ -42,6 +40,7 @@ import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.errorhandling.ErrorHandler.*; import static yugecin.opsudance.options.Options.*; import static yugecin.opsudance.core.InstanceContainer.*; @@ -155,7 +154,7 @@ public class Configuration { } if (!defaultDir.isDirectory() && !defaultDir.mkdir()) { String msg = String.format("Failed to create %s directory at '%s'.", kind, defaultDir.getAbsolutePath()); - BubNotifListener.EVENT.make().onBubNotif(msg, Colors.BUB_RED); + bubNotifs.send(BUB_RED, msg); } return defaultDir; } @@ -215,9 +214,11 @@ public class Configuration { // TODO: get a decent place for this // create the screenshot directory if (!screenshotDir.isDirectory() && !screenshotDir.mkdir()) { - BubNotifListener.EVENT.make().onBubNotif( - String.format( "Failed to create screenshot directory at '%s'.", - screenshotDir.getAbsolutePath()), Colors.BUB_RED); + bubNotifs.sendf( + BUB_RED, + "Failed to create screenshot directory at '%s'.", + screenshotDir.getAbsolutePath() + ); return; } @@ -251,13 +252,13 @@ public class Configuration { } } ImageIO.write(image, OPTION_SCREENSHOT_FORMAT.getValueString().toLowerCase(), file); - BubNotifListener.EVENT.make().onBubNotif("Created " + fileName, - Colors.BUB_PURPLE); + bubNotifs.send(BUB_PURPLE, "Created " + fileName); } catch (Exception e) { Log.error("Could not take screenshot", e); - BubNotifListener.EVENT.make().onBubNotif( - "Failed to take a screenshot. See log file for details", - Colors.BUB_PURPLE); + bubNotifs.send( + BUB_PURPLE, + "Failed to take a screenshot. See log file for details" + ); } } }.start(); diff --git a/src/yugecin/opsudance/options/NumericOption.java b/src/yugecin/opsudance/options/NumericOption.java index 84a83dc2..7bf4fc71 100644 --- a/src/yugecin/opsudance/options/NumericOption.java +++ b/src/yugecin/opsudance/options/NumericOption.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,8 +18,9 @@ package yugecin.opsudance.options; import itdelatrisu.opsu.Utils; -import itdelatrisu.opsu.ui.Colors; -import yugecin.opsudance.events.BubNotifListener; + +import static itdelatrisu.opsu.ui.Colors.*; +import static yugecin.opsudance.core.InstanceContainer.*; public class NumericOption extends Option { @@ -53,8 +54,7 @@ public class NumericOption extends Option { try { val = Utils.clamp(Integer.parseInt(s), min, max); } catch (Exception ignored) { - BubNotifListener.EVENT.make().onBubNotif("Failed to parse " + configurationName + " option", - Colors.BUB_RED); + bubNotifs.send(BUB_RED, "Failed to parse '" + configurationName + "' option"); } } diff --git a/src/yugecin/opsudance/options/Options.java b/src/yugecin/opsudance/options/Options.java index ccf3ea73..f828e2ad 100644 --- a/src/yugecin/opsudance/options/Options.java +++ b/src/yugecin/opsudance/options/Options.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ import org.newdawn.slick.SlickException; import org.newdawn.slick.openal.SoundStore; import org.newdawn.slick.util.Log; import yugecin.opsudance.*; -import yugecin.opsudance.events.BarNotifListener; import yugecin.opsudance.movers.factories.ExgonMoverFactory; import yugecin.opsudance.movers.factories.QuadraticBezierMoverFactory; import yugecin.opsudance.movers.slidermovers.DefaultSliderMoverController; @@ -439,7 +438,7 @@ public class Options { public static final ToggleOption OPTION_DISABLE_MOUSE_BUTTONS = new ToggleOption("Disable mouse buttons in play mode", "MouseDisableButtons", "This option will disable all mouse buttons. Specifically for people who use their keyboard to click.", false) { @Override public void toggle() { - BarNotifListener.EVENT.make().onBarNotif(state ? + barNotifs.send(state ? "Mouse buttons are disabled." : "Mouse buttons are enabled."); } }; @@ -608,7 +607,7 @@ public class Options { public void clickListItem(int index){ if (Game.isInGame && Dancer.moverFactories[index] instanceof PolyMoverFactory) { // TODO remove this when #79 is fixed - BarNotifListener.EVENT.make().onBarNotif("This mover is disabled in the storyboard right now"); + barNotifs.send("This mover is disabled in the storyboard right now"); return; } Dancer.instance.setMoverFactoryIndex(index); diff --git a/src/yugecin/opsudance/options/OptionsService.java b/src/yugecin/opsudance/options/OptionsService.java index b4fe3ee9..d0d972a0 100644 --- a/src/yugecin/opsudance/options/OptionsService.java +++ b/src/yugecin/opsudance/options/OptionsService.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,15 +17,14 @@ */ package yugecin.opsudance.options; -import itdelatrisu.opsu.ui.Colors; import org.newdawn.slick.util.Log; -import yugecin.opsudance.events.BubNotifListener; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; +import static itdelatrisu.opsu.ui.Colors.*; import static yugecin.opsudance.core.InstanceContainer.*; /** @@ -80,7 +79,7 @@ public class OptionsService { } catch (IOException e) { String err = String.format("Failed to read option file '%s'.", config.OPTIONS_FILE.getAbsolutePath()); Log.error(err, e); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } config.loadDirectories(); } @@ -109,7 +108,7 @@ public class OptionsService { } catch (IOException e) { String err = String.format("Failed to write to file '%s'.", config.OPTIONS_FILE.getAbsolutePath()); Log.error(err, e); - BubNotifListener.EVENT.make().onBubNotif(err, Colors.BUB_RED); + bubNotifs.send(BUB_RED, err); } } diff --git a/src/yugecin/opsudance/sbv2/MoveStoryboard.java b/src/yugecin/opsudance/sbv2/MoveStoryboard.java index d7fd084e..145bee4b 100644 --- a/src/yugecin/opsudance/sbv2/MoveStoryboard.java +++ b/src/yugecin/opsudance/sbv2/MoveStoryboard.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2016 yugecin + * Copyright (C) 2016-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,7 +25,6 @@ import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; import yugecin.opsudance.core.DisplayContainer; import yugecin.opsudance.core.state.OverlayOpsuState; -import yugecin.opsudance.events.BarNotifListener; import yugecin.opsudance.sbv2.movers.CubicStoryboardMover; import yugecin.opsudance.sbv2.movers.LinearStoryboardMover; import yugecin.opsudance.sbv2.movers.QuadraticStoryboardMover; @@ -35,6 +34,8 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import static yugecin.opsudance.core.InstanceContainer.*; + public class MoveStoryboard extends OverlayOpsuState{ private final DisplayContainer displayContainer; @@ -185,7 +186,7 @@ public class MoveStoryboard extends OverlayOpsuState{ private StoryboardMove getCurrentMoveOrCreateNew() { if (gameObjects[objectIndex].isSlider() && trackPosition > gameObjects[objectIndex].getTime() && trackPosition < gameObjects[objectIndex].getEndTime()) { - BarNotifListener.EVENT.make().onBarNotif("Wait until the slider ended"); + barNotifs.send("Wait until the slider ended"); return dummyMove; } if (moves[objectIndex] == null) { diff --git a/src/yugecin/opsudance/skinning/SkinService.java b/src/yugecin/opsudance/skinning/SkinService.java index 814f736d..a2541e35 100644 --- a/src/yugecin/opsudance/skinning/SkinService.java +++ b/src/yugecin/opsudance/skinning/SkinService.java @@ -1,6 +1,6 @@ /* * opsu!dance - fork of opsu! with cursordance auto - * Copyright (C) 2017 yugecin + * Copyright (C) 2017-2018 yugecin * * opsu!dance is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,21 +26,39 @@ import org.newdawn.slick.util.ResourceLoader; import yugecin.opsudance.events.SkinChangedListener; import java.io.File; +import java.util.ArrayList; +import java.util.List; import static yugecin.opsudance.core.InstanceContainer.*; + /** * @author itdelatrisu (https://github.com/itdelatrisu) most functions are copied from itdelatrisu.opsu.Options.java */ -public class SkinService { +public class SkinService +{ + private final List skinChangedListeners; public String[] availableSkinDirectories; public String usedSkinName = "Default"; public static Skin skin; + + public SkinService() + { + this.skinChangedListeners = new ArrayList<>(); + } + + public void addSkinChangedListener(SkinChangedListener l) + { + this.skinChangedListeners.add(l); + } - public void reloadSkin() { + public void reloadSkin() + { loadSkin(); SoundController.init(); - SkinChangedListener.EVENT.make().onSkinChanged(usedSkinName); + for (SkinChangedListener l : this.skinChangedListeners) { + l.onSkinChanged(this.usedSkinName); + } } /**