move title subst into its own class

This commit is contained in:
Glenn Maynard
2003-02-10 22:59:24 +00:00
parent 2cf35b96b8
commit 897c28868f
5 changed files with 214 additions and 147 deletions
+4 -147
View File
@@ -28,6 +28,7 @@
#include "Notes.h"
#include "GameState.h"
#include "FontCharAliases.h"
#include "TitleSubstitution.h"
#include "NotesLoaderSM.h"
#include "NotesLoaderDWI.h"
@@ -577,156 +578,12 @@ void Song::TidyUpData()
m_apNotes[i]->Compress();
}
struct TitleTrans
{
Regex TitleFrom, SubFrom, ArtistFrom;
CString TitleTo, SubTo, ArtistTo; /* plain text */
TitleTrans(CString tf, CString sf, CString af, CString tt, CString st, CString at):
TitleFrom(tf), SubFrom(sf), ArtistFrom(af),
TitleTo(tt), SubTo(st), ArtistTo(at) { }
bool Matches(CString title, CString sub, CString artist)
{
if(!TitleFrom.Compare(title)) return false; /* no match */
if(!SubFrom.Compare(sub)) return false; /* no match */
if(!ArtistFrom.Compare(artist)) return false; /* no match */
return true;
}
};
void Song::TranslateTitles()
{
/* XXX make theme metrics for these or something. */
static TitleSubst tsub;
static vector<TitleTrans> ttab;
/* These REs aren't completely tested. XXX */
if(ttab.empty())
{
/* Ambiguous, so check artist. Do this early; Riyu will be replaced later: */
ttab.push_back(TitleTrans("^Candy$", "", "^Luv.*", "CANDY &whitestar;", "", "") );
ttab.push_back(TitleTrans("^Candy$", "", ".*Riyu.*", "CANDY &whiteheart;", "", "") );
/* Make sure this appears after the above "Riyu" match, so it doesn't
* break it. I've seen both "Kosaku" and "Kosaka"; I think Kosaka is
* correct, but handle both. */
ttab.push_back(TitleTrans("", "", "Riyu Kosak[au]", "", "", "&kosaka1;&kosaka2;&hri;&hyu;") );
ttab.push_back(TitleTrans("", "", "Kosak[au] Riyu", "", "", "&kosaka1;&kosaka2;&hri;&hyu;") );
/* Matsuri Japan is often just "Japan". There may be other songs by
* this name, too, so match the artist, too. */
ttab.push_back(TitleTrans("^Japan$", "", "(Re-Venge)|(RevenG)", "&matsuri; JAPAN", "", "") );
/* Fix up hacked titles: */
ttab.push_back(TitleTrans("^Max 300$", "", "%", "", "", "&omega;") );
ttab.push_back(TitleTrans("^Bre=kdown$", "", "", "Bre&flipped-a;kdown", "", "") );
ttab.push_back(TitleTrans("^Candy #$", "", "", "Candy &whitestar;", "", "") );
ttab.push_back(TitleTrans("^Candy \\$$", "", "", "Candy &whiteheart;", "", "") );
ttab.push_back(TitleTrans("^} JAPAN$", "", "", "&matsuri; JAPAN", "", "") );
ttab.push_back(TitleTrans("^\\+\\{$", "", "", "&kakumei1;&kakumei2;", "", "") );
ttab.push_back(TitleTrans("^Sweet Sweet \\$ Magic$", "", "", "Sweet Sweet &whiteheart; Magic", "", "") );
/* Special stuff is done. Titles: */
ttab.push_back(TitleTrans("^Matsuri Japan$", "", "", "&matsuri; JAPAN", "", "") );
ttab.push_back(TitleTrans("^Kakumei$", "", "", "&kakumei1;&kakumei2;", "", "") );
ttab.push_back(TitleTrans("^Sweet Sweet (Love )?Magic$", "", "", "Sweet Sweet &whiteheart; Magic", "", "") );
ttab.push_back(TitleTrans("^Break ?Down!?$", "", "", "BRE&flipped-a;K DOWN!", "", "") );
/* サナ・モレッテ・ネ・エンテ
* People can't decide how they want to spell this, so cope with
* both l or r, and one or two l/r and t. */
ttab.push_back(TitleTrans("^Sana Mo((ll?)|(rr?))et(t?)e Ne Ente", "", "",
"&ksa;&kna;&kdot;&kmo;&kre;&kq;&kte;&kdot;&kne;&kdot;&ke;&kn;&kte;", "", ""));
ttab.push_back(TitleTrans("^Freckles$", "", "", "&hso;&hba;&hka;&hsu;", "", "") );
ttab.push_back(TitleTrans("^Sobakasu$", "", "", "&hso;&hba;&hka;&hsu;", "", "") );
/* 夜空のムコウ */
ttab.push_back(TitleTrans("^Yozora no Muko$", "", "", "&yozora1;&yozora2;&hno;&kmu;&kko;&ku;", "", "") );
/* 17才 */
ttab.push_back(TitleTrans("^17 ?(Sai)?$", "", "", "17&sai;", "", "") );
/* Handle "Mobo Moga", "Mobo * Moga"; spaces optional. */
ttab.push_back(TitleTrans("^Mobo ?\\*? ?Moga$", "", "", "MOBO&whitestar;MOGA", "", "") );
ttab.push_back(TitleTrans("^Love (Love )?Shine$", "", "", "LOVE &whiteheart; SHINE", "", "") );
/* ロマンスの神様 */
ttab.push_back(TitleTrans("^God of Romance$", "", "", "&kro;&kma;&kn;&ksu;&hno;&kami;&sama;", "", "") );
/* おどるポンポコリン */
ttab.push_back(TitleTrans("^Dancing Pompokolin$", "", "", "&ho;&hdo;&hru;&kpo;&kn;&kpo;&kko;&kri;&kn;", "", "") );
/* 青い振動 */
ttab.push_back(TitleTrans("^Aoi Shoudou$", "", "", "&aoi;&hi;&shoudou1;&shoudou2;", "", "") );
ttab.push_back(TitleTrans("^Blue Impulse$", "", "", "&aoi;&hi;&shoudou1;&shoudou2;", "", "") );
/* Handle a typo: */
ttab.push_back(TitleTrans("^Aio Shoudou$", "", "", "&aoi;&hi;&shoudou1;&shoudou2;", "", "") );
/* 大見解 */
ttab.push_back(TitleTrans("^Daikenkai$", "", "", "&ookii;&kenkai1;&kenkai2;", "", "") );
/* ♡LOVE²シュガ→♡ */
ttab.push_back(TitleTrans("^Love Love Sugar$", "", "", "&whiteheart;LOVE&squared; &ksi;&kyus;&kga;&rightarrow;&whiteheart;", "", "") );
/* 三毛猫ロック */
ttab.push_back(TitleTrans("^Mikeneko Rock$", "", "", "&num-san;&hair;&neko;&kro;&kq;&kku;", "", "") );
/* 桜 */
ttab.push_back(TitleTrans("^Sakura$", "", "", "&sakura;", "", "") );
/* 魔法の扉, スペース☆マコのテーマ (handle Door and Doors) */
ttab.push_back(TitleTrans("^(Doors? of Magic)|(Mahou no Tobira)$", "", "", "&mahou1;&mahou2;&hno;&tobira;", "&ksu;&kpe;&kdash;&ksu;&whitestar;&kma;&kko;&hno;&kti;&kdash;&kmu;", "") );
/* Subtitles: */
/* それぞれの明日 (title is Graduation) */
ttab.push_back(TitleTrans("", "^Each Tomorrow$", "", "", "&hso;&hre;&hzo;&hre;&hno;&aka;&nichi;", "") );
/* Artists: */
ttab.push_back(TitleTrans("", "", "^Omega$", "", "", "&omega;") );
ttab.push_back(TitleTrans("", "", "^ZZ$", "", "", "&doublezeta;") );
/* 亜熱帯マジ-SKA爆弾 (serious tropical ska bomb? ruh roh) */
ttab.push_back(TitleTrans("", "", "^Anettai Maji.*Ska (Bakudan|Bukuden)", "", "", "&anettai1;&anettai2;&anettai3;&kma;&kji;-SKA&bakudan1;&bakudan2;") );
/* メキシコ民謡 */
ttab.push_back(TitleTrans("", "", "^Spanish Folk Music$", "", "", "&kme;&kki;&ksi;&kko;&minyou1;&minyou2;") );
/* 新谷さなえ (Sanae or incorrect Sana) */
ttab.push_back(TitleTrans("", "", "Sanae? Shintani", "", "", "&shintani1;&shintani2;&hsa;&hna;&he;") );
ttab.push_back(TitleTrans("", "", "dj TAKA feat. ?Noria", "", "", "dj TAKA feat. &hno;&hri;&ha;") );
/* くにたけみゆき */
ttab.push_back(TitleTrans("", "", "Miyuki Kunitake", "", "", "&hku;&hni;&hta;&hke;&hmi;&hyu;&hki;") );
ttab.push_back(TitleTrans("", "", "Kunitake Miyuki", "", "", "&hku;&hni;&hta;&hke;&hmi;&hyu;&hki;") );
}
for(unsigned i = 0; i < ttab.size(); ++i)
{
if(!ttab[i].Matches(m_sMainTitle, m_sSubTitle, m_sArtist))
continue;
/* The song matches. Replace whichever strings aren't empty: */
if(!ttab[i].TitleTo.empty())
{
m_sMainTitleTranslit = m_sMainTitle;
m_sMainTitle = ttab[i].TitleTo;
FontCharAliases::ReplaceMarkers( m_sMainTitle );
}
if(!ttab[i].SubTo.empty())
{
m_sSubTitleTranslit = m_sSubTitle;
m_sSubTitle = ttab[i].SubTo;
FontCharAliases::ReplaceMarkers( m_sSubTitle );
}
if(!ttab[i].ArtistTo.empty())
{
m_sArtistTranslit = m_sArtist;
m_sArtist = ttab[i].ArtistTo;
FontCharAliases::ReplaceMarkers( m_sArtist );
}
}
tsub.Subst(m_sMainTitle, m_sSubTitle, m_sArtist,
m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit);
}
void Song::ReCalculateRadarValuesAndLastBeat()
+8
View File
@@ -529,6 +529,14 @@ SOURCE=.\StyleDef.h
SOURCE=.\StyleInput.h
# End Source File
# Begin Source File
SOURCE=.\TitleSubstitution.cpp
# End Source File
# Begin Source File
SOURCE=.\TitleSubstitution.h
# End Source File
# End Group
# Begin Group "File Types"
+6
View File
@@ -649,6 +649,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
<File
RelativePath="StyleInput.h">
</File>
<File
RelativePath="TitleSubstitution.cpp">
</File>
<File
RelativePath="TitleSubstitution.h">
</File>
</Filter>
<Filter
Name="File Types"
+176
View File
@@ -0,0 +1,176 @@
#include "stdafx.h"
#include "TitleSubstitution.h"
#include "RageUtil.h"
#include "FontCharAliases.h"
struct TitleTrans
{
Regex TitleFrom, SubFrom, ArtistFrom;
CString TitleTo, SubTo, ArtistTo; /* plain text */
TitleTrans(CString tf, CString sf, CString af, CString tt, CString st, CString at):
TitleFrom(tf), SubFrom(sf), ArtistFrom(af),
TitleTo(tt), SubTo(st), ArtistTo(at) { }
bool Matches(CString title, CString sub, CString artist);
};
vector<TitleTrans> ttab;
bool TitleTrans::Matches(CString title, CString sub, CString artist)
{
if(!TitleFrom.Compare(title)) return false; /* no match */
if(!SubFrom.Compare(sub)) return false; /* no match */
if(!ArtistFrom.Compare(artist)) return false; /* no match */
return true;
}
void TitleSubst::AddTrans(const CString &tf, const CString &sf, const CString &af,
const CString &tt, const CString &st, const CString &at)
{
ttab.push_back(new TitleTrans(tf, sf, af, tt, st, at));
}
void TitleSubst::Subst(CString &title, CString &subtitle, CString &artist,
CString &ttitle, CString &tsubtitle, CString &tartist)
{
for(unsigned i = 0; i < ttab.size(); ++i)
{
if(!ttab[i]->Matches(title, subtitle, artist))
continue;
/* The song matches. Replace whichever strings aren't empty: */
if(!ttab[i]->TitleTo.empty())
{
ttitle = title;
title = ttab[i]->TitleTo;
FontCharAliases::ReplaceMarkers( title );
}
if(!ttab[i]->SubTo.empty())
{
tsubtitle = subtitle;
subtitle = ttab[i]->SubTo;
FontCharAliases::ReplaceMarkers( subtitle );
}
if(!ttab[i]->ArtistTo.empty())
{
tartist = artist;
artist = ttab[i]->ArtistTo;
FontCharAliases::ReplaceMarkers( artist );
}
}
}
TitleSubst::TitleSubst()
{
/* Ambiguous, so check artist. Do this early; Riyu will be replaced later: */
AddTrans("^Candy$", "", "^Luv.*", "CANDY &whitestar;", "", "");
AddTrans("^Candy$", "", ".*Riyu.*", "CANDY &whiteheart;", "", "");
/* Make sure this appears after the above "Riyu" match, so it doesn't
* break it. I've seen both "Kosaku" and "Kosaka"; I think Kosaka is
* correct, but handle both. */
AddTrans("", "", "Riyu Kosak[au]", "", "", "&kosaka1;&kosaka2;&hri;&hyu;");
AddTrans("", "", "Kosak[au] Riyu", "", "", "&kosaka1;&kosaka2;&hri;&hyu;");
/* Matsuri Japan is often just "Japan". There may be other songs by
* this name, too, so match the artist, too. */
AddTrans("^Japan$", "", "(Re-Venge)|(RevenG)", "&matsuri; JAPAN", "", "");
/* Fix up hacked titles: */
AddTrans("^Max 300$", "", "%", "", "", "&omega;");
AddTrans("^Bre=kdown$", "", "", "Bre&flipped-a;kdown", "", "");
AddTrans("^Candy #$", "", "", "Candy &whitestar;", "", "");
AddTrans("^Candy \\$$", "", "", "Candy &whiteheart;", "", "");
AddTrans("^} JAPAN$", "", "", "&matsuri; JAPAN", "", "");
AddTrans("^\\+\\{$", "", "", "&kakumei1;&kakumei2;", "", "");
AddTrans("^Sweet Sweet \\$ Magic$", "", "", "Sweet Sweet &whiteheart; Magic", "", "");
/* Special stuff is done. Titles: */
AddTrans("^Matsuri Japan$", "", "", "&matsuri; JAPAN", "", "");
AddTrans("^Kakumei$", "", "", "&kakumei1;&kakumei2;", "", "");
AddTrans("^Sweet Sweet (Love )?Magic$", "", "", "Sweet Sweet &whiteheart; Magic", "", "");
AddTrans("^Break ?Down!?$", "", "", "BRE&flipped-a;K DOWN!", "", "");
/* サナ・モレッテ・ネ・エンテ
* People can't decide how they want to spell this, so cope with
* both l or r, and one or two l/r and t. */
AddTrans("^Sana Mo((ll?)|(rr?))et(t?)e Ne Ente", "", "",
"&ksa;&kna;&kdot;&kmo;&kre;&kq;&kte;&kdot;&kne;&kdot;&ke;&kn;&kte;", "", "");
AddTrans("^Freckles$", "", "", "&hso;&hba;&hka;&hsu;", "", "");
AddTrans("^Sobakasu$", "", "", "&hso;&hba;&hka;&hsu;", "", "");
/* 夜空のムコウ */
AddTrans("^Yozora no Muko$", "", "", "&yozora1;&yozora2;&hno;&kmu;&kko;&ku;", "", "");
/* 17才 */
AddTrans("^17 ?(Sai)?$", "", "", "17&sai;", "", "");
/* Handle "Mobo Moga", "Mobo * Moga"; spaces optional. */
AddTrans("^Mobo ?\\*? ?Moga$", "", "", "MOBO&whitestar;MOGA", "", "");
AddTrans("^Love (Love )?Shine$", "", "", "LOVE &whiteheart; SHINE", "", "");
/* ロマンスの神様 */
AddTrans("^God of Romance$", "", "", "&kro;&kma;&kn;&ksu;&hno;&kami;&sama;", "", "");
/* おどるポンポコリン */
AddTrans("^Dancing Pompokolin$", "", "", "&ho;&hdo;&hru;&kpo;&kn;&kpo;&kko;&kri;&kn;", "", "");
/* 青い振動 */
AddTrans("^Aoi Shoudou$", "", "", "&aoi;&hi;&shoudou1;&shoudou2;", "", "");
AddTrans("^Blue Impulse$", "", "", "&aoi;&hi;&shoudou1;&shoudou2;", "", "");
/* Handle a typo: */
AddTrans("^Aio Shoudou$", "", "", "&aoi;&hi;&shoudou1;&shoudou2;", "", "");
/* 大見解 */
AddTrans("^Daikenkai$", "", "", "&ookii;&kenkai1;&kenkai2;", "", "");
/* ♡LOVE²シュガ→♡ */
AddTrans("^Love Love Sugar$", "", "", "&whiteheart;LOVE&squared; &ksi;&kyus;&kga;&rightarrow;&whiteheart;", "", "");
/* 三毛猫ロック */
AddTrans("^Mikeneko Rock$", "", "", "&num-san;&hair;&neko;&kro;&kq;&kku;", "", "");
/* 桜 */
AddTrans("^Sakura$", "", "", "&sakura;", "", "");
/* 魔法の扉, スペース☆マコのテーマ (handle Door and Doors) */
AddTrans("^(Doors? of Magic)|(Mahou no Tobira)$", "", "", "&mahou1;&mahou2;&hno;&tobira;", "&ksu;&kpe;&kdash;&ksu;&whitestar;&kma;&kko;&hno;&kti;&kdash;&kmu;", "");
AddTrans("^Senorita$", "", "", "Se&x00F1;orita", "", "");
AddTrans("^Senorita\\(Speedy Mix\\)$", "", "", "Se&x00F1;orita", "Speedy Mix", "");
AddTrans("^La Senorita$", "", "", "La Se&x00F1;orita", "", "");
AddTrans("^La Senorita Virtual$", "", "", "La Se&x00F1;orita Virtual", "", "");
/* Subtitles: */
/* それぞれの明日 (title is Graduation) */
AddTrans("", "^Each Tomorrow$", "", "", "&hso;&hre;&hzo;&hre;&hno;&aka;&nichi;", "");
/* Artists: */
AddTrans("", "", "^Omega$", "", "", "&omega;");
AddTrans("", "", "^ZZ$", "", "", "&doublezeta;");
/* 亜熱帯マジ-SKA爆弾 (serious tropical ska bomb? ruh roh) */
AddTrans("", "", "^Anettai Maji.*Ska (Bakudan|Bukuden)", "", "", "&anettai1;&anettai2;&anettai3;&kma;&kji;-SKA&bakudan1;&bakudan2;");
/* メキシコ民謡 */
AddTrans("", "", "^Spanish Folk Music$", "", "", "&kme;&kki;&ksi;&kko;&minyou1;&minyou2;");
/* 新谷さなえ (Sanae or incorrect Sana) */
AddTrans("", "", "Sanae? Shintani", "", "", "&shintani1;&shintani2;&hsa;&hna;&he;");
AddTrans("", "", "dj TAKA feat. ?Noria", "", "", "dj TAKA feat. &hno;&hri;&ha;");
/* くにたけみゆき */
AddTrans("", "", "Miyuki Kunitake", "", "", "&hku;&hni;&hta;&hke;&hmi;&hyu;&hki;");
AddTrans("", "", "Kunitake Miyuki", "", "", "&hku;&hni;&hta;&hke;&hmi;&hyu;&hki;");
}
TitleSubst::~TitleSubst()
{
for(unsigned i = 0; i < ttab.size(); ++i)
delete ttab[i];
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef TITLE_SUBSTITUTION_H
#define TITLE_SUBSTITUTION_H 1
struct TitleTrans;
class TitleSubst
{
vector<TitleTrans *> ttab;
void AddTrans(const CString &tf, const CString &sf, const CString &af,
const CString &tt, const CString &st, const CString &at);
public:
TitleSubst();
~TitleSubst();
void Subst(CString &title, CString &sub, CString &artist,
CString &ttitle, CString &tsub, CString &tartist);
};
#endif