diff --git a/src/itdelatrisu/opsu/GameImage.java b/src/itdelatrisu/opsu/GameImage.java index 05af3b91..7bdaacd6 100644 --- a/src/itdelatrisu/opsu/GameImage.java +++ b/src/itdelatrisu/opsu/GameImage.java @@ -110,9 +110,24 @@ public enum GameImage { SLIDER_TICK ("sliderscorepoint", "png"), // Spinner - SPINNER_CIRCLE ("spinner-circle", "png"), - SPINNER_APPROACHCIRCLE ("spinner-approachcircle", "png"), - SPINNER_METRE ("spinner-metre", "png"), + SPINNER_CIRCLE ("spinner-circle", "png") { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(h * 9 / 10, h * 9 / 10); + } + }, + SPINNER_APPROACHCIRCLE ("spinner-approachcircle", "png") { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(h * 9 / 10, h * 9 / 10); + } + }, + SPINNER_METRE ("spinner-metre", "png") { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(w, h); + } + }, SPINNER_SPIN ("spinner-spin", "png"), SPINNER_CLEAR ("spinner-clear", "png"), SPINNER_OSU ("spinner-osu", "png"), diff --git a/src/itdelatrisu/opsu/GameScore.java b/src/itdelatrisu/opsu/GameScore.java index 8028996c..31b2d122 100644 --- a/src/itdelatrisu/opsu/GameScore.java +++ b/src/itdelatrisu/opsu/GameScore.java @@ -31,7 +31,6 @@ import java.util.LinkedList; import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; -import org.newdawn.slick.SlickException; /** * Holds score data and renders all score-related elements. @@ -245,9 +244,8 @@ public class GameScore { /** * Loads all game score images. * @param dir the image directory - * @throws SlickException */ - public void loadImages(File dir) throws SlickException { + public void loadImages(File dir) { // combo burst images if (GameImage.COMBO_BURST.hasSkinImages() || (!GameImage.COMBO_BURST.hasSkinImage() && GameImage.COMBO_BURST.getImages() != null)) diff --git a/src/itdelatrisu/opsu/Options.java b/src/itdelatrisu/opsu/Options.java index fda4225b..cbf756af 100644 --- a/src/itdelatrisu/opsu/Options.java +++ b/src/itdelatrisu/opsu/Options.java @@ -680,9 +680,8 @@ public class Options { * If the configured resolution is larger than the screen size, the smallest * available resolution will be used. * @param app the game container - * @throws SlickException failure to set display mode */ - public static void setDisplayMode(Container app) throws SlickException { + public static void setDisplayMode(Container app) { int screenWidth = app.getScreenWidth(); int screenHeight = app.getScreenHeight(); @@ -690,7 +689,11 @@ public class Options { if (screenWidth < resolution.getWidth() || screenHeight < resolution.getHeight()) resolution = Resolution.RES_800_600; - app.setDisplayMode(resolution.getWidth(), resolution.getHeight(), false); + try { + app.setDisplayMode(resolution.getWidth(), resolution.getHeight(), false); + } catch (SlickException e) { + ErrorHandler.error("Failed to set display mode.", e, true); + } // set borderless window if dimensions match screen size boolean borderless = (screenWidth == resolution.getWidth() && screenHeight == resolution.getHeight()); diff --git a/src/itdelatrisu/opsu/objects/Circle.java b/src/itdelatrisu/opsu/objects/Circle.java index b6e9af53..36ddd278 100644 --- a/src/itdelatrisu/opsu/objects/Circle.java +++ b/src/itdelatrisu/opsu/objects/Circle.java @@ -29,7 +29,6 @@ import itdelatrisu.opsu.states.Game; import org.newdawn.slick.Color; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; -import org.newdawn.slick.SlickException; /** * Data type representing a circle object. @@ -64,9 +63,8 @@ public class Circle implements HitObject { * Initializes the Circle data type with map modifiers, images, and dimensions. * @param container the game container * @param circleSize the map's circleSize value - * @throws SlickException */ - public static void init(GameContainer container, float circleSize) throws SlickException { + public static void init(GameContainer container, float circleSize) { int diameter = (int) (96 - (circleSize * 8)); diameter = diameter * container.getWidth() / 640; // convert from Osupixels (640x480) GameImage.HITCIRCLE.setImage(GameImage.HITCIRCLE.getImage().getScaledCopy(diameter, diameter)); diff --git a/src/itdelatrisu/opsu/objects/Slider.java b/src/itdelatrisu/opsu/objects/Slider.java index 712d1fae..30a695cd 100644 --- a/src/itdelatrisu/opsu/objects/Slider.java +++ b/src/itdelatrisu/opsu/objects/Slider.java @@ -32,7 +32,6 @@ import org.newdawn.slick.Color; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; -import org.newdawn.slick.SlickException; /** * Data type representing a slider object. @@ -273,9 +272,8 @@ public class Slider implements HitObject { * @param container the game container * @param circleSize the map's circleSize value * @param osu the associated OsuFile object - * @throws SlickException */ - public static void init(GameContainer container, float circleSize, OsuFile osu) throws SlickException { + public static void init(GameContainer container, float circleSize, OsuFile osu) { int diameter = (int) (96 - (circleSize * 8)); diameter = diameter * container.getWidth() / 640; // convert from Osupixels (640x480) diff --git a/src/itdelatrisu/opsu/objects/Spinner.java b/src/itdelatrisu/opsu/objects/Spinner.java index 481c480e..fd1aed2a 100644 --- a/src/itdelatrisu/opsu/objects/Spinner.java +++ b/src/itdelatrisu/opsu/objects/Spinner.java @@ -32,7 +32,6 @@ import org.newdawn.slick.Color; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; -import org.newdawn.slick.SlickException; /** * Data type representing a spinner object. @@ -71,17 +70,10 @@ public class Spinner implements HitObject { /** * Initializes the Spinner data type with images and dimensions. * @param container the game container - * @throws SlickException */ - public static void init(GameContainer container) throws SlickException { + public static void init(GameContainer container) { width = container.getWidth(); height = container.getHeight(); - - Image spinnerCircle = GameImage.SPINNER_CIRCLE.getImage(); - GameImage.SPINNER_CIRCLE.setImage(spinnerCircle.getScaledCopy(height * 9 / 10, height * 9 / 10)); - GameImage.SPINNER_APPROACHCIRCLE.setImage(GameImage.SPINNER_APPROACHCIRCLE.getImage().getScaledCopy( - spinnerCircle.getWidth(), spinnerCircle.getHeight())); - GameImage.SPINNER_METRE.setImage(GameImage.SPINNER_METRE.getImage().getScaledCopy(width, height)); } /** @@ -109,7 +101,7 @@ public class Spinner implements HitObject { boolean spinnerComplete = (rotations >= rotationsNeeded); // TODO: draw "OSU!" image after spinner ends - //spinnerOsuImage.drawCentered(width / 2, height / 4); + //GameImage.SPINNER_OSU.getImage().drawCentered(width / 2, height / 4); // darken screen g.setColor(Utils.COLOR_BLACK_ALPHA); diff --git a/src/itdelatrisu/opsu/states/Game.java b/src/itdelatrisu/opsu/states/Game.java index 26dd8a66..a83a03e6 100644 --- a/src/itdelatrisu/opsu/states/Game.java +++ b/src/itdelatrisu/opsu/states/Game.java @@ -848,74 +848,66 @@ public class Game extends BasicGameState { // load other images... ((GamePauseMenu) game.getState(Opsu.STATE_GAMEPAUSEMENU)).loadImages(); - try { - score.loadImages(osu.getFile().getParentFile()); - } catch (Exception e) { - ErrorHandler.error("Failed to load GameScore images.", e, false); - } + score.loadImages(osu.getFile().getParentFile()); } /** * Set map modifiers. */ private void setMapModifiers() { - try { - // map-based properties, re-initialized each game - float circleSize = osu.circleSize; - float approachRate = osu.approachRate; - float overallDifficulty = osu.overallDifficulty; - float HPDrainRate = osu.HPDrainRate; + // map-based properties, re-initialized each game + float circleSize = osu.circleSize; + float approachRate = osu.approachRate; + float overallDifficulty = osu.overallDifficulty; + float HPDrainRate = osu.HPDrainRate; - // "Hard Rock" modifiers - if (GameMod.HARD_ROCK.isActive()) { - circleSize = Math.min(circleSize * 1.4f, 10); - approachRate = Math.min(approachRate * 1.4f, 10); - overallDifficulty = Math.min(overallDifficulty * 1.4f, 10); - HPDrainRate = Math.min(HPDrainRate * 1.4f, 10); - } - - // "Easy" modifiers - else if (GameMod.EASY.isActive()) { - circleSize /= 2f; - approachRate /= 2f; - overallDifficulty /= 2f; - HPDrainRate /= 2f; - } - - // fixed difficulty overrides - if (Options.getFixedCS() > 0f) - circleSize = Options.getFixedCS(); - if (Options.getFixedAR() > 0f) - approachRate = Options.getFixedAR(); - if (Options.getFixedOD() > 0f) - overallDifficulty = Options.getFixedOD(); - if (Options.getFixedHP() > 0f) - HPDrainRate = Options.getFixedHP(); - - // initialize objects - Circle.init(container, circleSize); - Slider.init(container, circleSize, osu); - Spinner.init(container); - - // approachRate (hit object approach time) - if (approachRate < 5) - approachTime = (int) (1800 - (approachRate * 120)); - else - approachTime = (int) (1200 - ((approachRate - 5) * 150)); - - // overallDifficulty (hit result time offsets) - hitResultOffset = new int[GameScore.HIT_MAX]; - hitResultOffset[GameScore.HIT_300] = (int) (78 - (overallDifficulty * 6)); - hitResultOffset[GameScore.HIT_100] = (int) (138 - (overallDifficulty * 8)); - hitResultOffset[GameScore.HIT_50] = (int) (198 - (overallDifficulty * 10)); - hitResultOffset[GameScore.HIT_MISS] = (int) (500 - (overallDifficulty * 10)); - - // HPDrainRate (health change), overallDifficulty (scoring) - score.setDrainRate(HPDrainRate); - score.setDifficulty(overallDifficulty); - } catch (SlickException e) { - ErrorHandler.error("Error while setting map modifiers.", e, true); + // "Hard Rock" modifiers + if (GameMod.HARD_ROCK.isActive()) { + circleSize = Math.min(circleSize * 1.4f, 10); + approachRate = Math.min(approachRate * 1.4f, 10); + overallDifficulty = Math.min(overallDifficulty * 1.4f, 10); + HPDrainRate = Math.min(HPDrainRate * 1.4f, 10); } + + // "Easy" modifiers + else if (GameMod.EASY.isActive()) { + circleSize /= 2f; + approachRate /= 2f; + overallDifficulty /= 2f; + HPDrainRate /= 2f; + } + + // fixed difficulty overrides + if (Options.getFixedCS() > 0f) + circleSize = Options.getFixedCS(); + if (Options.getFixedAR() > 0f) + approachRate = Options.getFixedAR(); + if (Options.getFixedOD() > 0f) + overallDifficulty = Options.getFixedOD(); + if (Options.getFixedHP() > 0f) + HPDrainRate = Options.getFixedHP(); + + // initialize objects + Circle.init(container, circleSize); + Slider.init(container, circleSize, osu); + Spinner.init(container); + + // approachRate (hit object approach time) + if (approachRate < 5) + approachTime = (int) (1800 - (approachRate * 120)); + else + approachTime = (int) (1200 - ((approachRate - 5) * 150)); + + // overallDifficulty (hit result time offsets) + hitResultOffset = new int[GameScore.HIT_MAX]; + hitResultOffset[GameScore.HIT_300] = (int) (78 - (overallDifficulty * 6)); + hitResultOffset[GameScore.HIT_100] = (int) (138 - (overallDifficulty * 8)); + hitResultOffset[GameScore.HIT_50] = (int) (198 - (overallDifficulty * 10)); + hitResultOffset[GameScore.HIT_MISS] = (int) (500 - (overallDifficulty * 10)); + + // HPDrainRate (health change), overallDifficulty (scoring) + score.setDrainRate(HPDrainRate); + score.setDifficulty(overallDifficulty); } /**