diff --git a/Output/CreditsRessourcesDB.sqlite b/Output/CreditsRessourcesDB.sqlite
deleted file mode 100644
index d5dbafb9..00000000
Binary files a/Output/CreditsRessourcesDB.sqlite and /dev/null differ
diff --git a/Output/Graphics/CreditsLogo.png b/Output/Graphics/CreditsLogo.png
new file mode 100644
index 00000000..a3392a9c
Binary files /dev/null and b/Output/Graphics/CreditsLogo.png differ
diff --git a/Vocaluxe/Base/CDataBase.cs b/Vocaluxe/Base/CDataBase.cs
index d159679f..1cf8c52c 100644
--- a/Vocaluxe/Base/CDataBase.cs
+++ b/Vocaluxe/Base/CDataBase.cs
@@ -1,4 +1,4 @@
-#region license
+#region license
// This file is part of Vocaluxe.
//
// Vocaluxe is free software: you can redistribute it and/or modify
@@ -29,13 +29,11 @@ namespace Vocaluxe.Base
{
private static CHighscoreDB _HighscoreDB;
private static CCoverDB _CoverDB;
- private static CResourceDB _ResourceDB;
public static bool Init()
{
_HighscoreDB = new CHighscoreDB(CConfig.FileHighscoreDB);
_CoverDB = new CCoverDB(Path.Combine(CSettings.DataFolder, CSettings.FileNameCoverDB));
- _ResourceDB = new CResourceDB(Path.Combine(CSettings.ProgramFolder, CSettings.FileNameCreditsRessourcesDB));
if (!_HighscoreDB.Init())
{
@@ -46,12 +44,7 @@ namespace Vocaluxe.Base
{
CLog.Fatal("Error initializing Cover-DB");
return false;
- }
- if (!_ResourceDB.Init())
- {
- CLog.Fatal("Error initializing Credits-DB");
- return false;
- }
+ }
return true;
}
@@ -67,11 +60,6 @@ namespace Vocaluxe.Base
_CoverDB.Close();
_CoverDB = null;
}
- if (_ResourceDB != null)
- {
- _ResourceDB.Close();
- _ResourceDB = null;
- }
}
public static bool GetDataBaseSongInfos(string artist, string title, out int numPlayed, out DateTime dateAdded, out int highscoreID)
@@ -112,10 +100,5 @@ namespace Vocaluxe.Base
if (_CoverDB != null)
_CoverDB.CommitCovers();
}
-
- public static bool GetCreditsRessource(string fileName, ref CTextureRef tex)
- {
- return _ResourceDB != null && _ResourceDB.GetCreditsRessource(fileName, ref tex);
- }
}
-}
\ No newline at end of file
+}
diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs
index 57569ddb..cc9ea6dd 100644
--- a/Vocaluxe/Base/CSettings.cs
+++ b/Vocaluxe/Base/CSettings.cs
@@ -108,10 +108,10 @@ namespace Vocaluxe.Base
public const string FileNameIcon = "Vocaluxe.ico";
public const string FileNameLogo = "Logo.png";
public const string FileNameFonts = "Fonts.xml";
+ public const string FileNameCreditsLogo = "CreditsLogo.png";
public const string FileNameOldHighscoreDB = "Ultrastar.db";
public const string FileNameCoverDB = "CoverDB.sqlite";
- public const string FileNameCreditsRessourcesDB = "CreditsRessourcesDB.sqlite";
public const string FileNameMainLog = "Vocaluxe.log";
public const string FileNameSongLog = "Song.log";
diff --git a/Vocaluxe/Lib/Database/CResourceDB.cs b/Vocaluxe/Lib/Database/CResourceDB.cs
deleted file mode 100644
index 1aca8250..00000000
--- a/Vocaluxe/Lib/Database/CResourceDB.cs
+++ /dev/null
@@ -1,258 +0,0 @@
-#region license
-// This file is part of Vocaluxe.
-//
-// Vocaluxe is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Vocaluxe is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Vocaluxe. If not, see .
-#endregion
-
-using System;
-using System.Data;
-using System.Drawing;
-using System.Drawing.Imaging;
-using System.IO;
-using System.Runtime.InteropServices;
-using Vocaluxe.Base;
-using VocaluxeLib.Draw;
-using VocaluxeLib.Log;
-#if WIN
-using System.Data.SQLite;
-
-#else
-using Mono.Data.Sqlite;
-using SQLiteCommand = Mono.Data.Sqlite.SqliteCommand;
-using SQLiteConnection = Mono.Data.Sqlite.SqliteConnection;
-using SQLiteDataReader = Mono.Data.Sqlite.SqliteDataReader;
-using SQLiteTransaction = Mono.Data.Sqlite.SqliteTransaction;
-#endif
-
-namespace Vocaluxe.Lib.Database
-{
- public class CResourceDB : CDatabaseBase
- {
-#if DEBUG
- private readonly string[] _FilesV1 = new string[]
- {
- "Logo_voc.png", "PerfectNoteStar.png", "redDot.png", "blueDot.png", "brunzel.png", "Darkice.png", "flokuep.png", "flamefire.png", "bohning.png", "mesand.png",
- "babene03.png", "lukeIam.png"
- };
-#endif
- public CResourceDB(string filePath) : base(filePath) {}
-
- public override bool Init()
- {
- if (!base.Init())
- return false;
- if (_Version < 0)
- {
- CLog.Error("Can't find Ressource-DB!");
- return false;
- }
-
- if (_Version < CSettings.DatabaseCreditsRessourcesVersion)
- {
-#if DEBUG
- return _CreateDB() && _UpdateV1();
-#else
- CLog.Error("Upgrading Ressource-DB not possible");
- return false;
-#endif
- }
-
- return true;
- }
-
- public bool GetCreditsRessource(string fileName, ref CTextureRef tex)
- {
- if (_Connection == null)
- return false;
- bool result = false;
-
- using (var command = new SQLiteCommand(_Connection))
- {
- command.CommandText = "SELECT id, width, height FROM Images WHERE [Path] = @path";
- command.Parameters.Add("@path", DbType.String, 0).Value = fileName;
-
- SQLiteDataReader reader = command.ExecuteReader();
-
- if (reader != null && reader.HasRows)
- {
- reader.Read();
- int id = reader.GetInt32(0);
- int w = reader.GetInt32(1);
- int h = reader.GetInt32(2);
- reader.Close();
-
- command.CommandText = "SELECT Data FROM ImageData WHERE ImageID = @id";
- command.Parameters.Add("@id", DbType.Int32).Value = id;
- reader = command.ExecuteReader();
-
- if (reader.HasRows)
- {
- result = true;
- reader.Read();
- byte[] data = _GetBytes(reader);
- tex = CDraw.AddTexture(w, h, data);
- }
- }
-
- if (reader != null)
- reader.Dispose();
- }
-
- return result;
- }
-
-#if DEBUG
- //Update from V0 (empty) to V1
- private bool _UpdateV1()
- {
- if (_Connection == null || _Version >= 1)
- return false;
- using (SQLiteTransaction transaction = _Connection.BeginTransaction())
- {
- try
- {
- foreach (string file in _FilesV1)
- {
- string filePath = Path.Combine(CSettings.ProgramFolder, file);
- if (!_AddImageToCreditsDB(filePath, transaction))
- {
- transaction.Rollback();
- return false;
- }
- }
- using (SQLiteCommand command = new SQLiteCommand(_Connection))
- {
- command.Transaction = transaction;
- command.CommandText = "Update Version SET Value=@Value)";
- command.Parameters.Add("@Value", DbType.Int32).Value = 1;
- command.ExecuteNonQuery();
- }
- transaction.Commit();
- }
- catch (Exception)
- {
- transaction.Rollback();
- return false;
- }
- }
- return true;
- }
-
- //If you want to add an image to db, call this method!
- private bool _AddImageToCreditsDB(string imagePath, SQLiteTransaction transaction)
- {
- if (_Connection == null || !File.Exists(imagePath))
- return false;
-
- Bitmap origin;
- try
- {
- origin = new Bitmap(imagePath);
- }
- catch (Exception)
- {
- CLog.Error("Error loading image: " + imagePath);
- return false;
- }
- try
- {
- int w = origin.Width;
- int h = origin.Height;
- byte[] data = new byte[w * h * 4];
-
- BitmapData bmpData = origin.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
- Marshal.Copy(bmpData.Scan0, data, 0, w * h * 4);
- origin.UnlockBits(bmpData);
-
- using (SQLiteCommand command = new SQLiteCommand(_Connection))
- {
- command.Transaction = transaction;
- command.CommandText = "INSERT INTO Images (Path, width, height) VALUES (@path, @w, @h)";
- command.Parameters.Add("@path", DbType.String).Value = Path.GetFileName(imagePath);
- command.Parameters.Add("@w", DbType.Int32).Value = w;
- command.Parameters.Add("@h", DbType.Int32).Value = h;
- command.ExecuteNonQuery();
- }
-
- int id = -1;
- using (SQLiteCommand command = new SQLiteCommand(_Connection))
- {
- command.Transaction = transaction;
- command.CommandText = "SELECT id FROM Images WHERE [Path] = @path";
- command.Parameters.Add("@path", DbType.String, 0).Value = Path.GetFileName(imagePath);
- using (SQLiteDataReader reader = command.ExecuteReader())
- {
- if (reader != null)
- {
- reader.Read();
- id = reader.GetInt32(0);
- }
- }
- }
- if (id < 0)
- return false;
- using (SQLiteCommand command = new SQLiteCommand(_Connection))
- {
- command.Transaction = transaction;
- command.CommandText = "INSERT INTO ImageData (ImageID, Data) VALUES (@id, @data)";
- command.Parameters.Add("@id", DbType.Int32).Value = id;
- command.Parameters.Add("@data", DbType.Binary).Value = data;
- command.ExecuteNonQuery();
- return true;
- }
- }
- catch (Exception)
- {
- return false;
- }
- finally
- {
- origin.Dispose();
- }
- }
-
- private bool _CreateDB()
- {
- if (_Connection == null)
- return false;
-
- try
- {
- using (SQLiteCommand command = new SQLiteCommand(_Connection))
- {
- command.CommandText = "CREATE TABLE IF NOT EXISTS Version (Value INTEGER NOT NULL);";
- command.ExecuteNonQuery();
-
- command.CommandText = "INSERT INTO Version (Value) VALUES(0)";
- command.ExecuteNonQuery();
-
- command.CommandText = "CREATE TABLE IF NOT EXISTS Images ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " +
- "Path TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL);";
- command.ExecuteNonQuery();
-
- command.CommandText = "CREATE TABLE IF NOT EXISTS ImageData ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " +
- "ImageID INTEGER NOT NULL, Data BLOB NOT NULL);";
- command.ExecuteNonQuery();
- }
- }
- catch (Exception e)
- {
- CLog.Error("Error creating Ressource DB " + e);
- return false;
- }
- return true;
- }
-#endif
- }
-}
\ No newline at end of file
diff --git a/Vocaluxe/Screens/CScreenCredits.cs b/Vocaluxe/Screens/CScreenCredits.cs
index 824f25f4..b7f9bb8e 100644
--- a/Vocaluxe/Screens/CScreenCredits.cs
+++ b/Vocaluxe/Screens/CScreenCredits.cs
@@ -1,16 +1,16 @@
-#region license
+#region license
// This file is part of Vocaluxe.
-//
+//
// Vocaluxe is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
-//
+//
// Vocaluxe is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
// along with Vocaluxe. If not, see .
#endregion
@@ -19,6 +19,8 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
+using System.Drawing;
+using System.IO;
using Vocaluxe.Base;
using Vocaluxe.Base.Fonts;
using VocaluxeLib;
@@ -28,152 +30,6 @@ using VocaluxeLib.Menu;
namespace Vocaluxe.Screens
{
- enum EDirection
- {
- Left,
- Right,
- Up
- }
-
- class CCreditTranslation
- {
- private readonly string _Language;
- private readonly List _Texts;
- public float StartTime;
-
- public float Y
- {
- get { return _Texts[0].Y; }
- set
- {
- float diff = value - _Texts[0].Y;
- foreach (CText t in _Texts)
- t.Y += diff;
- }
- }
-
- public float Alpha
- {
- get { return _Texts[0].Alpha; }
- set
- {
- foreach (CText t in _Texts)
- t.Alpha = value;
- }
- }
-
- public bool Visible
- {
- set
- {
- foreach (CText t in _Texts)
- t.Visible = value;
- }
- }
-
- public float LastY
- {
- get
- {
- int lastText = _Texts.Count - 1;
- return _Texts[lastText].Y + _Texts[lastText].H;
- }
- }
-
- public CCreditTranslation(string language, List texts)
- {
- _Language = language;
- _Texts = texts;
- }
-
- public void Reset()
- {
- StartTime = -1;
- Alpha = 1f;
- Visible = true;
- _Texts[0].Y = CSettings.RenderH + 1;
- float y = CSettings.RenderH + 1;
- foreach (CText t in _Texts)
- {
- y += 25;
- t.Y = y;
- }
- }
- }
-
- class CCreditName
- {
- private readonly CStatic _Image;
- private readonly CStatic _ImgDot;
- private readonly CParticleEffect _Particle;
- private readonly int _ParticleOffsetX;
- private readonly int _ParticleOffsetY;
- public EDirection Direction;
- public float StartTimeUp;
-
- public CCreditName(CStatic image, CStatic imgDot, CParticleEffect particle, int particleOffsetX, int particleOffsetY)
- {
- _Image = image;
- _ImgDot = imgDot;
- _Particle = particle;
- _ParticleOffsetX = (int)Math.Round(particleOffsetX * image.Rect.W / image.Texture.OrigSize.Width - particle.Rect.W / 2);
- _ParticleOffsetY = (int)Math.Round(particleOffsetY * image.Rect.H / image.Texture.OrigSize.Height - particle.Rect.H / 2);
- Visible = true;
- }
-
- public float X
- {
- get { return _Image.X; }
- set
- {
- _Image.X = value;
- _ImgDot.X = value + _ParticleOffsetX;
- _Particle.X = value + _ParticleOffsetX;
- }
- }
- public float Y
- {
- get { return _Image.Rect.Y; }
- set
- {
- _Image.Y = value;
- _ImgDot.Y = value + _ParticleOffsetY;
- _Particle.Y = value + _ParticleOffsetY;
- }
- }
-
- public float W
- {
- get { return _Image.Rect.W; }
- }
-
- public float H
- {
- get { return _Image.Rect.H; }
- }
-
- public float Alpha
- {
- get { return _Image.Alpha; }
- set
- {
- _Image.Alpha = value;
- _ImgDot.Alpha = value;
- }
- }
-
- public bool Visible
- {
- set
- {
- _Image.Visible = value;
- _ImgDot.Visible = value;
- _Particle.Visible = value;
- }
- get { return _Image.Visible; }
- }
- }
-
public class CScreenCredits : CMenu
{
// Version number for theme files. Increment it, if you've changed something on the theme files!
@@ -183,184 +39,178 @@ namespace Vocaluxe.Screens
}
private CStatic _Logo;
- private CParticleEffect _StarsRed;
- private CParticleEffect _StarsBlue;
- private List _CreditNames;
+
+ private Stopwatch _ScrollTimer;
- private List _Translations;
- private int _NumTranslationTexts;
-
- private Stopwatch _LogoTimer;
- private Stopwatch _CreditsTimer;
- private Stopwatch _TranslationsTimer;
- private Stopwatch _TextTimer;
-
- private List _Paragraphs;
- private List _ParagraphTexts;
+ private List _ScrollingElements;
+ private Dictionary _ElementStartYPositions;
+ private float _previousElapsedMilliseconds;
private CTextureRef _TexLogo;
- private CTextureRef _TexPerfectNoteStar;
-
- private CTextureRef _TexRedDot;
- private CTextureRef _TexBlueDot;
-
- private CTextureRef _TexNameBrunzel;
- private CTextureRef _TexNameDarkice;
- private CTextureRef _TexNameFlokuep;
- private CTextureRef _TexNameFlamefire;
- private CTextureRef _TexNameLukeIam;
- private CTextureRef _TexNameMesand;
- private CTextureRef _TexNameBohning;
- private CTextureRef _TexNameBabene03;
-
- private SThemeBackground _BGTheme;
+
public override EMusicType CurrentMusicType
{
- get { return EMusicType.None; }
+ get { return EMusicType.Background; }
}
public override void Init()
{
base.Init();
- _LogoTimer = new Stopwatch();
- _CreditsTimer = new Stopwatch();
- _TranslationsTimer = new Stopwatch();
- _TextTimer = new Stopwatch();
-
- //Text for last part of credits.
- _ParagraphTexts = new List();
- _Paragraphs = new List();
-
- string paragraph = "Inspired by the achievements of UltraStar Deluxe and its variants and pursuing the goal of making " +
- "a good thing even better, we ended up rewriting the game from scratch. And a new implementation in a new " +
- "programming language called for a new name - and VOCALUXE [ˈvoʊˈkəˈlʌks] it is!";
- string[] words = paragraph.Split(new char[] {' '});
- _Paragraphs.Add(words);
-
- paragraph = "This first public version has already implemented many of the original features and it is fully " +
- "compatible with all the song files in your existing song collection. The code design allows a much faster " +
- "implementation of new features, thus the roadmap for the next few stable releases is packed and we expect much " +
- "shorter release cycles than ever before. And, of course, our and your ideas may be the features of tomorrow.";
- words = paragraph.Split(new char[] {' '});
- _Paragraphs.Add(words);
-
- paragraph = "We appreciate the feedback in the beta release phase and are, of course, always open for bug reports, " +
- "suggestions for improvements and ideas for new features. We would also like to thank the translators who make " +
- "Vocaluxe an international experience from the very beginning and all those diligent song makers out there - " +
- "there's something for everyone in the huge collection of available songs! Last but not least, thanks to " +
- "Kosal Sen's Philly Sans type used in the Vocaluxe Logo.";
- words = paragraph.Split(new char[] {' '});
- _Paragraphs.Add(words);
-
- paragraph = "Go ahead and grab your mics, crank up your stereo, warm up your voice and get ready to sing to the best " +
- "of your abilities!";
- words = paragraph.Split(new char[] {' '});
- _Paragraphs.Add(words);
-
- _BGTheme.Type = EBackgroundTypes.Color;
- _BGTheme.Color = new SThemeColor {Name = null, R = 0, G = 0.18f, B = 0.474f, A = 1};
+ _ScrollTimer = new Stopwatch();
+ _ScrollingElements = new List();
+ _ElementStartYPositions = new Dictionary();
}
public override void LoadTheme(string xmlPath)
{
+ // Vocaluxe-Logo
bool ressourceOK = true;
- //Vocaluxe-Logo
- ressourceOK &= CDataBase.GetCreditsRessource("Logo_voc.png", ref _TexLogo);
+ string path = Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameGraphics, CSettings.FileNameCreditsLogo);
- //Little stars for logo
- ressourceOK &= CDataBase.GetCreditsRessource("PerfectNoteStar.png", ref _TexPerfectNoteStar);
-
- ressourceOK &= CDataBase.GetCreditsRessource("redDot.png", ref _TexRedDot);
- ressourceOK &= CDataBase.GetCreditsRessource("blueDot.png", ref _TexBlueDot);
-
- ressourceOK &= CDataBase.GetCreditsRessource("brunzel.png", ref _TexNameBrunzel);
- ressourceOK &= CDataBase.GetCreditsRessource("Darkice.png", ref _TexNameDarkice);
- ressourceOK &= CDataBase.GetCreditsRessource("flokuep.png", ref _TexNameFlokuep);
- ressourceOK &= CDataBase.GetCreditsRessource("flamefire.png", ref _TexNameFlamefire);
- ressourceOK &= CDataBase.GetCreditsRessource("lukeIam.png", ref _TexNameLukeIam);
- ressourceOK &= CDataBase.GetCreditsRessource("bohning.png", ref _TexNameBohning);
- ressourceOK &= CDataBase.GetCreditsRessource("mesand.png", ref _TexNameMesand);
- ressourceOK &= CDataBase.GetCreditsRessource("babene03.png", ref _TexNameBabene03);
-
- if (!ressourceOK)
- CLog.Fatal("Could not load all ressources!");
-
- //Prepare Text
- int lastY = 280;
- foreach (string[] paragraph in _Paragraphs)
+ if (File.Exists(path))
{
- string line = "";
- for (int e = 0; e < paragraph.Length; e++)
- {
- if (paragraph[e] == null)
- continue;
- string newLine = " " + paragraph[e];
- CText text = GetNewText(75, lastY, -2, 25, -1, EAlignment.Left, EStyle.Bold, "Outline", new SColorF(1, 1, 1, 1), line);
- text.Visible = false;
- if (CFonts.GetTextBounds(text).Width < (CSettings.RenderW - 220))
- {
- line += newLine;
-
- //Check if all words are used
- if ((e + 1) == paragraph.Length)
- {
- text.Text = line;
- _ParagraphTexts.Add(text);
- line = "";
- lastY += 40;
- }
- }
- else
- {
- _ParagraphTexts.Add(text);
- line = newLine;
- lastY += 27;
- }
- _AddText(text);
- }
+ _TexLogo = CDraw.AddTexture(path);
+ ressourceOK &= _TexLogo != null;
+ }
+ else
+ {
+ ressourceOK = false;
+ }
+ if (!ressourceOK)
+ {
+ CLog.Fatal("Could not load all resources!");
}
+ // Initialize background theme
+ SThemeBackground _BGTheme = new SThemeBackground
+ {
+ Type = EBackgroundTypes.Color,
+ Color = new SThemeColor { Name = "Black", R = 0f, G = 0f, B = 0f, A = 1f }
+ };
+
+ // Create and add background
CBackground bg = new CBackground(_BGTheme, -1);
bg.LoadSkin();
_AddBackground(bg);
- //Vocaluxe-Logo
+ // Position Y for the first scrolling element
+ float scrollY = CSettings.RenderH - 1f;
+
+ // Create logo
_Logo = GetNewStatic(_TexLogo, new SColorF(1, 1, 1, 1),
- new SRectF((float)(CSettings.RenderW - _TexLogo.OrigSize.Width) / 2, -270, _TexLogo.OrigSize.Width, _TexLogo.OrigSize.Height, -2));
+ new SRectF((float)(CSettings.RenderW - _TexLogo.OrigSize.Width) / 2, scrollY, _TexLogo.OrigSize.Width, _TexLogo.OrigSize.Height, -2));
+ _Logo.Visible = false;
_AddStatic(_Logo);
+ _ScrollingElements.Add(_Logo);
+ _ElementStartYPositions[_Logo] = scrollY;
- //Little stars for logo
- var numstars = (int)(_Logo.Rect.W * 0.25f / 2f);
- var partRect = new SRectF(_Logo.Rect.X, _Logo.Rect.Y, _Logo.Rect.W, _Logo.Rect.H, -1);
- _StarsRed = _GetStarParticles(numstars, true, partRect, true);
- _StarsBlue = _GetStarParticles(numstars, false, partRect, true);
- _AddParticleEffect(_StarsRed);
- _AddParticleEffect(_StarsBlue);
+ scrollY += _Logo.Rect.H + 20f; // Update scrollY after logo
- //Credit names
- _CreditNames = new List();
+ // Helper variables for font sizes
+ int bigHeadlineSize = 45;
+ int headlineSize = 40;
+ int boldSize = 35;
+ int textSize = 30;
+ float paragraphSpacing = 30f; // Space between paragraphs
- _AddNewCreditName(_TexNameBrunzel, 502, 29, true);
- _AddNewCreditName(_TexNameDarkice, 360, 55, true);
- _AddNewCreditName(_TexNameFlokuep, 214, 14, true);
- _AddNewCreditName(_TexNameFlamefire, 496, 46, true);
- _AddNewCreditName(_TexNameLukeIam, 411, 26, true);
- _AddNewCreditName(_TexNameBohning, 383, 54, false);
- _AddNewCreditName(_TexNameMesand, 525, 13, false);
- _AddNewCreditName(_TexNameBabene03, 33, 26, false);
+ // Helper method to add text with formatting
+ void AddText(string content, int size, EStyle style, float yOffset, EAlignment alignment = EAlignment.Center)
+ {
+ CText text = GetNewText(new CText(CSettings.RenderW / 2, scrollY + yOffset, -2f, size, -1, alignment, style, "Outline", new SColorF(1, 1, 1, 1), content));
+ text.Visible = false;
+ _ScrollingElements.Add(text);
+ _AddText(text);
+ _ElementStartYPositions[text] = text.Y;
+ scrollY += size + yOffset;
+ }
- _AddTranslations();
+ // Intro
+ AddText("12 Years Vocaluxe!", bigHeadlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing;
+ AddText("A heartfelt thank you to all the people who have contributed to making Vocaluxe a reality over the past 12 years.", textSize, EStyle.Normal, 0);
+ AddText("Your dedication, time, and open-source spirit have been incredible. Keep contributing or re-join and make the world sing!", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing * 3;
+ AddText("VOCALUXE Team (2011-today)", bigHeadlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing * 2;
+
+ // Production
+ AddText("PRODUCTION", headlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing;
+ AddText("Project Leader", boldSize, EStyle.Bold, 0);
+ AddText("Florian Ostertag (2013-today)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing;
+ AddText("Project Management", boldSize, EStyle.Bold, 0);
+ AddText("Marwin (2023-today)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing * 3;
+
+ // Design
+ AddText("DESIGN", headlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing;
+ AddText("Original Concept/Idea", boldSize, EStyle.Bold, 0);
+ AddText("Alexander Eckhart (2011-2015)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing;
+ AddText("Party Mode Design", boldSize, EStyle.Bold, 0);
+ AddText("Alexander Eckhart (2011-2015)", textSize, EStyle.Normal, 0);
+ AddText("Florian Ostertag (2013-today)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing * 3;
+
+ // Programming/Engineering
+ AddText("PROGRAMMING/ENGINEERING", headlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing;
+ AddText("Technical Director", boldSize, EStyle.Bold, 0);
+ AddText("Alexander Eckhart (2011-2015)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing;
+ AddText("Software Engineer", boldSize, EStyle.Bold, 0);
+ AddText("Florian Ostertag (2013-today)", textSize, EStyle.Normal, 0);
+ AddText("LukeIam (2013-2019)", textSize, EStyle.Normal, 0);
+ AddText("Alexander Eckhart (2011-2015)", textSize, EStyle.Normal, 0);
+ AddText("Alexander Grund (2013-2015)", textSize, EStyle.Normal, 0);
+ AddText("Darkice", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing;
+ AddText("Programmer", boldSize, EStyle.Bold, 0);
+ AddText("Stefan1200 (2020-2022)", textSize, EStyle.Normal, 0);
+ AddText("Stephan Sundermann (2012-2014)", textSize, EStyle.Normal, 0);
+ AddText("GaryCXJk (2020-2021)", textSize, EStyle.Normal, 0);
+ AddText("Damien Laguerre (2024-today)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing * 3;
+
+ // Art/Graphics
+ AddText("ART/GRAPHICS", headlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing;
+ AddText("UI Artist/Graphics", boldSize, EStyle.Bold, 0);
+ AddText("Marwin (2023-today)", textSize, EStyle.Normal, 0);
+ AddText("Jiiniasu (2016-2020)", textSize, EStyle.Normal, 0);
+ AddText("Markus Bohning (2012)", textSize, EStyle.Normal, 0);
+ AddText("Mesand (2012)", textSize, EStyle.Normal, 0);
+ AddText("Babene03 (2012)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing;
+ AddText("Sound/Audio/Music Design", boldSize, EStyle.Bold, 0);
+ AddText("Marwin (2023-today)", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing;
+ AddText("Audio Producer", boldSize, EStyle.Bold, 0);
+ AddText("Ivymusic", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing * 3;
+
+ // Translation
+ AddText("TRANSLATION", headlineSize, EStyle.Bold, 0);
+ scrollY += paragraphSpacing;
+ AddText("Thanks to everyone translating Vocaluxe into different languages.", textSize, EStyle.Normal, 0);
+ scrollY += paragraphSpacing * 4;
+
+ // Website
+ AddText("www.vocaluxe.org", headlineSize, EStyle.Bold, 0);
+ AddText("www.open-music-games.org", headlineSize, EStyle.Bold, 0);
}
- public override void ReloadTheme(string xmlPath) {}
+ public override void ReloadTheme(string xmlPath) { }
- public override void SaveTheme() {}
+ public override void SaveTheme() { }
- public override void UnloadSkin() {}
+ public override void UnloadSkin() { }
- public override void ReloadSkin() {}
+ public override void ReloadSkin() { }
public override bool HandleInput(SKeyEvent keyEvent)
{
@@ -393,227 +243,80 @@ namespace Vocaluxe.Screens
return true;
}
- private CParticleEffect _GetStarParticles(int numStars, bool isRed, SRectF rect, bool bigParticles)
- {
- SColorF partColor = isRed ? new SColorF(1, 0, 0, 1) : new SColorF(0.149f, 0.415f, 0.819f, 1);
- int partSize = bigParticles ? 35 : 25;
- return GetNewParticleEffect(numStars, partColor, rect, _TexPerfectNoteStar, partSize, EParticleType.Star);
- }
-
- private void _AddNewCreditName(CTextureRef texture, int particleOffsetX, int particleOffsetY, bool bigParticles)
- {
- bool isRed = _CreditNames.Count % 2 == 0;
- int partRectSize = bigParticles ? 25 : 20;
- int partCount = bigParticles ? 8 : 6;
- CTextureRef texDot = isRed ? _TexRedDot : _TexBlueDot;
-
- CStatic image = GetNewStatic(texture, new SColorF(1, 1, 1, 1), new SRectF(-1, -1, 400, 120, -4));
-
- var particleRect = new SRectF(-1, -1, partRectSize, partRectSize, -6);
- SRectF imgDotRect = particleRect;
- imgDotRect.Z = -5;
- CStatic imgDot = GetNewStatic(texDot, new SColorF(1, 1, 1, 1), imgDotRect);
- CParticleEffect particle = _GetStarParticles(partCount, isRed, particleRect, bigParticles);
-
- var credit = new CCreditName(image, imgDot, particle, particleOffsetX, particleOffsetY);
-
- _CreditNames.Add(credit);
- _AddStatic(image);
- _AddStatic(imgDot);
- _AddParticleEffect(particle);
- }
-
- private void _AddTranslations()
- {
- CCreditTranslation intro = _AddNewTranslation("A special thanks to all our translators", new List { });
- CCreditTranslation asturian = _AddNewTranslation("Asturian", new List { "Puxarra" });
- CCreditTranslation czech = _AddNewTranslation("Czech", new List { "fri" });
- CCreditTranslation dutch = _AddNewTranslation("Dutch", new List { "thijsblaauw", "DeMarin" });
- CCreditTranslation french = _AddNewTranslation("French", new List { "pinky007", "javafrog" });
- CCreditTranslation hungarian = _AddNewTranslation("Hungarian", new List { "warez", "skyli" });
- CCreditTranslation italian = _AddNewTranslation("Italian", new List { "giuseppep", "LFactory", "yogotosleepnow" });
- CCreditTranslation portugese = _AddNewTranslation("Portuguese", new List { "2borG", "xventil" });
- CCreditTranslation spanish = _AddNewTranslation("Spanish", new List { "Pantero03", "RubenDjOn", "TeLiX", "karv" });
- CCreditTranslation swedish = _AddNewTranslation("Swedish", new List { "u28151", "Jiiniasu" });
- CCreditTranslation turkish = _AddNewTranslation("Turkish", new List { "spirax", "Swertyy" });
-
- _Translations = new List { intro, asturian, czech, dutch, french, hungarian, italian, spanish, swedish, turkish };
- }
-
- private CCreditTranslation _AddNewTranslation(string language, List translators)
- {
- List texts = new List();
- CText text = GetNewText(new CText(CSettings.RenderW / 2, CSettings.RenderH + 1, -4f, 30, -1, EAlignment.Center, EStyle.Bold, "Outline", new SColorF(1, 1, 1, 1), language));
- _AddText(text);
- texts.Add(text);
- _NumTranslationTexts++;
- float y = texts[0].Y;
- foreach (string t in translators)
- {
- y += 30;
- text = GetNewText(new CText(CSettings.RenderW / 2, y, -4f, 27, -1, EAlignment.Center, EStyle.Normal, "Outline", new SColorF(1, 1, 1, 1), t));
- _AddText(text);
- texts.Add(text);
- _NumTranslationTexts++;
- }
- CCreditTranslation cct = new CCreditTranslation(language, texts);
- return cct;
- }
-
public override void OnShow()
{
base.OnShow();
- foreach (CText text in _ParagraphTexts)
- text.Visible = false;
- bool isRight = true;
- foreach (CCreditName name in _CreditNames)
+ // Reset positions
+ foreach (dynamic element in _ScrollingElements)
{
- name.Visible = true;
- name.Direction = isRight ? EDirection.Right : EDirection.Left;
- name.X = -name.W;
- name.Y = 580;
- name.Alpha = 1;
- isRight = !isRight;
+ if (_ElementStartYPositions.TryGetValue(element, out float startY))
+ {
+ if (element is CText text)
+ {
+ text.Y = startY;
+ }
+ else if (element == _Logo)
+ {
+ _Logo.Y = startY;
+ }
+ }
}
- _Logo.Y = -270;
- _StarsRed.Y = _Logo.Y;
- _StarsBlue.Y = _Logo.Y;
- foreach (CCreditTranslation translation in _Translations)
- translation.Reset();
- _TextTimer.Reset();
- _LogoTimer.Reset();
- _CreditsTimer.Reset();
- _TranslationsTimer.Reset();
- }
+ // Set all elements to visible immediately
+ foreach (dynamic element in _ScrollingElements)
+ {
+ element.Visible = true;
+ }
- public override void OnShowFinish()
- {
- base.OnShowFinish();
-
- _LogoTimer.Start();
+ // Start the scroll timer immediately
+ _ScrollTimer.Reset();
+ _ScrollTimer.Start();
+ _previousElapsedMilliseconds = 0;
}
+
private bool _Animation()
{
- bool active = false;
- if (_LogoTimer.IsRunning)
+ if (!_ScrollTimer.IsRunning)
+ return false;
+
+ float deltaTime = (_ScrollTimer.ElapsedMilliseconds - _previousElapsedMilliseconds) / 1000f; // Convert milliseconds to seconds
+ _previousElapsedMilliseconds = _ScrollTimer.ElapsedMilliseconds;
+
+ float scrollSpeed = 60f;
+
+ foreach (dynamic element in _ScrollingElements)
{
- active = true;
-
- _Logo.Y = -270 + (270f / 3000f) * _LogoTimer.ElapsedMilliseconds;
- _StarsRed.Y = _Logo.Y;
- _StarsBlue.Y = _Logo.Y;
- if (_LogoTimer.ElapsedMilliseconds >= 2000 && !_CreditsTimer.IsRunning)
- _CreditsTimer.Start();
- if (_LogoTimer.ElapsedMilliseconds >= 3000)
- _LogoTimer.Stop();
- }
-
- if (_CreditsTimer.IsRunning)
- {
- active = true;
-
- for (int i = 0; i < _CreditNames.Count; i++)
+ if (element is CText text)
{
- if (!_CreditNames[i].Visible)
- continue;
- switch (_CreditNames[i].Direction)
- {
- case EDirection.Right:
- if (i * 4000f <= _CreditsTimer.ElapsedMilliseconds)
- {
- _CreditNames[i].X = -450 + (((CSettings.RenderW - _CreditNames[i].W) / 2) / 3000f) * (_CreditsTimer.ElapsedMilliseconds - (i * 4000f));
-
- //Check if name is in middle of screen and should go up
- if (_CreditNames[i].X >= (CSettings.RenderW - _CreditNames[i].W) / 2)
- {
- _CreditNames[i].Direction = EDirection.Up;
- _CreditNames[i].StartTimeUp = _CreditsTimer.ElapsedMilliseconds;
- }
- }
- break;
-
- case EDirection.Left:
- if (i * 4000f <= _CreditsTimer.ElapsedMilliseconds)
- {
- _CreditNames[i].X = CSettings.RenderW -
- (((CSettings.RenderW - _CreditNames[i].W) / 2) / 3000f) * (_CreditsTimer.ElapsedMilliseconds - (i * 4000f));
-
- //Check if name is in middle of screen and should go up
- if (_CreditNames[i].X <= (CSettings.RenderW - _CreditNames[i].W) / 2)
- {
- _CreditNames[i].Direction = EDirection.Up;
- _CreditNames[i].StartTimeUp = _CreditsTimer.ElapsedMilliseconds;
- }
- }
- break;
-
- case EDirection.Up:
- _CreditNames[i].Y = 580 - (430f / 3000f) * (_CreditsTimer.ElapsedMilliseconds - _CreditNames[i].StartTimeUp);
-
- //Set name inactive
- if (_CreditNames[i].Y <= 160f)
- {
- _CreditNames[i].Visible = false;
- //Check, if last name is shown
- if (i == _CreditNames.Count - 1)
- {
- _CreditsTimer.Stop();
- _TranslationsTimer.Start();
- }
- }
- else if (_CreditNames[i].Y <= 360f)
- {
- //Fade names out
- float alpha = ((360 - _CreditNames[i].Y) / 200).Clamp(0, 1);
- _CreditNames[i].Alpha = 1 - alpha;
- }
-
- break;
- }
+ text.Y -= scrollSpeed * deltaTime;
+ }
+ else if (element == _Logo)
+ {
+ _Logo.Y -= scrollSpeed * deltaTime;
}
}
- if (_TranslationsTimer.IsRunning)
+
+ // Check if the last element has scrolled off the top
+ dynamic lastElement = _ScrollingElements[_ScrollingElements.Count - 1];
+ float elementBottomY = 0;
+ if (lastElement is CText lastText)
{
- active = true;
-
- for (int i = 0; i < _Translations.Count; i++)
- {
- if (i * 1500f < _TranslationsTimer.ElapsedMilliseconds)
- {
- if (_Translations[i].StartTime == -1)
- _Translations[i].StartTime = _TranslationsTimer.ElapsedMilliseconds;
- float newY = 720f - (520f / 5000f) * (_TranslationsTimer.ElapsedMilliseconds - _Translations[i].StartTime);
- _Translations[i].Y = newY;
- }
-
- if (_Translations[i].Y <= 160f)
- {
- _Translations[i].Visible = false;
- if (i == _Translations.Count - 1)
- {
- _TranslationsTimer.Stop();
- _TextTimer.Start();
- foreach (CText text in _ParagraphTexts)
- text.Visible = true;
- }
- }
- if (_Translations[i].Y <= 360f)
- {
- //Fade out
- float alpha = ((360 - _Translations[i].Y) / 200).Clamp(0,1);
- _Translations[i].Alpha = 1 - alpha;
- }
- }
-
-
+ elementBottomY = lastText.Y + lastText.H;
+ }
+ else if (lastElement == _Logo)
+ {
+ elementBottomY = _Logo.Y + _Logo.Rect.H;
}
- if (_TextTimer.IsRunning)
- active = _TextTimer.ElapsedMilliseconds <= 10000;
- return active;
+ if (elementBottomY < 0)
+ {
+ _ScrollTimer.Stop();
+ return false;
+ }
+
+ return true;
}
}
-}
\ No newline at end of file
+}
diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj
index abd80829..60f10d24 100644
--- a/Vocaluxe/Vocaluxe.csproj
+++ b/Vocaluxe/Vocaluxe.csproj
@@ -198,7 +198,6 @@
-
@@ -589,4 +588,4 @@
-
\ No newline at end of file
+