This eliminates the game-wide lag (100-200ms on my computer) when switching song nodes. Attempted to mask the loading time with a fade-in effect.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
https://github.com/Tom94/AiModtpDifficultyCalculator
This might not be completely accurate as I wasn't able to get the original program to run, but it's probably close (note that hit object stacking isn't applied, though).
Since the computation is fairly expensive, they're currently done when selecting a beatmap set in the song menu (for all beatmaps in the set at once). The rating is displayed next to the beatmap difficulty settings (HP,CS,AR,OD) in the header. Also, since all the hit objects need to be loaded to perform the computation, the objects are later discarded (but not immediately) by a LRU cache to limit memory usage.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
The previous formulas were extremely close, so you shouldn't notice any gameplay differences at all.
Circle diameter:
- Previously: 104 - (CS * 8)
- Now: 108.848 - (CS * 8.9646)
Timing offsets: added 1.5ms to 300, 100, and 50 hit result offsets.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Removed "isImplemented" field from GameMod as all of the base mods have been implemented.
- Removed Utils.getBoundedValue() methods in preference for Utils.clamp().
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This introduces more accurate timing formulas associated with the "Hidden" mod (previously, in #115, these values were hardcoded). The values seem somewhat close to the values in osu!, but were not extensively tested.
Also set an upper bound on the fade in time for hit objects proportional to the approach time, or else the timing values in the "Hidden" mod would be too inconsistent.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Previously, enabling old-style cursors would try to load files "cursor2" and "cursortrail2". Now the actual files are loaded, and the -2 images are only used when no game skin image is provided.
Added a hasGameSkinImage() method in GameImage to check if the "default" image is skinned (by a game skin).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Renamed some methods and modified comments to avoid this confusion, as game skins were implemented much later than beatmap skins.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Any CREATE and DELETE that occur in the song menu state will now show a notification and modify the behavior of the 'F5' key. Changes that occur in other states will force a reload upon entering the song menu.
This is part of osu!, but as it's not incredibly helpful, I've left it disabled by default. It can be enabled in the options menu.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Also fixed an issue where songMenu.resetGameDataOnLoad() sometimes wasn't being called when it should be (e.g. after playing a beatmap, if you move to a different screen, your score won't appear in the song menu right away). It's now being called more often than necessary, but that should be fine.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Show retry button only when appropriate (e.g. not when viewing replays or when playing with "Auto" enabled).
- Watching a (fake) "replay" with "Auto" enabled will actually just call the "retry" code now.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Moved Utils.loadGlyphs() into this class, and rewrote it to take a single generic string (instead of beatmap title/artist strings, specifically).
- Also moved font initialization into this class.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Replaced ugly 'bang' image with 'fa-arrow-circle-o-down' and 'fa-restart' icons from Font Awesome v4.4.0 (https://github.com/FortAwesome/Font-Awesome).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Submitting new queries will now actually cancel the old query and immediately use the result of the new query. The old behavior was very inconsistent about this.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
URL: http://osu.uu.gl/
Note that there's no API available, so this just parses the HTML for beatmap data. It's pretty slow compared to the other servers.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
URL: http://osu.yas-online.net/
Note that fetching the direct download URL for a beatmap requires an extra query, which is not currently done asynchronously (but it really should be).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Check if other Desktop actions are supported (follow-up to #114).
- The cursor-middle image is no longer scaled (when clicking).
- Changed the options menu background image (created with Trianglify at http://qrohlf.com/trianglify/), and made it fit the entire page.
- Slightly increased minimum splash screen time.
- Switched more animations to use AnimatedValue.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
These are Robert Penner's easing functions (http://robertpenner.com/easing/), refactored by CharlotteGore to only take a t parameter (https://github.com/CharlotteGore/functional-easing). Licensed under BSD (the former) and MIT (the latter).
Related changes:
- Added "AnimatedValue" utility class for updating values used in animations.
- MenuButton now uses AnimatedValue to handle its animations (still linear by default).
- Added in-out-back easings on logo, mods, and various other elements; added out-bounce easings on button menu.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added on/off option for replay seeking in the "custom" menu.
- Mute sounds while seeking.
- Draw a bar on the left of the screen during replays for seeking (instead of just clicking near the top of the screen).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Many code style changes.
- Don't increment combo if missing the last slider circle.
- Added player name in ranking screen.
- Don't show null/default player names.
- Only import replays with .osr extension.
- Display loading status for importing replays.
- Moved MD5InputStreamWrapper to package "opsu.io".
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Added the "difficulty multiplier" as given by the osu! wiki. Please note that this will invalidate all of your saved scores.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added overridden methods read() and write() for reading from and writing to the options file within the GameOption enum, so that only 1 section needs to be changed when adding new options (instead of 3).
- Added 'displayName' field to the GameOption enum, instead of repeating it in the parseOptions() and saveOptions() methods.
- Added internal options (directories, port, theme song) into the GameOption enum for consistency.
- Removed GameOption.NULL.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This occurred when inserting beatmaps with null "bg" field into the database.
Also moved LOAD_HD_IMAGES option from "Custom" tab to "Display".
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Added getComboColors() method to Beatmap class, and the 'combo' field is now null if no combo is provided.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Pass the border color into CurveRenderState instead of determining it there; store the color as a static field in Curve (since it shouldn't change per-beatmap).
Also removed the leftover FrameBufferCache warning from #64.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Removed NEW_SLIDER option, and use the skin "SliderStyle" instead. Uses the new style by default, unless STYLE_PEPPYSLIDER is specified.
- Check if OpenGL 3.0 is supported before trying to draw new style sliders.
- Fixed compilation warnings; removed unneeded fields and imports.
- Filled in some missing Javadocs.
- Style changes.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
New slider rendering works by rendering the slider to an
offscreen buffer
Add CurveRenderState.java and FrameBufferCache.java that were forgotten in the last commit
When restarting the program through the options menu, all sounds now get reloaded if the skin was changed.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Moved cursor-related code out of UI and into a new non-static "Cursor" class.
Also, the cursor is no longer reset after gameplay if it wasn't skinned.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Skins are now loaded from subdirectories of the root "Skins" directory, and can be changed in-game (but requires a restart).
- Changed the default skin directory to the osu! directory, if available.
This implements a full parser for skin.ini (excluding CTB/Mania elements) based on the current wiki information. None of the settings have been implemented yet.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Attempts to eliminate any confusion between OsuHitObject (raw, parsed hit objects) and HitObject (interface for game object types).
- Renamed "HitObject" interface to "GameObject", since these objects are specific to gameplay.
- Renamed "OsuHitObject" to "HitObject", since these objects are primarily containers for parsed data.
Sorry if the name-swapping is confusing; these should be better names in the long run.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Renamed "OsuFile" to "Beatmap". All related variables and methods with "osu" have also been renamed to "beatmap" (or variants of each).
- Renamed "OsuGroupNode" to "BeatmapSetNode". Avoids confusion since groups are identified by a "set ID", not a "group ID".
- Renamed "OsuGroupList" to "BeatmapSetList", for the same reason as above.
- Renamed "OsuDB" to "BeatmapDB", for the same reason as above.
- Moved classes directly related to parsed beatmaps (Beatmap, BeatmapSetList, BeatmapSetNode, OsuHitObject, and TimingPoint) into a new "beatmap" package.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Generally much cleaner than Kochi Gothic, and half the file size. Uses an older version of the font, since many glyphs were removed in later versions (due to the glyphs being supported in other Google fonts).
Droid Sans Fallback is licensed under the Apache License, Version 2.0.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Actually provide relevant information when an audio file can't be found.
- When loading timing points, don't reset the start index every time.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Fixes:
- Set the modified speed again after unpausing and loading from checkpoints.
- Changed countdown delays based on current speed.
- Changed color of highlighted song info text to that in osu!.
- Made playback images unskinnable.
Code changes:
- Changed playback field in Game class to the PlaybackSpeed object instead of just the button.
- Changed PlaybackSpeed.next() to a non-static method.
- Added/edited Javadocs.
- Changed image names.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Can watch HalfTime on half speed.
Reset pitch on leaving the game state.
Load songInfo when entering select song menu.
Playback button fades in on hover instead of expands.
Reverted spinner changes. It should be fixed separately.
The master volume can now be changed (using the mouse wheel) with the ALT key pressed in any menu, as in osu!.
Also improved the handling of dimmed tracks.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Don't call MusicController.loopTrackIfEnded() if a beatmap reloading thread is running.
Other changes:
- Fixed issue where long download result text would be drawn outside the result area by adding a clip.
- Changed default music offset from -150ms to -75ms.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Changed the time format displayed on the main menu to match osu!.
- If no beatmaps are loaded, redirect the user to the downloads menu instead of an empty song menu.
Also, start showing bar notifications at time 1 instead of 0 so it can be called in enter() methods without visual delays.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Error handling (related to #53):
- Catch all exceptions caused by creating HitObjects and throw a more informative error with the hit object information. This also allows multiple errors to be reported, instead of crashing at the first error.
- Added a fallback "DummyObject" HitObject to replace hit objects causing errors, which should allow the game to function despite any errors.
- Added a toString() method to OsuHitObject (resembling the raw format).
Bug fixes (caused by #52):
- Game is no longer paused when focus is lost during lead-in time or during breaks.
- Replay frames are no longer recorded when the game is paused.
- Pulsing cursor animation now works even during lead-in time.
- skipIntro() during replays now works properly.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Glyphs are now loaded for specific fonts as needed, not for all of them at once. This reduces lag and saves memory.
- Fixed glyphs not being loaded in the downloads menu.
- Moved Utils.loadGlyphs() calls directly above text drawing code (easier to maintain, and fixes a bug with text flickering once).
Also removed MusicController methods 'getTrackName()' and 'getArtistName()' (not needed).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Animate skip button during lead in.
- Update flashlight radius during lead in.
- Check if keys are set before calling gameKeyPressed().
- Deleted mouse moved/dragged events (no longer used).
- Renamed updateGameKeyPress().
- Added "auto"/"relax" mod checks to gameKeyPressed().
Also fixed a bug where the MenuButton class wasn't properly resetting image alpha/rotation in certain cases.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Replay Changes:
- Saves replay frames as if its repaying, then plays the replay at exact track position. This should give out exact results as the score screen.
- Calculates MD5 for beatmap files. (doesn't currently help anything)
- Reverse Slider ball (fixes#50)
Moves the cursor between hit objects and along hit object paths (slider curves, spinner circles).
- Added 'getPointAt(trackPosition)' and 'getEndTime()' methods to HitObject interface.
- Unhide default cursor for "auto" plays.
Other changes:
- Don't save replays for unranked plays ("auto", "relax", "autopilot" mods).
- For "auto" replays, don't parse replay frames: use default "auto" behavior instead.
- Fixed cursor location data not being reset upon entering states.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
...to account for empty space around the alphamap image.
Also removed the persistent checkpoint text during gameplay (not necessary with the bar notification).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Restricted view area using alpha maps and offscreen drawing. (credits: davedes)
- Added silver grades.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- When reading replay frames, the thread will now sleep for the time difference minus 1ms if possible (to avoid so much unnecessary looping).
- Fixed a bug where the 'replay' GameData field wasn't being set in some cases.
- Move cursor to skip button location when skipping intro in a replay.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Hard Rock now flips hit object coordinates along the x axis, as in osu!.
- Fixed a bug where replay data wasn't being shown during breaks.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Fixes a bug where a resolution change (by restarting through the app) wouldn't re-scale hit object coordinates. Scaled coordinates are now stored in HitObject fields.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- A bar notification is now shown after opsu! updates.
- Insert the current database version into the beatmap cache upon creation (fixes the initial version check) and only update the version if necessary.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added 'info' table to score database to store the database version. Upon startup, if the stored version is less than the source version, all update queries defined in ScoreDB.getUpdateQueries() will be run.
- Created "Replays" directory to store replay files. Replay files are created after gameplay.
- Added 'replay' column to the score database to hold replay file names.
- Created a Game.loadOsuFile() method to load game data.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added Replay.save() method to save replays to a file.
- Separated Replay loading from the constructor into a load() method.
- Added OsuWriter class to write replays.
- Parse replay seeds (what do they do?).
- Added Updater.getBuildDate() method to retrieve the current build date (for the replay 'version' field).
- Added osu! mode constants in OsuFile.
- Added methods to retrieve raw ReplayFrame coordinates.
- Added replay fields/methods to GameData and Game state.
- Added jponge/lzma-java dependency for LZMA compression, since it isn't implemented in Apache commons-compress...
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This drops less frames, but is still pretty bad. See #42.
- Changed some LinkedList classes to LinkedBlockingDeques and added some synchronized methods.
- Slight modifications to OpenALStreamPlayer (may or may not be slightly more accurate).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Basic implementation of viewing replays in the Game state.
- Added OsuReader class for reading certain osu! file types. (author: Markus Jarderot)
- Added Replay, ReplayFrame, and LifeFrame classes to capture replay data. (author: smoogipooo)
- Added 'keyPressed' parameter to HitObject.update().
- Added cursor-drawing methods in UI that take the mouse coordinates and pressed state as parameters.
- Added GameMod methods to retrieve/load the active mods state as a bitmask.
- Added Apache commons-compress dependency for handling LZMA decompression.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added modified copy of slick.gui.TextField: added CTRL+BACKSPACE for word deletion, and disabled left/right arrows to move cursor and CTRL+Z to undo.
- Fixed musicEnded() incorrectly setting the "trackEnded" upon swapping tracks. This has caused some nasty loops since #38.
- Fixed a null pointer exception in OsuDB from 0b03912.
- Fixed the song menu search bar transition being incorrectly reset when hitting backspace on a 0-length query.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
When cached, defer loading of timing points, breaks, and combo colors until directly before a game. Potentially cuts loading time by 50%, and saves a bit of memory.
Other changes:
- Don't store the default combo colors in the cache.
- Removed some PreparedStatements that only get executed once.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
opsu! will now check for updates upon launching, and will prompt the user to download and run a newer version, if available.
- The remote version file is just the filled "version" file, currently located in the gh-pages branch.
- The new version is downloaded to the working directory, and launched with ProcessBuilder.
Related changes:
- Added "file" property (containing the download URL) to "version" file.
- Added maven-artifact dependency for version comparisons.
- Added methods in Downloads class to retrieve the constructor parameters.
- Moved method for showing exit confirmation dialogs into UI.
- Moved method for reading from URLs into Utils.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Main menu:
-- 'd': opens downloads menu
-- 'r': plays random track
- Song menu:
-- SHIFT+DEL: opens beatmap deletion menu
Other changes:
- In the main menu, tracks now play from the beginning instead of the preview time.
- Fixed "next page" icon sometimes showing in the downloads menu when a next page didn't exist.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Also added a few checks for related "autopilot" mod (probably incomplete).
Fixed the wrong default background being shown in the ranking screen.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Notifications are now sent when a download is complete and when new songs are imported in the downloads menu.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- F7: cycles through FPS settings.
- F10: toggles mouse enable/disable state during gameplay.
Also added bar notifications for saving/loading checkpoints.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Added draw(), update(), and enter() methods in UI to do all the necessary calls (instead of letting the states handle them).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- New database ".opsu.db" stores a cached copy of all parsed beatmaps. All data will be read from this database unless the last modified time of a beatmap file does not match the one in the table.
- OsuParser inserts all new entries to the database in batch after parsing.
- Added *toString()/*fromString() methods for 'breaks', 'timingPoints', and 'combo' fields in OsuFile for use with the database.
- For any database format changes, update the DATABASE_VERSION field in OsuDB.
- Reloading beatmaps (F5) will now clear the beatmap cache.
Related changes:
- Added small DBController class for convenience.
- Changed 'bg' field of OsuFile to only contain the image file name, instead of the full path.
- Deleted printDatabase() method from ScoreDB.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Clicking the mouse wheel now pauses the game (with these options disabled).
- Created an "Input" category in the options menu.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Moved all MultiClip-handling methods into the MultiClip class.
- Destroy extra clips when starting and finishing new beatmaps.
- Reduced maximum number of extra clips to 20.
- Attempted fixes at multithreading issues.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Sliders no longer need to be held to the end, but near it (within a 300-hit offset) for perfect hit.
Also made a slight improvement to SongMenu.setFocus().
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Always show the bar until no ticks are left.
- Fade out the bar.
- Moved from "Custom" options into "Gameplay".
- Separated drawing from update logic.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Partial revert of changes made in that commit; also made song menu header/footer partially transparent again. Thanks to @fluddokt.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This is currently being used for the logo/play/exit buttons in the main menu.
Also fixed bug where mod multipliers weren't being read.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added a simple color change when hovering over an option in the options menu.
- Draw part of the song button before the start node, if any, for a more complete-looking scroll animation.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- The MenuButton class now fully supports hover effects (scale, fade, rotate) for Animations.
- Used a fixed location for the selection buttons in the song menu (previously based on the "back" button width, which varies widely in different skins).
- Added hover effects for "retry" and "exit" buttons in the ranking screen.
- Changed animation speed of back/skip buttons.
- Fixed a bug where main menu showed the incorrect number of songs loaded during searches.
- Removed unneeded draw() methods in Utils for color filters (since 69f5aa5).
- Moved Utils.drawCentered(Image, ...) into the Image class.
- Added overwritten Image class to Maven excludes.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Reverted "Extends ScoresData bg to clock", as this was intended behavior.
- Fixed overlapping text in the options menu, and made it look more similar to the other menus.
- Fixed issues with the text and icon in the song menu header in certain resolutions.
- Fixed minor issue with ranking screen header text positioning.
- Decreased skip button hover scale.
- Some code style changes.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Replaces the mods being shown in the options menu.
- Added all the (base) mod icons to the menu, with the unimplemented ones grayed out.
- Added a rotation effect to MenuButton, and now multiple effects can be set at once.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Replaced duplicate GameImage.process_sub() calls from related images with calling a single method, for easier editing.
- Suppress warnings from overwritten Slick2D classes.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added "selection-*" images from Xiaounlimited's "Nexus Ivory" skin. These do the same thing as the F1-F3 keyboard buttons in the song menu.
- Removed the old wrench icon and replaced it with an "Other Options" button. F1 no longer opens the options menu.
- Moved the search bar to under the tabs and better simulate osu! behavior. Removed the old search icon.
- Added solid black bars at the top and bottom of the song menu. Moved the top divider closer to the end of the information text. Cropped song button images to fit between the bars.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Visual changes:
- Larger hit circles
- Circle overlay after drawing circle
- Fade in approach circles
- Fade in sliders
- Fade out hit lighting
- Hit Error Bar
- Reverse Slider ball rotation on repeats
- Fill bg image to screen while keeping aspect ratio
- Added a few more resolutions
- The music position bar in the main menu is now clickable (changes track position).
- Fixed scroll bar height function, and merged all scroll bar drawing into a single Utils.drawScrollbar() method.
- Fixed the buggy song menu scroll bar.
- Scaled the sizes/positions of the main menu music icons (previously fixed/hardcoded).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
mostly personal preferences though
Larger hit circles
Circle overlay after drawing circle
Fade in approach circles
Fade in sliders (I don't think it looks that bad)
Fade out hit lighting
Hit Error Bar
Probably need an option for this.
Miss locations(I don't know)
Reverse Slider ball rotation on repeats
- Added score management menu for deleting individual scores.
- Store generated title string lists in the beatmap menus to prevent performance issues.
Allow using the right mouse button (as well as left mouse button) in all states.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
New menus: beatmap options (erase scores/delete), delete beatmaps (single/all), reload songs.
- Pressing F3 or right-clicking in the song menu state will open the beatmap options menu.
- Pressing F5 in the song menu now opens a confirmation menu before reloading beatmaps.
- Deleted MainMenuExit state, which is replaced by MenuState.EXIT in ButtonMenu.
- Decreased Utils.FONT_XLARGE size (to fit in buttons).
Note: as of 800014e, song directory deletion is broken.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Removed the temporary directory (Options.TMP_DIR), which is no longer needed.
- Excluded original Slick2D classes that were overridden in pom.xml.
- Formatting changes and documentation.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- OsuGroupList.get().deleteSongGroup() will delete a song group from the list.
- OsuGroupList.get().deleteSong() will delete an individual song from the list (must be expanded), and will delete the song group if there are no remaining songs in the group.
- If possible, deleted beatmap files are moved to system trash (using JNA); otherwise, they are deleted immediately. This is done through Utils.deleteToTrash().
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Draw the playfield background in the song menu if a background cannot be drawn for the focused beatmap.
- Added ScoreDB.deleteScore() method to delete a score from the database.
- Added @author tags for curve-related classes (by fluddokt, #12).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- All beatmap set IDs are now stored in a set in OsuGroupList.
- OsuParser now checks the directory name for beatmap set IDs if the OsuFile doesn't contain one (for older beatmap formats).
Tweaks:
- Clear completed downloads when hitting "Import All".
- Call Download.updateReadSoFar() upon starting downloads instead of waiting for user to hover over the button (causing an unnecessary delay).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Rotate slider ball image along the curve.
- Show download speed and time remaining when hovering over the download info button.
- Maintain aspect ratio of beatmap background image during gameplay.
- Clear beatmap background image cache after reaching OsuFile.MAX_CACHE_SIZE.
- Multiply hit circle size by OsuHitObject.getXMultiplier().
- Scale MENU_BUTTON_BG based on SongMenu.MAX_SONG_BUTTONS.
- Fixed download search TextField retaining focus even after leaving the downloads menu.
- Include Unicode title/artist strings in searches.
- Parse x,y beatmap coordinates as floats (instead of integers), and only read Kiai time if present.
- Added 1600x1200 resolution.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
May rarly crash/not play on next music.
May have introduced other unknown bugs.
This may be due to loading it async.
Also loading of ogg is not loaded async anymore as it seems it doesn't
work very well.
Updates:
- Added some buttons to downloads menu: clear inactive downloads, import beatmaps, reset search, and show/hide unranked maps.
- Small changes to OsuParser, OszUnpacker, and OsuGroupList (mostly adding return values) to allow parsing only newly unpacked beatmaps.
- Added alpha fade hover effect to MenuButton, as an alternative to expanding (used for 3-part menu buttons).
- Added text rendering fields to MenuButton (also for the 3-part menu buttons).
- Added sound effects to downloads menu.
Fixes:
- Check downloads for illegal filename characters, and remove them if necessary.
- The number of results and downloads shown now supports all resolutions.
- Confirmation dialog no longer appears when restarting the application (since downloads are static).
- Do not set a focus node immediately if the theme song will be played.
- Always play the theme song if no songs are loaded (even if disabled in settings).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Page back/forward are now expanding buttons instead of static images.
- Fixed a mistake in DownloadList.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
The downloads menu can be accessed through the button on the right side of the main menu. The downloader supports searching and concurrent downloads (NOTE: this is limited by the download server!). Double-click any search result to begin downloading it to the SongPacks directory; cancel the download by hitting the red 'x' in the upper-right corner. A confirmation will appear if trying to quit opsu! while downloads are running.
New classes:
- Download: represents an individual download from a remote address to a local path, and provides status and progress information; downloads files using Java NIO.
- DownloadNode: holds a Download object as well as additional beatmap fields, and handles drawing.
- DownloadList: manages the current list of downloads.
- DownloadsMenu: game state controller.
- DownloadServer: interface for a beatmap download server.
- BloodcatServer: implements DownloadServer using Bloodcat.
- ReadableByteChannelWrapper: wrapper for ReadableByteChannel that tracks progress.
Added images:
- "downloads" image by @kouyang.
- "search-background" image from "Minimalist Miku" skin (listed in credits).
- "delete" icon by Visual Pharm (https://www.iconfinder.com/icons/27842/) under CC BY-ND 3.0.
Other changes:
- Added up/down/left/right Expand directions to MenuButton class.
- Removed width/height parameters from OsuParser (leftovers).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Fixes a bug during gameplay where if the music track ends before the last hit object is processed (esp. spinners), the game would hang.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Moved all curve-related classes into a new package.
- Added some fields and methods to Curve abstract class.
- Removed the old (no longer used) Bezier subclass.
- Changed Error throwing to ErrorHandler.error() calls.
- Formatted code.
Also fixed a crash when reaching the ranking screen with the "Auto" mod active.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added history icon by Google: https://www.iconfinder.com/icons/326655/
- Draw history icon and elapsed time next to score buttons if they were achieved within 24 hours. Conforming to osu! behavior, the elapsed time is not updated in real-time.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Fixed bug when having "Sudden Death" and Easy "mods" enabled at the same time. Additional "lives" are no longer granted.
- Fixed bug where GameMod active states weren't being reset upon restart.
- Fixed bug where GameMods were drawn as if inactive when viewing scores. Alpha levels are now only set when drawing the button (i.e. calling GameMod.draw()).
- Moved large grade scaling into GameImage, and slightly padded the right side when drawing.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Fixed a crash when closing the application in the ranking screen when viewing a score.
- Fixed a minor bug where OsuGroupList fields were not being erased upon restart.
- Dim the track volume by 50% when viewing a score.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Added a scrollable score history area in the song menu. Clicking on any score button will open the ranking screen.
Details:
- All drawing is performed by ScoreData.
- Store scores for the current focus node, and display up to "MAX_SCORE_BUTTONS" at a time; "startScore" is the starting index.
- When hovered over the score area, show scroll bar if needed. When hovered over individual score buttons, change colors and show the rank.
- Scrolling with the mouse in the score area overrides song scrolling.
- Store scaled grade images as a Grade field.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Implemented basic features (mostly stable). The remaining features are mostly graphical.
- Added package org.xerial.sqlite-jdbc. All scores are saved to .opsu_scores.db on table `scores` after a game completes.
- Added "Scores" class to handle all game score data (including database connections). The "Score" subclass encapsulates all database fields.
- Added "score viewing" constructor to GameData, for use only in the ranking screen.
- Draw the grade of the highest score next to expanded song buttons in the song menu.
- Added "bit" and "abbrev" fields to GameMod, used in storing/displaying scores.
- Hide the retry/exit buttons in the ranking screen when viewing a score.
Other changes:
- Removed "objectCount" field in GameData (no longer necessary).
- Removed "getID()" method in GameMod (no longer used).
- Moved most drawing in GameRanking state to GameData.
- Removed File parameter of "GameData.loadImages()" (leftover, no longer used).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Collapsed Javadoc comments for all fields.
- OsuFile now has proper Javadoc comments.
- Fixed various mistakes with comments.
Some changes with enums:
- Changed Class.values() calls to values().
- Changed size() calls to a SIZE field.
- Changed valuesReversed() calls to a VALUES_REVERSED field.
- Removed 'static' from enum declarations.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Press F5 to reload beatmaps in the song menu (resets OsuGroupList, then invokes OSZ unpacker and OsuFile parser).
- Many components reused from Splash screen (progress display, 'Esc' interrupt).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Renamed Options state into OptionsMenu, and created Options class for solely handling user options. Moved everything unrelated to the actual options menu into the static Options class.
- OptionsMenu no longer has static fields.
- Refactored option tabs into an enum, which makes the code much cleaner.
Also fixed a bug where global volume wasn't being used on container initialization.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Each song group references the same audio file probably 100% of the time, so don't create duplicate objects.
Also, follow-up to 3b13cc7: the up/down arrow keys now change global volume in the main menu and game states (in addition to the scroll wheel).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Fixes resource reloading when OsuGroupList is empty (i.e. if user has no beatmaps installed).
- OsuGroupList is no longer initialized with a class instance; OsuGroupList.create() is called by OsuParser.
- Also clear 'lastOsu' field in MusicController.reset(). Fixes theme song not playing on restart if it was the last track played (i.e. if no beatmaps installed).
- Call MusicController.reset() last so that more garbage is collected.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Pressing Ctrl+Shift+F5 in the options menu restarts the game. Beatmaps and sounds are not reloaded.
- Use GameContainer.setForceExit(false) to trigger a restart after exiting.
Other changes:
- Fixed general issues with track pausing/pause states.
- Store all background images loaded in OsuFiles in a static hash table, instead of in individual objects. This allows easier access to the allocated memory.
- Only delete OSZ files if they were unzipped. (They were previously deleted in all cases.)
- Moved more images (mods, playfield, lighting) into GameImage.
- Moved OsuHitObject initialization inside Utils.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- All sounds are now multiplied by a master volume setting.
- Changed all default volume levels.
- Scrolling in the main menu and game states changes the master volume and displays a volume bar on the right side of the screen.
- "volume-bg.png" image by @kouyang.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Reverted earlier change to load images immediately before a game begins, since there is a noticeable lag in some cases.
Other changes:
- Added 'preload' field to GameImage.
- Changed 'gameImage' field in GameImage to 'skinnable' (more suitable name).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Allows parsing only a subset of OsuFiles, in case parsing takes too long.
Other changes:
- Press 'ESC' three times to exit from the Splash state.
- Override Container.exit().
- Reset MusicController in closeRequested() to prevent an OpenAL error.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Critical game errors (detected in Game.updateAndRender()) are now passed through ErrorHandler. Note that the actual exception is not displayed in the ErrorHandler window, only the log.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- FPS display is now much more subtle.
- A couple of main menu tweaks.
Other changes:
- Restore old alpha levels of Utils.COLOR_* constants when modifying them.
- Utils.loadFont() can load any font effect, not just a ColorEffect.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Minor typo in ErrorHandler.
- Prevent more than one music control button in the main menu from being hovered over at once.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Fixes an issue where the first few milliseconds of the theme song would always play at full volume, even if container is not focused.
- Allows easier application to any song.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Padded game score display, and always display 2 digits in front of the decimal (e.g. 00.00% instead of 0.00%).
- Keep map progress circle at a fixed location instead of basing it off the score length.
- Moved some track resets (pause + restart at preview) to trigger upon loading the song menu. Fixes weird behaviors when leaving the game state.
- Cleaned up trailing whitespace and added missing overrides.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
The method creates a new Color object each call, so set color in UnicodeFont.drawString() instead.
Also slightly padded the song information text.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Checkpoint loading now works again. (blame: 9e69afa)
- Forgot to check for VSync when application initializes. (blame: 97f3aad)
- Also clear game data after finishing a checkpoint game.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
GitHub "mark" image is from: https://github.com/logos
Also changed default screen resolution to 1024x768 since it's more likely to be supported.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Instead of resetting immediately, set a variable in SongMenu to reset data when entering the state. Fixes some weird behaviors, and also allows resetting in more scenarios.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This mostly replaces the Slick2D Log class for error reporting. Most game errors will now trigger the error popup.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Specifically, the main menu background and pause/fail backgrounds now accept JPGs as well as PNGs.
Other changes:
- Don't draw the default pause/fail background if the buttons are skinned and the background is unskinned.
- Preload logo and main menu background.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This causes a noticeable drop in memory usage in most cases.
Also renamed the "crash" popup since the game doesn't necessarily crash.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Other changes:
- Write actual resolution and FPS values to config file instead of array indexes.
- Rewrote resolutions[][] array as an enum.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- MusicController.getPosition() now returns time even when track is paused. (e.g. song progress bar in main menu won't reset when paused)
- Force unpause track when entering the song menu.
- Rewrote Game.RESTART_* constants as enums.
- Cleaned up logo play/exit button scaling.
- MainMenu.previous is now non-static.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Stop loading all images on startup.
- Game images are preloaded before the song starts.
- Destroy skin images immediately after finishing a beatmap, potentially saving lots of memory.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Load all OsuFile String objects into a hash table while parsing, to eliminate duplicate strings.
- Trim all ArrayList objects in OsuFiles.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Replaced 'selection-tab.png' with a new image (by @kouyang).
- Simulate osu! color scheme (tab color/font color changes instead of alpha changes for selected tab).
- Added Utils.drawTab() method to avoid code duplication for Option menu tabs.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Only retrieve song information String[] when needed.
- Don't try to load glyphs if Unicode metadata is disabled.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- To scale an image, override process_sub() in its enum definition. All GameImages call the process() method when loaded.
- Skin GameImage overrides will now call process() immediately, so there's no more need for the hackish scaling status.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added enum classes SoundEffect and HitSound.
- Added a SoundComponent interface for sound effects and hit sounds, and extended playSound() and playHitSound() methods to play any SoundComponent.
- Moved features related to sample sets to the HitSound class, and rewrote sample sets as an internal enum class.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Pressing 'Esc' will now always enter the MainMenuExit state.
- Returning from MainMenuExit state does not reset button states: these must be manually reset by calling the reset() method.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
The class was originally named with the intent of adding many other GUI classes, but this never happened.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
When pressing the "next" button, songs will only be pushed when a new track plays. Fixes a potential null pointer crash.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Added hovering capabilities to GUIMenuButton. The max scale and direction to expand the image can be modified per object.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Plays a theme song when opsu! starts (can be disabled in options). The default song is "welcome to osu!" by nekodex, uploaded by CyberKitsune.
To change the song, place a new "theme.osu" in the skins folder and edit the file name, metadata, and song length (at minimum).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Setting is off by default, and can be switched on in the options menu.
- Changed default font to "Arial Unicode MS" (CJK), with fallback to "Lucida Sans Console" (non-CJK). Cross-platform support may be added later.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Properly handle bad input and log a warning. The game may run with some gameplay errors (ex. if no base TimingPoint is parsed), but it should not crash.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Always use '.' as decimal separator in options file, regardless of locale.
- Properly handle bad input when initially parsing hit objects.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Fixed null pointer in "Main Menu" state if no tracks loaded. (since b0c0b44)
- Fixed "keyOsuLeft" and "keyOsuRight" writing KEY_NONE to configuration file on first run (instead of default values).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Moved the bulk of hit object parsing into the OsuHitObject constructor, and made all fields private. Only combo-related data is still set by OsuParser.
- Added 'isCircle()', 'isSlider()', 'isSpinner()', and 'isNewCombo()' methods for convenience.
Other changes:
- Fixed difficulty overrides are no longer affected by game mods.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Game keys (default Z/X) can be changed to any letter or digit in the options screen.
Other changes:
- Mouse/keyboard input in the "Game Paused Menu" state is now the same as in the game state (i.e. all game keys available).
- Moved 'isInputKeyPressed()' into "Utils" class ("Game" state didn't even call it).
- Trimmed 'failsound.wav'.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Parse and store the end time for every beatmap (i.e. end time of last hit object).
- Added a 'length' sorting tab.
- Added 'length' search condition.
- Removed 'getTrackLength()' and 'getTrackLengthString()' methods, as they are no longer needed.
- Added a loader spritesheet animation to render during MP3 conversions (in place of track length rendering upon completion).
Other changes:
- Added a yellow progress circle during lead-in time.
- Fixed sorting tab positioning.
- Slightly increased button animation speed in "Main Menu Exit" state.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Halves all difficulty values and grants 3 "lives" instead of 1, with a score multiplier of 0.5x.
Other changes:
- Fixed score display in game state if score exceeds 8 digits.
- Added a "HP_DRAIN_MULTIPLIER" constant for steady HP drain/increase (to replace numeric constants).
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Modified "LoadVerbose" option so that 'false' will display a progress bar (instead of nothing at all), and made this the default.
- Slowed down a few shifting animations.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Threaded OGG loading (in addition to MP3) to eliminate delays in song select menu. (reported by xasuma)
- Changed default OSZ unpacking location to a "SongPacks" directory to prevent unintended unpacking. (reported by Lanturn)
- Fixed a null pointer for a corner case in 'getRandomNode()'. (reported by @iceblade112)
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
Makes clicking the logo more similar to the real osu! game, where the Play options show when you click the logo the second time (after it was clicked first).
- By default, sound effects will be disabled on Linux due to driver issues.
Other changes:
- Minor corner-case fix in song selection. (since 95f969f)
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Players can no longer set a container size larger than the screen dimensions.
- If the game resolution is equal to the screen size, the created window will be borderless.
- Added some additional resolutions.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Song group nodes are now hidden when the group is expanded.
- Setting a new focus will always move the focus into view.
- Left and right arrow keys now shift focus by exactly 1 node.
- Render the version string for unexpanded song group nodes containing only 1 beatmap.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Overhauled OsuTimingPoint class: parsing is done in the constructor, and fields are no longer public.
- Improved consistency of static/non-static fields in a couple of classes.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- A checkpoint (track position) can be set in the options screen, and also while playing by pressing "CTRL+S".
- A checkpoint can be loaded by pressing "CTRL+L" while playing. This will reset all game data and begin from the checkpoint time; the ranking screen will be skipped upon song completion.
Other changes:
- Don't draw grade if no objects have been processed (previously defaulted to GRADE_D).
- Calculate slider start/end angles based on a step difference (previously an arbitrary 0.01 difference).
- Always end a slider curve base on the last control point.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Search textfield now properly retains focus in song selection menu.
- Clearing an invalid search no longer changes the current song.
Other changes:
- Fixed skip image not being resized correctly.
- Added menuclick sounds when selecting a new song.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Cursor is now scaled based on window size.
- Cursor now rotates slowly (new style only).
- Cursor now expands upon mouse press.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
- Added 'zip4j' library to ant build script.
Other changes:
- Added 'esc' hotkey to exit from splash screen.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>