2003-04-02 21:55:54 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
#include "NoteFieldPositioning.h"
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-02 21:55:54 +00:00
|
|
|
#include "RageDisplay.h"
|
|
|
|
|
#include "RageUtil.h"
|
|
|
|
|
#include "RageLog.h"
|
2003-04-03 00:01:04 +00:00
|
|
|
#include "RageMath.h"
|
2003-04-02 21:55:54 +00:00
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
#include "GameState.h"
|
|
|
|
|
#include "GameManager.h"
|
|
|
|
|
#include "IniFile.h"
|
|
|
|
|
#include "Game.h"
|
|
|
|
|
#include "Style.h"
|
|
|
|
|
#include "GameDef.h"
|
|
|
|
|
|
2003-04-15 02:52:58 +00:00
|
|
|
/* Copies of the current mode. Update this by calling Load. */
|
|
|
|
|
NoteFieldMode g_NoteFieldMode[NUM_PLAYERS];
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-15 02:52:58 +00:00
|
|
|
NoteFieldMode::NoteFieldMode()
|
2003-04-02 21:55:54 +00:00
|
|
|
{
|
2003-04-14 22:23:13 +00:00
|
|
|
m_fFov = 0;
|
2003-04-17 21:16:56 +00:00
|
|
|
m_fNear = 5;
|
|
|
|
|
m_fFar = 1000;
|
2003-04-15 02:52:58 +00:00
|
|
|
m_fFirstPixelToDrawScale = m_fLastPixelToDrawScale = 1.0f;
|
2003-04-02 21:55:54 +00:00
|
|
|
}
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-15 02:52:58 +00:00
|
|
|
void NoteFieldMode::BeginDrawTrack(int tn)
|
2003-04-02 21:55:54 +00:00
|
|
|
{
|
2003-04-15 02:52:58 +00:00
|
|
|
DISPLAY->PushMatrix();
|
|
|
|
|
|
2003-04-14 22:23:13 +00:00
|
|
|
/* It's useful to be able to use Actors like this, functioning only
|
|
|
|
|
* for a transformation. However, this is a big waste of matrix
|
|
|
|
|
* stack space, as each of these will push. Profile this. XXX */
|
|
|
|
|
m_Center.BeginDraw();
|
|
|
|
|
if(tn != -1)
|
|
|
|
|
m_CenterTrack[tn].BeginDraw();
|
|
|
|
|
|
|
|
|
|
if(m_fFov)
|
2003-04-17 21:16:56 +00:00
|
|
|
DISPLAY->EnterPerspective(m_fFov, true, m_fNear, m_fFar);
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-14 22:23:13 +00:00
|
|
|
m_Position.BeginDraw();
|
2003-04-17 23:21:22 +00:00
|
|
|
if(tn != -1)
|
2003-04-14 22:23:13 +00:00
|
|
|
m_PositionTrack[tn].BeginDraw();
|
2003-04-02 21:55:54 +00:00
|
|
|
}
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-15 02:52:58 +00:00
|
|
|
void NoteFieldMode::EndDrawTrack(int tn)
|
2003-04-10 08:49:25 +00:00
|
|
|
{
|
2003-04-17 23:21:22 +00:00
|
|
|
if(tn != -1)
|
2003-04-14 22:23:13 +00:00
|
|
|
m_PositionTrack[tn].EndDraw();
|
|
|
|
|
m_Position.EndDraw();
|
|
|
|
|
|
|
|
|
|
if(m_fFov)
|
2003-04-10 08:49:25 +00:00
|
|
|
DISPLAY->ExitPerspective();
|
|
|
|
|
|
2003-04-14 22:23:13 +00:00
|
|
|
if(tn != -1)
|
|
|
|
|
m_CenterTrack[tn].EndDraw();
|
|
|
|
|
m_Center.EndDraw();
|
2003-04-15 02:52:58 +00:00
|
|
|
|
|
|
|
|
DISPLAY->PopMatrix();
|
2003-04-14 22:23:13 +00:00
|
|
|
}
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
template <class T>
|
|
|
|
|
static bool GetValue(IniFile &ini, int pn,
|
|
|
|
|
const CString &key, const CString &valuename, T &value )
|
|
|
|
|
{
|
|
|
|
|
if(pn != -1 && ini.GetValue(key, ssprintf("P%i%s", pn+1, valuename.c_str()), value))
|
|
|
|
|
return true;
|
|
|
|
|
return ini.GetValue(key, valuename, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool GetValue(IniFile &ini, int pn,
|
2003-04-17 21:16:56 +00:00
|
|
|
const CString &key, const CString &valuename, Actor &value )
|
2003-04-02 21:55:54 +00:00
|
|
|
{
|
2003-04-17 21:16:56 +00:00
|
|
|
CString str;
|
2003-04-17 22:53:36 +00:00
|
|
|
if(!GetValue(ini, pn, key, valuename, str))
|
2003-04-17 21:16:56 +00:00
|
|
|
return false;
|
2003-04-02 21:55:54 +00:00
|
|
|
|
2003-04-17 21:16:56 +00:00
|
|
|
value.Command(str);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
void NoteFieldMode::Load(IniFile &ini, CString id, int pn)
|
2003-04-17 21:16:56 +00:00
|
|
|
{
|
|
|
|
|
m_Id = id;
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-17 21:16:56 +00:00
|
|
|
/* Required: */
|
|
|
|
|
ASSERT( ini.GetValue ( id, "Name", m_Name ) );
|
2003-04-10 08:49:25 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
GetValue( ini, pn, id, "Backdrop", m_Backdrop );
|
|
|
|
|
GetValue( ini, pn, id, "FOV", m_fFov );
|
|
|
|
|
GetValue( ini, pn, id, "NearClipDistance", m_fNear );
|
|
|
|
|
GetValue( ini, pn, id, "FarClipDistance", m_fFar );
|
|
|
|
|
GetValue( ini, pn, id, "PixelsDrawAheadScale", m_fFirstPixelToDrawScale );
|
|
|
|
|
GetValue( ini, pn, id, "PixelsDrawBehindScale", m_fLastPixelToDrawScale );
|
|
|
|
|
|
|
|
|
|
GetValue( ini, pn, id, "Center", m_Center );
|
|
|
|
|
GetValue( ini, pn, id, "Position", m_Position );
|
|
|
|
|
GetValue( ini, pn, id, "Judgment", m_JudgmentCmd );
|
|
|
|
|
GetValue( ini, pn, id, "Combo", m_ComboCmd );
|
|
|
|
|
|
|
|
|
|
/* Load per-track data: */
|
|
|
|
|
int t;
|
|
|
|
|
for(t = 0; t < MAX_NOTE_TRACKS; ++t)
|
2003-04-17 21:16:56 +00:00
|
|
|
{
|
2003-04-17 22:53:36 +00:00
|
|
|
GetValue( ini, pn, id, ssprintf("Center%i", t+1), m_CenterTrack[t] );
|
|
|
|
|
GetValue( ini, pn, id, ssprintf("Position%i", t+1), m_PositionTrack[t] );
|
|
|
|
|
|
|
|
|
|
GetValue( ini, pn, id, ssprintf("GrayButton", t+1), GrayButtonNames[t] );
|
|
|
|
|
GetValue( ini, pn, id, ssprintf("GrayButton%i", t+1), GrayButtonNames[t] );
|
2003-04-17 21:45:37 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
GetValue( ini, pn, id, ssprintf("NoteButton", t+1), NoteButtonNames[t] );
|
|
|
|
|
GetValue( ini, pn, id, ssprintf("NoteButton%i", t+1), NoteButtonNames[t] );
|
2003-04-17 21:45:37 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
GetValue( ini, pn, id, ssprintf("GhostButton", t+1), GhostButtonNames[t] );
|
|
|
|
|
GetValue( ini, pn, id, ssprintf("GhostButton%i", t+1), GhostButtonNames[t] );
|
2003-04-17 21:45:37 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
GetValue( ini, pn, id, ssprintf("HoldJudgment", t+1), m_HoldJudgmentCmd[t] );
|
|
|
|
|
GetValue( ini, pn, id, ssprintf("HoldJudgment%i", t+1), m_HoldJudgmentCmd[t] );
|
2003-04-17 21:16:56 +00:00
|
|
|
}
|
2003-04-14 22:23:13 +00:00
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
/* Grab this directly; don't try to set game specs per-player. */
|
2003-04-17 21:16:56 +00:00
|
|
|
CString sGames;
|
|
|
|
|
if(ini.GetValue( id, "Games", sGames ))
|
|
|
|
|
{
|
|
|
|
|
vector<CString> games;
|
|
|
|
|
split(sGames, ",", games);
|
|
|
|
|
for(unsigned n = 0; n < games.size(); ++n)
|
2003-04-14 22:23:13 +00:00
|
|
|
{
|
2003-04-17 21:16:56 +00:00
|
|
|
vector<CString> bits;
|
|
|
|
|
split(games[n], "-", bits);
|
|
|
|
|
ASSERT(bits.size() == 2);
|
|
|
|
|
|
|
|
|
|
const Game game = GAMEMAN->StringToGameType( bits[0] );
|
|
|
|
|
ASSERT(game != GAME_INVALID);
|
|
|
|
|
|
|
|
|
|
const Style style = GAMEMAN->GameAndStringToStyle( game, bits[1] );
|
|
|
|
|
ASSERT(style != STYLE_INVALID);
|
|
|
|
|
Styles.insert(style);
|
2003-04-10 08:49:25 +00:00
|
|
|
}
|
2003-04-17 21:16:56 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NoteFieldPositioning::NoteFieldPositioning(CString fn)
|
|
|
|
|
{
|
|
|
|
|
m_Filename = fn;
|
|
|
|
|
IniFile ini(fn);
|
|
|
|
|
if(!ini.ReadFile())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
for(IniFile::const_iterator i = ini.begin(); i != ini.end(); ++i)
|
|
|
|
|
{
|
|
|
|
|
NoteFieldMode m;
|
|
|
|
|
m.Load(ini, i->first);
|
2003-04-10 08:49:25 +00:00
|
|
|
|
|
|
|
|
Modes.push_back(m);
|
2003-04-02 21:55:54 +00:00
|
|
|
}
|
2003-04-10 08:49:25 +00:00
|
|
|
}
|
2003-04-02 21:55:54 +00:00
|
|
|
|
2003-04-15 02:52:58 +00:00
|
|
|
bool NoteFieldMode::MatchesCurrentGame() const
|
2003-04-10 08:49:25 +00:00
|
|
|
{
|
|
|
|
|
if(Styles.empty())
|
|
|
|
|
return true;
|
2003-04-03 00:06:30 +00:00
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
if(Styles.find(GAMESTATE->m_CurStyle) == Styles.end())
|
|
|
|
|
return false;
|
2003-04-03 00:01:04 +00:00
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
return true;
|
|
|
|
|
}
|
2003-04-03 00:01:04 +00:00
|
|
|
|
2003-04-15 02:52:58 +00:00
|
|
|
void NoteFieldPositioning::Load(PlayerNumber pn)
|
|
|
|
|
{
|
|
|
|
|
NoteFieldMode &mode = g_NoteFieldMode[pn];
|
|
|
|
|
|
|
|
|
|
mode = NoteFieldMode(); /* reset */
|
|
|
|
|
|
|
|
|
|
const StyleDef *s = GAMESTATE->GetCurrentStyleDef();
|
|
|
|
|
|
2003-04-17 21:16:56 +00:00
|
|
|
/* Load the settings in the style table by default. */
|
2003-04-15 02:52:58 +00:00
|
|
|
for(int tn = 0; tn < MAX_NOTE_TRACKS; ++tn)
|
|
|
|
|
{
|
|
|
|
|
const float fPixelXOffsetFromCenter = s->m_ColumnInfo[pn][tn].fXOffset;
|
|
|
|
|
mode.m_PositionTrack[tn].SetX(fPixelXOffsetFromCenter);
|
|
|
|
|
}
|
2003-04-17 21:16:56 +00:00
|
|
|
|
|
|
|
|
/* Is there a custom mode with the current name that fits the current game? */
|
2003-04-22 04:54:04 +00:00
|
|
|
const int ModeNum = GetID(GAMESTATE->m_PlayerOptions[pn].m_sPositioning);
|
2003-04-17 21:16:56 +00:00
|
|
|
if(ModeNum == -1)
|
|
|
|
|
return; /* No, only use the style table settings. */
|
|
|
|
|
|
|
|
|
|
/* We have a custom mode. Reload the mode on top of the default style
|
|
|
|
|
* table settings. */
|
|
|
|
|
IniFile ini(m_Filename);
|
|
|
|
|
if(!ini.ReadFile())
|
|
|
|
|
return;
|
|
|
|
|
|
2003-04-17 22:53:36 +00:00
|
|
|
mode.Load(ini, Modes[ModeNum].m_Id, pn);
|
2003-04-15 02:52:58 +00:00
|
|
|
}
|
|
|
|
|
|
2003-04-03 00:01:04 +00:00
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
/* Get the unique ID of the given name, for the current game/style. If it
|
|
|
|
|
* doesn't exist, return "". */
|
|
|
|
|
int NoteFieldPositioning::GetID(const CString &name) const
|
|
|
|
|
{
|
|
|
|
|
for(unsigned i = 0; i < Modes.size(); ++i)
|
|
|
|
|
{
|
2003-04-17 21:16:56 +00:00
|
|
|
if(Modes[i].m_Name.CompareNoCase(name))
|
2003-04-10 08:49:25 +00:00
|
|
|
continue;
|
2003-04-03 00:01:04 +00:00
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
if(!Modes[i].MatchesCurrentGame())
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
return i;
|
2003-04-02 21:55:54 +00:00
|
|
|
}
|
2003-04-03 00:01:04 +00:00
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
return -1;
|
2003-04-03 00:06:30 +00:00
|
|
|
}
|
|
|
|
|
|
2003-04-10 08:49:25 +00:00
|
|
|
|
|
|
|
|
/* Get all arrow modifier names for the current game. */
|
|
|
|
|
void NoteFieldPositioning::GetNamesForCurrentGame(vector<CString> &IDs)
|
|
|
|
|
{ // XXX dupes
|
|
|
|
|
/* Iterate over all keys. */
|
|
|
|
|
for(unsigned i = 0; i < Modes.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if(!Modes[i].MatchesCurrentGame())
|
|
|
|
|
continue;
|
|
|
|
|
|
2003-04-17 21:16:56 +00:00
|
|
|
IDs.push_back(Modes[i].m_Name);
|
2003-04-10 08:49:25 +00:00
|
|
|
}
|
2003-04-03 00:06:30 +00:00
|
|
|
}
|
2003-05-13 05:24:30 +00:00
|
|
|
|
|
|
|
|
bool NoteFieldPositioning::IsValidModeForAnyStyle(CString mode) const
|
|
|
|
|
{
|
|
|
|
|
for(unsigned i = 0; i < Modes.size(); ++i)
|
|
|
|
|
if(Modes[i].m_Name.CompareNoCase(mode)==0)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|