Skip to content

Commit

Permalink
Updated to alpha 21
Browse files Browse the repository at this point in the history
  • Loading branch information
McKay committed Aug 4, 2016
1 parent e3881ee commit 11396fa
Show file tree
Hide file tree
Showing 14 changed files with 238 additions and 102 deletions.
18 changes: 11 additions & 7 deletions src/App/Osu/Osu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ void DUMMY_OSU_MODS(void) {;}

ConVar osu_debug("osu_debug", false);

ConVar osu_disable_mousebuttons("osu_disable_mousebuttons", true);
ConVar osu_disable_mousebuttons("osu_disable_mousebuttons", false);
ConVar osu_disable_mousewheel("osu_disable_mousewheel", false);
ConVar osu_confine_cursor_windowed("osu_confine_cursor_windowed", false, DUMMY_OSU_LETTERBOXING);
ConVar osu_confine_cursor_fullscreen("osu_confine_cursor_fullscreen", true, DUMMY_OSU_LETTERBOXING);

Expand Down Expand Up @@ -409,13 +410,16 @@ void Osu::update()
// handle mousewheel volume change
if (((m_songBrowser != NULL && (!m_songBrowser->isVisible() || engine->getKeyboard()->isAltDown())) || ((m_songBrowser2 != NULL && (!m_songBrowser2->isVisible() || engine->getKeyboard()->isAltDown()))) ) && !m_optionsMenu->isVisible())
{
int wheelDelta = engine->getMouse()->getWheelDeltaVertical();
if (wheelDelta != 0)
if (!(isInPlayMode() && !m_pauseMenu->isVisible()) || !osu_disable_mousewheel.getBool() || engine->getKeyboard()->isAltDown())
{
if (wheelDelta > 0)
volumeUp();
else
volumeDown();
int wheelDelta = engine->getMouse()->getWheelDeltaVertical();
if (wheelDelta != 0)
{
if (wheelDelta > 0)
volumeUp();
else
volumeDown();
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/App/Osu/OsuBeatmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ void OsuBeatmap::draw(Graphics *g)
}

// draw playfield border
if (osu_draw_playfield_border.getBool())
if (osu_draw_playfield_border.getBool() && !osu_mod_fps.getBool())
m_osu->getHUD()->drawPlayfieldBorder(g, m_vPlayfieldCenter, m_vPlayfieldSize, m_fHitcircleDiameter);

// draw followpoints
Expand Down
53 changes: 45 additions & 8 deletions src/App/Osu/OsuBeatmapDifficulty.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ bool OsuBeatmapDifficulty::loadMetadata()
// load metadata only
int curBlock = -1;

bool foundAR = false;

std::string curLine;
while (std::getline(file, curLine))
{
Expand Down Expand Up @@ -167,7 +169,8 @@ bool OsuBeatmapDifficulty::loadMetadata()

case 2: // Difficulty
sscanf(curLineChar, "CircleSize:%f\n", &CS);
sscanf(curLineChar, "ApproachRate:%f\n", &AR);
if (sscanf(curLineChar, "ApproachRate:%f\n", &AR) == 1)
foundAR = true;
sscanf(curLineChar, "HPDrainRate:%f\n", &HP);
sscanf(curLineChar, "OverallDifficulty:%f\n", &OD);
sscanf(curLineChar, "SliderMultiplier:%f\n", &sliderMultiplier);
Expand All @@ -194,7 +197,8 @@ bool OsuBeatmapDifficulty::loadMetadata()
break;
case 5: // TimingPoints

// Offset, Milliseconds per Beat, Meter, Sample Type, Sample Set, Volume, Inherited, Kiai Mode
// old beatmaps: Offset, Milliseconds per Beat
// new beatmaps: Offset, Milliseconds per Beat, Meter, Sample Type, Sample Set, Volume, Inherited, Kiai Mode

double tpOffset;
float tpMSPerBeat;
Expand All @@ -212,6 +216,18 @@ bool OsuBeatmapDifficulty::loadMetadata()

timingpoints.push_back(t);
}
else if (sscanf(curLineChar, "%lf,%f", &tpOffset, &tpMSPerBeat) == 2)
{
TIMINGPOINT t;
t.offset = (long)std::round(tpOffset);
t.msPerBeat = tpMSPerBeat;

t.sampleType = 0;
t.sampleSet = 0;
t.volume = 100;

timingpoints.push_back(t);
}
break;
}
}
Expand Down Expand Up @@ -290,6 +306,10 @@ bool OsuBeatmapDifficulty::loadMetadata()
maxBPM = (int)std::round(tempMaxBPM);
}

// old beatmaps: AR = OD, there is no ApproachRate stored
if (!foundAR)
AR = OD;

return true;
}

Expand Down Expand Up @@ -333,7 +353,8 @@ bool OsuBeatmapDifficulty::load(OsuBeatmap *beatmap, std::vector<OsuHitObject*>
{
case 3: // TimingPoints

// Offset, Milliseconds per Beat, Meter, Sample Type, Sample Set, Volume, Inherited, Kiai Mode
// old beatmaps: Offset, Milliseconds per Beat
// new beatmaps: Offset, Milliseconds per Beat, Meter, Sample Type, Sample Set, Volume, Inherited, Kiai Mode

double tpOffset;
float tpMSPerBeat;
Expand All @@ -351,6 +372,18 @@ bool OsuBeatmapDifficulty::load(OsuBeatmap *beatmap, std::vector<OsuHitObject*>

timingpoints.push_back(t);
}
else if (sscanf(curLineChar, "%lf,%f", &tpOffset, &tpMSPerBeat) == 2)
{
TIMINGPOINT t;
t.offset = (long)std::round(tpOffset);
t.msPerBeat = tpMSPerBeat;

t.sampleType = 0;
t.sampleSet = 0;
t.volume = 100;

timingpoints.push_back(t);
}
break;

case 4: // HitObjects
Expand Down Expand Up @@ -395,14 +428,18 @@ bool OsuBeatmapDifficulty::load(OsuBeatmap *beatmap, std::vector<OsuHitObject*>
std::vector<UString> tokens = curLineString.split(",");
if (tokens.size() < 8)
{
engine->showMessageError("Error", UString::format("Invalid slider in beatmap: %s\n\ncurLine = %s", m_sFilePath.toUtf8(), curLine));
return false;
debugLog("Invalid slider in beatmap: %s\n\ncurLine = %s\n", m_sFilePath.toUtf8(), curLineChar);
continue;
//engine->showMessageError("Error", UString::format("Invalid slider in beatmap: %s\n\ncurLine = %s", m_sFilePath.toUtf8(), curLine));
//return false;
}
std::vector<UString> sliderTokens = tokens[5].split("|");
if (sliderTokens.size() == 0)
if (sliderTokens.size() < 2)
{
engine->showMessageError("Error", UString::format("Invalid slider tokens: %s\n\nIn beatmap: %s", curLine, m_sFilePath.toUtf8()));
return false;
debugLog("Invalid slider tokens: %s\n\nIn beatmap: %s\n", curLineChar, m_sFilePath.toUtf8());
continue;
//engine->showMessageError("Error", UString::format("Invalid slider tokens: %s\n\nIn beatmap: %s", curLineChar, m_sFilePath.toUtf8()));
//return false;
}

std::vector<Vector2> points;
Expand Down
74 changes: 55 additions & 19 deletions src/App/Osu/OsuCircle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "OsuSkin.h"
#include "OsuGameRules.h"

ConVar osu_color_saturation("osu_color_saturation", 0.75f);
ConVar osu_circle_color_saturation("osu_circle_color_saturation", 0.75f);
ConVar osu_circle_rainbow("osu_circle_rainbow", false);

ConVar osu_draw_numbers("osu_draw_numbers", true);
Expand All @@ -40,7 +40,7 @@ void OsuCircle::drawCircle(Graphics *g, OsuSkin *skin, Vector2 pos, float hitcir
rainbowColorCounter = colorCounter;

Color comboColor = skin->getComboColorForCounter(colorCounter);
comboColor = COLOR(255, (int)(COLOR_GET_Ri(comboColor)*osu_color_saturation.getFloat()), (int)(COLOR_GET_Gi(comboColor)*osu_color_saturation.getFloat()), (int)(COLOR_GET_Bi(comboColor)*osu_color_saturation.getFloat()));
comboColor = COLOR(255, (int)(COLOR_GET_Ri(comboColor)*osu_circle_color_saturation.getFloat()), (int)(COLOR_GET_Gi(comboColor)*osu_circle_color_saturation.getFloat()), (int)(COLOR_GET_Bi(comboColor)*osu_circle_color_saturation.getFloat()));

// approach circle
drawApproachCircle(g, skin, pos, comboColor, hitcircleDiameter, approachScale, alpha, modHD, overrideHDApproachCircle);
Expand All @@ -53,57 +53,93 @@ void OsuCircle::drawCircle(Graphics *g, OsuSkin *skin, Vector2 pos, float hitcir
// overlay
const float circleOverlayImageScale = hitcircleDiameter / (128.0f * (skin->isHitCircleOverlay2x() ? 2.0f : 1.0f));
if (!skin->getHitCircleOverlayAboveNumber())
drawHitCircleOverlay(g, skin, pos, circleOverlayImageScale, alpha);
drawHitCircleOverlay(g, skin->getHitCircleOverlay(), pos, circleOverlayImageScale, alpha);

// number
if (drawNumber)
drawHitCircleNumber(g, skin, numberScale, overlapScale, pos, number, numberAlpha);

// overlay
if (skin->getHitCircleOverlayAboveNumber())
drawHitCircleOverlay(g, skin, pos, circleOverlayImageScale, alpha);
drawHitCircleOverlay(g, skin->getHitCircleOverlay(), pos, circleOverlayImageScale, alpha);
}

void OsuCircle::drawCircle(Graphics *g, OsuSkin *skin, Vector2 pos, float hitcircleDiameter, Color color, float alpha)
{
// this function is only used by the target practice heatmap

// circle
const float circleImageScale = hitcircleDiameter / (128.0f * (skin->isHitCircle2x() ? 2.0f : 1.0f));
drawHitCircle(g, skin->getHitCircle(), pos, color, circleImageScale, alpha);

// overlay
const float circleOverlayImageScale = hitcircleDiameter / (128.0f * (skin->isHitCircleOverlay2x() ? 2.0f : 1.0f));
if (!skin->getHitCircleOverlayAboveNumber())
drawHitCircleOverlay(g, skin, pos, circleOverlayImageScale, alpha);

// overlay
if (skin->getHitCircleOverlayAboveNumber())
drawHitCircleOverlay(g, skin, pos, circleOverlayImageScale, alpha);
drawHitCircleOverlay(g, skin->getHitCircleOverlay(), pos, circleOverlayImageScale, alpha);
}

void OsuCircle::drawSliderCircle(Graphics *g, OsuBeatmap *beatmap, Image *hitCircleImage, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber, bool overrideHDApproachCircle)
void OsuCircle::drawSliderStartCircle(Graphics *g, OsuBeatmap *beatmap, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber, bool overrideHDApproachCircle)
{
if (alpha <= 0.0f)
return;

OsuSkin *skin = beatmap->getSkin();

rainbowNumber = number;
rainbowColorCounter = colorCounter;

const Vector2 pos = beatmap->osuCoords2Pixels(rawPos);

OsuSkin *skin = beatmap->getSkin();

Color comboColor = 0xffffffff;
const Color comboColor = skin->getComboColorForCounter(colorCounter);

// approach circle
drawApproachCircle(g, skin, pos, comboColor, beatmap->getHitcircleDiameter(), approachScale, alpha, beatmap->getOsu()->getModHD(), overrideHDApproachCircle);

// circle
const float circleImageScale = beatmap->getHitcircleDiameter() / (128.0f * (skin->isHitCircle2x() ? 2.0f : 1.0f));
drawHitCircle(g, hitCircleImage, pos, comboColor, circleImageScale, alpha);
const float circleImageScale = beatmap->getHitcircleDiameter() / (128.0f * (skin->isSliderStartCircle2x() ? 2.0f : 1.0f));
drawHitCircle(g, skin->getSliderStartCircle(), pos, comboColor, circleImageScale, alpha);

// overlay
const float circleOverlayImageScale = beatmap->getHitcircleDiameter() / (128.0f * (skin->isSliderStartCircleOverlay2x() ? 2.0f : 1.0f));
if (skin->getSliderStartCircleOverlay() != skin->getMissingTexture())
{
if (!skin->getHitCircleOverlayAboveNumber())
drawHitCircleOverlay(g, skin->getSliderStartCircleOverlay(), pos, circleOverlayImageScale, alpha);
}

// number
if (drawNumber)
drawHitCircleNumber(g, skin, beatmap->getNumberScale(), beatmap->getHitcircleOverlapScale(), pos, number, numberAlpha);

// overlay
if (skin->getSliderStartCircleOverlay() != skin->getMissingTexture())
{
if (skin->getHitCircleOverlayAboveNumber())
drawHitCircleOverlay(g, skin->getSliderStartCircleOverlay(), pos, circleOverlayImageScale, alpha);
}
}

void OsuCircle::drawSliderEndCircle(Graphics *g, OsuBeatmap *beatmap, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber, bool overrideHDApproachCircle)
{
if (alpha <= 0.0f)
return;

OsuSkin *skin = beatmap->getSkin();

rainbowNumber = number;
rainbowColorCounter = colorCounter;

const Vector2 pos = beatmap->osuCoords2Pixels(rawPos);
const Color comboColor = skin->getComboColorForCounter(colorCounter);

// circle
const float circleImageScale = beatmap->getHitcircleDiameter() / (128.0f * (skin->isSliderEndCircle2x() ? 2.0f : 1.0f));
drawHitCircle(g, skin->getSliderEndCircle(), pos, comboColor, circleImageScale, alpha);

// overlay
if (skin->getSliderEndCircleOverlay() != skin->getMissingTexture())
{
const float circleOverlayImageScale = beatmap->getHitcircleDiameter() / (128.0f * (skin->isSliderEndCircleOverlay2x() ? 2.0f : 1.0f));
drawHitCircleOverlay(g, skin->getSliderEndCircleOverlay(), pos, circleOverlayImageScale, alpha);
}
}

void OsuCircle::drawApproachCircle(Graphics *g, OsuSkin *skin, Vector2 pos, Color comboColor, float hitcircleDiameter, float approachScale, float alpha, bool modHD, bool overrideHDApproachCircle)
Expand Down Expand Up @@ -138,14 +174,14 @@ void OsuCircle::drawApproachCircle(Graphics *g, OsuSkin *skin, Vector2 pos, Colo
}
}

void OsuCircle::drawHitCircleOverlay(Graphics *g, OsuSkin *skin, Vector2 pos, float circleOverlayImageScale, float alpha)
void OsuCircle::drawHitCircleOverlay(Graphics *g, Image *hitCircleOverlayImage, Vector2 pos, float circleOverlayImageScale, float alpha)
{
g->setColor(0xffffffff);
g->setAlpha(alpha);
g->pushTransform();
g->scale(circleOverlayImageScale, circleOverlayImageScale);
g->translate(pos.x, pos.y);
g->drawImage(skin->getHitCircleOverlay());
g->drawImage(hitCircleOverlayImage);
g->popTransform();
}

Expand Down
5 changes: 3 additions & 2 deletions src/App/Osu/OsuCircle.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ class OsuCircle : public OsuHitObject
static void drawCircle(Graphics *g, OsuBeatmap *beatmap, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber = true, bool overrideHDApproachCircle = false);
static void drawCircle(Graphics *g, OsuSkin *skin, Vector2 pos, float hitcircleDiameter, float numberScale, float overlapScale, bool modHD, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber = true, bool overrideHDApproachCircle = false);
static void drawCircle(Graphics *g, OsuSkin *skin, Vector2 pos, float hitcircleDiameter, Color color, float alpha = 1.0f);
static void drawSliderCircle(Graphics *g, OsuBeatmap *beatmap, Image *hitCircleImage, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber = true, bool overrideHDApproachCircle = false);
static void drawSliderStartCircle(Graphics *g, OsuBeatmap *beatmap, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber = true, bool overrideHDApproachCircle = false);
static void drawSliderEndCircle(Graphics *g, OsuBeatmap *beatmap, Vector2 rawPos, int number, int colorCounter, float approachScale, float alpha, float numberAlpha, bool drawNumber = true, bool overrideHDApproachCircle = false);

// split helper functions
static void drawApproachCircle(Graphics *g, OsuSkin *skin, Vector2 pos, Color comboColor, float hitcircleDiameter, float approachScale, float alpha, bool modHD, bool overrideHDApproachCircle);
static void drawHitCircleOverlay(Graphics *g, OsuSkin *skin, Vector2 pos, float circleOverlayImageScale, float alpha);
static void drawHitCircleOverlay(Graphics *g, Image *hitCircleOverlayImage, Vector2 pos, float circleOverlayImageScale, float alpha);
static void drawHitCircle(Graphics *g, Image *hitCircleImage, Vector2 pos, Color comboColor, float circleImageScale, float alpha);
static void drawHitCircleNumber(Graphics *g, OsuBeatmap *beatmap, Vector2 pos, int number, float numberAlpha);
static void drawHitCircleNumber(Graphics *g, OsuSkin *skin, float numberScale, float overlapScale, Vector2 pos, int number, float numberAlpha);
Expand Down
20 changes: 12 additions & 8 deletions src/App/Osu/OsuHUD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ ConVar osu_cursor_trail_spacing("osu_cursor_trail_spacing", 0.015f);
ConVar osu_cursor_trail_alpha("osu_cursor_trail_alpha", 1.0f);

ConVar osu_hud_scale("osu_hud_scale", 1.0f);
ConVar osu_hud_hiterrorbar_scale("osu_hud_hiterrorbar_scale", 1.0f);
ConVar osu_hud_combo_scale("osu_hud_combo_scale", 1.0f);
ConVar osu_hud_accuracy_scale("osu_hud_accuracy_scale", 1.0f);
ConVar osu_hud_progressbar_scale("osu_hud_progressbar_scale", 1.0f);
ConVar osu_hud_playfield_border_size("osu_hud_playfield_border_size", 5.0f);

ConVar osu_draw_cursor_trail("osu_draw_cursor_trail", true);
Expand Down Expand Up @@ -511,7 +515,7 @@ void OsuHUD::drawCombo(Graphics *g, int combo)

// draw back (anim)
float animScaleMultiplier = 1.0f + m_fComboAnim2*osu_combo_anim2_size.getFloat();
float scale = osu_hud_scale.getFloat() * m_osu->getImageScale(m_osu->getSkin()->getScore0(), 32)*animScaleMultiplier;
float scale = m_osu->getImageScale(m_osu->getSkin()->getScore0(), 32)*animScaleMultiplier * osu_hud_scale.getFloat() * osu_hud_combo_scale.getFloat();
if (m_fComboAnim2 > 0.01f)
{
g->setAlpha(m_fComboAnim2*0.65f);
Expand All @@ -530,7 +534,7 @@ void OsuHUD::drawCombo(Graphics *g, int combo)
g->setAlpha(1.0f);
const float animPercent = (m_fComboAnim1 < 1.0f ? m_fComboAnim1 : 2.0f - m_fComboAnim1);
animScaleMultiplier = 1.0f + (0.5f*animPercent*animPercent)*osu_combo_anim1_size.getFloat();
scale = osu_hud_scale.getFloat() * m_osu->getImageScale(m_osu->getSkin()->getScore0(), 32) * animScaleMultiplier;
scale = m_osu->getImageScale(m_osu->getSkin()->getScore0(), 32) * animScaleMultiplier * osu_hud_scale.getFloat() * osu_hud_combo_scale.getFloat();
g->pushTransform();
g->scale(scale, scale);
g->translate(offset, Osu::getScreenHeight() - m_osu->getSkin()->getScore0()->getHeight()*scale/2.0f);
Expand All @@ -556,7 +560,7 @@ void OsuHUD::drawAccuracy(Graphics *g, float accuracy)
// draw it
const int spacingOffset = 2;
const int offset = 5;
const float scale = osu_hud_scale.getFloat() * m_osu->getImageScale(m_osu->getSkin()->getScore0(), 13);
const float scale = m_osu->getImageScale(m_osu->getSkin()->getScore0(), 13) * osu_hud_scale.getFloat() * osu_hud_accuracy_scale.getFloat();
g->pushTransform();

// note that "spacingOffset*numDigits" would actually be used with (numDigits-1), but because we add a spacingOffset after the score dot we also have to add it here
Expand Down Expand Up @@ -667,8 +671,8 @@ void OsuHUD::drawHitErrorBar(Graphics *g, float hitWindow300, float hitWindow100
const Color color100 = COLOR(255, 0, 255-brightnessSub, 0);
const Color color50 = COLOR(255, 255-brightnessSub, 165-brightnessSub, 0);

const Vector2 size = Vector2(Osu::getScreenWidth()*0.15f, Osu::getScreenHeight()*0.007f);
const Vector2 center = Vector2(Osu::getScreenWidth()/2.0f, Osu::getScreenHeight()*0.985f);
const Vector2 size = Vector2(Osu::getScreenWidth()*0.15f, Osu::getScreenHeight()*0.007f)*osu_hud_scale.getFloat()*osu_hud_hiterrorbar_scale.getFloat();
const Vector2 center = Vector2(Osu::getScreenWidth()/2.0f, Osu::getScreenHeight() - Osu::getScreenHeight()*0.015*osu_hud_scale.getFloat()*osu_hud_hiterrorbar_scale.getFloat());

const float entryHeight = size.y*3.4f;
const float entryWidth = size.y*0.6f;
Expand Down Expand Up @@ -723,14 +727,14 @@ void OsuHUD::drawProgressBar(Graphics *g, float percent, bool waiting)
{
const float num_segments = 15*8;
const int offset = 20;
const float radius = osu_hud_scale.getFloat() * m_osu->getUIScale(10.5f);
const float radius = m_osu->getUIScale(10.5f) * osu_hud_scale.getFloat() * osu_hud_progressbar_scale.getFloat();
const float circularMetreScale = ((2*radius)/m_osu->getSkin()->getCircularmetre()->getWidth()) * 1.3f; // HACKHACK: the skin image is NOT border to border; hardcoded 1.3 multiplier
const float actualCircularMetreScale = ((2*radius)/m_osu->getSkin()->getCircularmetre()->getWidth());
Vector2 center = Vector2(m_fAccuracyXOffset - radius - offset, m_fAccuracyYOffset);

// clamp to top edge of screen
if (center.y - (m_osu->getSkin()->getCircularmetre()->getHeight()*actualCircularMetreScale)/2.0f < 0)
center.y += std::abs(center.y - (m_osu->getSkin()->getCircularmetre()->getHeight()*actualCircularMetreScale)/2.0f);
if (center.y - (m_osu->getSkin()->getCircularmetre()->getHeight()*actualCircularMetreScale + 5)/2.0f < 0)
center.y += std::abs(center.y - (m_osu->getSkin()->getCircularmetre()->getHeight()*actualCircularMetreScale + 5)/2.0f);

const float theta = 2 * PI / float(num_segments);
const float s = sinf(theta); // precalculate the sine and cosine
Expand Down
Loading

0 comments on commit 11396fa

Please sign in to comment.