''' ''' The notification popup. ''' Public Class NotificationPopup Private _background As Texture2D Private _icon As Texture2D Private FrameSizeBack As Integer Private FramesizeIcon As Integer Private _positionY As Single = -12 Private _started As Boolean = False Private _scale As Single = CInt(SpriteBatch.InterfaceScale * 2) Private _soundEffect As String = "" Private _text As String = "" Private _size As Size = New Size(13, 3) Private _backgroundIndex As Vector2 = New Vector2(0, 0) Private _iconIndex As Vector2 = New Vector2(0, 0) Private _delay As Integer = Nothing Public _delayDate As Date = Nothing Public _waitForInput As Boolean = False Public _interacted As Boolean = False Public _scriptFile As String = "" Public _forceAccept As Boolean = False Public IsReady As Boolean = False ''' ''' Sets the values of the NotificationPopup and displays it on the screen. ''' Public Sub Setup(Text As String, Optional Delay As Integer = 500, Optional BackgroundIndex As Integer = 0, Optional IconIndex As Integer = 0, Optional SoundEffect As String = "", Optional ScriptFile As String = "", Optional ForceAccept As Boolean = False) _text = Text If Delay <> -1 Then If Delay = 0 Then _waitForInput = True End If _delay = Delay Else _delay = 500 End If If BackgroundIndex <> -1 Then _backgroundIndex = New Vector2(BackgroundIndex, 0) Else _backgroundIndex = New Vector2(0, 0) End If While _backgroundIndex.X >= 3 _backgroundIndex.X -= 3 _backgroundIndex.Y += 1 End While If _backgroundIndex.X < 0 Then _backgroundIndex.X = 0 End If Dim BackTexture As Texture2D = TextureManager.GetTexture("Textures\Notifications\Backgrounds") FrameSizeBack = CInt(BackTexture.Width / 3) _background = TextureManager.GetTexture(BackTexture, New Rectangle(CInt(_backgroundIndex.X * FrameSizeBack), CInt(_backgroundIndex.Y * FrameSizeBack), FrameSizeBack, FrameSizeBack)) _positionY = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - (FrameSizeBack / 3 * _scale) - 5) If IconIndex <> -1 Then _iconIndex = New Vector2(IconIndex, 0) Else _iconIndex = New Vector2(0, 0) End If While _iconIndex.X >= 3 _iconIndex.X -= 3 _iconIndex.Y += 1 End While If _iconIndex.X < 0 Then _iconIndex.X = 0 End If Dim IconTexture As Texture2D = TextureManager.GetTexture("Textures\Notifications\Icons") FramesizeIcon = CInt(IconTexture.Width / 3) _icon = TextureManager.GetTexture(IconTexture, New Rectangle(CInt(_iconIndex.X * FramesizeIcon), CInt(_iconIndex.Y * FramesizeIcon), FramesizeIcon, FramesizeIcon)) _scriptFile = ScriptFile _soundEffect = SoundEffect _forceAccept = ForceAccept End Sub ''' ''' Dismiss the Popup ''' Public Sub Dismiss() Me._waitForInput = False Me._delayDate = Date.Now _interacted = True End Sub ''' ''' Update the NotificationPopup. ''' Public Sub Update() If _started = False Then _delayDate = Date.Now.AddMilliseconds(CDbl(_delay * 10)) _started = True End If If _waitForInput = True Then If Me._positionY < 5.0F Then Me._positionY += CInt(0.7 * (FrameSizeBack / 3 * _scale) / _size.Height) Else If _soundEffect IsNot "" Then SoundManager.PlaySound("Notifications\" & _soundEffect) _soundEffect = "" End If End If Else If Date.Now < _delayDate Then If Me._positionY < 5.0F Then Me._positionY += CInt(0.7 * (FrameSizeBack / 3 * _scale) / _size.Height) Else If _soundEffect IsNot "" Then SoundManager.PlaySound("Notifications\" & _soundEffect) _soundEffect = "" End If End If Else Dim BackY As Integer = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - (FrameSizeBack / 3 * _scale) - 5) If Me._interacted = True OrElse _forceAccept = True Then If Me._positionY > BackY Then Me._positionY -= CInt(1.6 * (FrameSizeBack / 3 * _scale) / _size.Height) If Me._positionY <= BackY Then Me._positionY = BackY If Me._scriptFile <> "" Then CType(Core.CurrentScreen, OverworldScreen).ActionScript.StartScript(Me._scriptFile, 0, False,, "Notification") End If Me.IsReady = True End If End If Else If Me._positionY > BackY Then Me._positionY -= CInt(1.0 * (FrameSizeBack / 3 * _scale) / _size.Height) If Me._positionY <= BackY Then Me._positionY = BackY Me.IsReady = True End If End If End If End If End If End Sub ''' ''' Renders the NotificationPopup. ''' Public Sub Draw() Dim TextHeader As String = _text.GetSplit(0, "*").Replace(CChar("~"), Environment.NewLine).CropStringToWidth(FontManager.InGameFont, CInt(_scale), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)) Dim TextBody As String = _text.GetSplit(1, "*").Replace(CChar("~"), Environment.NewLine) While FontManager.InGameFont.MeasureString(TextHeader).Y * 2 + FontManager.InGameFont.MeasureString(TextBody).Y > CInt(((_size.Height * FrameSizeBack / 3) - FrameSizeBack / 3) * _scale - 5) _size.Height += 1 End While Dim BackGroundOffsetX As Integer = CInt(Core.windowSize.Width - (_size.Width * (FrameSizeBack / 3) * _scale) - (FrameSizeBack / 3) * 2 - 5) 'Draw the frame. Canvas.DrawImageBorder(_background, CInt(_scale), New Rectangle(BackGroundOffsetX, CInt(Me._positionY), CInt(_size.Width * (FrameSizeBack / 3) * _scale), CInt(_size.Height * (FrameSizeBack / 3) * _scale))) 'Draw the icon. Core.SpriteBatch.DrawInterface(_icon, New Rectangle(CInt(BackGroundOffsetX + (FrameSizeBack / 3 + 3) * _scale - _icon.Width / 3), CInt(Me._positionY + ((FrameSizeBack / 3 * _size.Height / 2) - FrameSizeBack / 3 * 0.5) * _scale - _icon.Width / 3), CInt(_icon.Width * _scale), CInt(_icon.Height * _scale)), Color.White) Dim TextOffset = CInt(BackGroundOffsetX + FrameSizeBack / 3 * _scale * 4) If TextBody <> "" Then If TextHeader <> "" Then 'Draw the header, then the body Core.SpriteBatch.DrawString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(_scale), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3)), Color.Black, 0.0F, Vector2.Zero, CSng(_scale), SpriteEffects.None, 0.0F) Core.SpriteBatch.DrawString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(_scale / 2), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3 + (FontManager.InGameFont.MeasureString(TextHeader).Y * _scale))), Color.Black, 0.0F, Vector2.Zero, CSng(_scale / 2), SpriteEffects.None, 0.0F) Else 'Just draw the body Core.SpriteBatch.DrawString(FontManager.InGameFont, TextBody.CropStringToWidth(FontManager.InGameFont, CInt(_scale / 2), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3)), Color.Black, 0.0F, Vector2.Zero, CSng(_scale / 2), SpriteEffects.None, 0.0F) End If Else 'Just draw the header Core.SpriteBatch.DrawString(FontManager.InGameFont, TextHeader.CropStringToWidth(FontManager.InGameFont, CInt(_scale), CInt((_size.Width * (FrameSizeBack / 3) - FrameSizeBack / 3 * 4) * _scale)), New Vector2(TextOffset, CInt(Me._positionY + FrameSizeBack / 3)), Color.Black, 0.0F, Vector2.Zero, CSng(_scale), SpriteEffects.None, 0.0F) End If Dim InteractText As String = "[" & Localization.GetString("game_notification_dismiss") & "]" If Me._scriptFile <> "" OrElse _waitForInput = True Then InteractText = "[" & Localization.GetString("game_notification_accept") & "]" End If Dim InteractOffset As Vector2 = New Vector2(CInt(Core.windowSize.Width - FrameSizeBack / 3 * _scale - FontManager.InGameFont.MeasureString(InteractText).X * _scale / 2), CInt(Me._positionY + _size.Height * (FrameSizeBack / 3) * _scale + 5)) Core.SpriteBatch.DrawInterface(_background, New Rectangle(CInt(InteractOffset.X), CInt(InteractOffset.Y), CInt(FontManager.InGameFont.MeasureString(InteractText).X * _scale / 2), CInt(FontManager.InGameFont.MeasureString(InteractText).Y * _scale / 2)), New Rectangle(CInt(FrameSizeBack / 3), CInt(FrameSizeBack / 3), CInt(FrameSizeBack / 3), CInt(FrameSizeBack / 3)), Color.White) Core.SpriteBatch.DrawString(FontManager.InGameFont, InteractText, New Vector2(CInt(InteractOffset.X), CInt(InteractOffset.Y)), Color.Black) End Sub End Class