|
@@ -12,9 +12,9 @@
|
|
|
#include "CBaseUIButton.h"
|
|
|
#include "CBaseUIContainer.h"
|
|
|
#include "ConVar.h"
|
|
|
+#include "Downloader.h"
|
|
|
#include "Engine.h"
|
|
|
#include "File.h"
|
|
|
-#include "HorizonSDLEnvironment.h"
|
|
|
#include "Keyboard.h"
|
|
|
#include "Mouse.h"
|
|
|
#include "Osu.h"
|
|
@@ -29,9 +29,6 @@
|
|
|
#include "OsuRichPresence.h"
|
|
|
#include "OsuSkin.h"
|
|
|
#include "OsuSkinImage.h"
|
|
|
-#include "OsuSlider.h"
|
|
|
-#include "OsuSliderCurves.h"
|
|
|
-#include "OsuSliderRenderer.h"
|
|
|
#include "OsuSongBrowser.h"
|
|
|
#include "OsuUIButton.h"
|
|
|
#include "OsuUpdateHandler.h"
|
|
@@ -39,44 +36,10 @@
|
|
|
#include "SoundEngine.h"
|
|
|
#include "VertexArrayObject.h"
|
|
|
|
|
|
-#define MCOSU_VERSION_TEXT "Version"
|
|
|
-#define MCOSU_BANNER_TEXT ""
|
|
|
-UString OsuMainMenu::MCOSU_MAIN_BUTTON_TEXT = UString("McOsu");
|
|
|
-UString OsuMainMenu::MCOSU_MAIN_BUTTON_SUBTEXT = UString("Multiplayer Client");
|
|
|
-
|
|
|
-#define MCOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE "version.txt"
|
|
|
-
|
|
|
-static const char *s_sliderTextBeatmap =
|
|
|
- "osu file format v14\r\n"
|
|
|
- "\r\n"
|
|
|
- "[General]\r\n"
|
|
|
- "AudioFilename: nothing.mp3\r\n"
|
|
|
- "\r\n"
|
|
|
- "[Metadata]\r\n"
|
|
|
- "Title:McOsu Slider Text\r\n"
|
|
|
- "TitleUnicode:McOsu Slider Text\r\n"
|
|
|
- "Artist:McKay\r\n"
|
|
|
- "ArtistUnicode:McKay\r\n"
|
|
|
- "Creator:McKay\r\n"
|
|
|
- "Version:McOsu\r\n"
|
|
|
- "\r\n"
|
|
|
- "[Difficulty]\r\n"
|
|
|
- "HPDrainRate:6\r\n"
|
|
|
- "CircleSize:6\r\n"
|
|
|
- "OverallDifficulty:5\r\n"
|
|
|
- "ApproachRate:0\r\n"
|
|
|
- "SliderMultiplier:10\r\n"
|
|
|
- "SliderTickRate:1\r\n"
|
|
|
- "\r\n"
|
|
|
- "[TimingPoints]\r\n"
|
|
|
- "1717.04358603418,1200,4,1,0,27,1,0\r\n"
|
|
|
- "\r\n"
|
|
|
- "[HitObjects]\r\n"
|
|
|
- "-143,275,0,6,0,B|-143:115|-143:115|-79:179|-79:179|-20:115|-20:115|-20:275,1,498.750001415609\r\n"
|
|
|
- "112,197,0,2,0,P|45:236|115:262,1,183.75000052154\r\n"
|
|
|
- "263,111,0,2,0,P|282:272|251:111,1,520\r\n"
|
|
|
- "480,179,0,2,0,B|288:179|480:243|544:275|384:275,1,262.500000745058\r\n"
|
|
|
- "543,182,0,2,0,B|511:309|671:309|616:165,1,236.250000670552";
|
|
|
+UString OsuMainMenu::NEOSU_MAIN_BUTTON_TEXT = UString("neosu");
|
|
|
+UString OsuMainMenu::NEOSU_MAIN_BUTTON_SUBTEXT = UString("Multiplayer Client");
|
|
|
+
|
|
|
+#define NEOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE "version.txt"
|
|
|
|
|
|
class OsuMainMenuCubeButton : public CBaseUIButton {
|
|
|
public:
|
|
@@ -172,11 +135,6 @@ ConVar osu_toggle_preview_music("osu_toggle_preview_music");
|
|
|
|
|
|
ConVar osu_draw_menu_background("osu_draw_menu_background", false, FCVAR_NONE);
|
|
|
ConVar osu_main_menu_startup_anim_duration("osu_main_menu_startup_anim_duration", 0.25f, FCVAR_NONE);
|
|
|
-ConVar osu_main_menu_use_slider_text("osu_main_menu_use_slider_text", true, FCVAR_NONE);
|
|
|
-ConVar osu_main_menu_slider_text_alpha("osu_main_menu_slider_text_alpha", 1.0f, FCVAR_NONE);
|
|
|
-ConVar osu_main_menu_slider_text_scale("osu_main_menu_slider_text_scale", 1.0f, FCVAR_NONE);
|
|
|
-ConVar osu_main_menu_slider_text_offset_x("osu_main_menu_slider_text_offset_x", 15.0f, FCVAR_NONE);
|
|
|
-ConVar osu_main_menu_slider_text_offset_y("osu_main_menu_slider_text_offset_y", 0.0f, FCVAR_NONE);
|
|
|
ConVar osu_main_menu_alpha("osu_main_menu_alpha", 1.0f, FCVAR_NONE);
|
|
|
ConVar osu_main_menu_friend("osu_main_menu_friend", true, FCVAR_NONE);
|
|
|
|
|
@@ -192,13 +150,10 @@ ConVar *OsuMainMenu::m_osu_universal_offset_ref = NULL;
|
|
|
ConVar *OsuMainMenu::m_osu_universal_offset_hardcoded_ref = NULL;
|
|
|
ConVar *OsuMainMenu::m_osu_old_beatmap_offset_ref = NULL;
|
|
|
ConVar *OsuMainMenu::m_osu_universal_offset_hardcoded_fallback_dsound_ref = NULL;
|
|
|
-ConVar *OsuMainMenu::m_osu_slider_border_feather_ref = NULL;
|
|
|
ConVar *OsuMainMenu::m_osu_mod_random_ref = NULL;
|
|
|
ConVar *OsuMainMenu::m_osu_songbrowser_background_fade_in_duration_ref = NULL;
|
|
|
|
|
|
OsuMainMenu::OsuMainMenu(Osu *osu) : OsuScreen(osu) {
|
|
|
- if(env->getOS() == Environment::OS::OS_HORIZON) MCOSU_MAIN_BUTTON_TEXT.append(" NX");
|
|
|
-
|
|
|
if(m_osu_universal_offset_ref == NULL) m_osu_universal_offset_ref = convar->getConVarByName("osu_universal_offset");
|
|
|
if(m_osu_universal_offset_hardcoded_ref == NULL)
|
|
|
m_osu_universal_offset_hardcoded_ref = convar->getConVarByName("osu_universal_offset_hardcoded");
|
|
@@ -207,8 +162,6 @@ OsuMainMenu::OsuMainMenu(Osu *osu) : OsuScreen(osu) {
|
|
|
if(m_osu_universal_offset_hardcoded_fallback_dsound_ref == NULL)
|
|
|
m_osu_universal_offset_hardcoded_fallback_dsound_ref =
|
|
|
convar->getConVarByName("osu_universal_offset_hardcoded_fallback_dsound");
|
|
|
- if(m_osu_slider_border_feather_ref == NULL)
|
|
|
- m_osu_slider_border_feather_ref = convar->getConVarByName("osu_slider_border_feather");
|
|
|
if(m_osu_mod_random_ref == NULL) m_osu_mod_random_ref = convar->getConVarByName("osu_mod_random");
|
|
|
if(m_osu_songbrowser_background_fade_in_duration_ref == NULL)
|
|
|
m_osu_songbrowser_background_fade_in_duration_ref =
|
|
@@ -258,14 +211,19 @@ OsuMainMenu::OsuMainMenu(Osu *osu) : OsuScreen(osu) {
|
|
|
|
|
|
m_fBackgroundFadeInTime = 0.0f;
|
|
|
|
|
|
+ const int baseDPI = 96;
|
|
|
+ const int newDPI = Osu::getUIScale(osu) * baseDPI;
|
|
|
+ m_titleFont =
|
|
|
+ engine->getResourceManager()->loadFont("SourceSansPro-Semibold.otf", "FONT_OSU_MAINMENU", 150, true, newDPI);
|
|
|
+
|
|
|
// check if the user has never clicked the changelog for this update
|
|
|
m_bDidUserUpdateFromOlderVersion = false;
|
|
|
m_bDidUserUpdateFromOlderVersionLe3300 = false;
|
|
|
m_bDidUserUpdateFromOlderVersionLe3303 = false;
|
|
|
{
|
|
|
m_bDrawVersionNotificationArrow = false;
|
|
|
- if(env->fileExists(MCOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE)) {
|
|
|
- File versionFile(MCOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE);
|
|
|
+ if(env->fileExists(NEOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE)) {
|
|
|
+ File versionFile(NEOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE);
|
|
|
if(versionFile.canRead()) {
|
|
|
float version = std::stof(versionFile.readLine());
|
|
|
if(version < Osu::version->getFloat() - 0.0001f) m_bDrawVersionNotificationArrow = true;
|
|
@@ -307,51 +265,15 @@ OsuMainMenu::OsuMainMenu(Osu *osu) : OsuScreen(osu) {
|
|
|
m_updateAvailableButton->setTextColor(0x22ffffff);
|
|
|
|
|
|
m_versionButton = new CBaseUIButton(0, 0, 0, 0, "", "");
|
|
|
- UString versionString = MCOSU_VERSION_TEXT;
|
|
|
- versionString.append(" ");
|
|
|
- versionString.append(UString::format("%.2f", Osu::version->getFloat()));
|
|
|
+ UString versionString = UString::format("Version %.2f", Osu::version->getFloat());
|
|
|
m_versionButton->setText(versionString);
|
|
|
m_versionButton->setDrawBackground(false);
|
|
|
m_versionButton->setDrawFrame(false);
|
|
|
m_versionButton->setClickCallback(fastdelegate::MakeDelegate(this, &OsuMainMenu::onVersionPressed));
|
|
|
addBaseUIElement(m_versionButton);
|
|
|
-
|
|
|
- m_mainMenuSliderTextDatabaseBeatmap = NULL;
|
|
|
- m_mainMenuSliderTextBeatmapStandard = NULL;
|
|
|
- m_fMainMenuSliderTextRawHitCircleDiameter = 1.0f;
|
|
|
- if(osu_main_menu_use_slider_text.getBool()) {
|
|
|
- m_mainMenuSliderTextDatabaseBeatmap = new OsuDatabaseBeatmap(m_osu, s_sliderTextBeatmap, "", true);
|
|
|
- m_mainMenuSliderTextBeatmapStandard = new OsuBeatmap(m_osu);
|
|
|
-
|
|
|
- // HACKHACK: temporary workaround to avoid this breaking the main menu logo text sliders (1/2)
|
|
|
- const bool wasModRandomEnabled = m_osu_mod_random_ref->getBool();
|
|
|
- if(wasModRandomEnabled) m_osu_mod_random_ref->setValue(0.0f);
|
|
|
-
|
|
|
- OsuDatabaseBeatmap::LOAD_GAMEPLAY_RESULT result =
|
|
|
- OsuDatabaseBeatmap::loadGameplay(m_mainMenuSliderTextDatabaseBeatmap, m_mainMenuSliderTextBeatmapStandard);
|
|
|
- if(result.errorCode == 0) {
|
|
|
- m_fMainMenuSliderTextRawHitCircleDiameter = m_mainMenuSliderTextBeatmapStandard->getRawHitcircleDiameter();
|
|
|
- m_mainMenuSliderTextBeatmapHitObjects = result.hitobjects;
|
|
|
- for(size_t i = 0; i < m_mainMenuSliderTextBeatmapHitObjects.size(); i++) {
|
|
|
- OsuHitObject *hitObject = m_mainMenuSliderTextBeatmapHitObjects[i];
|
|
|
- OsuSlider *sliderPointer = dynamic_cast<OsuSlider *>(hitObject);
|
|
|
- if(sliderPointer != NULL)
|
|
|
- sliderPointer->rebuildVertexBuffer(
|
|
|
- true); // we are working in osu coordinate space for this (no mods, just raw curve coords)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // HACKHACK: temporary workaround to avoid this breaking the main menu logo text sliders (2/2)
|
|
|
- if(wasModRandomEnabled) m_osu_mod_random_ref->setValue(1.0f);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
OsuMainMenu::~OsuMainMenu() {
|
|
|
- for(auto slider : m_mainMenuSliderTextBeatmapHitObjects) {
|
|
|
- delete slider;
|
|
|
- }
|
|
|
- m_mainMenuSliderTextBeatmapHitObjects.clear();
|
|
|
-
|
|
|
anim->deleteExistingAnimation(&m_fUpdateButtonAnim);
|
|
|
|
|
|
anim->deleteExistingAnimation(&m_fMainMenuAnimFriendEyeFollowX);
|
|
@@ -370,16 +292,38 @@ OsuMainMenu::~OsuMainMenu() {
|
|
|
|
|
|
// if the user didn't click on the update notification during this session, quietly remove it so it's not annoying
|
|
|
if(m_bWasCleanShutdown) writeVersionFile();
|
|
|
-
|
|
|
- SAFE_DELETE(m_mainMenuSliderTextBeatmapStandard);
|
|
|
- SAFE_DELETE(m_mainMenuSliderTextDatabaseBeatmap);
|
|
|
}
|
|
|
|
|
|
void OsuMainMenu::draw(Graphics *g) {
|
|
|
if(!m_bVisible) return;
|
|
|
|
|
|
- McFont *smallFont = m_osu->getSubTitleFont();
|
|
|
- McFont *titleFont = m_osu->getTitleFont();
|
|
|
+ // load server icon
|
|
|
+ if(bancho.is_online() && bancho.server_icon_url.length() > 0 && bancho.server_icon == nullptr) {
|
|
|
+ std::stringstream ss;
|
|
|
+ ss << MCENGINE_DATA_DIR "avatars/" << bancho.endpoint.toUtf8();
|
|
|
+ auto icon_path = ss.str();
|
|
|
+ if(!env->directoryExists(icon_path)) {
|
|
|
+ env->createDirectory(icon_path);
|
|
|
+ }
|
|
|
+ icon_path.append("/server_icon");
|
|
|
+
|
|
|
+ float progress = -1.f;
|
|
|
+ std::vector<uint8_t> data;
|
|
|
+ int response_code;
|
|
|
+ download(bancho.server_icon_url.toUtf8(), &progress, data, &response_code);
|
|
|
+ if(progress == -1.f) bancho.server_icon_url = "";
|
|
|
+ if(!data.empty()) {
|
|
|
+ FILE *file = fopen(icon_path.c_str(), "wb");
|
|
|
+ if(file != NULL) {
|
|
|
+ fwrite(data.data(), data.size(), 1, file);
|
|
|
+ fflush(file);
|
|
|
+ fclose(file);
|
|
|
+ }
|
|
|
+
|
|
|
+ bancho.server_icon = engine->getResourceManager()->loadImageAbs(icon_path, icon_path);
|
|
|
+ bancho.server_icon_url = "";
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// menu-background
|
|
|
if(osu_draw_menu_background.getBool()) {
|
|
@@ -401,35 +345,32 @@ void OsuMainMenu::draw(Graphics *g) {
|
|
|
}
|
|
|
|
|
|
// XXX: Should do fade transition between beatmap backgrounds when switching to next song
|
|
|
- if(m_osu->getSelectedBeatmap() != NULL) {
|
|
|
- float alpha = 1.0f;
|
|
|
- if(m_osu_songbrowser_background_fade_in_duration_ref->getFloat() > 0.0f) {
|
|
|
- // handle fadein trigger after handler is finished loading
|
|
|
- const bool ready = m_osu->getSelectedBeatmap() != NULL &&
|
|
|
- m_osu->getSelectedBeatmap()->getSelectedDifficulty2() != NULL &&
|
|
|
- m_osu->getBackgroundImageHandler()->getLoadBackgroundImage(
|
|
|
- m_osu->getSelectedBeatmap()->getSelectedDifficulty2()) != NULL &&
|
|
|
- m_osu->getBackgroundImageHandler()
|
|
|
- ->getLoadBackgroundImage(m_osu->getSelectedBeatmap()->getSelectedDifficulty2())
|
|
|
- ->isReady();
|
|
|
-
|
|
|
- if(!ready)
|
|
|
- m_fBackgroundFadeInTime = engine->getTime();
|
|
|
- else if(m_fBackgroundFadeInTime > 0.0f && engine->getTime() > m_fBackgroundFadeInTime) {
|
|
|
- alpha = clamp<float>((engine->getTime() - m_fBackgroundFadeInTime) /
|
|
|
- m_osu_songbrowser_background_fade_in_duration_ref->getFloat(),
|
|
|
- 0.0f, 1.0f);
|
|
|
- alpha = 1.0f - (1.0f - alpha) * (1.0f - alpha);
|
|
|
- }
|
|
|
+ float alpha = 1.0f;
|
|
|
+ if(m_osu_songbrowser_background_fade_in_duration_ref->getFloat() > 0.0f) {
|
|
|
+ // handle fadein trigger after handler is finished loading
|
|
|
+ const bool ready = m_osu->getSelectedBeatmap()->getSelectedDifficulty2() != NULL &&
|
|
|
+ m_osu->getBackgroundImageHandler()->getLoadBackgroundImage(
|
|
|
+ m_osu->getSelectedBeatmap()->getSelectedDifficulty2()) != NULL &&
|
|
|
+ m_osu->getBackgroundImageHandler()
|
|
|
+ ->getLoadBackgroundImage(m_osu->getSelectedBeatmap()->getSelectedDifficulty2())
|
|
|
+ ->isReady();
|
|
|
+
|
|
|
+ if(!ready)
|
|
|
+ m_fBackgroundFadeInTime = engine->getTime();
|
|
|
+ else if(m_fBackgroundFadeInTime > 0.0f && engine->getTime() > m_fBackgroundFadeInTime) {
|
|
|
+ alpha = clamp<float>((engine->getTime() - m_fBackgroundFadeInTime) /
|
|
|
+ m_osu_songbrowser_background_fade_in_duration_ref->getFloat(),
|
|
|
+ 0.0f, 1.0f);
|
|
|
+ alpha = 1.0f - (1.0f - alpha) * (1.0f - alpha);
|
|
|
}
|
|
|
- OsuSongBrowser::drawSelectedBeatmapBackgroundImage(g, m_osu, alpha);
|
|
|
}
|
|
|
+ OsuSongBrowser::drawSelectedBeatmapBackgroundImage(g, m_osu, alpha);
|
|
|
|
|
|
// main button stuff
|
|
|
bool haveTimingpoints = false;
|
|
|
const float div = 1.25f;
|
|
|
float pulse = 0.0f;
|
|
|
- if(m_osu->getSelectedBeatmap() != NULL && m_osu->getSelectedBeatmap()->getSelectedDifficulty2() != NULL &&
|
|
|
+ if(m_osu->getSelectedBeatmap()->getSelectedDifficulty2() != NULL &&
|
|
|
m_osu->getSelectedBeatmap()->getMusic() != NULL && m_osu->getSelectedBeatmap()->getMusic()->isPlaying()) {
|
|
|
haveTimingpoints = true;
|
|
|
|
|
@@ -458,7 +399,6 @@ void OsuMainMenu::draw(Graphics *g) {
|
|
|
} else
|
|
|
pulse = (div - fmod(engine->getTime(), div)) / div;
|
|
|
|
|
|
- // pulse *= pulse; // quadratic
|
|
|
Vector2 size = m_vSize;
|
|
|
const float pulseSub = 0.05f * pulse;
|
|
|
size -= size * pulseSub;
|
|
@@ -467,60 +407,6 @@ void OsuMainMenu::draw(Graphics *g) {
|
|
|
McRect mainButtonRect =
|
|
|
McRect(m_vCenter.x - size.x / 2.0f - m_fCenterOffsetAnim, m_vCenter.y - size.y / 2.0f, size.x, size.y);
|
|
|
|
|
|
- bool drawBanner = true;
|
|
|
-
|
|
|
-#ifdef __SWITCH__
|
|
|
-
|
|
|
- drawBanner = ((HorizonSDLEnvironment *)env)->getMemAvailableMB() < 1024;
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
- if(drawBanner) {
|
|
|
- UString bannerText = MCOSU_BANNER_TEXT;
|
|
|
-
|
|
|
- if(osu_main_menu_banner_always_text.getString().length() > 0)
|
|
|
- bannerText = osu_main_menu_banner_always_text.getString();
|
|
|
- else if(m_bDidUserUpdateFromOlderVersion &&
|
|
|
- osu_main_menu_banner_ifupdatedfromoldversion_text.getString().length() > 0)
|
|
|
- bannerText = osu_main_menu_banner_ifupdatedfromoldversion_text.getString();
|
|
|
- else if(m_bDidUserUpdateFromOlderVersionLe3300 &&
|
|
|
- osu_main_menu_banner_ifupdatedfromoldversion_le3300_text.getString().length() > 0)
|
|
|
- bannerText = osu_main_menu_banner_ifupdatedfromoldversion_le3300_text.getString();
|
|
|
- else if(m_bDidUserUpdateFromOlderVersionLe3303 &&
|
|
|
- osu_main_menu_banner_ifupdatedfromoldversion_le3303_text.getString().length() > 0)
|
|
|
- bannerText = osu_main_menu_banner_ifupdatedfromoldversion_le3303_text.getString();
|
|
|
-
|
|
|
- if(bannerText.length() > 0) {
|
|
|
- McFont *bannerFont = m_osu->getSubTitleFont();
|
|
|
- float bannerStringWidth = bannerFont->getStringWidth(bannerText);
|
|
|
- int bannerDiff = 20;
|
|
|
- int bannerMargin = 5;
|
|
|
- int numBanners = (int)std::round(m_osu->getScreenWidth() / (bannerStringWidth + bannerDiff)) + 2;
|
|
|
-
|
|
|
- g->setColor(0xffee7777);
|
|
|
- g->pushTransform();
|
|
|
- g->translate(1, 1);
|
|
|
- for(int i = -1; i < numBanners; i++) {
|
|
|
- g->pushTransform();
|
|
|
- g->translate(i * bannerStringWidth + i * bannerDiff +
|
|
|
- fmod(engine->getTime() * 30, bannerStringWidth + bannerDiff),
|
|
|
- bannerFont->getHeight() + bannerMargin);
|
|
|
- g->drawString(bannerFont, bannerText);
|
|
|
- g->popTransform();
|
|
|
- }
|
|
|
- g->popTransform();
|
|
|
- g->setColor(0xff555555);
|
|
|
- for(int i = -1; i < numBanners; i++) {
|
|
|
- g->pushTransform();
|
|
|
- g->translate(i * bannerStringWidth + i * bannerDiff +
|
|
|
- fmod(engine->getTime() * 30, bannerStringWidth + bannerDiff),
|
|
|
- bannerFont->getHeight() + bannerMargin);
|
|
|
- g->drawString(bannerFont, bannerText);
|
|
|
- g->popTransform();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
// draw notification arrow for changelog (version button)
|
|
|
if(m_bDrawVersionNotificationArrow) {
|
|
|
float animation = fmod((float)(engine->getTime()) * 3.2f, 2.0f);
|
|
@@ -538,6 +424,7 @@ void OsuMainMenu::draw(Graphics *g) {
|
|
|
g->setColor(0xffffffff);
|
|
|
g->pushTransform();
|
|
|
{
|
|
|
+ McFont *smallFont = m_osu->getSubTitleFont();
|
|
|
g->translate(arrowPos.x - smallFont->getStringWidth(notificationText) / 2.0f,
|
|
|
(-offset * 2) * scale + arrowPos.y -
|
|
|
(m_osu->getSkin()->getPlayWarningArrow2()->getSizeBaseRaw().y * scale) / 1.5f,
|
|
@@ -571,52 +458,6 @@ void OsuMainMenu::draw(Graphics *g) {
|
|
|
g->pop3DScene();
|
|
|
}
|
|
|
|
|
|
- // pre-render all slider text into the one single sliderFrameBuffer (up here before any of the 3dscene stuff)
|
|
|
- if(osu_main_menu_use_slider_text.getBool() && m_mainMenuSliderTextBeatmapHitObjects.size() > 0) {
|
|
|
- static std::vector<Vector2> alwaysPoints;
|
|
|
- const float scale =
|
|
|
- (mainButtonRect.getWidth() / 1100.0f) * osu_main_menu_slider_text_scale.getFloat() * m_fStartupAnim;
|
|
|
- const Vector2 osuCoordsToCenteredAtOrigin =
|
|
|
- Vector2(-OsuGameRules::OSU_COORD_WIDTH / 2 + osu_main_menu_slider_text_offset_x.getFloat(),
|
|
|
- -OsuGameRules::OSU_COORD_HEIGHT / 2 + osu_main_menu_slider_text_offset_y.getFloat()) *
|
|
|
- scale;
|
|
|
- const Vector2 screenCenterOffset =
|
|
|
- Vector2(m_osu->getScreenWidth() / 2 - m_fCenterOffsetAnim, m_osu->getScreenHeight() / 2);
|
|
|
- const Vector2 translation = osuCoordsToCenteredAtOrigin + screenCenterOffset;
|
|
|
- const float from = 0.0f;
|
|
|
- const float to = m_fStartupAnim2;
|
|
|
-
|
|
|
- const float prevSliderBorderFeatherBackup = m_osu_slider_border_feather_ref->getFloat();
|
|
|
- m_osu_slider_border_feather_ref->setValue(0.04f); // heuristic to avoid aliasing
|
|
|
- {
|
|
|
- const size_t numHitObjects = m_mainMenuSliderTextBeatmapHitObjects.size();
|
|
|
- for(size_t i = 0; i < numHitObjects; i++) {
|
|
|
- OsuSlider *sliderPointer = dynamic_cast<OsuSlider *>(m_mainMenuSliderTextBeatmapHitObjects[i]);
|
|
|
- if(sliderPointer != NULL) {
|
|
|
- alwaysPoints.clear();
|
|
|
- if(to < 1.0f)
|
|
|
- alwaysPoints.push_back((sliderPointer->getCurve()->pointAt(to)) * scale +
|
|
|
- translation); // alwaysPoints are always drawn in engine coords, so
|
|
|
- // compensate by applying scale and translation manually
|
|
|
-
|
|
|
- const bool doEnableRenderTarget = (i == 0);
|
|
|
- const bool doDisableRenderTarget = (i + 1 >= numHitObjects);
|
|
|
- const bool doDrawSliderFrameBufferToScreen = false;
|
|
|
-
|
|
|
- OsuSliderRenderer::draw(g, m_osu, sliderPointer->getVAO(), alwaysPoints, translation, scale,
|
|
|
- (to < 1.0f ? m_fMainMenuSliderTextRawHitCircleDiameter * scale
|
|
|
- : OsuSliderRenderer::UNIT_CIRCLE_VAO_DIAMETER),
|
|
|
- from, to,
|
|
|
- m_osu->getSkin()->getComboColorForCounter(sliderPointer->getColorCounter(),
|
|
|
- sliderPointer->getColorOffset()),
|
|
|
- 1.0f, 1.0f, 0, doEnableRenderTarget, doDisableRenderTarget,
|
|
|
- doDrawSliderFrameBufferToScreen);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- m_osu_slider_border_feather_ref->setValue(prevSliderBorderFeatherBackup);
|
|
|
- }
|
|
|
-
|
|
|
// draw main button
|
|
|
float inset = 0.0f;
|
|
|
if((m_fMainMenuAnim > 0.0f && m_fMainMenuAnim != 1.0f) ||
|
|
@@ -922,107 +763,40 @@ void OsuMainMenu::draw(Graphics *g) {
|
|
|
}
|
|
|
|
|
|
// main text
|
|
|
- const float fontScale = (1.0f - pulseSub + m_fSizeAddAnim) * m_fStartupAnim;
|
|
|
- {
|
|
|
+ if(bancho.server_icon == nullptr || !bancho.server_icon->isReady()) {
|
|
|
+ const float title_width = m_titleFont->getStringWidth(NEOSU_MAIN_BUTTON_TEXT);
|
|
|
+ const float title_scale = mainButtonRect.getWidth() / title_width * 0.6f;
|
|
|
+ const float font_scale = title_scale * (1.0f - pulseSub + m_fSizeAddAnim) * m_fStartupAnim;
|
|
|
+
|
|
|
float alpha = (1.0f - m_fMainMenuAnimFriendPercent) * (1.0f - m_fMainMenuAnimFriendPercent) *
|
|
|
(1.0f - m_fMainMenuAnimFriendPercent);
|
|
|
|
|
|
- if(!osu_main_menu_use_slider_text.getBool() || m_mainMenuSliderTextBeatmapHitObjects.size() < 1) {
|
|
|
- g->setColor(0xffffffff);
|
|
|
- g->setAlpha(alpha);
|
|
|
- g->pushTransform();
|
|
|
- {
|
|
|
- g->scale(fontScale, fontScale);
|
|
|
- g->translate(m_vCenter.x - m_fCenterOffsetAnim -
|
|
|
- (titleFont->getStringWidth(MCOSU_MAIN_BUTTON_TEXT) / 2.0f) * fontScale,
|
|
|
- m_vCenter.y + (titleFont->getHeight() * fontScale) / 2.25f, -1.0f);
|
|
|
- g->drawString(titleFont, MCOSU_MAIN_BUTTON_TEXT);
|
|
|
- }
|
|
|
- g->popTransform();
|
|
|
- } else {
|
|
|
- alpha *= m_fStartupAnim * m_fStartupAnim * m_fStartupAnim * m_fStartupAnim;
|
|
|
-
|
|
|
- m_osu->getSliderFrameBuffer()->setColor(
|
|
|
- COLORf(alpha * osu_main_menu_slider_text_alpha.getFloat(), 1.0f, 1.0f, 1.0f));
|
|
|
- m_osu->getSliderFrameBuffer()->drawRect(g, mainButtonRect.getX() + inset, mainButtonRect.getY() + inset,
|
|
|
- mainButtonRect.getWidth() - 2 * inset,
|
|
|
- mainButtonRect.getHeight() - 2 * inset);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // subtitle
|
|
|
- UString subtext = MCOSU_MAIN_BUTTON_SUBTEXT;
|
|
|
- if(bancho.is_online()) {
|
|
|
- subtext = bancho.endpoint;
|
|
|
- }
|
|
|
-
|
|
|
- if(subtext.length() > 0) {
|
|
|
- float invertedPulse = 1.0f - pulse;
|
|
|
-
|
|
|
- if(haveTimingpoints)
|
|
|
- g->setColor(COLORf(1.0f, 0.10f + 0.15f * invertedPulse, 0.10f + 0.15f * invertedPulse,
|
|
|
- 0.10f + 0.15f * invertedPulse));
|
|
|
- else
|
|
|
- g->setColor(0xff444444);
|
|
|
-
|
|
|
- g->setAlpha((1.0f - m_fMainMenuAnimFriendPercent) * (1.0f - m_fMainMenuAnimFriendPercent) *
|
|
|
- (1.0f - m_fMainMenuAnimFriendPercent) *
|
|
|
- (1.0f - (1.0f - m_fStartupAnim2) * (1.0f - m_fStartupAnim2)) * osu_main_menu_alpha.getFloat());
|
|
|
-
|
|
|
+ g->setColor(0xffffffff);
|
|
|
+ g->setAlpha(alpha);
|
|
|
g->pushTransform();
|
|
|
{
|
|
|
- g->scale(fontScale, fontScale);
|
|
|
- g->translate(
|
|
|
- m_vCenter.x - m_fCenterOffsetAnim - (smallFont->getStringWidth(subtext) / 2.0f) * fontScale,
|
|
|
- m_vCenter.y + (mainButtonRect.getHeight() / 2.0f) / 2.0f + (smallFont->getHeight() * fontScale) / 2.0f,
|
|
|
- -1.0f);
|
|
|
- g->drawString(smallFont, subtext);
|
|
|
+ g->scale(font_scale, font_scale);
|
|
|
+ g->translate(m_vCenter.x - m_fCenterOffsetAnim -
|
|
|
+ (m_titleFont->getStringWidth(NEOSU_MAIN_BUTTON_TEXT) / 2.0f) * font_scale,
|
|
|
+ m_vCenter.y + (m_titleFont->getHeight() * font_scale) / 2.25f, -1.0f);
|
|
|
+ g->drawString(m_titleFont, NEOSU_MAIN_BUTTON_TEXT);
|
|
|
}
|
|
|
g->popTransform();
|
|
|
+ } else {
|
|
|
+ float alpha = (1.0f - m_fMainMenuAnimFriendPercent) * (1.0f - m_fMainMenuAnimFriendPercent) *
|
|
|
+ (1.0f - m_fMainMenuAnimFriendPercent);
|
|
|
|
|
|
- if(bancho.is_online()) {
|
|
|
- UString score_submission("Scores: ");
|
|
|
- UString submission_status(bancho.submit_scores() ? "ENABLED" : "DISABLED");
|
|
|
-
|
|
|
- auto full_text = score_submission;
|
|
|
- full_text.append(submission_status);
|
|
|
- float x_start = m_vCenter.x - m_fCenterOffsetAnim - smallFont->getStringWidth(full_text) / 2.f * fontScale;
|
|
|
-
|
|
|
- g->pushTransform();
|
|
|
- {
|
|
|
- if(haveTimingpoints)
|
|
|
- g->setColor(COLORf(1.0f, 0.10f + 0.15f * invertedPulse, 0.10f + 0.15f * invertedPulse,
|
|
|
- 0.10f + 0.15f * invertedPulse));
|
|
|
- else
|
|
|
- g->setColor(0xff444444);
|
|
|
-
|
|
|
- g->scale(fontScale, fontScale);
|
|
|
- g->translate(
|
|
|
- x_start,
|
|
|
- m_vCenter.y + (mainButtonRect.getHeight() / 2.0f) / 2.0f + 2 * (smallFont->getHeight() * fontScale),
|
|
|
- -1.0f);
|
|
|
- g->drawString(smallFont, score_submission);
|
|
|
- }
|
|
|
- g->popTransform();
|
|
|
+ float xscale = mainButtonRect.getWidth() / bancho.server_icon->getWidth();
|
|
|
+ float yscale = mainButtonRect.getHeight() / bancho.server_icon->getHeight();
|
|
|
+ float scale = std::min(xscale, yscale) * 0.8f;
|
|
|
|
|
|
- g->pushTransform();
|
|
|
- {
|
|
|
- if(haveTimingpoints)
|
|
|
- g->setColor(COLORf(1.0f, (bancho.submit_scores() ? 0.1 : 0.3) + 0.15f * invertedPulse,
|
|
|
- (bancho.submit_scores() ? 0.3 : 0.1) + 0.15f * invertedPulse,
|
|
|
- 0.10f + 0.15f * invertedPulse));
|
|
|
- else
|
|
|
- g->setColor(bancho.submit_scores() ? 0xff44bb44 : 0xffbb4444);
|
|
|
-
|
|
|
- g->scale(fontScale, fontScale);
|
|
|
- g->translate(
|
|
|
- x_start + smallFont->getStringWidth(score_submission) * fontScale,
|
|
|
- m_vCenter.y + (mainButtonRect.getHeight() / 2.0f) / 2.0f + 2 * (smallFont->getHeight() * fontScale),
|
|
|
- -1.0f);
|
|
|
- g->drawString(smallFont, submission_status);
|
|
|
- }
|
|
|
- g->popTransform();
|
|
|
- }
|
|
|
+ g->pushTransform();
|
|
|
+ g->setColor(0xffffffff);
|
|
|
+ g->setAlpha(alpha);
|
|
|
+ g->scale(scale, scale);
|
|
|
+ g->translate(m_vCenter.x - m_fCenterOffsetAnim, m_vCenter.y);
|
|
|
+ g->drawImage(bancho.server_icon);
|
|
|
+ g->popTransform();
|
|
|
}
|
|
|
|
|
|
if((m_fMainMenuAnim > 0.0f && m_fMainMenuAnim != 1.0f) ||
|
|
@@ -1252,7 +1026,7 @@ void OsuMainMenu::mouse_update(bool *propagate_clicks) {
|
|
|
if(m_updateAvailableButton->getText().find("ready") != -1)
|
|
|
m_updateAvailableButton->setText("Click here to restart now!");
|
|
|
else
|
|
|
- m_updateAvailableButton->setText("A new version of McOsu is ready!");
|
|
|
+ m_updateAvailableButton->setText("A new version of neosu is ready!");
|
|
|
}
|
|
|
break;
|
|
|
case OsuUpdateHandler::STATUS::STATUS_ERROR:
|
|
@@ -1268,35 +1042,37 @@ void OsuMainMenu::mouse_update(bool *propagate_clicks) {
|
|
|
}
|
|
|
|
|
|
// Update pause button and shuffle songs
|
|
|
- if(m_osu->getSelectedBeatmap() != NULL) {
|
|
|
- if(m_osu->getSelectedBeatmap()->isPreviewMusicPlaying()) {
|
|
|
- m_osu->getSelectedBeatmap()->getMusic()->setLoop(false);
|
|
|
+ m_pauseButton->setPaused(true);
|
|
|
+ auto music = m_osu->getSelectedBeatmap()->getMusic();
|
|
|
+ if(music == nullptr) {
|
|
|
+ selectRandomBeatmap();
|
|
|
+ } else {
|
|
|
+ if(music->isFinished()) {
|
|
|
+ selectRandomBeatmap();
|
|
|
+ }
|
|
|
+
|
|
|
+ if(music->isPlaying()) {
|
|
|
m_pauseButton->setPaused(false);
|
|
|
- } else {
|
|
|
- if(shuffling) {
|
|
|
- selectRandomBeatmap();
|
|
|
- } else {
|
|
|
- m_pauseButton->setPaused(true);
|
|
|
- }
|
|
|
+
|
|
|
+ // NOTE: We set this every frame, because music loading isn't instant
|
|
|
+ music->setLoop(false);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void OsuMainMenu::selectRandomBeatmap() {
|
|
|
- shuffling = true;
|
|
|
-
|
|
|
- if(m_osu->getSongBrowser()->getDatabase()->isFinished()) {
|
|
|
+ auto sb = m_osu->getSongBrowser();
|
|
|
+ if(sb->getDatabase()->isFinished() && !sb->m_beatmaps.empty()) {
|
|
|
m_osu->getSongBrowser()->selectRandomBeatmap();
|
|
|
} else {
|
|
|
// Database is not loaded yet, load a random map and select it
|
|
|
- // XXX: Also pick from McOsu maps/ directory
|
|
|
+ // XXX: Also pick from neosu maps/ directory
|
|
|
auto songs_folder = m_osu->getSongBrowser()->getDatabase()->getOsuSongsFolder();
|
|
|
auto mapset_folders = env->getFoldersInFolder(songs_folder);
|
|
|
auto nb_mapsets = mapset_folders.size();
|
|
|
if(nb_mapsets == 0) return;
|
|
|
|
|
|
- auto cur_beatmap = m_osu->getSongBrowser()->getSelectedBeatmap();
|
|
|
- if(cur_beatmap) cur_beatmap->deselect();
|
|
|
+ m_osu->getSongBrowser()->getSelectedBeatmap()->deselect();
|
|
|
SAFE_DELETE(preloaded_beatmap);
|
|
|
|
|
|
for(int i = 0; i < 10; i++) {
|
|
@@ -1317,6 +1093,7 @@ void OsuMainMenu::selectRandomBeatmap() {
|
|
|
}
|
|
|
|
|
|
preloaded_beatmap = beatmap_diffs[rand() % beatmap_diffs.size()];
|
|
|
+ preloaded_beatmap->do_not_store = true;
|
|
|
m_osu->getSongBrowser()->onDifficultySelected(preloaded_beatmap, false);
|
|
|
return;
|
|
|
}
|
|
@@ -1371,23 +1148,23 @@ void OsuMainMenu::onResolutionChange(Vector2 newResolution) {
|
|
|
CBaseUIContainer *OsuMainMenu::setVisible(bool visible) {
|
|
|
m_bVisible = visible;
|
|
|
|
|
|
- if(!m_bVisible) {
|
|
|
- setMenuElementsVisible(false, false);
|
|
|
- } else {
|
|
|
+ if(visible) {
|
|
|
OsuRichPresence::onMainMenu(m_osu);
|
|
|
|
|
|
updateLayout();
|
|
|
|
|
|
m_fMainMenuAnimDuration = 15.0f;
|
|
|
m_fMainMenuAnimTime = engine->getTime() + m_fMainMenuAnimDuration;
|
|
|
- }
|
|
|
|
|
|
- if(visible && m_bStartupAnim) {
|
|
|
- m_bStartupAnim = false;
|
|
|
- anim->moveQuadOut(&m_fStartupAnim, 1.0f, osu_main_menu_startup_anim_duration.getFloat(),
|
|
|
- (float)engine->getTimeReal());
|
|
|
- anim->moveQuartOut(&m_fStartupAnim2, 1.0f, osu_main_menu_startup_anim_duration.getFloat() * 6.0f,
|
|
|
- (float)engine->getTimeReal() + osu_main_menu_startup_anim_duration.getFloat() * 0.5f);
|
|
|
+ if(m_bStartupAnim) {
|
|
|
+ m_bStartupAnim = false;
|
|
|
+ anim->moveQuadOut(&m_fStartupAnim, 1.0f, osu_main_menu_startup_anim_duration.getFloat(),
|
|
|
+ (float)engine->getTimeReal());
|
|
|
+ anim->moveQuartOut(&m_fStartupAnim2, 1.0f, osu_main_menu_startup_anim_duration.getFloat() * 6.0f,
|
|
|
+ (float)engine->getTimeReal() + osu_main_menu_startup_anim_duration.getFloat() * 0.5f);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ setMenuElementsVisible(false, false);
|
|
|
}
|
|
|
|
|
|
return this;
|
|
@@ -1541,7 +1318,7 @@ void OsuMainMenu::setMenuElementsVisible(bool visible, bool animate) {
|
|
|
|
|
|
void OsuMainMenu::writeVersionFile() {
|
|
|
// remember, don't show the notification arrow until the version changes again
|
|
|
- std::ofstream versionFile(MCOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE, std::ios::out | std::ios::trunc);
|
|
|
+ std::ofstream versionFile(NEOSU_NEWVERSION_NOTIFICATION_TRIGGER_FILE, std::ios::out | std::ios::trunc);
|
|
|
if(versionFile.good()) versionFile << Osu::version->getFloat();
|
|
|
}
|
|
|
|
|
@@ -1632,11 +1409,13 @@ void OsuMainMenu::onExitButtonPressed() {
|
|
|
void OsuMainMenu::onPausePressed() {
|
|
|
if(m_osu->getInstanceID() > 1) return;
|
|
|
|
|
|
- if(m_osu->getSelectedBeatmap() != NULL) {
|
|
|
+ if(m_osu->getSelectedBeatmap()->isPreviewMusicPlaying()) {
|
|
|
m_osu->getSelectedBeatmap()->pausePreviewMusic();
|
|
|
- shuffling = false;
|
|
|
} else {
|
|
|
- shuffling = true;
|
|
|
+ auto music = m_osu->getSelectedBeatmap()->getMusic();
|
|
|
+ if(music != nullptr) {
|
|
|
+ engine->getSound()->play(music);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|