Files
itgmania212121/stepmania/src/NoteFieldPositioning.cpp
T

216 lines
6.1 KiB
C++
Raw Normal View History

#include "global.h"
#include "NoteFieldPositioning.h"
2003-04-10 08:49:25 +00:00
#include "RageDisplay.h"
#include "RageUtil.h"
#include "RageLog.h"
2003-04-03 00:01:04 +00:00
#include "RageMath.h"
2003-04-10 08:49:25 +00:00
#include "GameState.h"
#include "GameManager.h"
#include "IniFile.h"
2004-07-25 17:07:32 +00:00
#include "Game.h"
#include "ScreenDimensions.h"
2003-04-10 08:49:25 +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
NoteFieldMode::NoteFieldMode()
{
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;
m_fFirstPixelToDrawScale = m_fLastPixelToDrawScale = 1.0f;
}
2003-04-10 08:49:25 +00:00
void NoteFieldMode::BeginDrawTrack(int tn)
{
DISPLAY->CameraPushMatrix();
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 */
if(m_fFov)
2004-11-05 06:35:10 +00:00
DISPLAY->LoadMenuPerspective(m_fFov, SCREEN_CENTER_X, SCREEN_CENTER_Y);
2003-04-10 08:49:25 +00:00
if(tn != -1)
2004-10-28 03:01:58 +00:00
{
DISPLAY->PushMatrix();
DISPLAY->Translate( m_fPositionTrackX[tn], 0, 0 );
}
}
2003-04-10 08:49:25 +00:00
void NoteFieldMode::EndDrawTrack(int tn)
2003-04-10 08:49:25 +00:00
{
if(tn != -1)
2004-10-28 03:01:58 +00:00
DISPLAY->PopMatrix();
DISPLAY->CameraPopMatrix();
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);
}
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-09-18 19:07:04 +00:00
// if we aren't loading a player, we can bail here.
if(pn == -1)
return;
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 );
CString s;
2004-12-03 05:19:46 +00:00
if( GetValue( ini, pn, id, "Judgment", s ) ) m_JudgmentCmd = ParseCommands(s);
if( GetValue( ini, pn, id, "Combo", s ) ) m_ComboCmd = ParseCommands(s);
2003-04-17 22:53:36 +00:00
/* Load per-track data: */
int t;
for(t = 0; t < MAX_NOTE_TRACKS; ++t)
2003-04-17 21:16:56 +00:00
{
2003-12-18 00:33:02 +00:00
GetValue( ini, pn, id, ssprintf("GrayButton"), GrayButtonNames[t] );
2003-04-17 22:53:36 +00:00
GetValue( ini, pn, id, ssprintf("GrayButton%i", t+1), GrayButtonNames[t] );
2003-04-17 21:45:37 +00:00
2003-12-18 00:33:02 +00:00
GetValue( ini, pn, id, ssprintf("NoteButton"), NoteButtonNames[t] );
2003-04-17 22:53:36 +00:00
GetValue( ini, pn, id, ssprintf("NoteButton%i", t+1), NoteButtonNames[t] );
2003-04-17 21:45:37 +00:00
2003-12-18 00:33:02 +00:00
GetValue( ini, pn, id, ssprintf("GhostButton"), GhostButtonNames[t] );
2003-04-17 22:53:36 +00:00
GetValue( ini, pn, id, ssprintf("GhostButton%i", t+1), GhostButtonNames[t] );
2003-04-17 21:45:37 +00:00
2004-12-03 05:19:46 +00:00
if( GetValue( ini, pn, id, ssprintf("HoldJudgment"), s ) ) m_HoldJudgmentCmd[t] = ParseCommands(s);
if( GetValue( ini, pn, id, ssprintf("HoldJudgment%i",t+1), s ) ) m_HoldJudgmentCmd[t] = ParseCommands(s);
2003-04-17 21:16:56 +00:00
}
}
NoteFieldPositioning::NoteFieldPositioning(CString fn)
{
m_Filename = fn;
2004-05-23 02:27:51 +00:00
IniFile ini;
if( !ini.ReadFile(fn) )
2003-04-17 21:16:56 +00:00
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-10 08:49:25 +00:00
}
bool NoteFieldMode::MatchesCurrentGame() const
2003-04-10 08:49:25 +00:00
{
return true;
}
2003-04-03 00:01:04 +00:00
void NoteFieldPositioning::Load(PlayerNumber pn)
{
NoteFieldMode &mode = g_NoteFieldMode[pn];
mode = NoteFieldMode(); /* reset */
2004-06-28 07:26:00 +00:00
const Style *s = GAMESTATE->GetCurrentStyle();
2003-04-17 21:16:56 +00:00
/* Load the settings in the style table by default. */
for(int tn = 0; tn < MAX_NOTE_TRACKS; ++tn)
{
const float fPixelXOffsetFromCenter = s->m_ColumnInfo[pn][tn].fXOffset;
2004-10-28 03:01:58 +00:00
mode.m_fPositionTrackX[tn] = 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. */
2004-05-23 02:27:51 +00:00
IniFile ini;
if( !ini.ReadFile(m_Filename) )
2003-04-17 21:16:56 +00:00
return;
2003-04-17 22:53:36 +00:00
mode.Load(ini, Modes[ModeNum].m_Id, pn);
}
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-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
}
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;
}
2004-05-31 22:42:12 +00:00
/*
* (c) 2001-2004 Chris Danford, Glenn Maynard
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/