From 03be29307f06ddd1c1797db78dee9e0735629935 Mon Sep 17 00:00:00 2001 From: Jeffrey Han Date: Wed, 2 Jul 2014 23:38:30 -0400 Subject: [PATCH] Misc. bug fixes and improvements. - Fixed Game not loading OsuFile for maps in a song group. (blame: 5612336) - Implemented rotations for reverse arrows, and added a new one by Alic1a. - "Auto" mod: pausing no longer requires click to unpause, and mod images are permanently drawn. - Program now loads from Main Menu instead of Options (unnecessary complications for the sake of a transition). Signed-off-by: Jeffrey Han --- res/reversearrow.png | Bin 4853 -> 6958 bytes src/itdelatrisu/opsu/MusicController.java | 6 +-- src/itdelatrisu/opsu/Opsu.java | 16 ++++---- src/itdelatrisu/opsu/objects/Slider.java | 46 +++++++++++++++++----- src/itdelatrisu/opsu/states/Game.java | 37 ++++++++--------- src/itdelatrisu/opsu/states/MainMenu.java | 2 + src/itdelatrisu/opsu/states/Options.java | 10 +---- src/itdelatrisu/opsu/states/SongMenu.java | 8 ++-- 8 files changed, 75 insertions(+), 50 deletions(-) diff --git a/res/reversearrow.png b/res/reversearrow.png index 7ebdec37d356490d018f711ae525abb3250be3fd..f88117cadea6fa9f87526d96a5d2a2ad38e62a41 100644 GIT binary patch literal 6958 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 1) { + float[] c1 = pointAt(0f); + float[] c2 = pointAt(0.01f); + startAngle = (float) (Math.atan2(c2[1] - c1[1], c2[0] - c1[0]) * 180 / Math.PI); + c1 = pointAt(1f); + c2 = pointAt(0.99f); + endAngle = (float) (Math.atan2(c2[1] - c1[1], c2[0] - c1[0]) * 180 / Math.PI); + } } /** @@ -176,21 +191,31 @@ public class Slider { private float getX(int i) { return (i == 0) ? hitObject.x : hitObject.sliderX[i - 1]; } - + /** * Returns the y coordinate of the control point at index i. */ private float getY(int i) { return (i == 0) ? hitObject.y : hitObject.sliderY[i - 1]; } - + + /** + * Returns the angle of the first control point. + */ + private float getStartAngle() { return startAngle; } + + /** + * Returns the angle of the last control point. + */ + private float getEndAngle() { return endAngle; } + /** * Calculates the factorial of a number. */ private long factorial(int n) { return (n <= 1 || n > 20) ? 1 : n * factorial(n - 1); } - + /** * Calculates the Bernstein polynomial. * @param i the index @@ -201,7 +226,7 @@ public class Slider { return factorial(n) / (factorial(i) * factorial(n-i)) * Math.pow(t, i) * Math.pow(1-t, n-i); } - + /** * Returns the point on the Bezier curve at a value t. * For curves of order greater than 4, points will be generated along @@ -284,7 +309,7 @@ public class Slider { this.color = color; this.comboEnd = comboEnd; - this.bezier = new Bezier(hitObject.pixelLength); + this.bezier = new Bezier(); // calculate slider time and ticks upon first update call } @@ -327,10 +352,13 @@ public class Slider { // repeats if (hitObject.repeat - 1 > currentRepeats) { - if (currentRepeats % 2 == 0) // last circle + if (currentRepeats % 2 == 0) { // last circle + reverseArrow.setRotation(bezier.getEndAngle()); reverseArrow.drawCentered(hitObject.sliderX[lastIndex], hitObject.sliderY[lastIndex]); - else // first circle + } else { // first circle + reverseArrow.setRotation(bezier.getStartAngle()); reverseArrow.drawCentered(hitObject.x, hitObject.y); + } } if (timeDiff >= 0) { diff --git a/src/itdelatrisu/opsu/states/Game.java b/src/itdelatrisu/opsu/states/Game.java index 655ff2e2..cc9000c7 100644 --- a/src/itdelatrisu/opsu/states/Game.java +++ b/src/itdelatrisu/opsu/states/Game.java @@ -322,23 +322,22 @@ public class Game extends BasicGameState { // game elements score.drawGameElements(g, mapLength, false, objectIndex == 0); - // first object... - if (objectIndex == 0) { - // skip beginning - if (osu.objects[objectIndex].time - skipOffsetTime > 5000 && - trackPosition < osu.objects[objectIndex].time - skipOffsetTime) - skipButton.draw(); - - // mod icons - if (trackPosition < osu.objects[objectIndex].time) { - for (int i = Options.MOD_MAX - 1; i >= 0; i--) { - if (Options.isModActive(i)) { - Image modImage = Options.getModImage(i); - modImage.draw( - (width * 0.85f) + ((i - (Options.MOD_MAX / 2)) * modImage.getWidth() / 3f), - height / 10f - ); - } + // skip beginning + if (objectIndex == 0 && + osu.objects[0].time - skipOffsetTime > 5000 && + trackPosition < osu.objects[0].time - skipOffsetTime) + skipButton.draw(); + + // mod icons + if ((objectIndex == 0 && trackPosition < osu.objects[0].time) || + Options.isModActive(Options.MOD_AUTO)) { + for (int i = Options.MOD_MAX - 1; i >= 0; i--) { + if (Options.isModActive(i)) { + Image modImage = Options.getModImage(i); + modImage.draw( + (width * 0.85f) + ((i - (Options.MOD_MAX / 2)) * modImage.getWidth() / 3f), + height / 10f + ); } } } @@ -570,7 +569,9 @@ public class Game extends BasicGameState { case Input.KEY_ESCAPE: // pause game int trackPosition = MusicController.getPosition(); - if (pauseTime < 0 && breakTime <= 0 && trackPosition >= osu.objects[0].time) { + if (pauseTime < 0 && breakTime <= 0 && + trackPosition >= osu.objects[0].time && + !Options.isModActive(Options.MOD_AUTO)) { pausedMouseX = input.getMouseX(); pausedMouseY = input.getMouseY(); pausePulse = 0f; diff --git a/src/itdelatrisu/opsu/states/MainMenu.java b/src/itdelatrisu/opsu/states/MainMenu.java index 8eac1291..66375dc4 100644 --- a/src/itdelatrisu/opsu/states/MainMenu.java +++ b/src/itdelatrisu/opsu/states/MainMenu.java @@ -111,6 +111,8 @@ public class MainMenu extends BasicGameState { @Override public void init(GameContainer container, StateBasedGame game) throws SlickException { + Utils.init(container, game); + this.game = game; osuStartTime = System.currentTimeMillis(); diff --git a/src/itdelatrisu/opsu/states/Options.java b/src/itdelatrisu/opsu/states/Options.java index e88b7e4c..3bc9b7c0 100644 --- a/src/itdelatrisu/opsu/states/Options.java +++ b/src/itdelatrisu/opsu/states/Options.java @@ -315,7 +315,6 @@ public class Options extends BasicGameState { private Input input; private Graphics g; private int state; - private boolean init = false; public Options(int state) { this.state = state; @@ -329,8 +328,6 @@ public class Options extends BasicGameState { this.input = container.getInput(); this.g = container.getGraphics(); - Utils.init(container, game); - int width = container.getWidth(); int height = container.getHeight(); @@ -376,16 +373,11 @@ public class Options extends BasicGameState { ); for (int i = 0; i < modButtons.length; i++) modButtons[i].getImage().setAlpha(0.5f); - - game.enterState(Opsu.STATE_MAINMENU, new EmptyTransition(), new FadeInTransition(Color.black)); } @Override public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { - if (!init) - return; - g.setBackground(Utils.COLOR_BLACK_ALPHA); g.setColor(Color.white); @@ -449,7 +441,7 @@ public class Options extends BasicGameState { @Override public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException { - init = true; + // empty } @Override diff --git a/src/itdelatrisu/opsu/states/SongMenu.java b/src/itdelatrisu/opsu/states/SongMenu.java index c5b855bb..6427cf5e 100644 --- a/src/itdelatrisu/opsu/states/SongMenu.java +++ b/src/itdelatrisu/opsu/states/SongMenu.java @@ -363,6 +363,7 @@ public class SongMenu extends BasicGameState { if (sortTabs[i].contains(x, y)) { if (i != currentSort) { currentSort = i; + SoundController.playSound(SoundController.SOUND_MENUCLICK); OsuGroupNode oldFocusBase = Opsu.groups.getBaseNode(focusNode.index); int oldFocusFileIndex = focusNode.osuFileIndex; focusNode = null; @@ -395,7 +396,7 @@ public class SongMenu extends BasicGameState { } else if (node.osuFileIndex == focusNode.osuFileIndex) { // if already focused, load the beatmap - startGame(focusNode.osuFiles.get(focusNode.osuFileIndex)); + startGame(); } else { // focus the node @@ -443,7 +444,7 @@ public class SongMenu extends BasicGameState { break; case Input.KEY_ENTER: if (focusNode != null) - startGame(focusNode.osuFiles.get(focusNode.osuFileIndex)); + startGame(); break; case Input.KEY_DOWN: changeIndex(1); @@ -595,11 +596,12 @@ public class SongMenu extends BasicGameState { * Starts the game. * @param osu the OsuFile to send to the game */ - private void startGame(OsuFile osu) { + private void startGame() { if (MusicController.isConverting()) return; SoundController.playSound(SoundController.SOUND_MENUHIT); + OsuFile osu = MusicController.getOsuFile(); Display.setTitle(String.format("%s - %s", game.getTitle(), osu.toString())); OsuParser.parseHitObjects(osu); SoundController.setSampleSet(osu.sampleSet);