1. osu! forums
  2. osu!
  3. Feature Requests
This is a feature request. Feature requests can be voted up by supporters.
Current Priority: +36
posted
I felt that this would be a fun little low priority thing.

It works in different ways depending on mode:
[osu!]
Upon hitting the last note, the following can happen:
FC with 100s: GREAT FULL COMBO flashes in green, with a sound effect.
FC with only 300s: PERFECT FULL COMBO flashes in a gold sparkle, with a greater sound effect.
[osu!mania]
FC with 100s or 200s: GREAT FULL COMBO appears on playfield in green, with a sound effect.
FCs with only 300s: PERFECT FULL COMBO appears on playfield, this time in yellow. Same SFX.|
FCs with only Perfects: FANTASTIC FULL COMBO appears on playfield, in a shining light blue. Greater SFX.
[CTB]
FC with 100s: Fruit falls down onto screen, very huge, explodes with more fruits, with the words GREAT FULL COMBO APPEARING, styled with various fruits.
FC with only 300s: Same as above, but instead says PERFECT FULL COMBO.
[Taiko]
FC: Pippi-don constantly does the clear effect, with FULL COMBO appearing on the playfield across it. Extra effects can be skinned/storyboarded.

All of this could be storyboarded/skinned, and I just thought it'd be a fun little thing to add in.

For a example of what I mean, skip to 2:08 of this:


Taiko example (skip 2:14)


I apologize for the frequent Feature Requests, I just get a lot of ideas in my head sometimes :?
posted
Keep to one request per topic please
posted
First of all:

Guidelines:

  1. Make a thorough effort to search for related requests (using the search feature). If a similar request already exists, bump or post the thread with amendments to it. Also, check the changelog to see if a request is already in the test release.
  2. Don't request anything that has already been rejected unless you have a really good reason as to why it shouldn't have been rejected.
  3. Use a relevant and descriptive title (not "my request" or "plz add this").
  4. Keep to one request per topic.
  5. Include a reason for adding your request.
  6. You should wait at least 24 hours to shoot stars to a request. You will not get your stars back if we have to merge/duplicate your topic.
  7. Don't request ports. We don't need people to tell us we need ports, we need people to make them. Contact peppy if you're willing to make a port.
  8. Don't request a toggle for disabling [insert new feature here] unless you want peppy to come to your house with a baseball bat.
  9. Do NOT request beatmaps here. Make them yourself or ask someone privately.

Now regarding your requests:

1. Lyrics:
t/107830 t/150268

2.Full Combo FX:
Just skin it?

EDIT: Wait a sec... are you talking about the sound effect at the result screen, or Geki/Katu?

EDIT2: Are you asking for something like this (effect at 2:08)? (Thanks MillhioreF for the video)
posted
Yes, something like that @EDIT2
posted
Hmm...

In that case could you please edit the Title and OP a bit? Get rid of request #1 since it's a duplicate, just focus on this "last note effect" thingy.

You might wanna include that video in the OP (or find better ones), it helps a lot.
posted

Oinari-sama wrote:

Hmm...

In that case could you please edit the Title and OP a bit? Get rid of request #1 since it's a duplicate, just focus on this "last note effect" thingy.

You might wanna include that video in the OP (or find better ones), it helps a lot.
Got it in the OP.
posted
Reworked the title a bit for you ;)

For all who're reading this, please avoid using keywords of 2 letters or less in the Title/Description. The forum search function automatically omits keywords of 2 letters or less. The Google Search box is immune to this, but it isn't easy to limit the search result within a certain forum.
posted
i guess what you really mean is...

osu! Standard
300 only (100% Acc) : ALL PERFECT! (ok, i've played maimai too much)
300-100 (combo = max combo) : Nice Full Combo!
300-100-50 (no Slidertick misses and no Combobreaks) : Full Combo!
Taiko
All 300s + no drumroll tick miss + no denden miss: Perfect performance!
All 300s + no denden miss: Awesome performance!
300-100s + no denden miss: Great performance!
300-100s: Nice performance!

the reason i put no drumroll above no denden is because drumroll gives variety of score, and were allowed to miss
while the denden itself, it might reduce the spirit bar if not completed within the given time.
CatchTheBeat
No droplets miss : All caught! (non slider tick droplets)
No combo breaks : Nice full combo!
osu!mania
All MAX: Maximum score!!!
All 300 or above: All Perfect Combo!!
All 200 or above: Great Full Combo!
(the reason i don't support 100 or 50, because its treated as "combo breaker" and considered as "Bad" from the mania old dev itself

yeah i total support this
posted
I think the best way to make this work would be to add a skinnable+animatable effect for each rank. With a sound effect also ofcourse.

Like how at the moment your rank just fades in and falls to right side of the ranking page. You could instead see the ranks been written, or then just do exactly as OP said, and have a text appear with the sound effect saying exactly what it says on the text.
posted
S/he mean by effect like rhythm game in cytus and deemo
At the end of the game....
posted
This should be great with a decent amount of pain.
posted
This would be a nice aesthetic feature in my opinion. Obviously not a priority in any way, but if this was eventually implemented, it would definitely be satisfying to see that pop up at the end of a difficult map :P
posted
If it helps, I have taken this from the pump it up pro 2

Min 1.25











local c;
local pn = Var "Player";
local ShowComboAt = THEME:GetMetric("Combo", "ShowComboAt");
local ShowMissComboAt = THEME:GetMetric("Combo", "ShowMissComboAt");
local Pulse = THEME:GetMetric("Combo", "PulseCommand");
local RestZoom = 0.75;

local Number;
local ComboLabel;
local function PositionCombo(self)
-- We're the NumberFrame. Position the combo above or below the judgement
-- based on whether reverse is active. Don't flip the combo label to the
-- top.
local player = self:GetParent():GetParent();

if player:GetReverse() then
Number:y(0-52);
ComboLabel:y(23-52);
else
Number:y(0+60);
ComboLabel:y(23+60);
end
end

local t = Def.ActorFrame {
Def.ActorFrame {
GameplayClearedCommand=function(self)
local player = self:GetParent():GetParent();
if player:GetReverse() then
-- This still puts the full combo text below the
-- judgement in reverse, not above the combo, to
-- make sure it's still visible in eg. Centered + Reverse.
-- The spacing used is optimized for plain Reverse,
-- and is presentable but not ideal when combined with
-- other scroll mods.
self:y(-22);
else
self:y(22);
end
local tns = PlayerHasAFullCombo(pn);
if tns then
local c1;
local params = {};
if tns == "TapNoteScore_W1" then
params.c1 = color("#FFFFFFFF");
params.speed = 2;
elseif tns == "TapNoteScore_W2" then
params.c1 = color("#1a7fe755");
params.speed = 1.5;
elseif tns == "TapNoteScore_W3" then
params.c1 = color("#5bfe5955");
params.speed = 1;
else
params.c1 = color("#ffff4e55");
params.speed = 1;
end
self:playcommand("SetUpGlow", params);

-- Tricky: If one player has a full combo, then we play a single explosion
-- sound on that player's side (playforplayer,pn). However, if both players
-- have a full combo, we don't want to do this twice, once for each player's
-- side. If we do that, the two sounds won't start at exactly the same time
-- and sound ugly; it'll also drop stereo. Instead, if both players have a
-- full combo, then play the sound once on both speakers with a regular play().
local Explosion = self:GetChild("Explosion");
if EveryHumanPlayerHasAFullCombo() then
if pn == GAMESTATE:GetMasterPlayerNumber() then
Trace("Playing global full combo explosion");
Explosion:play();
end
else
Trace("Playing player " .. pn .. " full combo explosion");
Explosion:playforplayer(pn);
end
self:playcommand("DoExplosion");
end;
end;
LoadActor( "explosion" ) .. {
Name="Explosion";
SupportPan=true;
};
LoadActor( "full combo wave" ) .. {
InitCommand=cmd(diffusealpha,0;zoomy,1.1;);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;fadetop,0.1;diffusealpha,1;croptop,0.5;cropbottom,0.5;linear,2;diffusealpha,.7;croptop,0;linear,.1;fadebottom,0.1;linear,1.2;cropbottom,1;diffusealpha,0.3;);
};
LoadActor( "full combo wave" ) .. {
InitCommand=cmd(diffusealpha,0;zoomy,1.1;);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;fadebottom,0.1;diffusealpha,1;croptop,0.5;cropbottom,0.5;linear,2;diffusealpha,.7;cropbottom,0;linear,.1;fadetop,0.1;linear,1.2;croptop,1;diffusealpha,0.3;);
};
LoadActor( "full combo inner wave" ) .. {
InitCommand=cmd(diffusealpha,0;zoomy,1.1;);
DoExplosionCommand=cmd(stoptweening;fadetop,0.1;diffusealpha,1;croptop,0.5;cropbottom,0.5;linear,2;diffusealpha,.7;croptop,0;linear,.1;fadebottom,0.1;linear,1.2;cropbottom,1;diffusealpha,0.3;);
};
LoadActor( "full combo inner wave" ) .. {
InitCommand=cmd(diffusealpha,0;zoomy,1.1;);
DoExplosionCommand=cmd(stoptweening;fadebottom,0.1;diffusealpha,1;croptop,0.5;cropbottom,0.5;linear,2;diffusealpha,.7;cropbottom,0;linear,.1;fadetop,0.1;linear,1.2;croptop,1;diffusealpha,0.3;);
};
LoadActor( "full combo edge" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";zoomy,0.5;
fadeleft,0.1;faderight,0.1);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;accelerate,.1;diffusealpha,1;y,-28;linear,2.0;addy,-564);
};
LoadActor( "full combo edge" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";zoomy,0.5;
fadeleft,0.1;faderight,0.1);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;accelerate,.1;diffusealpha,1;y,28;linear,2.0;addy,564);
};
Def.ActorFrame {
InitCommand=cmd(y,80;);
LoadActor( "full combo beam" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";fadeleft,0.25;faderight,0.25;zoomx,1.5;customtexturerect,0,0,2,1;texcoordvelocity,1,0;);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); self:texcoordvelocity(1*params.speed,0); end;
DoExplosionCommand=cmd(stoptweening;diffusealpha,0;linear,0.5;diffusealpha,0.5;);
};
LoadActor( "full combo beam" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";fadeleft,0.25;faderight,0.25;zoomx,-1.5;customtexturerect,0.5,0,2.5,1;texcoordvelocity,-0.9,0;);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); self:texcoordvelocity(-0.9*params.speed,0); end;
DoExplosionCommand=cmd(stoptweening;diffusealpha,0;linear,0.5;diffusealpha,0.5;);
};
LoadActor( "full combo beam" ) .. {
InitCommand=cmd(zoomy,-1;diffusealpha,0;blend,"BlendMode_Add";fadeleft,0.25;faderight,0.25;zoomx,1.5;customtexturerect,0,0,2.5,1;texcoordvelocity,-0.2,0;);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); self:texcoordvelocity(-0.2*params.speed,0); end;
DoExplosionCommand=cmd(stoptweening;diffusealpha,0;linear,0.5;diffusealpha,0.5;);
};
LoadActor( "full combo text" ) .. {
InitCommand=cmd(diffusealpha,0;);
DoExplosionCommand=cmd(stoptweening;diffusealpha,0;zoom,2;linear,0.5;zoom,1;diffusealpha,1;);
};
LoadActor( "full combo glow" ) .. {
InitCommand=cmd(diffusealpha,0;);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); self:diffusealpha(0); end;
DoExplosionCommand=cmd(stoptweening;blend,"BlendMode_Add";sleep,1;linear,0.5;diffusealpha,1;linear,0.5;diffusealpha,0.3;);
};
LoadActor( "full combo text" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;x,0;y,0;diffusealpha,0;sleep,0.5;diffusealpha,1;linear,0.5;addx,-100;addy,-50;diffusealpha,0;);
};
LoadActor( "full combo text" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;x,0;y,0;diffusealpha,0;sleep,0.5;diffusealpha,1;linear,0.5;addx,100;addy,-50;diffusealpha,0;);
};
LoadActor( "full combo text" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;x,0;y,0;diffusealpha,0;sleep,0.5;diffusealpha,1;linear,0.5;addx,-100;addy,50;diffusealpha,0;);
};
LoadActor( "full combo text" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
SetUpGlowCommand=function(self,params) self:diffuse(params.c1); end;
DoExplosionCommand=cmd(stoptweening;x,0;y,0;diffusealpha,0;sleep,0.5;diffusealpha,1;linear,0.5;addx,100;addy,50;diffusealpha,0;);
};
};
};
Def.ActorFrame {
MilestoneSmallCommand=cmd(stoptweening;y,self:GetParent():GetChild("NumberFrame"):GetChild("Number"):GetY()*RestZoom;);
LoadActor( "large milestone flash" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
MilestoneLargeCommand=cmd(stoptweening;diffusealpha,0.7;x,0;linear,1.5;addx,-200;diffusealpha,0;);
};
LoadActor( "large milestone flash" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";zoomx,-1;);
MilestoneLargeCommand=cmd(stoptweening;diffusealpha,0.7;x,0;linear,1.5;addx,200;diffusealpha,0;);
};
};
Def.ActorFrame {
Name="NumberFrame";
InitCommand=cmd(SetUpdateFunction,PositionCombo);
LoadFont( "Combo", "numbers" ) .. {
Name="Number";
InitCommand=cmd(shadowlength,0;y,-2+32+6;visible,false);
};
LoadActor( THEME:GetPathG("","_combo label") ) .. {
Name="ComboLabel";
InitCommand=cmd(visible,false);
};
};
Def.ActorFrame {
MilestoneSmallCommand=cmd(stoptweening;y,self:GetParent():GetChild("NumberFrame"):GetChild("Number"):GetY()*RestZoom;);
LoadActor( "small milestone flash" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
MilestoneSmallCommand=cmd(stoptweening;rotationz,-45;diffusealpha,0.7;zoom,1.2;linear,0.5;diffusealpha,0;rotationz,0;zoom,0.8;);
MilestoneLargeCommand=cmd(playcommand,"MilestoneSmall";);
};
LoadActor( "small milestone flash" ) .. {
InitCommand=cmd(diffusealpha,0;blend,"BlendMode_Add";);
MilestoneSmallCommand=cmd(stoptweening;rotationz,90;diffusealpha,0.7;zoom,1.2;linear,0.5;diffusealpha,0;rotationz,45;zoom,0.8;);
MilestoneLargeCommand=cmd(playcommand,"MilestoneSmall";);
};
};
};

t.InitCommand = function(self)
c = self:GetChildren();
c.Number = c.NumberFrame:GetChild("Number");
c.Number:visible(false);
c.ComboLabel = c.NumberFrame:GetChild("ComboLabel");
c.ComboLabel:visible(false);

Number = c.Number;
ComboLabel = c.ComboLabel;
end;

t.OnCommand = function(self)
-- Set the frame around the number as the Combo actor, so it's
-- moved by ComboTransformCommand. Don't set the number itself,
-- since we want to set an explicit zoom on it, and ComboTransformCommand
-- will override the whole TweenState.
local player = self:GetParent();
--player:SetActorWithComboPosition( c.NumberFrame );
end;

t.ComboCommand=function(self, param)
local iCombo = param.Misses or param.Combo;
local iShowComboAt = (param.Misses and param.Misses > 0) and ShowMissComboAt or ShowComboAt;

if param.Combo then
c.ComboLabel:diffuse( color("#FFFFFF") );
c.Number:diffuse( color("#FFFFFF") );
else
c.ComboLabel:diffuse( color("#FF2020") );
c.Number:diffuse( color("#FF2020") );
end

c.Number:settext( string.format("%03i", iCombo or 0) );

c.NumberFrame:stoptweening();
local CurrentZoom = c.NumberFrame:GetZoomX();
local DestZoom = 1;
local PercentToRest = scale( CurrentZoom, RestZoom, DestZoom, 1, 0 );
local Time = 0.04;

c.NumberFrame:linear(Time * PercentToRest);
c.NumberFrame:zoom(DestZoom);
c.NumberFrame:linear(Time);
c.NumberFrame:zoom(RestZoom);

-- Do the above even if we're not going to show the combo, so the
-- tweening always matches up with the judgement.
if not iCombo or iCombo < iShowComboAt then
c.Number:visible(false);
c.ComboLabel:visible(false);
else
c.Number:visible(true);
c.ComboLabel:visible(true);
end

if param.FullComboW1 then
c.Number:glowshift();
c.Number:effectcolor1(color("#eafbffAA"));
c.Number:effectcolor2(color("#1a7fe733"));
c.Number:diffusealpha(1);
c.Number:effectclock("bgm");
c.Number:blend("BlendMode_Normal");
elseif param.FullComboW2 then
c.Number:glowshift();
c.Number:effectcolor1(color("#1a7fe755"));
c.Number:effectcolor2(color("#1a7fe700"));
c.Number:diffusealpha(1);
c.Number:effectclock("bgm");
c.Number:blend("BlendMode_Normal");
elseif param.FullComboW3 then
c.Number:glowshift();
c.Number:effectcolor1(color("#5bfe5955"));
c.Number:effectcolor2(color("#5bfe5900"));
c.Number:diffusealpha(1);
c.Number:effectclock("bgm");
c.Number:blend("BlendMode_Normal");
elseif param.FullComboW4 then
c.Number:glowshift();
c.Number:effectcolor1(color("#ffff4e55"));
c.Number:effectcolor2(color("#ffff4e00"));
c.Number:diffusealpha(1);
c.Number:effectclock("bgm");
c.Number:blend("BlendMode_Normal");
else
c.Number:stopeffect();
c.Number:diffusealpha(1);
c.Number:blend("BlendMode_Normal");
end

end;
return t;


i hope this help the dev team to get an idea of how it could be
Please sign in to reply.