diff --git a/res/repo.png b/res/repo.png new file mode 100644 index 00000000..192846a1 Binary files /dev/null and b/res/repo.png differ diff --git a/src/itdelatrisu/opsu/ErrorHandler.java b/src/itdelatrisu/opsu/ErrorHandler.java index 6d651b31..459261d6 100644 --- a/src/itdelatrisu/opsu/ErrorHandler.java +++ b/src/itdelatrisu/opsu/ErrorHandler.java @@ -24,8 +24,6 @@ import java.awt.Cursor; import java.awt.Desktop; import java.io.PrintWriter; import java.io.StringWriter; -import java.net.URI; -import java.net.URISyntaxException; import javax.swing.JOptionPane; import javax.swing.JScrollPane; @@ -81,18 +79,6 @@ public class ErrorHandler { message = { desc, scroll }, messageR = { descR, scroll }; - /** - * Address to report issues. - */ - private static URI uri; - static { - try { - uri = new URI("https://github.com/itdelatrisu/opsu/issues/new"); - } catch (URISyntaxException e) { - Log.error("Problem with error URI.", e); - } - } - // This class should not be instantiated. private ErrorHandler() {} @@ -137,7 +123,7 @@ public class ErrorHandler { JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, optionsR, optionsR[2]); if (n == 0) { - Desktop.getDesktop().browse(uri); + Desktop.getDesktop().browse(Options.ISSUES_URI); Desktop.getDesktop().open(Options.LOG_FILE); } else if (n == 1) Desktop.getDesktop().open(Options.LOG_FILE); diff --git a/src/itdelatrisu/opsu/GameImage.java b/src/itdelatrisu/opsu/GameImage.java index 9107b75f..22210e95 100644 --- a/src/itdelatrisu/opsu/GameImage.java +++ b/src/itdelatrisu/opsu/GameImage.java @@ -302,6 +302,13 @@ public enum GameImage { protected Image process_sub(Image img, int w, int h) { return img.getScaledCopy((h * 0.15f) / img.getHeight()); } + }, + + REPOSITORY ("repo", "png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy((h / 17f) / img.getHeight()); + } }; /** diff --git a/src/itdelatrisu/opsu/states/MainMenu.java b/src/itdelatrisu/opsu/states/MainMenu.java index 848cc547..85796a0d 100644 --- a/src/itdelatrisu/opsu/states/MainMenu.java +++ b/src/itdelatrisu/opsu/states/MainMenu.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.ErrorHandler; import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.MenuButton; import itdelatrisu.opsu.Opsu; @@ -29,6 +30,8 @@ import itdelatrisu.opsu.audio.MusicController; import itdelatrisu.opsu.audio.SoundController; import itdelatrisu.opsu.audio.SoundEffect; +import java.awt.Desktop; +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Stack; @@ -83,6 +86,11 @@ public class MainMenu extends BasicGameState { */ private MenuButton musicPlay, musicPause, musicNext, musicPrevious; + /** + * Button linking to repository. + */ + private MenuButton repoButton; + /** * Application start time, for drawing the total running time. */ @@ -126,7 +134,7 @@ public class MainMenu extends BasicGameState { int width = container.getWidth(); int height = container.getHeight(); - // initialize buttons + // initialize menu buttons Image logoImg = GameImage.MENU_LOGO.getImage(); Image playImg = GameImage.MENU_PlAY.getImage(); Image exitImg = GameImage.MENU_EXIT.getImage(); @@ -154,6 +162,14 @@ public class MainMenu extends BasicGameState { musicNext.setHoverScale(1.5f); musicPrevious.setHoverScale(1.5f); + // initialize repository button + if (Desktop.isDesktopSupported()) { // only if a webpage can be opened + Image repoImg = GameImage.REPOSITORY.getImage(); + repoButton = new MenuButton(repoImg, + (width * 0.995f) - repoImg.getWidth(), (height * 0.995f) - repoImg.getHeight() + ); + } + reset(); } @@ -195,6 +211,10 @@ public class MainMenu extends BasicGameState { g.fillRoundRect(width - 168, 54, 148f * MusicController.getPosition() / osu.endTime, 5, 4); + // draw repository button + if (repoButton != null) + repoButton.draw(); + // draw text g.setFont(Utils.FONT_MEDIUM); int lineHeight = Utils.FONT_MEDIUM.getLineHeight(); @@ -235,6 +255,8 @@ public class MainMenu extends BasicGameState { musicPause.hoverUpdate(delta, mouseX, mouseY); musicNext.hoverUpdate(delta, mouseX, mouseY); musicPrevious.hoverUpdate(delta, mouseX, mouseY); + if (repoButton != null) + repoButton.hoverUpdate(delta, mouseX, mouseY); // window focus change: increase/decrease theme song volume if (MusicController.isThemePlaying()) { @@ -314,6 +336,8 @@ public class MainMenu extends BasicGameState { musicNext.setScale(1f); if (!musicPrevious.contains(mouseX, mouseY)) musicPrevious.setScale(1f); + if (repoButton != null && !repoButton.contains(mouseX, mouseY)) + repoButton.setScale(1f); } @Override @@ -350,6 +374,15 @@ public class MainMenu extends BasicGameState { MusicController.setPosition(0); } + // repository button actions + else if (repoButton != null && repoButton.contains(x, y)) { + try { + Desktop.getDesktop().browse(Options.REPOSITORY_URI); + } catch (IOException e) { + ErrorHandler.error("Could not browse to repository URI.", e, false); + } + } + // start moving logo (if clicked) else if (!logoClicked) { if (logo.contains(x, y)) { diff --git a/src/itdelatrisu/opsu/states/Options.java b/src/itdelatrisu/opsu/states/Options.java index 58fd2e56..b9eefa60 100644 --- a/src/itdelatrisu/opsu/states/Options.java +++ b/src/itdelatrisu/opsu/states/Options.java @@ -35,6 +35,8 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; +import java.net.URI; +import java.net.URISyntaxException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; @@ -87,6 +89,25 @@ public class Options extends BasicGameState { */ public static final String FONT_NAME = "kochi-gothic.ttf"; + /** + * Repository address. + */ + public static URI REPOSITORY_URI; + + /** + * Issue reporting address. + */ + public static URI ISSUES_URI; + + static { + try { + REPOSITORY_URI = new URI("https://github.com/itdelatrisu/opsu"); + ISSUES_URI = new URI("https://github.com/itdelatrisu/opsu/issues/new"); + } catch (URISyntaxException e) { + Log.error("Problem loading URIs.", e); + } + } + /** * The beatmap directory. */ @@ -559,7 +580,7 @@ public class Options extends BasicGameState { /** * Index (row) in resolutions[][] array. */ - private static Resolution resolution = Resolution.RES_1280_800; + private static Resolution resolution = Resolution.RES_1024_768; // /** // * Whether or not the game should run in fullscreen mode.