public ComboCounter(Player player) { this.player = player; s_hitCombo = new pSpriteText(GetComboString(), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(2, 465), 0.9F, true, Color.TransparentWhite); s_hitCombo.CurrentPosition.Y = 480 - s_hitCombo.MeasureText().Y *0.8f; s_hitCombo.StartPosition.Y = 480 - s_hitCombo.MeasureText().Y *0.8f; s_hitCombo.CurrentScale = 1.28F; s_hitCombo2 = new pSpriteText("0x", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(2, 465), 0.9F, true, Color.TransparentWhite); s_hitCombo2.CurrentPosition.Y = 480 - 8; s_hitCombo2.OriginPosition = new Vector2(0, s_hitCombo2.MeasureText().Y *0.625f + 8); s_hitCombo2.CurrentScale = 1.28F; if (!Player.Relaxing) { player.spriteManager.Add(s_hitCombo); player.spriteManager.Add(s_hitCombo2); } }
internal virtual void LoadScoreText(string scoreText, Vector2 location) { pSprite p; Transformation t; const int timeOffset = 200; Vector2 tMove = new Vector2(40, 0); p = new pSpriteText(scoreText, SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, location, 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(p.Position - tMove, p.Position, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); text = p; }
protected virtual void InitializeSprites() { SkinOsu skin = SkinManager.Current; Vector2 position = new Vector2(2, 472); s_hitCombo = new pSpriteText(comboString, skin.FontCombo, skin.FontComboOverlap, Fields.TopLeft, Origins.Custom, Clocks.Game, position, 0.92f, true, Color.TransparentWhite); s_hitCombo.OriginPosition = new Vector2(0, s_hitCombo.MeasureText().Y * 0.625f + 9); s_hitCombo2 = new pSpriteText("0x", skin.FontCombo, skin.FontComboOverlap, Fields.TopLeft, Origins.Custom, Clocks.Game, position, 0.91f, true, Color.TransparentWhite); s_hitCombo2.OriginPosition = new Vector2(3, s_hitCombo2.MeasureText().Y * 0.625f + 9); s_hitCombo2.Additive = true; s_hitCombo.Scale = s_hitCombo2.Scale = 1.28f; if (canDisplayCombo) { spriteManager.Add(s_hitCombo); spriteManager.Add(s_hitCombo2); } }
internal ScoreDisplay(SpriteManager spriteManager, Vector2 position, bool alignRight, float scale, bool showScore, bool showAccuracy) { this.spriteManager = spriteManager; this.scale = scale; if (GameBase.Tournament) { scale *= 1.4f; } float vpos = position.Y; textMeasure = Vector2.Zero; if (showScore) { s_Score = new pSpriteText(@"00000000", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, alignRight ? Fields.TopRight : Fields.TopLeft, alignRight ? Origins.TopRight : Origins.TopLeft, Clocks.Game, new Vector2(0, 0), 0.95F, true, Color.White); s_Score.TextConstantSpacing = true; textMeasure = s_Score.MeasureText() * 0.625f * scale; s_Score.Position = new Vector2(position.X, vpos); s_Score.Scale = scale; vpos += textMeasure.Y; } if (SkinManager.UseNewLayout) { vpos += 3; } if (showAccuracy) { s_Accuracy = new pSpriteText(@"00.00%", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, alignRight ? Fields.TopRight : Fields.TopLeft, alignRight ? Origins.TopRight : Origins.TopLeft, Clocks.Game, new Vector2(0, 0), 0.95F, true, Color.White); s_Accuracy.Scale = scale * (showScore ? 0.6f : 1); s_Accuracy.TextConstantSpacing = true; s_Accuracy.Position = new Vector2(position.X, vpos); LeftOfDisplay = s_Accuracy.Position + new Vector2(s_Accuracy.MeasureText().X * 0.625f * s_Accuracy.Scale + 24, s_Accuracy.MeasureText().Y * 0.625f * s_Accuracy.Scale / 2); } if (!Player.Relaxing && !Player.Relaxing2) { spriteManager.Add(s_Score); spriteManager.Add(s_Accuracy); } }
internal HitCircle(HitObjectManager hit_object_manager, Vector2 pos, int startTime, bool newCombo, int comboOffset, HitObjectSoundType soundType) : base(hit_object_manager, pos, startTime, soundType, newCombo, comboOffset) { Type = HitObjectType.Circle; Color4 white = Color4.White; SpriteHitCircle1 = new pSprite(TextureManager.Load(OsuTexture.hitcircle0), FieldTypes.GamefieldSprites, OriginTypes.Centre, ClockTypes.Audio, Position, SpriteManager.drawOrderBwd(StartTime), false, white); Sprites.Add(SpriteHitCircle1); //SpriteHitCircle1.TagNumeric = 1; SpriteHitCircle1.TagNumeric = DIMMABLE_TAG; SpriteHitCircleText = new pSpriteText(null, "default", 3, //SkinManager.Current.FontHitCircle, SkinManager.Current.FontHitCircleOverlap, FieldTypes.GamefieldSprites, OriginTypes.Centre, ClockTypes.Audio, Position, SpriteManager.drawOrderBwd(StartTime - 1), false, white); SpriteHitCircleText.TextConstantSpacing = false; SpriteHitCircleText.TagNumeric = DIMMABLE_TAG; SpriteApproachCircle = new ApproachCircle(Position, 1, false, 1, white); SpriteApproachCircle.Clocking = ClockTypes.Audio; Sprites.Add(SpriteApproachCircle); if (ShowCircleText) { Sprites.Add(SpriteHitCircleText); } SpriteApproachCircle.Transform(new TransformationF(TransformationType.Fade, 0, 0.9F, startTime - DifficultyManager.PreEmpt, Math.Min(startTime, startTime - DifficultyManager.PreEmpt + DifficultyManager.FadeIn * 2))); SpriteApproachCircle.Transform(new TransformationF(TransformationType.Scale, 4, 1, startTime - DifficultyManager.PreEmpt, startTime)); SpriteApproachCircle.Transform(new TransformationF(TransformationType.Fade, 0.9f, 0, startTime, startTime + (int)(DifficultyManager.PreEmpt * 0.1f))); Transformation fadeIn = new TransformationF(TransformationType.Fade, 0, 1, startTime - DifficultyManager.PreEmpt, startTime - DifficultyManager.PreEmpt + DifficultyManager.FadeIn); SpriteHitCircle1.Transform(fadeIn); SpriteHitCircleText.Transform(fadeIn); Transformation fadeOut = new TransformationF(TransformationType.Fade, 1, 0, startTime, startTime + DifficultyManager.HitWindow50); SpriteHitCircle1.Transform(fadeOut); SpriteHitCircleText.Transform(fadeOut); }
internal ScoreboardEntry(int rank, string name, PlayModes playMode) { this.rank = rank; this.playMode = playMode; this.name = name ?? @"-"; creationOrder = creationCount++; float depth = 0.92f; SpriteBackground = new pSprite(TextureManager.Load(@"menu-button-background"), Fields.TopLeft, Origins.Custom, Clocks.Game, Vector2.Zero, depth, true, new Color(0, 0, 0, 150)) { Alpha = 0, Scale = 0.62f }; SpriteName = new pText(name, 14, new Vector2(0, -2), Vector2.Zero, depth + 0.000003f, true, new Color(255, 255, 255, 0), true); SpriteScore = new pSpriteText(string.Empty, @"scoreentry", 2.5f, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(2, 18), depth + 0.000003f, true, new Color(255, 255, 255, 0)) { TextConstantSpacing = true }; SpriteCombo = new pSpriteText(string.Empty, @"scoreentry", 2.5f, Fields.TopLeft, Origins.TopRight, Clocks.Game, new Vector2(82, 18), depth + 0.000003f, true, new Color(153, 251, 255, 0)) { TextConstantSpacing = true }; SpriteRank = new pSpriteText(rank > 0 ? rank.ToString() : string.Empty, @"scoreentry", 3, Fields.TopLeft, Origins.TopRight, Clocks.Game, new Vector2(82, -2), depth + 0.000002f, true, new Color(255, 255, 255, 80)) { Scale = 2.2f, Alpha = 0 }; SpriteCollection = new List <pSprite> { SpriteBackground, SpriteName, SpriteScore, SpriteCombo, SpriteRank }; UpdateSpriteLayout(); }
protected override void animateDecrease() { if (HitCombo == 0 && applyEffect) { applyEffect = false; pSpriteText s_fade = new pSpriteText(s_hitCombo.Text, SkinManager.Current.FontCombo, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.Centre, Clocks.Game, Vector2.Zero, 0.915f, true, breakColour); s_fade.Position = s_hitCombo.Position; s_fade.OriginPosition = Vector2.Zero; s_fade.Transformations.Add(new Transformation(TransformationType.Fade, 0.8f, 0, GameBase.Time, GameBase.Time + 200)); s_fade.Transformations.Add(new Transformation(TransformationType.Scale, 1, 4, GameBase.Time, GameBase.Time + 200)); spriteManager.Add(s_fade); } }
internal override void InitializeSprites() { if (GameBase.GameField.CorrectionOffsetActive) { spinnerTopOffset -= 16; } //this is madness, but works. posTopLeftCentre = new Vector2(GameBase.WindowManager.WidthScaled / Math.Max(1, GameBase.WindowManager.WidthWidescreenRatio) / 2f, spinnerTopOffset + 219); Color fade = (GameBase.Mode == OsuModes.Play && (ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.SpunOut) || Player.Relaxing2) ? Color.Gray : Color.White); SpriteCircleTop = new pSprite(TextureManager.Load(@"spinner-circle", SkinSource.Osu | SkinSource.Skin), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderBwd(EndTime), false, fade); SpriteCollection.Add(SpriteCircleTop); if (!ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.Hidden)) { pTexture highRes = TextureManager.Load(@"spinner-approachcircle", SkinSource.Skin); SpriteApproachCircle = new pSprite(TextureManager.Load(@"spinner-approachcircle", SkinSource.Osu | SkinSource.Skin), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderBwd(EndTime - 2), false, fade); SpriteCollection.Add(SpriteApproachCircle); } SpriteBonusCounter = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.Centre, Clocks.Audio, new Vector2(posTopLeftCentre.X, posTopLeftCentre.Y + 80), SpriteManager.drawOrderBwd(EndTime - 3), false, fade); SpriteCollection.Add(SpriteBonusCounter); SpriteCircleTop.Scale *= 0.8f; }
protected override void InitializeSprites() { SkinOsu skin = SkinManager.Current; Vector2 position = new Vector2(2, 240); s_hitCombo = new pSpriteText(comboString, skin.FontCombo, skin.FontComboOverlap, Fields.TopLeft, Origins.Centre, Clocks.Game, position, 0.9f, true, Color.TransparentWhite); s_hitCombo2 = new pSpriteText(string.Empty, skin.FontCombo, skin.FontComboOverlap, Fields.TopLeft, Origins.Centre, Clocks.Game, position, 0.91f, true, Color.TransparentWhite); s_hitCombo2.Additive = true; if (canDisplayCombo) { spriteManager.Add(s_hitCombo); spriteManager.Add(s_hitCombo2); } }
public override void Initialize() { base.Initialize(); s_hitCombo = new pSpriteText("0x", "score", -2, FieldTypes.StandardSnapBottomLeft, OriginTypes.BottomLeft, ClockTypes.Game, new Vector2(2 + GameBase.SuperWidePadding, 6), 0.92F, true, Color4.White); s_hitCombo.Alpha = 0; //s_hitCombo.OriginVector = new Vector2(3, 40); s_hitCombo.ScaleScalar = 1.28F; s_hitCombo_Incoming = new pSpriteText("0x", "score", -2, FieldTypes.StandardSnapBottomLeft, OriginTypes.BottomLeft, ClockTypes.Game, new Vector2(2 + GameBase.SuperWidePadding, 6), 0.91F, true, Color4.White); s_hitCombo_Incoming.Alpha = 0; //s_hitCombo_Incoming.OriginVector = new Vector2(3, 40); s_hitCombo_Incoming.Additive = true; spriteManager.Add(s_hitCombo); spriteManager.Add(s_hitCombo_Incoming); }
public InputOverlayButton(ButtonType type, Vector2 position) { Type = type; SpriteBackground = new pSprite(TextureManager.Load(@"inputoverlay-key"), Fields.TopLeft, Origins.Centre, Clocks.Game, position) { AlwaysDraw = true, Depth = 0.98f }; Sprites.Add(SpriteBackground); //tournament draws stuff so small text is pointless. if (GameBase.Tournament) { return; } if (string.IsNullOrEmpty(description)) { SpriteBackground.InitialColour = Color.LightGray; SpriteBackground.Alpha = 0.5f; } else { SpriteDescription = new pText(description, 12, position, 1, true, SkinManager.Current.Colours[@"InputOverlayText"]) { Origin = Origins.Centre, TextColour = Color.White }; Sprites.Add(SpriteDescription); SpriteCount = new pSpriteText(string.Empty, @"scoreentry", 1, Fields.TopLeft, Origins.Centre, Clocks.Game, position, 1, true, SkinManager.Current.Colours[@"InputOverlayText"]); SpriteCount.Alpha = 0; Sprites.Add(SpriteCount); } }
internal ScoreDisplay(Vector2 position, bool alignRight, float scale, bool showScore, bool showAccuracy) { this.scale = scale; float vpos = position.Y; float hOffset = 40 + GameBase.SuperWidePadding; textMeasure = Vector2.Zero; if (showScore) { s_Score = new pSpriteText("000000", "score", 1, alignRight ? FieldTypes.StandardSnapRight : FieldTypes.Standard, alignRight ? OriginTypes.TopRight : OriginTypes.TopLeft, ClockTypes.Game, new Vector2(hOffset, 0), 0.95F, true, Color4.White); s_Score.TextConstantSpacing = true; s_Score.Position = new Vector2(hOffset, vpos); s_Score.ScaleScalar = scale; textMeasure = s_Score.MeasureText() * 0.625f * scale; vpos += textMeasure.Y + 4; } if (showAccuracy) { s_Accuracy = new pSpriteText("00.00%", "score", 1, alignRight ? FieldTypes.StandardSnapRight : FieldTypes.Standard, alignRight ? OriginTypes.TopRight : OriginTypes.TopLeft, ClockTypes.Game, new Vector2(hOffset, 0), 0.95F, true, Color4.White); s_Accuracy.TextConstantSpacing = true; s_Accuracy.ScaleScalar = scale * (showScore ? 0.7f : 1); s_Accuracy.Position = new Vector2(hOffset - 35, vpos); } spriteManager.Add(s_Score); spriteManager.Add(s_Accuracy); }
internal override void Update(int score) { if (!Player.Relaxing) { int diff = score - CurrentScore; if (diff > 0) { Vector2 startPos = new Vector2(10, s_Score.Position.Y + textMeasure.Y); pSpriteText s = new pSpriteText(diff.ToString(), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, s_Accuracy.Field, Origins.TopRight, Clocks.Game, startPos, 0.95F, false, Color.Red); s.Scale = scale * 0.8f; spriteManager.Add(s); s.FadeInFromZero(60); s.Transformations.Add(new Transformation(startPos + new Vector2(RNG.NextBool(0.5) ? 10 : -10, 0), startPos, GameBase.Time + 0, GameBase.Time + 100, EasingTypes.Out)); s.Transformations.Add(new Transformation(startPos, startPos + new Vector2(0, -30), GameBase.Time + 300, GameBase.Time + 420, EasingTypes.In)); s.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, GameBase.Time + 300, GameBase.Time + 420, EasingTypes.In)); } } base.Update(score); }
internal HitCircle(Vector2 pos, int startTime, bool newCombo, bool addWhistle, bool addFinish) { Position = pos; StartTime = startTime; EndTime = startTime; Type = HitObjectType.Normal; SoundType = HitObjectSoundType.Normal; if (newCombo) { Type |= HitObjectType.NewCombo; } if (addWhistle) { SoundType |= HitObjectSoundType.Whistle; } if (addFinish) { SoundType |= HitObjectSoundType.Finish; } SpriteCollection = new List <pSprite>(); DimCollection = new List <pSprite>(); SpriteApproachCircle = new pSprite(SkinManager.Load("approachcircle"), FieldTypes.Gamefield, OriginTypes.Centre, ClockTypes.Audio, Position, SpriteManager.drawOrderFwdPrio(StartTime - HitObjectManager.PreEmpt), false, beatColour); if (Player.currentScore == null || (!ModManager.CheckActive(Player.currentScore.enabledMods, Mods.Hidden) && !ModManager.CheckActive(Player.currentScore.enabledMods, Mods.Taiko))) { SpriteCollection.Add(SpriteApproachCircle); } SpriteHitCircle1 = new pSprite(SkinManager.Load("hitcircle"), FieldTypes.Gamefield, OriginTypes.Centre, ClockTypes.Audio, Position, SpriteManager.drawOrderBwd(StartTime), false, beatColour); SpriteCollection.Add(SpriteHitCircle1); SpriteHitCircle1.TagNumeric = 1; DimCollection.Add(SpriteHitCircle1); SpriteHitCircle2 = new pSprite(SkinManager.Load("hitcircleoverlay"), FieldTypes.Gamefield, OriginTypes.Centre, ClockTypes.Audio, Position, SpriteManager.drawOrderBwd(StartTime - (SkinManager.Current.OverlayAboveNumber ? 2 : 1)), false, Color.White); SpriteCollection.Add(SpriteHitCircle2); DimCollection.Add(SpriteHitCircle2); SpriteHitCircleText = new pSpriteText(null, SkinManager.Current.FontHitCircle, SkinManager.Current.FontHitCircleOverlap, FieldTypes.Gamefield, OriginTypes.Centre, ClockTypes.Audio, Position, SpriteManager.drawOrderBwd(StartTime - (SkinManager.Current.OverlayAboveNumber ? 1 : 2)), false, Color.White); SpriteHitCircleText.CurrentScale = textSize; /*new pSpriteText( comboNumber.ToString(), FieldTypes.Gamefield, OriginTypes.Centre, * ClockTypes.Audio, Position, SpriteManager.drawOrderBwd(StartTime - 2), false, * Color.White);*/ SpriteCollection.Add(SpriteHitCircleText); DimCollection.Add(SpriteHitCircleText); SpriteSelectionCircle = new pSprite(SkinManager.Load("hitcircleselect"), FieldTypes.Gamefield, OriginTypes.Centre, ClockTypes.Game, Position, SpriteManager.drawOrderBwd(StartTime - 2), true, Color.TransparentWhite); SpriteCollection.Add(SpriteSelectionCircle); SpriteApproachCircle.Transformations.Add( new Transformation(TransformationType.Fade, 0, 0.9F, startTime - HitObjectManager.PreEmpt, Math.Min(startTime, startTime - HitObjectManager.PreEmpt + HitObjectManager.FadeIn * 2))); SpriteApproachCircle.Transformations.Add( new Transformation(TransformationType.Scale, 4, 1, startTime - HitObjectManager.PreEmpt, startTime)); Transformation t; if (Player.currentScore != null && ModManager.CheckActive(Player.currentScore.enabledMods, Mods.Hidden)) { t = new Transformation(TransformationType.Fade, 0, 1, startTime - HitObjectManager.PreEmpt, startTime - (int)(HitObjectManager.PreEmpt * 0.6)); SpriteHitCircle1.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime - HitObjectManager.PreEmpt, startTime - (int)(HitObjectManager.PreEmpt * 0.6)); SpriteHitCircle2.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime - HitObjectManager.PreEmpt, startTime - (int)(HitObjectManager.PreEmpt * 0.6)); SpriteHitCircleText.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 1, 0, startTime - (int)(HitObjectManager.PreEmpt * 0.6), startTime - (int)(HitObjectManager.PreEmpt * 0.3)); SpriteHitCircle1.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 1, 0, startTime - (int)(HitObjectManager.PreEmpt * 0.6), startTime - (int)(HitObjectManager.PreEmpt * 0.3)); SpriteHitCircle2.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 1, 0, startTime - (int)(HitObjectManager.PreEmpt * 0.6), startTime - (int)(HitObjectManager.PreEmpt * 0.3)); SpriteHitCircleText.Transformations.Add(t); } else { t = new Transformation(TransformationType.Fade, 0, 1, startTime - HitObjectManager.PreEmpt, startTime - HitObjectManager.PreEmpt + HitObjectManager.FadeIn); SpriteHitCircle1.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime - HitObjectManager.PreEmpt, startTime - HitObjectManager.PreEmpt + HitObjectManager.FadeIn); SpriteHitCircle2.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime - HitObjectManager.PreEmpt, startTime - HitObjectManager.PreEmpt + HitObjectManager.FadeIn); SpriteHitCircleText.Transformations.Add(t); } if (GameBase.Mode == Modes.Edit) { SpriteApproachCircle.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.ForceFadeOut)); SpriteApproachCircle.Transformations.Add( new Transformation(TransformationType.Scale, 1, 1.1F, startTime, startTime + 100)); SpriteHitCircle1.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.ForceFadeOut)); SpriteHitCircle1.Transformations.Add( new Transformation(Colour, Color.White, startTime - 5, startTime - 5)); SpriteHitCircle2.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.ForceFadeOut)); SpriteHitCircleText.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.ForceFadeOut)); } else if (Player.currentScore == null || !ModManager.CheckActive(Player.currentScore.enabledMods, Mods.Hidden)) { SpriteHitCircle1.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.Hit50)); SpriteHitCircle2.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.Hit50)); SpriteHitCircleText.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.Hit50)); } }
internal Spinner(HitObjectManager hitObjectManager, int startTime, int endTime, HitObjectSoundType soundType) : base(hitObjectManager, Vector2.Zero, startTime, soundType, true, 0) { if (SpinnerCentre == Vector2.Zero) { SpinnerCentre = GameBase.StandardToGamefield(new Vector2(GameBase.BaseSizeFixedWidth.X / 2, GameBase.BaseSizeFixedWidth.Y - (GameBase.BaseSizeFixedWidth.Y / GameBase.BaseSize.Y) * SpinnerCentreFromBottom.Y)); } Position = SpinnerCentre; EndTime = endTime; Type = HitObjectType.Spinner; Colour = Color4.Gray; Color4 white = Color4.White; //Check for a jpg background for beatmap-based skins (used to reduce filesize), then fallback to png. SpriteBackground = new pSprite(TextureManager.Load(OsuTexture.spinner_background), FieldTypes.StandardSnapBottomCentre, OriginTypes.BottomCentre, ClockTypes.Audio, new Vector2(0, 0), SpriteManager.drawOrderFwdLowPrio(2), false, white); Sprites.Add(SpriteBackground); spriteCircle = new pSprite(TextureManager.Load(OsuTexture.spinner_circle), FieldTypes.StandardSnapBottomCentre, OriginTypes.Centre, ClockTypes.Audio, SpinnerCentreFromBottom, SpriteManager.drawOrderFwdLowPrio(3), false, white) { ExactCoordinates = false }; Sprites.Add(spriteCircle); //todo: possible optimisation by changing the draw method for filling of spinner metres. spriteScoreMetreBackground = new pRectangle(Vector2.Zero, new Vector2(GameBase.BaseSizeFixedWidth.X, GameBase.BaseSize.Y), false, SpriteManager.drawOrderFwdLowPrio(0), new Color4(20, 20, 20, 255)) { Clocking = ClockTypes.Audio, Field = FieldTypes.StandardSnapBottomCentre, Origin = OriginTypes.BottomCentre }; Sprites.Add(spriteScoreMetreBackground); spriteScoreMetreForeground = new pRectangle(Vector2.Zero, new Vector2(GameBase.BaseSizeFixedWidth.X, 0), false, SpriteManager.drawOrderFwdLowPrio(1), Color4.OrangeRed) { Clocking = ClockTypes.Audio, Field = FieldTypes.StandardSnapBottomCentre, Origin = OriginTypes.BottomCentre }; Sprites.Add(spriteScoreMetreForeground); ApproachCircle = new ApproachCircle(SpinnerCentreFromBottom, 1, false, SpriteManager.drawOrderFwdLowPrio(5), new Color4(77 / 255f, 139 / 255f, 217 / 255f, 1)); ApproachCircle.Width = 8; ApproachCircle.Clocking = ClockTypes.Audio; ApproachCircle.Field = FieldTypes.StandardSnapBottomCentre; Sprites.Add(ApproachCircle); spriteBonus = new pSpriteText("", "score", -5, // SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.StandardSnapBottomCentre, OriginTypes.Centre, ClockTypes.Audio, SpinnerCentreFromBottom - new Vector2(0, 80), SpriteManager.drawOrderFwdLowPrio(6), false, white); spriteBonus.Additive = true; Sprites.Add(spriteBonus); foreach (pDrawable p in Sprites) { p.Transformations.Clear(); p.Transform(new TransformationF(TransformationType.Fade, 0, 1, StartTime - DifficultyManager.FadeIn, StartTime)); p.Transform(new TransformationF(TransformationType.Fade, 1, 0, EndTime, EndTime + (spriteScoreMetreForeground == p ? DifficultyManager.FadeOut / 4 : DifficultyManager.FadeOut / 2))); } SpriteSpin = new pSprite(TextureManager.Load(OsuTexture.spinner_spin), FieldTypes.StandardSnapBottomCentre, OriginTypes.Centre, ClockTypes.Audio, SpinnerCentreFromBottom, SpriteManager.drawOrderFwdLowPrio(5), false, white); SpriteSpin.Transform(new TransformationF(TransformationType.Fade, 0, 1, StartTime - DifficultyManager.FadeIn / 2, StartTime)); SpriteSpin.Transform(new TransformationF(TransformationType.Fade, 1, 0, EndTime - Math.Min(400, endTime - startTime), EndTime)); Sprites.Add(SpriteSpin); ApproachCircle.Transform(new TransformationF(TransformationType.Scale, GameBase.BaseSizeFixedWidth.Y * 0.47f, 0.1f, StartTime, EndTime)); SpriteClear = new pSprite(TextureManager.Load(OsuTexture.spinner_clear), FieldTypes.StandardSnapBottomCentre, OriginTypes.Centre, ClockTypes.Audio, SpinnerCentreFromBottom + new Vector2(0, 80), SpriteManager.drawOrderFwdLowPrio(6), false, white); SpriteClear.Transform(new TransformationF(TransformationType.Fade, 0, 0, startTime, endTime)); Sprites.Add(SpriteClear); currentRotationCount = 0; rotationRequirement = (int)((float)(EndTime - StartTime) / 1000 * DifficultyManager.SpinnerRotationRatio) * sensitivity_modifier; }
internal void UpdateCalculations(bool force, double multiplier) { if (force || taikoMiddle == null) { //slider endpoint is not hittable when the next hitobject has //a starttime before the slider's endtime. List <HitObject> hitobjects = hitObjectManager.hitObjects; int ind = hitobjects.IndexOf(this); if (ind < hitobjects.Count - 1 && hitobjects[ind + 1].HittableStartTime - (EndTime + (int)MinHitDelay) <= (int)MinHitDelay) { endpointHittable = false; } float scalefactor = !SoundType.IsType(HitObjectSoundType.Finish) ? 0.65f : 1; SpatialLength *= SegmentCount; double v = hitObjectManager.SliderScoringPointDistance * hitObjectManager.Beatmap.DifficultySliderTickRate; double b = hitObjectManager.Beatmap.BeatLengthAt(StartTime); EndTime = StartTime + (int)(SpatialLength / v * b); SpatialLength *= multiplier; taikoMiddle = new pSprite(TextureManager.Load(@"taiko-roll-middle"), Fields.GamefieldWide, Origins.TopLeft, Clocks.Audio, new Vector2(Position.X, Position.Y - hitObjectManager.HitObjectRadius * scalefactor), SpriteManager.drawOrderBwd(EndTime + 10), false, new Color(252, 184, 6)); taikoMiddle.VectorScale = new Vector2((float)SpatialLength * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio * (1 / scalefactor), 1); taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime - hitObjectManager.PreEmpt, StartTime)); taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime, EndTime + hitObjectManager.PreEmptSliderComplete)); spriteManager.Add(taikoMiddle); SpriteCollection.Add(taikoMiddle); DimCollection.Add(taikoMiddle); taikoEnd = new pSprite(TextureManager.Load(@"taiko-roll-end"), Fields.GamefieldWide, Origins.TopLeft, Clocks.Audio, new Vector2(Position.X, Position.Y - hitObjectManager.HitObjectRadius * scalefactor), SpriteManager.drawOrderBwd(EndTime + 8), false, new Color(252, 184, 6)); taikoEnd.OriginPosition = new Vector2( (float)-SpatialLength * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio * (1 / scalefactor), 0); taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime - hitObjectManager.PreEmpt, StartTime)); taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime, EndTime + hitObjectManager.PreEmptSliderComplete)); spriteManager.Add(taikoEnd); SpriteCollection.Add(taikoEnd); DimCollection.Add(taikoEnd); sliderBall.Transformations.Add(new Transformation(sliderStartCircle.Position, sliderStartCircle.Position, StartTime - 500, EndTime)); sliderFollower.Transformations.Add(new Transformation(sliderStartCircle.Position, sliderStartCircle.Position, StartTime, EndTime)); counter = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.GamefieldWide, Origins.Centre, Clocks.Audio, HitObjectManagerTaiko.HIT_LOCATION, 0.9f, false, Color.White); counter.Scale = 0.8f; counter.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime, StartTime)); counter.Transformations.Add(new Transformation(TransformationType.Fade, 0.6f, 0, EndTime, EndTime + 300)); spriteManager.Add(counter); int index = 0; for (double i = StartTime; i < HittableEndTime; i += MinHitDelay) { if (i == StartTime) { hittablePoints.Add(new HitPoint((int)i, null)); index++; continue; } bool major = ((hitObjectManager.Beatmap.DifficultySliderTickRate == 3) || (hitObjectManager.Beatmap.DifficultySliderTickRate == 6) || (hitObjectManager.Beatmap.DifficultySliderTickRate == 1.5d)) ? (index % 3) == 0 : (index % 4) == 0; pSprite scoringDot = new pSprite(TextureManager.Load(@"sliderscorepoint"), Fields.GamefieldWide, Origins.Centre, Clocks.Audio, new Vector2(Position.X, Position.Y), SpriteManager.drawOrderBwd(StartTime + 1), false, major ? Color.Yellow : Color.White, this); if (!major) { scoringDot.Scale *= 0.8f; } scoringDot.OriginPosition.X -= (float)(SpatialLength * (float)(i - StartTime) / Length) * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio / scoringDot.Scale * (1 / scalefactor); scoringDot.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime - hitObjectManager.PreEmpt, StartTime)); scoringDot.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime, EndTime + hitObjectManager.PreEmptSliderComplete)); hittablePoints.Add(new HitPoint((int)i, scoringDot)); spriteManager.Add(scoringDot); SpriteCollection.Add(scoringDot); DimCollection.Add(scoringDot); index++; } if (scalefactor != 1) { foreach (pSprite p in SpriteCollection) { p.Scale *= scalefactor; } } for (int i = 0; i < sliderStartCircle.SpriteCollection.Count; i++) { pSprite s = sliderStartCircle.SpriteCollection[i]; foreach (Transformation t in s.Transformations) { if (t.Type == TransformationType.Fade && t.StartFloat == 1) { t.Time1 = EndTime; t.Time2 = EndTime; } } SpriteCollection.Add(s); DimCollection.Add(s); spriteManager.Add(s); } } }
private void LoadScore(Score score) { foreach (pSprite ps in leftPanel) { ps.FadeOut(100); ps.AlwaysDraw = false; } leftPanel.Clear(); this.score = score; stringTotalScore = String.Format("{0:00000000}", score.totalScore); s_score1 = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(180, 94), 0.8F, true, Color.White); s_score1.CurrentScale = 1.05f; spriteManager.Add(s_score1); leftPanel.Add(s_score1); int textx1 = 80; int imgx1 = 40; int textx2 = 280; int imgx2 = 240; int row1 = 160; int row2 = 220; int row3 = 280; int row4 = 320; int row5 = 380; int textoffset = -25; int timeOffset = 1000; int timeOffset2 = 1300; Vector2 tMove = new Vector2(40, 0); int length = 400; pSprite p = new pSprite(SkinManager.Load("hit300"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx1, row1), 0.9F, true, Color.TransparentWhite); Transformation t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.count300), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1, row1 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("hit100"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx1, row2), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.count100), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1, row2 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("hit50"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx1, row3), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.count50), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1, row3 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("hit300g"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx2, row1), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.countGeki), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2, row1 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("hit100k"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx2, row2), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.countKatu), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2, row2 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("hit0"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx2, row3), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.countMiss), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2, row3 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("ranking-maxcombo"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(imgx1 - 35, row4 - 8), 0.81F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0}x", score.maxCombo), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1 - 65, row4 + 10), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSprite(SkinManager.Load("ranking-accuracy"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(imgx2 - 58, row4 - 8), 0.81F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); p = new pSpriteText(String.Format("{0:0.00}%", score.accuracy * 100), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2 - 86, row4 + 10), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); if (score.ranking < Rankings.F) { p = new pSprite(SkinManager.Load("ranking-" + score.ranking), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(180, 270), 0.3F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1.4f, 1f, startTime + timeOffset, startTime + timeOffset + 1000); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 0.4f, startTime + timeOffset, startTime + timeOffset + 1000); t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); if (score.ranking < Rankings.B) { p = new pSprite(SkinManager.Load("ranking-" + score.ranking), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(180, 270), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1f, 2f, startTime + timeOffset + 1000, startTime + timeOffset + 1400); t.Easing = EasingTypes.In; p.Transformations.Add(t); leftPanel.Add(p); t = new Transformation(TransformationType.Fade, 0.4f, 0, startTime + timeOffset + 1000, startTime + timeOffset + 1400); t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); } } if (score.perfect) { p = new pSprite(SkinManager.Load("ranking-perfect"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(200, 430), 0.99F, true, Color.TransparentWhite, "ranking"); t = new Transformation(TransformationType.Scale, 1.1F, 1, startTime + timeOffset, startTime + timeOffset + 600); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + 600); t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); leftPanel.Add(p); } s_white = new pSprite(GameBase.WhitePixel, FieldTypes.WindowNone, OriginTypes.TopLeft, ClockTypes.Game, Vector2.Zero, 1, false, Color.TransparentWhite); s_white.UseVectorScale = true; s_white.VectorScale = new Vector2(GameBase.WindowWidth, GameBase.WindowHeight); t = new Transformation(TransformationType.Fade, 1, 0, startTime + timeOffset + 1000, startTime + timeOffset + 2400); s_white.Transformations.Add(t); spriteManager.Add(s_white); leftPanel.Add(s_white); }
internal Spinner(int startTime, int endTime, HitObjectSoundType soundType, bool spinnerStuff) { Position = new Vector2(GameBase.GamefieldDefaultWidth / 2, GameBase.GamefieldDefaultHeight / 2); StartTime = startTime; EndTime = endTime; Type = HitObjectType.Spinner | HitObjectType.NewCombo; SoundType = soundType; Colour = Color.Gray; SpriteCollection = new List <pSprite>(); DimCollection = new List <pSprite>(); spriteBackground = new pSprite(SkinManager.Load("spinner-background"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Audio, new Vector2(0, 45), SpriteManager.drawOrderFwd(StartTime - 1), false, Color.White); SpriteCollection.Add(spriteBackground); spriteCircle = new pSprite(SkinManager.Load("spinner-circle"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Audio, new Vector2(320, 264), SpriteManager.drawOrderFwd(StartTime), false, Color.White); SpriteCollection.Add(spriteCircle); spriteScoreMetre = new pSprite(SkinManager.Load("spinner-metre"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Audio, new Vector2(0, 45), SpriteManager.drawOrderFwd(StartTime + 1), false, Color.White); SpriteCollection.Add(spriteScoreMetre); spriteRpmBackground = new pSprite(SkinManager.Load("spinner-rpm"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Audio, new Vector2(233, 445), SpriteManager.drawOrderFwd(StartTime + 3), false, Color.White); spriteRpmText = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopRight, ClockTypes.Audio, new Vector2(400, 448), SpriteManager.drawOrderFwd(StartTime + 4), false, Color.White); spriteRpmText.CurrentScale = 0.9f; if (GameBase.Mode != Modes.Edit && spinnerStuff) { SpriteCollection.Add(spriteRpmText); SpriteCollection.Add(spriteRpmBackground); } SpriteApproachCircle = new pSprite(SkinManager.Load("approachcircle"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Audio, new Vector2(320, 264), SpriteManager.drawOrderFwd(StartTime + 2), false, SkinManager.LoadColour("SpinnerApproachCircle")); if (Player.currentScore == null || !ModManager.CheckActive(Player.currentScore.enabledMods, Mods.Hidden)) { SpriteCollection.Add(SpriteApproachCircle); } spriteBonus = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.Centre, ClockTypes.Audio, new Vector2(320, 344), SpriteManager.drawOrderFwd(StartTime + 3), false, Color.White); SpriteCollection.Add(spriteBonus); UpdateDraw(); if (GameBase.Mode != Modes.Edit && spinnerStuff) { SpriteSpin = new pSprite(SkinManager.Load("spinner-spin"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Audio, new Vector2(320, 380), SpriteManager.drawOrderFwd(StartTime + 2), false, Color.White); SpriteSpin.Transformations.Add( new Transformation(TransformationType.Fade, 0, 1, StartTime - HitObjectManager.FadeIn / 3, StartTime)); SpriteSpin.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, StartTime + Math.Min(1600, endTime - startTime), StartTime + Math.Min(2000, endTime - startTime))); SpriteCollection.Add(SpriteSpin); SpriteClear = new pSprite(SkinManager.Load("spinner-clear"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Audio, new Vector2(320, 160), SpriteManager.drawOrderFwd(StartTime + 2), false, Color.White); SpriteClear.Transformations.Add( new Transformation(TransformationType.Fade, 0, 0, startTime, endTime)); SpriteCollection.Add(SpriteClear); } randomizer = new Random(); }
public override void Initialize() { ReplayMode = InputManager.ReplayMode; if (ReplayMode) { if (InputManager.ReplayStreaming) { score = Player.currentScore; score.playerName = ChatEngine.watchTarget; } else { score = InputManager.ReplayScore; score.replay = null; if (score.rawGraph != null) { score.ReadGraphData(score.rawGraph); } } } else { score = Player.currentScore; score.playerName = ConfigManager.sUsername; rankingDialog = new RankingDialog(this); } InputManager.ReplayMode = false; InputManager.ReplayStreaming = false; InputManager.ReplayStreamingStart = 0; Randomizer = new Random(); startTime = GameBase.Time + 300; KeyboardHandler.OnKeyPressed += GameBase_OnKeyPressed; MouseHandler.OnClick += GameBase_OnClick; spriteManager = new SpriteManager(); Texture2D ss = null; if (SkinManager.Current.RawName == "Default") { try { ss = content.Load <Texture2D>("ranking-background"); } catch { } } pSprite bg = new pSprite(ss ?? SkinManager.Load("playfield"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, Vector2.Zero, 0, true, ss != null ? Color.White : new Color(146, 148, 214)); spriteManager.Add(bg); pSprite p = new pSprite(SkinManager.Load("ranking-title"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(360, 0), 0.8F, true, Color.White); spriteManager.Add(p); p = new pSprite(SkinManager.Load("ranking-graph"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(80, 360), 0.8F, true, Color.White); spriteManager.Add(p); p = new pSprite(SkinManager.Load("ranking-panel"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(0, 46), 0.2F, true, Color.White); spriteManager.Add(p); p.Additive = true; stringTotalScore = String.Format("{0:00000000}", score.totalScore); s_score1 = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(180, 94), 0.8F, true, Color.White); s_score1.CurrentScale = 1.05f; spriteManager.Add(s_score1); int textx1 = 80; int imgx1 = 40; int textx2 = 280; int imgx2 = 240; int row1 = 160; int row2 = 220; int row3 = 280; int row4 = 320; int textoffset = -25; int timeOffset = 1000; int timeOffset2 = 1300; Vector2 tMove = new Vector2(40, 0); int length = 400; p = new pSprite(SkinManager.Load("hit300"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx1, row1), 0.9F, true, Color.TransparentWhite); Transformation t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.count300), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1, row1 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("hit100"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx1, row2), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.count100), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1, row2 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("hit50"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx1, row3), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.count50), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1, row3 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("hit300g"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx2, row1), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.countGeki), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2, row1 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("hit100k"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx2, row2), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.countKatu), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2, row2 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("hit0"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(imgx2, row3), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 0.5F, startTime + timeOffset, startTime + timeOffset + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.countMiss), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2, row3 + textoffset), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("ranking-maxcombo"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(imgx1 - 35, row4 - 8), 0.81F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0}x", score.maxCombo), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx1 - 65, row4 + 10), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("ranking-accuracy"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(imgx2 - 58, row4 - 8), 0.81F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + length); timeOffset += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); p = new pSpriteText(String.Format("{0:0.00}%", score.accuracy * 100), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(textx2 - 86, row4 + 10), 0.8F, true, Color.TransparentWhite); p.CurrentScale = 1.12F; t = new Transformation(p.CurrentPosition - tMove, p.CurrentPosition, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); p = new pSprite(SkinManager.Load("ranking-" + score.ranking), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(530, 170), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 2, 1, startTime + timeOffset, startTime + timeOffset + 1000); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + 1000); t.Easing = EasingTypes.Out; p.Transformations.Add(t); spriteManager.Add(p); if (score.ranking < Rankings.B) { p = new pSprite(SkinManager.Load("ranking-" + score.ranking), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(530, 170), 0.9F, true, Color.TransparentWhite); t = new Transformation(TransformationType.Scale, 1, 2, startTime + timeOffset + 1000, startTime + timeOffset + 1400); t.Easing = EasingTypes.In; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 1, 0, startTime + timeOffset + 1000, startTime + timeOffset + 1400); t.Easing = EasingTypes.In; p.Transformations.Add(t); spriteManager.Add(p); } if (score.perfect) { p = new pSprite(SkinManager.Load("ranking-perfect"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(200, 430), 0.9F, true, Color.TransparentWhite, "ranking"); t = new Transformation(TransformationType.Scale, 1.1F, 1, startTime + timeOffset, startTime + timeOffset + 600); t.Easing = EasingTypes.Out; p.Transformations.Add(t); t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset, startTime + timeOffset + 600); t.Easing = EasingTypes.Out; p.Transformations.Add(t); GameBase.spriteManager.Add(p); } s_white = new pSprite(GameBase.WhitePixel, FieldTypes.WindowNone, OriginTypes.TopLeft, ClockTypes.Game, Vector2.Zero, 1, false, Color.TransparentWhite); s_white.UseVectorScale = true; s_white.VectorScale = new Vector2(GameBase.WindowWidth, GameBase.WindowHeight); t = new Transformation(TransformationType.Fade, 1, 0, startTime + timeOffset + 1000, startTime + timeOffset + 2400); s_white.Transformations.Add(t); GameBase.spriteManager.Add(s_white); pSprite detailsBack = new pSprite(GameBase.WhitePixel, FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(0, 0), 0.7F, true, Color.Black); detailsBack.VectorScale = new Vector2(1024, 83); detailsBack.UseVectorScale = true; spriteManager.Add(detailsBack); pText pt = new pText(BeatmapManager.Current.DisplayTitle, 22, new Vector2(0, 0), Vector2.Zero, 0.79F, true, Color.White, false); spriteManager.Add(pt); pt = new pText("Beatmap by " + BeatmapManager.Current.Creator, 16, new Vector2(1, 20), Vector2.Zero, 0.79F, true, Color.White, false); spriteManager.Add(pt); pt = new pText("Played by " + score.playerName + " on " + score.date.ToString("yy/MM/dd hh:mm:ss", GameBase.nfi), 16, new Vector2(1, 34), Vector2.Zero, 0.79F, true, Color.White, false); spriteManager.Add(pt); if (!ReplayMode) { b_retry = new pSprite(SkinManager.Load("ranking-retry"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(520, 320), 0.94F, true, new Color(255, 255, 255, 178)); b_retry.OnClick += retry_OnClick; b_retry.IsClickable = true; b_retry.HoverEffect = new Transformation(TransformationType.Fade, 0.7F, 1, 0, 200); spriteManager.Add(b_retry); } b_replay = new pSprite(SkinManager.Load("ranking-replay"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(520, 380), 0.94F, true, new Color(255, 255, 255, 178)); b_replay.OnClick += replay_OnClick; b_replay.IsClickable = true; b_replay.HoverEffect = new Transformation(TransformationType.Fade, 0.7F, 1, 0, 200); spriteManager.Add(b_replay); b_back = new pSprite(SkinManager.Load("ranking-back"), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(520, 440), 0.94F, true, new Color(255, 255, 255, 178)); b_back.OnClick += return_OnClick; b_back.IsClickable = true; b_back.HoverEffect = new Transformation(TransformationType.Fade, 0.7F, 1, 0, 200); spriteManager.Add(b_back); int time = 0; float dep = 0; int x = 600; foreach (Mods m in Enum.GetValues(typeof(Mods))) { if (ModManager.CheckActive(score.enabledMods, m)) { Transformation t2 = new Transformation(TransformationType.Scale, 2, 1, GameBase.Time + time, GameBase.Time + time + 400); Transformation t3 = new Transformation(TransformationType.Fade, 0, 1, GameBase.Time + time, GameBase.Time + time + 400); t2.Easing = EasingTypes.In; t3.Easing = EasingTypes.In; p = new pSprite(SkinManager.Load("selection-mod-" + m.ToString().ToLower()), FieldTypes.Window, OriginTypes.Centre, ClockTypes.Game, new Vector2(x, 260), 0.92F + dep, true, Color.TransparentWhite); p.Transformations.Add(t2); p.Transformations.Add(t3); spriteManager.Add(p); time += 500; dep += 0.00001f; x -= 20; } } graphLine = new List <Line>(); if (score.hpGraph != null && score.hpGraph.Count > 0) { float time1 = score.hpGraph[0].X; float time2 = score.hpGraph[score.hpGraph.Count - 1].X; float ratio = 186 / (time2 - time1); int height = 86; int offsetX = 94; int offsetY = 373; Vector2[] va = score.hpGraph.ToArray(); for (int i = 0; i < va.Length; i++) { va[i].X = GameBase.WindowRatio * ((va[i].X - time1) * ratio + offsetX); bool ok = va[i].Y > 0.5; va[i].Y = GameBase.WindowRatio * ((1 - va[i].Y) * height + offsetY); if (i > 0) { Line l = new Line(va[i - 1], va[i], 1, (ok ? Color.YellowGreen : Color.Red)); graphLine.Add(l); graphLength += l.rho; } } } Console.WriteLine("graph length is " + graphLength); drawList = new List <Line>(); base.Initialize(); GameBase.LoadComplete(); if (ReplayMode) { Progress(false); } else { ApplauseChannel = AudioEngine.PlaySample(AudioEngine.s_Applause); } }
override internal void UpdateCalculations(bool force) { if (force || taikoMiddle == null) { sliderStartCircle = new HitCircle((int)Position.X, (int)Position.Y, StartTime, false, SoundType); sliderStartCircle.SetColour(Colour); for (int i = 0; i < sliderStartCircle.SpriteCollection.Count; i++) { SpriteCollection.Add(sliderStartCircle.SpriteCollection[i]); HitObjectManager.spriteManager.Add(sliderStartCircle.SpriteCollection[i]); } float scalefactor = (SoundType & HitObjectSoundType.Finish) == 0 ? 0.7f : 1; sliderLength *= sliderRepeatCount; double v = HitObjectManager.SliderScoringPointDistance * BeatmapManager.Current.DifficultySliderTickRate; double b = AudioEngine.beatLengthAt(StartTime); EndTime = StartTime + (int)(sliderLength / v * b); taikoMiddle = new pSprite(SkinManager.Load("taiko-roll-middle"), FieldTypes.Gamefield, OriginTypes.TopLeft, ClockTypes.Audio, new Vector2(Position.X, Position.Y - HitObjectManager.HitObjectRadius * scalefactor), SpriteManager.drawOrderBwd(EndTime + 10), false, new Color(252, 184, 6)); taikoMiddle.UseVectorScale = true; taikoMiddle.VectorScale = new Vector2((float)sliderLength * GameBase.WindowRatio / HitObjectManager.SpriteRatio * (1 / scalefactor), 1); taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime - HitObjectManager.PreEmpt, StartTime)); taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime, EndTime + HitObjectManager.PreEmptSliderComplete)); HitObjectManager.spriteManager.Add(taikoMiddle); SpriteCollection.Add(taikoMiddle); taikoEnd = new pSprite(SkinManager.Load("taiko-roll-end"), FieldTypes.Gamefield, OriginTypes.TopLeft, ClockTypes.Audio, new Vector2(Position.X, Position.Y - HitObjectManager.HitObjectRadius * scalefactor), SpriteManager.drawOrderBwd(EndTime + 8), false, new Color(252, 184, 6)); taikoEnd.OriginPosition = new Vector2((float)-sliderLength * GameBase.WindowRatio / HitObjectManager.SpriteRatio * (1 / scalefactor), 0); taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime - HitObjectManager.PreEmpt, StartTime)); taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime, EndTime + HitObjectManager.PreEmptSliderComplete)); HitObjectManager.spriteManager.Add(taikoEnd); SpriteCollection.Add(taikoEnd); sliderBall.Transformations.Add(new Transformation(sliderStartCircle.Position, sliderStartCircle.Position, StartTime - 500, EndTime)); sliderFollower.Transformations.Add(new Transformation(sliderStartCircle.Position, sliderStartCircle.Position, StartTime, EndTime)); counter = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, FieldTypes.Gamefield, OriginTypes.Centre, ClockTypes.Audio, new Vector2(100, 150), 0.9f, false, Color.White); counter.CurrentScale = 0.8f; counter.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime, StartTime)); counter.Transformations.Add(new Transformation(TransformationType.Fade, 0.6f, 0, EndTime, EndTime + 300)); HitObjectManager.spriteManager.Add(counter); newCache = false; if (scalefactor != 1) { foreach (pSprite p in SpriteCollection) { p.CurrentScale *= 0.7f; } } } }
internal HitCircleOsu(HitObjectManager hom, Vector2 pos, int startTime, bool newCombo, bool addWhistle, bool addFinish, bool addClap, int comboOffset) : base(hom) { Position = pos; BasePosition = pos; StartTime = startTime; EndTime = startTime; Type = HitObjectType.Normal; SoundType = HitObjectSoundType.None; SampleSet = Audio.SampleSet.None; SampleSetAdditions = Audio.SampleSet.None; int p = LocalPreEmpt; if (newCombo) { Type |= HitObjectType.NewCombo; ComboOffset = comboOffset; } if (addWhistle) { SoundType |= HitObjectSoundType.Whistle; } if (addFinish) { SoundType |= HitObjectSoundType.Finish; } if (addClap) { SoundType |= HitObjectSoundType.Clap; } if (hom.spriteManager == null) { return; } bool hidden = ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.Hidden); bool hasApproachCircle = ShowApproachCircle && (!hidden || (hom.hitObjects.Count == 0 && ConfigManager.sHiddenShowFirstApproach)); Color white = Color.White; pTexture t_approachCircle = TextureManager.Load(@"approachcircle"); pTexture t_hit1 = TextureManager.LoadFirstAvailable(new[] { SpriteNameHitCircle, default_sprite_hitcircle }); pTexture[] t_hit2 = TextureManager.LoadAll((t_hit1 != null ? t_hit1.AssetName : default_sprite_hitcircle) + @"overlay"); SpriteApproachCircle = new pSprite(t_approachCircle, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position, SpriteManager.drawOrderFwdPrio(StartTime - p), false, white); if (hasApproachCircle) { SpriteCollection.Add(SpriteApproachCircle); } SpriteApproachCircle.Transformations.Add(new Transformation(TransformationType.Fade, 0, 0.9F, startTime - p, Math.Min(startTime, startTime - p + HitObjectManager.FadeIn * 2))); SpriteApproachCircle.Transformations.Add(new Transformation(TransformationType.Scale, 4, 1, startTime - p, startTime)); SpriteHitCircle1 = new pSprite(t_hit1, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime), false, white) { TagNumeric = 1 }; SpriteCollection.Add(SpriteHitCircle1); DimCollection.Add(SpriteHitCircle1); SpriteHitCircle2 = new pAnimation(t_hit2, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime - (hitObjectManager.ShowOverlayAboveNumber ? 2 : 1)), false, Color.White); SpriteHitCircle2.FrameDelay = 1000 / 2F; SpriteCollection.Add(SpriteHitCircle2); DimCollection.Add(SpriteHitCircle2); SpriteHitCircleText = new pSpriteText(null, SkinManager.Current.FontHitCircle, SkinManager.Current.FontHitCircleOverlap, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime - (hitObjectManager.ShowOverlayAboveNumber ? 1 : 2)), false, Color.White); SpriteHitCircleText.Scale = TEXT_SIZE; if (ShowCircleText) { SpriteCollection.Add(SpriteHitCircleText); } Transformation t; //fade in if (hidden) { t = new Transformation(TransformationType.Fade, 0, 1, startTime - p, startTime - (int)(p * 0.6)); } else { t = new Transformation(TransformationType.Fade, 0, 1, startTime - p, startTime - p + HitObjectManager.FadeIn); } SpriteHitCircle1.Transformations.Add(t.Clone()); SpriteHitCircle2.Transformations.Add(t.Clone()); SpriteHitCircleText.Transformations.Add(t.Clone()); //fade out if (GameBase.Mode == OsuModes.Edit) { SpriteSelectionCircle = new pSprite(TextureManager.Load(@"hitcircleselect"), Fields.Gamefield, Origins.Centre, Clocks.Game, Position, SpriteManager.drawOrderBwd(StartTime - 3), true, Color.TransparentWhite); SpriteCollection.Add(SpriteSelectionCircle); if (ConfigManager.sEditorHitAnimations) { Arm(true); } else { t = new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + hitObjectManager.ForceFadeOut); SpriteHitCircle1.Transformations.Add(t.Clone()); SpriteHitCircle2.Transformations.Add(t.Clone()); SpriteHitCircleText.Transformations.Add(t.Clone()); SpriteApproachCircle.Transformations.Add(t.Clone()); } SpriteApproachCircle.Transformations.Add(new Transformation(TransformationType.Scale, 1, 1.1F, startTime, startTime + 100)); } else { Disarm(); } }
private void loadScores(SlotTeams teamId, int tabId, bool slowAnimations) { bool isFruits = playMode == PlayModes.CatchTheBeat; int startTime = GameBase.Time; Score scoreEntry = tabId != 0 ? PlayerVs.LastScoreEntries[tabId - 1].Score : (teamId == SlotTeams.Blue ? team1Score : team2Score); //load the right scoreSprites we are about to replace List <pSprite> scoreSprites = teamId == SlotTeams.Blue ? scoreSpritesBlue : scoreSpritesRed; HealthGraph currentHpGraph; spriteManagerWideScrolling.RemoveRange(scoreSprites); scoreSprites.Clear(); //create new scoresprites const int textx1 = 80; const int imgx1 = 40; const int textx2 = 280; //const int imgx2 = 240; const int row1 = 160; const int row2 = 220; const int row3 = 280; const int row4 = 320; int textoffset = SkinManager.UseNewLayout ? -16 : -25; Vector2 tMove = new Vector2(0, 20); int timeOffset = slowAnimations ? 1000 : 0; int timeOffset2 = slowAnimations ? 1300 : 0; int length = slowAnimations ? 400 : 20; pSprite p; Transformation t; p = new pSpriteText(String.Format("{0}x", scoreEntry.Count300), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx1, row1 + textoffset), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); p = new pSpriteText(String.Format("{0}x", scoreEntry.Count100), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx1, row2 + textoffset), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); p = new pSpriteText(String.Format("{0}x", scoreEntry.Count50), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx1, row3 + textoffset), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); if (!isFruits) { p = new pSpriteText(String.Format("{0}x", scoreEntry.CountGeki), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx2, row1 + textoffset), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); p = new pSpriteText(String.Format("{0}x", scoreEntry.CountKatu), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx2, row2 + textoffset), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); } p = new pSpriteText(String.Format("{0}x", scoreEntry.CountMiss), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx2, (isFruits ? row1 : row3) + textoffset), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); p = new pSpriteText(tabId == 0 ? "xxxx" : String.Format("{0}x", scoreEntry.MaxCombo), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx1 - 65, row4 + 10), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); timeOffset2 += length; t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); p = new pSpriteText(String.Format("{0:0.00}%", scoreEntry.Accuracy * 100), SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(textx2 - 86, row4 + 10), 0.8F, true, Color.TransparentWhite); p.Scale = 1.12F; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length); t.Easing = EasingTypes.Out; p.Transformations.Add(t); scoreSprites.Add(p); timeOffset2 += length; string stringTotalScore = String.Format("{0:00000000}", scoreEntry.TotalScore); pSpriteText ps = new pSpriteText(stringTotalScore, SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.Centre, Clocks.Game, /*new Vector2(180, row4 + 110)*/ new Vector2(180, 94), 0.8F, true, Color.White); ps.Scale = SkinManager.UseNewLayout ? 1.3f : 1.2f; if (SkinManager.UseNewLayout) { ps.SpacingOverlap = -2; } ps.Alpha = 0; t = new Transformation(TransformationType.Fade, 0, 1, startTime + timeOffset2, startTime + timeOffset2 + length * 2); t.Easing = EasingTypes.Out; ps.Transformations.Add(t); scoreSprites.Add(ps); int offsetX = 0; switch (teamId) { case SlotTeams.Blue: break; case SlotTeams.Red: offsetX = GameBase.WindowManager.WidthScaled - 279; break; } //scale and move the sprites to the correct panel float scale = 0.6f * 1.10f; for (int j = 0; j < scoreSprites.Count; j++) { pSprite pp = scoreSprites[j]; pp.Scale *= scale; pp.Position.X = imgx1 + (pp.Position.X - imgx1) * scale + offsetX; pp.Position.Y = row1 + (pp.Position.Y - row1) * scale + 18; spriteManagerWideScrolling.Add(pp); } //Actual graph position relative to the graph sprite float healthGraphX = rankingGraphPosition.X + (SkinManager.UseNewLayout ? 0 : 5) + offsetX; float healthGraphY = rankingGraphPosition.Y - (SkinManager.UseNewLayout ? 65 : 44); //finally create the hpGraph currentHpGraph = new HealthGraph(startTime, slowAnimations ? 2000 : 4000, scoreEntry, new RectangleF(healthGraphX, healthGraphY, 150, 68)); if (teamId == SlotTeams.Blue) { team1HPgraph = currentHpGraph; } else { team2HPgraph = currentHpGraph; } spriteManagerWideScrolling.Add(currentHpGraph); }
internal ScorePanel(Score score, EventHandler action) { Score = score; base_depth += 0.0001f * score.OnlineRank; s_BackingPlate = new pRectangle(Vector2.Zero, new Vector2(GameBase.BaseSize.X, PANEL_HEIGHT), true, base_depth, new Color4(0, 0, 0, 40)) { Tag = this }; s_BackingPlate.OnHover += delegate { s_BackingPlate.FadeColour(new Color4(83, 156, 224, 80), 100); }; s_BackingPlate.OnHoverLost += delegate { s_BackingPlate.FadeColour(new Color4(0, 0, 0, 40), 100); }; Sprites.Add(s_BackingPlate); if (action != null) { s_BackingPlate.OnClick += action; } s_BackingPlate.HandleClickOnUp = true; pSpriteText rankNumber = new pSpriteText(score.OnlineRank.ToString(), "score", 0, FieldTypes.Standard, OriginTypes.CentreRight, ClockTypes.Mode, Vector2.Zero, 0.9f, true, new Color4(100, 100, 100, 255)); rankNumber.Offset = new Vector2(GameBase.SuperWidePadding + 20, PANEL_HEIGHT / 2); rankNumber.TextConstantSpacing = true; rankNumber.SpacingOverlap = 8; rankNumber.ZeroAlpha = 0.5f; rankNumber.ScaleScalar = 0.5f; Sprites.Add(rankNumber); pSprite rankingSprite = new pSprite(score.RankingTextureTiny, Vector2.Zero) { Origin = OriginTypes.CentreLeft, DrawDepth = base_depth + 0.06f, Offset = new Vector2(GameBase.SuperWidePadding + 23, PANEL_HEIGHT / 2) }; Sprites.Add(rankingSprite); if (!score.guest) { pSpriteWeb avatar = new pSpriteWeb(@"https://api.twitter.com/1/users/profile_image/" + score.Username) { Offset = new Vector2(GameBase.SuperWidePadding + 80, PANEL_HEIGHT / 2), Origin = OriginTypes.Centre }; Sprites.Add(avatar); } s_Text = new pText(score.Username, 26, Vector2.Zero, Vector2.Zero, 0.5f, true, score.guest ? Color4.LightGray : Color4.White, false); s_Text.Bold = true; s_Text.Offset = new Vector2(GameBase.SuperWidePadding + 100, 0); Sprites.Add(s_Text); pSpriteText scoreText = new pSpriteText("000000", "score", 0, FieldTypes.StandardSnapRight, OriginTypes.CentreRight, ClockTypes.Mode, Vector2.Zero, 0.9f, true, new Color4(255, 166, 0, 255)); scoreText.Offset = new Vector2(GameBase.SuperWidePadding + 200, PANEL_HEIGHT / 2); scoreText.ShowInt(score.totalScore, 6, true); scoreText.TextConstantSpacing = true; scoreText.ZeroAlpha = 0.5f; scoreText.ScaleScalar = 0.8f; Sprites.Add(scoreText); pSpriteText accuracy = new pSpriteText((score.accuracy * 100).ToString("00.00", GameBase.nfi) + "%", "score", 0, FieldTypes.StandardSnapRight, OriginTypes.CentreRight, ClockTypes.Mode, Vector2.Zero, 0.9f, true, new Color4(0, 180, 227, 255)); accuracy.Offset = new Vector2(GameBase.SuperWidePadding + 20, PANEL_HEIGHT / 2); accuracy.ScaleScalar = 0.8f; accuracy.TextConstantSpacing = true; Sprites.Add(accuracy); }
public override void Initialize() { background = new pSprite(TextureManager.Load(OsuTexture.songselect_background), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, Vector2.Zero, 0, true, new Color4(56, 56, 56, 255)); background.Scale.X = background.DrawWidth / GameBase.BaseSize.X; background.AlphaBlend = false; spriteManager.Add(background); rankingBackground = new pSprite(TextureManager.Load(OsuTexture.ranking_background), FieldTypes.StandardSnapCentreLeft, OriginTypes.CentreLeft, ClockTypes.Mode, Vector2.Zero, 0.4f, true, Color4.White); rankingBackground.Position = new Vector2(5, -20); rankingBackground.ScaleScalar = 0.85f; layer2.Add(rankingBackground); pText artist = new pText(Player.Beatmap.Artist, 30, new Vector2(10, fill_height + 5), 0.5f, true, Color4.OrangeRed) { TextShadow = true }; layer1.Add(artist); pText title = new pText(Player.Beatmap.Title, 30, new Vector2(16 + artist.MeasureText().X / GameBase.BaseToNativeRatioAligned, fill_height + 5), 0.5f, true, Color4.White) { TextShadow = true }; layer1.Add(title); pTexture modeTex; switch (Player.Difficulty) { case Difficulty.Easy: modeTex = TextureManager.Load(OsuTexture.songselect_mode_easy); break; case Difficulty.Expert: modeTex = TextureManager.Load(OsuTexture.songselect_mode_expert); break; default: modeTex = TextureManager.Load(OsuTexture.songselect_mode_stream); break; } modeGraphic = new pSprite(modeTex, FieldTypes.StandardSnapRight, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(5, 7), 0.45f, true, Color4.White) { ScaleScalar = 0.5f }; layer1.Add(modeGraphic); rankGraphic = new pSprite(RankableScore.RankingTexture, FieldTypes.StandardSnapBottomRight, OriginTypes.Centre, ClockTypes.Mode, new Vector2(120, 180), 0.46f, true, Color4.White) { Alpha = 0 }; layer1.Add(rankGraphic); initializeTransition(); //Scoring { float v_offset = -165; pText heading = new pText(LocalisationManager.GetString(OsuString.Score), 28, new Vector2(240, v_offset), 0.5f, true, Color4.White) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); v_offset += 30; pSpriteText count = new pSpriteText("000,000", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(255, 166, 0, 255)); count.TextConstantSpacing = true; countTotalScore = count; resultSprites.Add(count); v_offset += 40; //Spin Bonus heading = new pText(LocalisationManager.GetString(OsuString.Hit), 20, new Vector2(240, v_offset), 0.5f, true, Color4.Gray) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); count = new pSpriteText("000000", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(255, 166, 0, 255)); count.TextConstantSpacing = true; count.ZeroAlpha = 0.5f; count.ScaleScalar = 0.7f; resultSprites.Add(count); countScoreHit = count; v_offset += 25; heading = new pText(LocalisationManager.GetString(OsuString.Combo), 20, new Vector2(240, v_offset), 0.5f, true, Color4.Gray) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); count = new pSpriteText("000000", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(255, 166, 0, 255)); count.TextConstantSpacing = true; count.ZeroAlpha = 0.5f; count.ScaleScalar = 0.7f; resultSprites.Add(count); countScoreCombo = count; v_offset += 25; heading = new pText(LocalisationManager.GetString(OsuString.Accuracy), 20, new Vector2(240, v_offset), 0.5f, true, Color4.Gray) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); count = new pSpriteText("000000", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(255, 166, 0, 255)); count.TextConstantSpacing = true; count.ZeroAlpha = 0.5f; count.ScaleScalar = 0.7f; resultSprites.Add(count); countScoreAccuracy = count; v_offset += 25; heading = new pText(LocalisationManager.GetString(OsuString.Spin), 20, new Vector2(240, v_offset), 0.5f, true, Color4.Gray) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); count = new pSpriteText("000000", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(255, 166, 0, 255)); count.TextConstantSpacing = true; count.ZeroAlpha = 0.5f; count.ScaleScalar = 0.7f; resultSprites.Add(count); countScoreSpin = count; v_offset += 30; heading = new pText(LocalisationManager.GetString(OsuString.Accuracy), 28, new Vector2(240, v_offset), 0.5f, true, Color4.White) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); v_offset += 34; count = new pSpriteText((RankableScore.accuracy * 100).ToString("00.00", GameBase.nfi) + "%", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(0, 180, 227, 255)); count.ScaleScalar = 0.7f; resultSprites.Add(count); v_offset += 20; heading = new pText(LocalisationManager.GetString(OsuString.MaxCombo), 28, new Vector2(240, v_offset), 0.5f, true, Color4.White) { Origin = OriginTypes.TopLeft, Field = FieldTypes.StandardSnapCentreLeft, Bold = true }; resultSprites.Add(heading); v_offset += 34; count = new pSpriteText(RankableScore.maxCombo.ToString("#,0", GameBase.nfi) + "x", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.TopRight, ClockTypes.Mode, new Vector2(445, v_offset), 0.9f, true, new Color4(0, 180, 227, 255)); count.ScaleScalar = 0.7f; resultSprites.Add(count); } { Vector2 pos = new Vector2(60, -130); Vector2 textOffset = new Vector2(150, 0); float spacing = 65; pSprite hitExplosion = new pSprite(TextureManager.Load(OsuTexture.hit300), pos) { Field = FieldTypes.StandardSnapCentreLeft, Origin = OriginTypes.Centre, ScaleScalar = 0.5f, DrawDepth = 0.9f }; resultSprites.Add(hitExplosion); count300 = new pSpriteText("0x", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.CentreRight, ClockTypes.Mode, pos + textOffset, 0.9f, true, Color4.White) { SpacingOverlap = 3, TextConstantSpacing = true }; resultSprites.Add(count300); pos.Y += spacing; hitExplosion = new pSprite(TextureManager.Load(OsuTexture.hit100), pos) { Field = FieldTypes.StandardSnapCentreLeft, Origin = OriginTypes.Centre, ScaleScalar = 0.5f, DrawDepth = 0.9f }; resultSprites.Add(hitExplosion); count100 = new pSpriteText("0x", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.CentreRight, ClockTypes.Mode, pos + textOffset, 0.9f, true, Color4.White) { SpacingOverlap = 3, TextConstantSpacing = true }; resultSprites.Add(count100); pos.Y += spacing; hitExplosion = new pSprite(TextureManager.Load(OsuTexture.hit50), pos) { Field = FieldTypes.StandardSnapCentreLeft, Origin = OriginTypes.Centre, ScaleScalar = 0.5f, DrawDepth = 0.9f }; resultSprites.Add(hitExplosion); count50 = new pSpriteText("0x", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.CentreRight, ClockTypes.Mode, pos + textOffset, 0.9f, true, Color4.White) { SpacingOverlap = 3, TextConstantSpacing = true }; resultSprites.Add(count50); pos.Y += spacing; hitExplosion = new pSprite(TextureManager.Load(OsuTexture.hit0), pos) { Field = FieldTypes.StandardSnapCentreLeft, Origin = OriginTypes.Centre, ScaleScalar = 0.5f, DrawDepth = 0.9f }; resultSprites.Add(hitExplosion); count0 = new pSpriteText("0x", "score", 0, FieldTypes.StandardSnapCentreLeft, OriginTypes.CentreRight, ClockTypes.Mode, pos + textOffset, 0.9f, true, Color4.White) { SpacingOverlap = 3, TextConstantSpacing = true }; resultSprites.Add(count0); } if (Director.LastOsuMode == OsuMode.SongSelect) { cameFromSongSelect = true; } layer2.Add(resultSprites); s_ButtonBack = new BackButton(returnToSelect, false); s_ButtonBack.Alpha = 0; topMostLayer.Add(s_ButtonBack); s_Footer = new pSprite(TextureManager.Load(OsuTexture.ranking_footer), FieldTypes.StandardSnapBottomRight, OriginTypes.BottomRight, ClockTypes.Mode, new Vector2(0, -100), 0.98f, true, Color4.White); s_Footer.Alpha = 0; s_Footer.OnClick += delegate { Director.ChangeMode(OsuMode.Play); AudioEngine.PlaySample(OsuSamples.MenuHit); }; topMostLayer.Add(s_Footer); if (!cameFromSongSelect) { InitializeBgm(); //this is a bit of cheating to ensure that getting 100% will always result in 1mil. there are some race conditions with multitouch that may allow //for ever-so-slightly lower max scores, but this would piss people off. if (RankableScore.accuracy == 1 && RankableScore.totalScore - RankableScore.spinnerBonusScore != Score.MAX_SCORE) { RankableScore.comboBonusScore = Score.MAX_SCORE - RankableScore.accuracyBonusScore - RankableScore.hitScore; } DifficultyScoreInfo bmi = BeatmapDatabase.GetDifficultyInfo(Player.Beatmap, Player.Difficulty); if (bmi.HighScore == null || RankableScore.totalScore > bmi.HighScore.totalScore) { if (bmi.difficulty == Difficulty.Normal && RankableScore.Ranking >= Rank.A && (bmi.HighScore == null || bmi.HighScore.Ranking < Rank.A)) { unlockedExpert = true; } isPersonalBest = true; bmi.HighScore = RankableScore; BeatmapDatabase.Write(); } else if (bmi.HighScore != null && RankableScore.Ranking > bmi.HighScore.Ranking) { bmi.HighScore.Ranking = RankableScore.Ranking; } //Average Timing avg = (float)RankableScore.hitOffsetMilliseconds / Math.Max(1, RankableScore.hitOffsetCount); pText heading = new pText(LocalisationManager.GetString(OsuString.AvgTiming) + Math.Round(Math.Abs(avg), 1) + (RankableScore.hitOffsetMilliseconds > 0 ? "ms late" : "ms early"), 16, new Vector2(0, 20), 0.5f, true, Color4.White) { Field = FieldTypes.StandardSnapBottomCentre, Origin = OriginTypes.BottomCentre }; layer1.Add(heading); doSubmission(); } else { if (!string.IsNullOrEmpty(RankableScore.Username)) { pText playerName = new pText("Played by " + RankableScore.Username, 30, new Vector2(10, 10), 0.5f, true, new Color4(255, 234, 0, 255)) { TextShadow = true, Field = FieldTypes.StandardSnapBottomRight, Origin = OriginTypes.BottomRight }; s_Footer.Bypass = true; //don't show footer. we need this room! layer1.Add(playerName); } //displaying a previous high score (or online high score) finishDisplaying(); } Director.OnTransitionEnded += Director_OnTransitionEnded; InputManager.OnMove += HandleInputManagerOnMove; }
internal virtual void InitializeSprites() { newStyleSpinner = SkinManager.UseNewLayout && (SkinManager.IgnoreBeatmapSkin || TextureManager.Load(@"spinner-circle", SkinSource.Beatmap) == null) && TextureManager.Load(@"spinner-background", SkinSource.Skin) == null; if (GameBase.GameField.CorrectionOffsetActive) { spinnerTopOffset -= 16; } //this is madness, but works. posTopLeftCentre = new Vector2(GameBase.WindowManager.WidthScaled / Math.Max(1, GameBase.WindowManager.WidthWidescreenRatio) / 2f, spinnerTopOffset + 219); Color initialColour = (GameBase.Mode == OsuModes.Play && Player.currentScore != null && (ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.SpunOut) || Player.Relaxing2) ? Color.Gray : Color.White); if (GameBase.Mode == OsuModes.Play && SkinManager.Current.SpinnerFadePlayfield) { //we need to add a backing layer as this skin requests the playfield is hidden while the spinner is present. SpriteCollection.Add(new pSprite(GameBase.WhitePixel, Fields.TopLeft, Origins.TopLeft, Clocks.Audio, new Vector2(0, 0), SpriteManager.drawOrderFwdLowPrio(StartTime - 1), false, Color.Black) { Scale = 1.6f, VectorScale = new Vector2(640, spinnerTopOffset) }); if (GameBase.GameField.CorrectionOffsetActive) { SpriteCollection.Add(new pSprite(GameBase.WhitePixel, Fields.TopLeft, Origins.TopLeft, Clocks.Audio, new Vector2(0, 480 - 19), SpriteManager.drawOrderFwdLowPrio(StartTime - 1), false, Color.Black) { Scale = 1.6f, VectorScale = new Vector2(640, 19) //Use 19 here instead of 16 as the spinner-background graphic seems a little short... }); } } if (newStyleSpinner) { SpriteCircleTop = new pSprite(TextureManager.Load(@"spinner-top"), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime + 1), false, initialColour); SpriteCollection.Add(SpriteCircleTop); spriteCircleBottom = new pSprite(TextureManager.Load(@"spinner-bottom"), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime), false, initialColour); SpriteCollection.Add(spriteCircleBottom); spriteMiddleTop = new pSprite(TextureManager.Load(@"spinner-middle"), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime + 3), false, Color.TransparentWhite); SpriteCollection.Add(spriteMiddleTop); spriteMiddleBottom = new pSprite(TextureManager.Load(@"spinner-middle2"), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime + 2), false, Color.TransparentWhite); SpriteCollection.Add(spriteMiddleBottom); } else { pTexture bgTexture = null; //Check for a jpg background for beatmap-based skins (used to reduce filesize), then fallback to png. if (!SkinManager.IgnoreBeatmapSkin) { bgTexture = TextureManager.Load(@"spinner-background.jpg", SkinSource.Beatmap); } if (bgTexture == null) { bgTexture = TextureManager.Load(@"spinner-background", SkinSource.Beatmap | SkinSource.Skin); } Color bgColour = SkinManager.Colours.ContainsKey(@"SpinnerBackground") ? SkinManager.Colours[@"SpinnerBackground"] : new Color(100, 100, 100, 255); spriteBackground = new pSprite(bgTexture, Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime - 1), false, bgColour); SpriteCollection.Add(spriteBackground); SpriteCircleTop = new pSprite(TextureManager.Load(@"spinner-circle"), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime), false, initialColour); SpriteCollection.Add(SpriteCircleTop); spriteScoreMetre = new pSprite(TextureManager.Load(@"spinner-metre"), Fields.TopLeft, Origins.TopLeft, Clocks.Audio, new Vector2(posTopLeftCentre.X - 320, spinnerTopOffset), SpriteManager.drawOrderFwdLowPrio(StartTime + 1), false, initialColour); spriteScoreMetre.DrawHeight = 0; SpriteCollection.Add(spriteScoreMetre); } if (GameBase.Mode == OsuModes.Play) { spriteRpmBackground = new pSprite(TextureManager.Load(@"spinner-rpm"), Fields.TopLeft, Origins.TopLeft, Clocks.Audio, new Vector2(posTopLeftCentre.X - 87, 445), SpriteManager.drawOrderFwdLowPrio(StartTime + 3), false, initialColour); spriteRpmText = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.TopRight, Clocks.Audio, new Vector2(posTopLeftCentre.X + 80, 448), SpriteManager.drawOrderFwdLowPrio(StartTime + 4), false, initialColour) { Scale = 0.9f }; SpriteCollection.Add(spriteRpmText); SpriteCollection.Add(spriteRpmBackground); } if (SpriteCircleTop.Texture.Source != SkinSource.Osu && (!ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.Hidden))) { SpriteApproachCircle = new pSprite(TextureManager.Load(@"spinner-approachcircle"), Fields.TopLeft, Origins.Centre, Clocks.Audio, posTopLeftCentre, SpriteManager.drawOrderFwdLowPrio(StartTime + 2), false, initialColour); SpriteCollection.Add(SpriteApproachCircle); } SpriteBonusCounter = new pSpriteText(string.Empty, SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.Centre, Clocks.Audio, new Vector2(posTopLeftCentre.X, spinnerTopOffset + 299), SpriteManager.drawOrderFwdLowPrio(StartTime + 3), false, initialColour); SpriteCollection.Add(SpriteBonusCounter); }
protected virtual void LoadScore(Score score) { if (score == null) { return; } foreach (pSprite ps in leftPanel) { ps.FadeOut(100); ps.AlwaysDraw = false; } leftPanel.Clear(); rankingElements.Clear(); this.score = score; if (score.Processor != null || score.PlayMode == PlayModes.OsuMania) { stringTotalScore = string.Format("{0:0000000}", score.TotalScore); } else { stringTotalScore = string.Format("{0:00000000}", score.TotalScore); } s_score1 = new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap, Fields.TopLeft, Origins.Centre, Clocks.Game, new Vector2(220, 94), 0.8F, true, Color.White); s_score1.Scale = SkinManager.UseNewLayout ? 1.3f : 1.05f; if (SkinManager.UseNewLayout) { s_score1.SpacingOverlap = -2; } s_score1.TextConstantSpacing = true; spriteManagerWideScrolling.Add(s_score1); leftPanel.Add(s_score1); const int textx1 = 80; const int imgx1 = 40; const int textx2 = 280; const int imgx2 = 240; const int row1 = 160; const int row2 = 220; const int row3 = 280; const int row4 = 320; RankingElement e; switch (score.PlayMode) { case PlayModes.Osu: { rankingElements.Add(new RankingElement(@"hit300", new Vector2(imgx1, row1), String.Format("{0}x", score.Count300))); rankingElements.Add(new RankingElement(@"hit100", new Vector2(imgx1, row2), String.Format("{0}x", score.Count100))); rankingElements.Add(new RankingElement(@"hit50", new Vector2(imgx1, row3), String.Format("{0}x", score.Count50))); rankingElements.Add(new RankingElement(@"hit300g", new Vector2(imgx2, row1), String.Format("{0}x", score.CountGeki))); rankingElements.Add(new RankingElement(@"hit100k", new Vector2(imgx2, row2), String.Format("{0}x", score.CountKatu))); rankingElements.Add(new RankingElement(@"hit0", new Vector2(imgx2, row3), String.Format("{0}x", score.CountMiss))); break; } case PlayModes.Taiko: { rankingElements.Add(new RankingElement(@"taiko-hit300", new Vector2(imgx1, row1), String.Format("{0}x", score.Count300 - score.CountGeki))); rankingElements.Add(new RankingElement(@"taiko-hit100", new Vector2(imgx1, row2), String.Format("{0}x", score.Count100 - score.CountKatu))); rankingElements.Add(new RankingElement(@"taiko-hit0", new Vector2(imgx1, row3), String.Format("{0}x", score.CountMiss))); rankingElements.Add(new RankingElement(@"taiko-hit300g", new Vector2(imgx2, row1), String.Format("{0}x", score.CountGeki))); rankingElements.Add(new RankingElement(@"taiko-hit100k", new Vector2(imgx2, row2), String.Format("{0}x", score.CountKatu))); break; } case PlayModes.CatchTheBeat: { // overlays are added first to prevent a minor display bug rankingElements.Add(new RankingElement(@"fruit-orange-overlay", new Vector2(imgx1, row1), null, true)); e = new RankingElement(@"fruit-orange", new Vector2(imgx1, row1), String.Format("{0}x", score.Count300)); e.image.InitialColour = Color.Orange; rankingElements.Add(e); e = new RankingElement(@"fruit-drop", new Vector2(imgx1, row2), String.Format("{0}x", score.Count100)); e.ChangeScale(1F, 0.6F); e.image.InitialColour = Color.YellowGreen; rankingElements.Add(e); e = new RankingElement(@"fruit-drop", new Vector2(imgx1, row3), String.Format("{0}x", score.Count50)); e.ChangeScale(1F, 0.4F); e.ApplyRotation(4f); e.image.InitialColour = Color.LightBlue; rankingElements.Add(e); e = new RankingElement(@"fruit-orange-overlay", new Vector2(imgx2, row1), null, true); e.ChangeScale(1f, 0.4f); e.ApplyRotation(0.8f); rankingElements.Add(e); e = new RankingElement(@"hit0", new Vector2(imgx2, row1) - new Vector2(20, 20), null, true); e.ChangeScale(0.7f, 0.2f); rankingElements.Add(e); e = new RankingElement(@"fruit-orange", new Vector2(imgx2, row1), String.Format("{0}x", score.CountMiss)); e.ChangeScale(1f, 0.4f); e.ApplyRotation(0.8f); e.image.InitialColour = Color.LightGray; rankingElements.Add(e); break; } case PlayModes.OsuMania: { rankingElements.Add(new RankingElement(@"mania-hit300", new Vector2(imgx1, row1), String.Format("{0}x", score.Count300))); rankingElements.Add(new RankingElement(@"mania-hit200", new Vector2(imgx1, row2), String.Format("{0}x", score.CountKatu))); rankingElements.Add(new RankingElement(@"mania-hit50", new Vector2(imgx1, row3), String.Format("{0}x", score.Count50))); rankingElements.Add(new RankingElement(@"mania-hit300g", new Vector2(imgx2, row1), String.Format("{0}x", score.CountGeki))); rankingElements.Add(new RankingElement(@"mania-hit100", new Vector2(imgx2, row2), String.Format("{0}x", score.Count100))); rankingElements.Add(new RankingElement(@"mania-hit0", new Vector2(imgx2, row3), String.Format("{0}x", score.CountMiss))); break; } } int row4Offset = (SkinManager.UseNewLayout ? 20 : 8); e = new RankingElement(@"ranking-maxcombo", new Vector2(imgx1 - 35, row4 - row4Offset), null, false, 0, Origins.TopLeft); e.ChangeScale(1F, 1F); e.image.Depth = 0.81F; // we're adding the text separately here because of the unusual offset. e.LoadScoreText(String.Format("{0}x", score.MaxCombo), new Vector2(textx1 - 65, row4 + 10)); e.text.Depth = 0.8F; rankingElements.Add(e); e = new RankingElement(@"ranking-accuracy", new Vector2(imgx2 - 58, row4 - row4Offset), null, false, 0, Origins.TopLeft); e.ChangeScale(1F, 1F); e.image.Depth = 0.81F; e.LoadScoreText(String.Format("{0:0.00}%", score.Accuracy * 100), new Vector2(textx2 - 86, row4 + 10)); e.text.Depth = 0.8F; rankingElements.Add(e); // show average error as hint string hint = ""; if (score.HitErrors != null && score.HitErrors.Count != 0) { List <double> result = GetErrorStatisticsArray(score.HitErrors); if (result != null) { #if DEBUG hint = String.Format("Accuracy:\nError: {0:0.00}ms - {1:0.00}ms avg / {3:0.00}ms - {4:0.00}ms max \nUnstable Rate: {2:0.00}\n", result[0], result[1], result[4] * 10, result[6], result[5]); #else hint = String.Format("Accuracy:\nError: {0:0.00}ms - {1:0.00}ms avg\nUnstable Rate: {2:0.00}\n", result[0], result[1], result[4] * 10, result[6], result[5]); #endif } } if (score.SpinningRates != null && score.SpinningRates.Count != 0) { List <double> result = GetErrorStatisticsArray(score.SpinningRates); if (result != null) { hint += String.Format("Spin:\nSpeed: {0:000}(Max:{1:000}rpm)\nUnstable Rate: {2:0.00}\n", result[2], result[5], result[4] * 2); } } if (hint != "") { spriteRankingGraph.HandleInput = true; spriteRankingGraph.ToolTip = hint; } if (score.Perfect) { e = new RankingElement(@"ranking-perfect", new Vector2(SkinManager.UseNewLayout ? 260 : 200, 430), null, false, 300); e.ChangeScale(1.1F, 1F); e.image.Depth = 0.99F; rankingElements.Add(e); } int timeOffset = AddRankingSprites(); LoadRanking(timeOffset); if (healthGraph != null) { spriteManagerWideScrolling.Remove(healthGraph); healthGraph.Dispose(); } //Actual graph position relative to the graph sprite float healthGraphX = spriteRankingGraph.InitialPosition.X + (SkinManager.UseNewLayout ? 5 : 10); float healthGraphY = spriteRankingGraph.InitialPosition.Y + (SkinManager.UseNewLayout ? 5 : 10); healthGraph = new HealthGraph(startTime, 4000, score, new RectangleF(healthGraphX, healthGraphY, 186, 86)); spriteManagerWideScrolling.Add(healthGraph); LoadMods(); s_white = new pSprite(GameBase.WhitePixel, Fields.TopLeft, Origins.TopLeft, Clocks.Game, Vector2.Zero, 1, false, Color.TransparentWhite); s_white.ScaleToWindowRatio = false; s_white.Additive = true; s_white.VectorScale = new Vector2(GameBase.WindowManager.Width, GameBase.WindowManager.Height); Transformation t = new Transformation(TransformationType.Fade, 0.5f, 0, startTime + timeOffset + 1000, startTime + timeOffset + 2400); s_white.Transformations.Add(t); spriteManagerWideAbove.Add(s_white); leftPanel.Add(s_white); }